blob: 1d08c376e6b33b75437951a2e358df2f4746c7e0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Patrik Suzzi.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Patrik Suzzi <psuzzi@gmail.com> - initial API and implementation;
******************************************************************************/
package org.eclipse.ui.internal.handlers;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
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;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.internal.WorkbenchMessages;
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.EventHandler;
/**
* Toggle the visibility of the status bar. Implementation of the
* {@code org.eclipse.ui.window.togglestatusbar} command.
*
*/
public class ToggleStatusBarHandler extends AbstractHandler implements IElementUpdater {
public static final String COMMAND_ID_TOGGLE_STATUSBAR = "org.eclipse.ui.window.togglestatusbar"; //$NON-NLS-1$
// 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) {
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());
}
return null;
}
/**
* @param window
*/
private void initializeEventHandler(IWorkbenchWindow window) {
final IEventBroker eventBroker = window.getService(IEventBroker.class);
eventBrokers.put(window, eventBroker);
EventHandler eventHandler = 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 (Entry<IWorkbenchWindow, EventHandler> w : eventHandlers.entrySet()) {
IEventBroker eventBroker = eventBrokers.get(w.getKey());
EventHandler eventHandler = w.getValue();
if (eventBroker != null && eventHandler != null) {
eventBroker.unsubscribe(eventHandler);
}
}
super.dispose();
}
/**
* Updates the visibilty status of the element.
*/
@Override
public void updateElement(UIElement element, Map parameters) {
IWorkbenchLocationService wls = element.getServiceLocator().getService(IWorkbenchLocationService.class);
IWorkbenchWindow window = wls.getWorkbenchWindow();
if (!(window instanceof WorkbenchWindow))
return;
MUIElement trimStatus = getTrimStatus((WorkbenchWindow) window);
if (trimStatus != null) {
element.setText(trimStatus.isVisible() ? WorkbenchMessages.ToggleStatusBarVisibilityAction_hide_text
: WorkbenchMessages.ToggleStatusBarVisibilityAction_show_text);
}
}
/* 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();
return modelService.find(BOTTOM_TRIM_ID, searchRoot);
}
}