Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrik Suzzi2017-05-21 18:14:26 +0000
committerPatrik Suzzi2017-05-22 17:10:46 +0000
commit8d3cec152314f294c03ec432ad16de8e6daedd78 (patch)
tree9904086e1ace33c600dbaadcfe986ec61b988783
parent367c47cf57ecbf81c6f525b608cacee602503540 (diff)
downloadeclipse.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.java62
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();

Back to the top