From 8d9f07912a3355bfc2a126d7c25da6ad4231cb2d Mon Sep 17 00:00:00 2001 From: Kirill Grouchnikov Date: Sat, 22 Jun 2024 17:34:08 -0400 Subject: [PATCH] Strong reference the popup listener registered on popup ribbon tasks Fixes #472 --- .../internal/ui/ribbon/BasicRibbonUI.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonUI.java b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonUI.java index 25264d463..82379245e 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonUI.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonUI.java @@ -91,6 +91,12 @@ public abstract class BasicRibbonUI extends RibbonUI { */ protected Map taskToggleButtons; + // Strong references to popup listeners registered when a task is displayed in a popup (when + // the ribbon is minimized). Not having strong references can lead to the locally defined listener + // to be garbage collected and not notified when the ribbon is maximized, and the end result + // is the ribbon task content not getting re-parented back to the ribbon. + private Map taskPopupListeners; + /** * Group model for task toggle buttons. */ @@ -113,6 +119,7 @@ public abstract class BasicRibbonUI extends RibbonUI { */ protected BasicRibbonUI() { this.taskToggleButtons = new HashMap<>(); + this.taskPopupListeners = new HashMap<>(); this.taskToggleGroupModel = new CommandToggleGroupModel(); this.taskToggleGroupModel.setAllowsClearingSelection(false); } @@ -163,6 +170,7 @@ protected void installListeners() { ribbon.repaint(); } if ("minimized".equals(propertyChangeEvent.getPropertyName())) { + System.out.println("Minimizing ribbon state change -> hiding popups"); PopupPanelManager.defaultManager().hidePopups(null); RichTooltipManager.sharedInstance().hideCurrentlyShowingTipIfNecessary(); ribbon.revalidate(); @@ -195,6 +203,11 @@ protected void uninstallListeners() { this.ribbon.removeComponentListener(this.ribbonComponentListener); this.ribbonComponentListener = null; + + for (PopupPanelManager.PopupListener taskPopupListener: this.taskPopupListeners.values()) { + PopupPanelManager.defaultManager().removePopupListener(taskPopupListener); + } + this.taskPopupListeners.clear(); } /** @@ -1282,6 +1295,7 @@ public void popupHidden(PopupEvent event) { if (originator instanceof JRibbonTaskToggleButton) { ribbon.add(bandScrollablePanel); PopupPanelManager.defaultManager().removePopupListener(this); + taskPopupListeners.remove(task); ribbon.revalidate(); ribbon.doLayout(); ribbon.repaint(); @@ -1290,6 +1304,7 @@ public void popupHidden(PopupEvent event) { }; PopupPanelManager.defaultManager().addPopupListener(tracker); PopupPanelManager.defaultManager().showPopup(taskToggleButton, popupPanel, x, y); + taskPopupListeners.put(task, tracker); } }