From 3e0b2348edfd5a1992c0c4e3f30bab00e9cc0eba Mon Sep 17 00:00:00 2001 From: "Liana.Bakradze" Date: Mon, 6 Feb 2017 16:33:57 +0300 Subject: [PATCH] PY-22572 Data View: close corresponding tabs when Python Console session removed --- .../debugger/containerview/PyDataView.java | 24 ++++++++++++----- .../PyDataViewToolWindowFactory.java | 27 +++++++++++++++---- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java b/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java index fa4e12cb5c8c..1c9053d76bd8 100644 --- a/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java +++ b/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java @@ -39,6 +39,7 @@ import com.jetbrains.python.debugger.PyDebugProcess; import com.jetbrains.python.debugger.PyDebugValue; import com.jetbrains.python.debugger.PyFrameAccessor; import icons.PythonIcons; +import org.apache.xmlrpc.XmlRpcException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,6 +47,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Predicate; import java.util.stream.Collectors; public class PyDataView implements DumbAware { @@ -76,14 +78,11 @@ public class PyDataView implements DumbAware { window.show(null); } - public void closeRelatedTabs(@NotNull PyDebugProcess process) { + public void closeTabs(Predicate ifClose) { List tabsToRemove = new ArrayList<>(); for (TabInfo info : myTabs.getTabs()) { - PyFrameAccessor frameAccessor = getPanel(info).getFrameAccessor(); - if (frameAccessor instanceof PyDebugProcess) { - if (frameAccessor == process) { - tabsToRemove.add(info); - } + if (ifClose.test(getPanel(info).getFrameAccessor())) { + tabsToRemove.add(info); } } ApplicationManager.getApplication().invokeLater(() -> { @@ -141,6 +140,19 @@ public class PyDataView implements DumbAware { return null; } + public void closeDisconnectedFromConsoleTabs() { + closeTabs(frameAccessor -> frameAccessor instanceof PydevConsoleCommunication && !isConnected(((PydevConsoleCommunication)frameAccessor))); + } + + private static boolean isConnected(PydevConsoleCommunication accessor){ + try { + return accessor.handshake(); + } + catch (XmlRpcException ignored) { + return false; + } + } + public static PyDataView getInstance(@NotNull final Project project) { return ServiceManager.getService(project, PyDataView.class); } diff --git a/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java b/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java index 5761dcf51183..3327b58aa864 100644 --- a/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java +++ b/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java @@ -25,22 +25,24 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.ToggleAction; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowAnchor; -import com.intellij.openapi.wm.ToolWindowFactory; -import com.intellij.openapi.wm.ToolWindowType; +import com.intellij.openapi.wm.*; import com.intellij.openapi.wm.ex.ToolWindowEx; +import com.intellij.ui.content.ContentManagerAdapter; +import com.intellij.ui.content.ContentManagerEvent; import com.intellij.util.messages.MessageBusConnection; import com.intellij.xdebugger.XDebugProcess; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.XDebuggerManagerListener; +import com.jetbrains.python.console.PythonConsoleToolWindowFactory; import com.jetbrains.python.debugger.PyDebugProcess; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class PyDataViewToolWindowFactory implements ToolWindowFactory { public static final String EMPTY_TEXT = "Run debugger to view available data "; + private static final Logger LOG = Logger.getInstance(PyDataViewToolWindowFactory.class); @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { @@ -70,9 +72,24 @@ public class PyDataViewToolWindowFactory implements ToolWindowFactory { } }); + addPythonConsoleListener(project); ((ToolWindowEx)toolWindow).setAdditionalGearActions(new DefaultActionGroup(new ColoredByDefaultAction())); } + private static void addPythonConsoleListener(@NotNull Project project) { + final ToolWindow pythonConsole = ToolWindowManager.getInstance(project).getToolWindow(PythonConsoleToolWindowFactory.Companion.getID()); + if (pythonConsole == null) { + LOG.error("No Python Console tool window"); + return; + } + pythonConsole.getContentManager().addContentManagerListener(new ContentManagerAdapter() { + @Override + public void contentRemoved(ContentManagerEvent event) { + PyDataView.getInstance(project).closeDisconnectedFromConsoleTabs(); + } + }); + } + @Override public void init(ToolWindow window) { window.setDefaultState(ToolWindowAnchor.RIGHT, ToolWindowType.FLOATING, null); @@ -109,7 +126,7 @@ public class PyDataViewToolWindowFactory implements ToolWindowFactory { @Override public void processStopped(@NotNull XDebugProcess debugProcess) { if (debugProcess instanceof PyDebugProcess) { - PyDataView.getInstance(myProject).closeRelatedTabs(((PyDebugProcess)debugProcess)); + PyDataView.getInstance(myProject).closeTabs(frameAccessor -> frameAccessor instanceof PyDebugProcess && frameAccessor == debugProcess); } } }