diff options
author | Patrik Suzzi | 2017-05-21 18:14:26 +0000 |
---|---|---|
committer | Patrik Suzzi | 2017-05-22 17:10:46 +0000 |
commit | 8d3cec152314f294c03ec432ad16de8e6daedd78 (patch) | |
tree | 9904086e1ace33c600dbaadcfe986ec61b988783 | |
parent | 367c47cf57ecbf81c6f525b608cacee602503540 (diff) | |
download | eclipse.platform.ui-8d3cec152314f294c03ec432ad16de8e6daedd78.tar.gz eclipse.platform.ui-8d3cec152314f294c03ec432ad16de8e6daedd78.tar.xz eclipse.platform.ui-8d3cec152314f294c03ec432ad16de8e6daedd78.zip |
Bug 516725 - Show/Hide Status Bar context menu not updated I20170524-0800I20170523-2000
The proposed change fixes the bug by refreshing the menu label when the
status bar changes its visibility. The change works also when there are
multiple workbench windows.
Change-Id: If00b2ba2c3e7b23672bdfb80dd4459b8debcafb6
Signed-off-by: Patrik Suzzi <psuzzi@gmail.com>
-rw-r--r-- | bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/ToggleStatusBarHandler.java | 62 |
1 files changed, 52 insertions, 10 deletions
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/ToggleStatusBarHandler.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/ToggleStatusBarHandler.java index d105aec61c0..109d96f7586 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/ToggleStatusBarHandler.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/ToggleStatusBarHandler.java @@ -14,8 +14,9 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; +import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.model.application.ui.MUIElement; +import org.eclipse.e4.ui.workbench.UIEvents; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.commands.ICommandService; @@ -26,6 +27,8 @@ import org.eclipse.ui.internal.WorkbenchWindow; import org.eclipse.ui.internal.services.IWorkbenchLocationService; import org.eclipse.ui.menus.UIElement; import org.eclipse.ui.services.IServiceScopes; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventHandler; /** * Toggle the visibility of the status bar. Implementation of the @@ -36,29 +39,68 @@ public class ToggleStatusBarHandler extends AbstractHandler implements IElementU public static final String COMMAND_ID_TOGGLE_STATUSBAR = "org.eclipse.ui.window.togglestatusbar"; //$NON-NLS-1$ - // id of the statusbar, as defined in the LegacyIDE.e4xmi + // id of the status bar, as defined in the LegacyIDE.e4xmi private static final String BOTTOM_TRIM_ID = "org.eclipse.ui.trim.status"; //$NON-NLS-1$ + // keep references of event handlers and brokers per each window + private HashMap<IWorkbenchWindow, EventHandler> eventHandlers = new HashMap<>(); + private HashMap<IWorkbenchWindow, IEventBroker> eventBrokers = new HashMap<>(); + @Override - public Object execute(ExecutionEvent event) throws ExecutionException { + public Object execute(ExecutionEvent event) { IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event); if (!(window instanceof WorkbenchWindow)) return null; + // initialize event handler + if (!eventHandlers.containsKey(window)) { + initializeEventHandler(window); + } + // perform operation MUIElement trimStatus = getTrimStatus((WorkbenchWindow) window); - if (trimStatus != null) { // toggle statusbar visibility trimStatus.setVisible(!trimStatus.isVisible()); - // refresh menu item label, triggering updateElement() - ICommandService commandService = window.getService(ICommandService.class); - Map<String, WorkbenchWindow> filter = new HashMap<>(); - filter.put(IServiceScopes.WINDOW_SCOPE, (WorkbenchWindow) window); - commandService.refreshElements(COMMAND_ID_TOGGLE_STATUSBAR, filter); } return null; } /** + * @param window + */ + private void initializeEventHandler(IWorkbenchWindow window) { + final IEventBroker eventBroker = window.getService(IEventBroker.class); + eventBrokers.put(window, eventBroker); + EventHandler eventHandler = new EventHandler() { + @Override + public void handleEvent(Event event) { + Object element = event.getProperty(UIEvents.EventTags.ELEMENT); + // if the current-window trim is the event element + if (element != null && element == getTrimStatus((WorkbenchWindow) window)) { + // refresh menu item label, triggering updateElement() + ICommandService commandService = window.getService(ICommandService.class); + Map<String, WorkbenchWindow> filter = new HashMap<>(); + filter.put(IServiceScopes.WINDOW_SCOPE, (WorkbenchWindow) window); + commandService.refreshElements(COMMAND_ID_TOGGLE_STATUSBAR, filter); + } + } + }; + eventHandlers.put(window, eventHandler); + eventBroker.subscribe(UIEvents.UIElement.TOPIC_VISIBLE, eventHandler); + } + + @Override + public void dispose() { + for (IWorkbenchWindow w : eventHandlers.keySet()) { + IEventBroker eventBroker = eventBrokers.get(w); + EventHandler eventHandler = eventHandlers.get(w); + if (eventBroker != null && eventHandler != null) { + eventBroker.unsubscribe(eventHandler); + } + } + super.dispose(); + } + + /** * Updates the visibilty status of the element. */ @Override @@ -76,7 +118,7 @@ public class ToggleStatusBarHandler extends AbstractHandler implements IElementU } } - /* Get the MUIElement representing the status bar */ + /* Get the MUIElement representing the status bar for the given window */ private static MUIElement getTrimStatus(WorkbenchWindow window) { EModelService modelService = window.getService(EModelService.class); MUIElement searchRoot = window.getModel(); |