From 728ff4bd4933709066fd9b4937d12d467a3a64cf Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 11 Nov 2016 16:50:41 +0300 Subject: [PATCH] allow to cancel emulated breakpoints setup --- .../ui/breakpoints/MethodBreakpoint.java | 26 ++++++++++++------- .../src/messages/DebuggerBundle.properties | 3 ++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java index 491529c1c311..509e119d1086 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java @@ -153,7 +153,7 @@ public class MethodBreakpoint extends BreakpointWithHighlighter indicatorRef.set(new ProgressWindowWithNotification(true, myProject))); ProgressIndicator indicator = indicatorRef.get(); ProgressManager.getInstance().executeProcessUnderProgress( - () -> processSubTypes(baseType, subType -> createRequestForPreparedClassEmulated(debugProcess, subType, false), indicator), + () -> processPreparedSubTypes(baseType, subType -> createRequestForPreparedClassEmulated(debugProcess, subType, false), indicator), indicator); if (indicator.isCanceled()) { ApplicationManager.getApplication().invokeLater( @@ -539,7 +539,7 @@ public class MethodBreakpoint extends BreakpointWithHighlighter consumer, ProgressIndicator progressIndicator) { + private static void processPreparedSubTypes(ReferenceType classType, Consumer consumer, ProgressIndicator progressIndicator) { long start = 0; if (LOG.isDebugEnabled()) { start = System.currentTimeMillis(); @@ -547,18 +547,26 @@ public class MethodBreakpoint extends BreakpointWithHighlighter inheritance = new MultiMap<>(); - classType.virtualMachine().allClasses().stream() - .filter(ReferenceType::isPrepared) - .forEach(type -> supertypes(type).forEach(st -> inheritance.putValue(st, type))); + List allTypes = classType.virtualMachine().allClasses(); + for (int i = 0; i < allTypes.size(); i++) { + if (progressIndicator.isCanceled()) { + return; + } + ReferenceType type = allTypes.get(i); + if (type.isPrepared()) { + supertypes(type).forEach(st -> inheritance.putValue(st, type)); + } + progressIndicator.setText2(i + "/" + allTypes.size()); + progressIndicator.setFraction((double)i / allTypes.size()); + } List types = StreamEx.ofTree(classType, t -> StreamEx.of(inheritance.get(t))).skip(1).toList(); - progressIndicator.setIndeterminate(false); + progressIndicator.setText(DebuggerBundle.message("label.method.breakpoints.setting.breakpoints")); + for (int i = 0; i < types.size(); i++) { if (progressIndicator.isCanceled()) { - break; + return; } consumer.accept(types.get(i)); diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index 362844a0eef6..17a148924d48 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -390,7 +390,8 @@ error.invalid.breakpoint.bad.line.number=Line number is invalid line.breakpoint.display.name=Line {0} line.breakpoint.display.name.with.class.or.method=Line {0,number,#} in {1} error.invalid.breakpoint.method.not.found=Method not found in class {0} -label.method.breakpoints.processing.classes=Processing classes for method breakpoints +label.method.breakpoints.processing.classes=Processing classes for emulated method breakpoints +label.method.breakpoints.setting.breakpoints=Setting emulated method breakpoints label.method.breakpoint.properties.panel.method.entry=Method entr&y label.method.breakpoint.properties.panel.method.exit=Method e&xit label.method.breakpoint.properties.panel.emulated=Em&ulated