]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/handlers/e4/ToggleFocusabilityHandler.java
ToggleFocusabilityHandler now updates UI state on active part change
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / handlers / e4 / ToggleFocusabilityHandler.java
index a6cd3be0e87af9861bf809ba6591c9077852b686..4df8b4678a615ad770386253198e6717a1531d35 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
- * Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     Semantum Oy - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.modeling.ui.diagramEditor.handlers.e4;\r
-\r
-import org.eclipse.e4.core.contexts.Active;\r
-import org.eclipse.e4.core.di.annotations.CanExecute;\r
-import org.eclipse.e4.core.di.annotations.Execute;\r
-import org.eclipse.e4.core.di.annotations.Optional;\r
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;\r
-import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;\r
-import org.eclipse.ui.IEditorPart;\r
-import org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor;\r
-import org.simantics.g2d.diagram.DiagramHints;\r
-import org.simantics.g2d.diagram.IDiagram;\r
-import org.simantics.g2d.layers.ILayersEditor;\r
-import org.simantics.modeling.ui.diagramEditor.DiagramEditor;\r
-import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
-\r
-/**\r
- * @author Tuukka Lehtonen\r
- */\r
-public class ToggleFocusabilityHandler {\r
-\r
-    @CanExecute\r
-    public boolean canExecute(@Active MPart part) {\r
-        if (!(part.getObject() instanceof CompatibilityEditor))\r
-            return false;\r
-        CompatibilityEditor editor = (CompatibilityEditor) part.getObject();\r
-        if (!(editor.getPart() instanceof DiagramEditor))\r
-            return false;\r
-        return true;\r
-    }\r
-    \r
-       @Execute\r
-       public void execute(@Optional MToolItem toolItem) {\r
-               ILayersEditor le = getLayers();\r
-               if (le != null) {\r
-                       boolean b = le.getIgnoreFocusSettings();\r
-                       le.setIgnoreFocusSettings( !b );\r
-\r
-                       if (toolItem != null) {\r
-                           toolItem.setSelected(!b);\r
-                           toolItem.setTooltip((!b ? "Deny" : "Allow") + " Focusing and Editing of Images");\r
-                       }\r
-               }\r
-       }\r
-\r
-       protected ILayersEditor getLayers() {\r
-               DiagramEditor editor = getEditor();\r
-               if (editor == null)\r
-                       return null;\r
-               return getLayers(editor);\r
-       }\r
-\r
-       protected ILayersEditor getLayers(DiagramEditor editor) {\r
-               // The diagram might not be available since the diagram editor loads it asynchronously.\r
-               IDiagram diagram = (IDiagram) editor.getAdapter(IDiagram.class);\r
-               if (diagram == null)\r
-                       return null;\r
-               //System.out.println("getLayersEditor(" + diagram + ")");\r
-               ILayersEditor le = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR);\r
-               return le;\r
-       }\r
-\r
-       protected DiagramEditor getEditor() {\r
-               IEditorPart editorPart = WorkbenchUtils.getActiveEditor();\r
-               if (editorPart == null)\r
-                       return null;\r
-               if (editorPart instanceof DiagramEditor) {\r
-                       DiagramEditor editor = (DiagramEditor) editorPart;\r
-                       return editor;\r
-               }\r
-               return null;\r
-       }\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2013 Association for Decentralized Information Management in
+ * Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Semantum Oy - initial API and implementation
+ *******************************************************************************/
+package org.simantics.modeling.ui.diagramEditor.handlers.e4;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.e4.core.contexts.Active;
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
+import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor;
+import org.simantics.g2d.diagram.DiagramHints;
+import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.g2d.layers.ILayersEditor;
+import org.simantics.modeling.ui.diagramEditor.DiagramEditor;
+import org.simantics.utils.ui.workbench.WorkbenchUtils;
+
+/**
+ * @author Tuukka Lehtonen
+ */
+@SuppressWarnings("restriction")
+public class ToggleFocusabilityHandler {
+
+       private static final String HANDLED_ITEM_ID = "fi.vtt.apros.ui.diagram.handledtoolitem.enableimageeditability";
+
+       @Inject
+       private EModelService modelService;
+
+       private void updateStateForPart(MPart part) {
+               IWorkbenchPart wbPart = tryGetWorkbenchPart(part);
+               if (wbPart != null) {
+                       MWindow win = modelService.getTopLevelWindowFor(part);
+                       MToolItem item = (MToolItem) modelService.find(HANDLED_ITEM_ID, win);
+                       ILayersEditor le = getLayers(wbPart);
+                       if (item != null && le != null) {
+                               setToolItemState(item, le.getIgnoreFocusSettings());
+                       }
+               }
+       }
+
+       // tracks the active part
+       @Inject
+       @Optional
+       public void receiveActivePart(@Named(IServiceConstants.ACTIVE_PART) MPart activePart) {
+               updateStateForPart(activePart);
+       }
+
+       @CanExecute
+       public boolean canExecute(@Active MPart part) {
+               return tryGetWorkbenchPart(part) instanceof DiagramEditor;
+       }
+
+       @Execute
+       public void execute(@Optional MToolItem toolItem) {
+               ILayersEditor le = getLayers();
+               if (le != null) {
+                       boolean newValue = !le.getIgnoreFocusSettings();
+                       le.setIgnoreFocusSettings( newValue );
+                       if (toolItem != null) {
+                               setToolItemState(toolItem, newValue);
+                       }
+               }
+       }
+
+       private void setToolItemState(MToolItem item, boolean ignoreFocusSettings) {
+               item.setSelected(ignoreFocusSettings);
+               item.setTooltip((ignoreFocusSettings ? "Deny" : "Allow") + " Focusing and Editing of Images");
+       }
+
+       protected ILayersEditor getLayers() {
+               DiagramEditor editor = getEditor();
+               if (editor == null)
+                       return null;
+               return getLayers(editor);
+       }
+
+       protected ILayersEditor getLayers(IAdaptable editor) {
+               // The diagram might not be available since the diagram editor loads it asynchronously.
+               IDiagram diagram = (IDiagram) editor.getAdapter(IDiagram.class);
+               if (diagram == null)
+                       return null;
+               //System.out.println("getLayersEditor(" + diagram + ")");
+               ILayersEditor le = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR);
+               return le;
+       }
+
+       protected DiagramEditor getEditor() {
+               IEditorPart editorPart = WorkbenchUtils.getActiveEditor();
+               if (editorPart == null)
+                       return null;
+               if (editorPart instanceof DiagramEditor) {
+                       DiagramEditor editor = (DiagramEditor) editorPart;
+                       return editor;
+               }
+               return null;
+       }
+
+       private IWorkbenchPart tryGetWorkbenchPart(MPart part) {
+               if (part == null)
+                       return null;
+               Object obj = part.getObject();
+               if (obj instanceof CompatibilityEditor) {
+                       CompatibilityEditor editor = (CompatibilityEditor) obj;
+                       return editor.getPart();
+               } else if (obj instanceof IWorkbenchPart) {
+                       return (IWorkbenchPart) obj; 
+               }
+               return null;
+       }
+
+}