From 9c6b34171fe9e7934f6379333cdc8126fa993ce9 Mon Sep 17 00:00:00 2001 From: azerr Date: Tue, 16 Apr 2024 21:19:34 +0200 Subject: [PATCH] fix: Details pane in consoles view is not removed after deleting the last LS Fixes #220 Signed-off-by: azerr --- .../console/LSPConsoleToolWindowPanel.java | 31 +++++++++++++++++++ .../explorer/LanguageServerExplorer.java | 13 ++++++++ 2 files changed, 44 insertions(+) diff --git a/src/main/java/com/redhat/devtools/lsp4ij/console/LSPConsoleToolWindowPanel.java b/src/main/java/com/redhat/devtools/lsp4ij/console/LSPConsoleToolWindowPanel.java index e7e66f52..bd43c043 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/console/LSPConsoleToolWindowPanel.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/console/LSPConsoleToolWindowPanel.java @@ -124,6 +124,18 @@ public void selectConsole(LanguageServerProcessTreeNode processTreeNode) { consoles.select(processTreeNode, true); } + /** + * Remove the detail, console panel of the given language server tree node. + * + * @param serverTreeNode the language server tree node. + */ + public void removeConsolePanel(LanguageServerTreeNode serverTreeNode) { + if (consoles == null || isDisposed()) { + return; + } + consoles.dispose(serverTreeNode); + } + /** * A card-panel that displays panels for each language server instances. */ @@ -153,6 +165,25 @@ protected void dispose(DefaultMutableTreeNode key, ConsoleContentPanel value) { value.dispose(); } } + + /** + * Remove the detail, console panel of the given language server tree node. + * + * @param key the language server or process tree node. + */ + public void dispose(@NotNull DefaultMutableTreeNode key) { + var value = super.getValue(key, false); + if (value != null) { + // Remove the detail panel of the language server + value.dispose(); + } + // Remove the console panel of the language server (processes) + for (int i = 0; i < key.getChildCount(); i++) { + if (key.getChildAt(i) instanceof DefaultMutableTreeNode treeNode) { + dispose(treeNode); + } + } + } } private class ConsoleContentPanel extends SimpleCardLayoutPanel { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/console/explorer/LanguageServerExplorer.java b/src/main/java/com/redhat/devtools/lsp4ij/console/explorer/LanguageServerExplorer.java index a53ce760..9f3851c2 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/console/explorer/LanguageServerExplorer.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/console/explorer/LanguageServerExplorer.java @@ -75,7 +75,11 @@ public void handleRemoved(@NotNull LanguageServerDefinitionListener.LanguageServ for (var serverDefinition : event.serverDefinitions) { LanguageServerTreeNode node = findNodeForServer(serverDefinition, root); if (node != null) { + // Remove the language server definition from the tree root.remove(node); + // Remove the detail, console panel (on the right) of the language server + removeConsolePanel(node); + } } treeModel.reload(root); @@ -268,6 +272,15 @@ public void showError(LanguageServerProcessTreeNode processTreeNode, Throwable e panel.showError(processTreeNode, exception); } + /** + * Remove the detail, console panel of the given language server tree node. + * + * @param serverTreeNode the language server tree node. + */ + public void removeConsolePanel(LanguageServerTreeNode serverTreeNode) { + panel.removeConsolePanel(serverTreeNode); + } + public DefaultTreeModel getTreeModel() { return (DefaultTreeModel) tree.getModel(); }