package rocks.inspectit.ui.rcp.handlers;
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.core.commands.IHandler;
import org.eclipse.ui.IEditorPart;
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.menus.UIElement;
import org.eclipse.ui.services.IServiceScopes;
import rocks.inspectit.ui.rcp.editor.preferences.IPreferencePanel;
import rocks.inspectit.ui.rcp.editor.root.AbstractRootEditor;
/**
* Handler for the maximize/minimize the active sub-view. At the same time this Handler implements
* the {@link IElementUpdater} interface so that we can manually update the checked state of the UI
* elements that are bounded to the {@value #COMMAND_ID} command.
*
* @author Ivan Senic
*
*/
public class MaximizeActiveViewHandler extends AbstractHandler implements IHandler, IElementUpdater {
/**
* Command id.
*/
public static final String COMMAND_ID = "rocks.inspectit.ui.rcp.commands.maximizeActiveView";
/**
* Preference panel id parameter needed for this command.
*/
public static final String PREFERENCE_PANEL_ID_PARAMETER = COMMAND_ID + ".preferencePanelId";
/**
* {@inheritDoc}
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IEditorPart editorPart = HandlerUtil.getActiveEditor(event);
if (editorPart instanceof AbstractRootEditor) {
AbstractRootEditor abstractRootEditor = (AbstractRootEditor) editorPart;
if (abstractRootEditor.canMaximizeActiveSubView()) {
abstractRootEditor.maximizeActiveSubView();
} else if (abstractRootEditor.canMinimizeActiveSubView()) {
abstractRootEditor.minimizeActiveSubView();
}
}
// after the maximized/minimized is executed we need to refresh the UI elements bounded to
// the command, so that checked state of that elements is updated
ICommandService commandService = (ICommandService) HandlerUtil.getActiveWorkbenchWindow(event).getService(ICommandService.class);
Map<Object, Object> filter = new HashMap<>();
filter.put(IServiceScopes.WINDOW_SCOPE, HandlerUtil.getActiveWorkbenchWindow(event));
commandService.refreshElements(event.getCommand().getId(), filter);
return null;
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("rawtypes")
@Override
public void updateElement(UIElement element, Map parameters) {
// we'll only update the element that is bounded to the preference panel in the active
// sub-view
IWorkbenchWindow workbenchWindow = (IWorkbenchWindow) parameters.get("org.eclipse.ui.IWorkbenchWindow");
String preferencePanelId = (String) parameters.get(PREFERENCE_PANEL_ID_PARAMETER);
if ((null != workbenchWindow) && (null != preferencePanelId)) {
IEditorPart editorPart = workbenchWindow.getActivePage().getActiveEditor();
if (editorPart instanceof AbstractRootEditor) {
AbstractRootEditor abstractRootEditor = (AbstractRootEditor) editorPart;
IPreferencePanel preferencePanel = abstractRootEditor.getPreferencePanel();
if (preferencePanelId.equals(preferencePanel.getId())) {
element.setChecked(!abstractRootEditor.canMaximizeActiveSubView());
}
}
}
}
}