diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java index 96e6d015f026..9386cca37ec8 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java @@ -27,8 +27,8 @@ import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.impl.DebuggerSession; +import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.jdi.VirtualMachineProxyImpl; -import com.intellij.debugger.ui.DebuggerSessionTab; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; @@ -70,7 +70,7 @@ public class ThreadDumpAction extends AnAction implements AnAction.TransparentUp public void run() { XDebugSession xSession = session.getXDebugSession(); if (xSession != null) { - DebuggerSessionTab.addThreadDump(project, threads, xSession.getUI(), session); + DebuggerUtilsEx.addThreadDump(project, threads, xSession.getUI(), session); } } }, ModalityState.NON_MODAL); diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java index c7e682f200a5..5bd576c109f6 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java @@ -33,7 +33,14 @@ import com.intellij.debugger.requests.Requestor; import com.intellij.debugger.ui.CompletionEditor; import com.intellij.debugger.ui.breakpoints.Breakpoint; import com.intellij.debugger.ui.tree.DebuggerTreeNode; +import com.intellij.execution.filters.ExceptionFilters; +import com.intellij.execution.filters.TextConsoleBuilder; +import com.intellij.execution.filters.TextConsoleBuilderFactory; +import com.intellij.execution.ui.ConsoleView; +import com.intellij.execution.ui.RunnerLayoutUi; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; @@ -47,6 +54,9 @@ import com.intellij.pom.Navigatable; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.ui.classFilter.ClassFilter; +import com.intellij.ui.content.Content; +import com.intellij.unscramble.ThreadDumpPanel; +import com.intellij.unscramble.ThreadState; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.XSourcePosition; @@ -399,6 +409,43 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { return null; } + private static int myThreadDumpsCount = 0; + private static int myCurrentThreadDumpId = 1; + + private static final String THREAD_DUMP_CONTENT_PREFIX = "Dump"; + + public static void addThreadDump(Project project, List threads, final RunnerLayoutUi ui, DebuggerSession session) { + final TextConsoleBuilder consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(project); + consoleBuilder.filters(ExceptionFilters.getFilters(session.getSearchScope())); + final ConsoleView consoleView = consoleBuilder.getConsole(); + final DefaultActionGroup toolbarActions = new DefaultActionGroup(); + consoleView.allowHeavyFilters(); + final ThreadDumpPanel panel = new ThreadDumpPanel(project, consoleView, toolbarActions, threads); + + final String id = THREAD_DUMP_CONTENT_PREFIX + " #" + myCurrentThreadDumpId; + final Content content = ui.createContent(id, panel, id, null, null); + content.setCloseable(true); + content.setDescription("Thread Dump"); + ui.addContent(content); + ui.selectAndFocus(content, true, true); + myThreadDumpsCount++; + myCurrentThreadDumpId++; + Disposer.register(content, new Disposable() { + @Override + public void dispose() { + myThreadDumpsCount--; + if (myThreadDumpsCount == 0) { + myCurrentThreadDumpId = 1; + } + } + }); + Disposer.register(content, consoleView); + ui.selectAndFocus(content, true, false); + if (threads.size() > 0) { + panel.selectStackFrame(0); + } + } + public abstract DebuggerTreeNode getSelectedNode (DataContext context); public abstract EvaluatorBuilder getEvaluatorBuilder(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 51a96197ba48..7842769a7479 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -36,12 +36,8 @@ import com.intellij.execution.ExecutionManager; import com.intellij.execution.ExecutionResult; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.executors.DefaultDebugExecutor; -import com.intellij.execution.filters.ExceptionFilters; -import com.intellij.execution.filters.TextConsoleBuilder; -import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ExecutionConsoleEx; -import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.execution.ui.layout.PlaceInGrid; import com.intellij.icons.AllIcons; import com.intellij.idea.ActionsBundle; @@ -56,8 +52,6 @@ import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; import com.intellij.ui.content.tabs.PinToolwindowTabAction; -import com.intellij.unscramble.ThreadDumpPanel; -import com.intellij.unscramble.ThreadState; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.impl.actions.XDebuggerActions; import com.intellij.xdebugger.impl.settings.XDebuggerSettingsManager; @@ -68,7 +62,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.tree.TreePath; -import java.util.List; public class DebuggerSessionTab extends DebuggerSessionTabBase implements Disposable { private static final Logger LOG = Logger.getInstance(DebuggerSessionTab.class); @@ -84,7 +77,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos private final DebugUIEnvironment myDebugUIEnvironment; private final ThreadsPanel myThreadsPanel; - private static final String THREAD_DUMP_CONTENT_PREFIX = "Dump"; public DebuggerSessionTab(final Project project, final String sessionName, @NotNull final DebugUIEnvironment environment, @NotNull DebuggerSession debuggerSession) { @@ -447,51 +439,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos myUi.selectAndFocus(myUi.findContent(DebuggerContentInfo.FRAME_CONTENT), true, false); } - private static int myThreadDumpsCount = 0; - private static int myCurrentThreadDumpId = 1; - - public static void addThreadDump(Project project, List threads, final RunnerLayoutUi ui, DebuggerSession session) { - final TextConsoleBuilder consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(project); - consoleBuilder.filters(ExceptionFilters.getFilters(session.getSearchScope())); - final ConsoleView consoleView = consoleBuilder.getConsole(); - final DefaultActionGroup toolbarActions = new DefaultActionGroup(); - consoleView.allowHeavyFilters(); - final ThreadDumpPanel panel = new ThreadDumpPanel(project, consoleView, toolbarActions, threads); - - final String id = createThreadDumpContentId(); - final Content content = ui.createContent(id, panel, id, null, null); - content.setCloseable(true); - content.setDescription("Thread Dump"); - ui.addContent(content); - ui.selectAndFocus(content, true, true); - myThreadDumpsCount += 1; - myCurrentThreadDumpId += 1; - //Disposer.register(this, new Disposable() { - // @Override - // public void dispose() { - // ui.removeContent(content, true); - // } - //}); - Disposer.register(content, new Disposable() { - @Override - public void dispose() { - myThreadDumpsCount -= 1; - if (myThreadDumpsCount == 0) { - myCurrentThreadDumpId = 1; - } - } - }); - Disposer.register(content, consoleView); - ui.selectAndFocus(content, true, false); - if (threads.size() > 0) { - panel.selectStackFrame(0); - } - } - - private static String createThreadDumpContentId() { - return THREAD_DUMP_CONTENT_PREFIX + " #" + myCurrentThreadDumpId; - } - private class MyDebuggerStateManager extends DebuggerStateManager { @Override public void fireStateChanged(DebuggerContextImpl newContext, int event) {