From df439e9a49c48ae62b8be0648402bab15154c098 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:22:41 -0500 Subject: [PATCH] GP-5344 - Prevent the Front End tool disappearing by not allowing component provider actions to close the provider if it is the last one in the window --- .../src/main/java/docking/ComponentProvider.java | 12 ++++++++---- .../main/java/docking/DockingWindowManager.java | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java index 5d0a75d994..95f93565e4 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java @@ -1104,17 +1104,21 @@ public abstract class ComponentProvider implements HelpDescriptor, ActionContext @Override public void actionPerformed(ActionContext context) { + Tool tool = getTool(); + DockingWindowManager myDwm = tool.getWindowManager(); boolean isFrustrated = isFrustrated(); boolean isFocused = isFocused(); if (isFocused && !isFrustrated) { - // the user has decided to hide this component and is not madly clicking - setVisible(false); + // the user has decided to hide this component and is not madly clicking; also, we + // don't allow the last component in a window to be closed in order to prevent an + // empty window. + if (!myDwm.isLastComponentInWindow(ComponentProvider.this)) { + setVisible(false); + } return; } boolean emphasize = getComponent().isShowing() && isFrustrated; - Tool tool = getTool(); - DockingWindowManager myDwm = tool.getWindowManager(); myDwm.showComponent(ComponentProvider.this, true, emphasize); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java index e4089284d9..cdf3116533 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java @@ -478,6 +478,20 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder return windowNode.getComponentCount() == 1; } + /** + * Returns true if the given provider is the last provider in its window. + * @param provider the provider + * @return true if the given provider is the last provider in its window. + */ + public boolean isLastComponentInWindow(ComponentProvider provider) { + Window providerWindow = getProviderWindow(provider); + WindowNode providerNode = root.getNodeForWindow(providerWindow); + if (providerNode != null) { + return providerNode.getComponentCount() == 1; + } + return false; + } + /** * Sets the visible state of the set of docking windows. *