GP-5777 - Fix for dialog action context

This commit is contained in:
dragonmacher 2025-06-26 13:54:21 -04:00
parent a7e64844fb
commit 6b7064b1f4
2 changed files with 33 additions and 10 deletions

View file

@ -2580,7 +2580,12 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder
*
* @param context the context
*/
void doContextChanged(ActionContext context) {
void notifyContextListeners(ActionContext context) {
if (context == null) {
return;
}
for (DockingContextListener listener : contextListeners) {
listener.contextChanged(context);
}

View file

@ -15,6 +15,8 @@
*/
package docking;
import java.awt.KeyboardFocusManager;
import java.awt.Window;
import java.util.*;
import docking.action.DockingActionIf;
@ -184,24 +186,40 @@ public class GlobalMenuAndToolBarManager implements DockingWindowListener {
}
WindowActionManager actionManager = windowToActionManagerMap.get(windowNode);
ActionContext localContext = getContext(windowNode);
ActionContext localContext = getComponentProviderContext(windowNode);
actionManager.contextChanged(defaultContextMap, localContext, focusedWindowActions);
}
// now update the focused window's actions
updateFocusedWindowActions(focusedWindowNode, defaultContextMap);
}
private void updateFocusedWindowActions(WindowNode focusedWindowNode,
Map<Class<? extends ActionContext>, ActionContext> defaultContextMap) {
ActionContext focusedContext = getFocusedWindowContext(focusedWindowNode);
WindowActionManager actionManager = windowToActionManagerMap.get(focusedWindowNode);
ActionContext focusedContext = getContext(focusedWindowNode);
if (actionManager != null) {
actionManager.contextChanged(defaultContextMap, focusedContext, Collections.emptySet());
}
// update the docking window manager ; no focused context when no window is focused
if (focusedContext != null) {
windowManager.doContextChanged(focusedContext);
}
// this is for non-action listeners that wish to do work when the context changes
windowManager.notifyContextListeners(focusedContext);
}
private ActionContext getContext(WindowNode windowNode) {
private ActionContext getFocusedWindowContext(WindowNode focusedWindowNode) {
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
Window w = kfm.getFocusedWindow();
if (w instanceof DockingDialog dialog) {
DialogComponentProvider provider = dialog.getDialogComponent();
return provider.getActionContext(null);
}
return getComponentProviderContext(focusedWindowNode);
}
private ActionContext getComponentProviderContext(WindowNode windowNode) {
if (windowNode == null) {
return null;
}