]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromConfigurationAdapter.java
Configurable connection crossing styles
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / OpenDiagramFromConfigurationAdapter.java
index 978d1f89595989dc811de829f1051941edec5190..c446d1c3c057f15409192b182d3dba45d6c6c668 100644 (file)
@@ -13,6 +13,8 @@ package org.simantics.modeling.ui.diagramEditor;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.eclipse.ui.PlatformUI;
 import org.simantics.Simantics;
@@ -30,6 +32,7 @@ import org.simantics.g2d.canvas.ICanvasContext;
 import org.simantics.g2d.diagram.DiagramHints;
 import org.simantics.layer0.Layer0;
 import org.simantics.modeling.ComponentUtils;
+import org.simantics.modeling.ModelingResources;
 import org.simantics.modeling.actions.NavigateToTarget;
 import org.simantics.modeling.ui.Activator;
 import org.simantics.structural.stubs.StructuralResource2;
@@ -42,14 +45,19 @@ import org.simantics.utils.threads.ThreadUtils;
  */
 public class OpenDiagramFromConfigurationAdapter extends AbstractResourceEditorAdapter {
 
-    private static final String EDITOR_ID = "org.simantics.modeling.ui.diagramEditor";
+    private static final String EDITOR_ID = "org.simantics.modeling.ui.diagramEditor"; //$NON-NLS-1$
 
     public OpenDiagramFromConfigurationAdapter() {
-        super("Diagram Editor", Activator.COMPOSITE_ICON);
+        super(Messages.OpenDiagramFromConfigurationAdapter_DiagramEditor, Activator.COMPOSITE_ICON);
     }
 
-    protected String getEditorId() {
-        return EDITOR_ID;
+    protected String getEditorId(ReadGraph g, Resource composite) throws DatabaseException {
+        ModelingResources MOD = ModelingResources.getInstance(g);
+        String preferredEditorId = g.getPossibleRelatedValue(composite, MOD.PreferredDiagramEditorID);
+        if(preferredEditorId != null)
+            return preferredEditorId;
+        else
+            return EDITOR_ID;
     }
 
     @Override
@@ -78,7 +86,7 @@ public class OpenDiagramFromConfigurationAdapter extends AbstractResourceEditorA
         Simantics.getSession().asyncRequest(new ReadRequest() {
             @Override
             public void run(ReadGraph g) throws DatabaseException {
-                openEditor(g, r, getEditorId());
+                openEditor(g, r, getEditorId(g, r));
             }
         });
     }
@@ -103,16 +111,21 @@ public class OpenDiagramFromConfigurationAdapter extends AbstractResourceEditorA
         Resource diagram = ComponentUtils.getPossibleCompositeDiagram(graph, r);
         if(diagram != null) return diagram;
         
-        if(selectedObjects.size() == 1) {
-               Object o = selectedObjects.iterator().next();
-               if(o instanceof Resource) {
-                       Resource res = (Resource)o;
-                       if(graph.isInstanceOf(res, DIA.Element)) {
-                               return graph.getPossibleObject(res, L0.PartOf);
-                       }
-               }
+        // TODO: what if the selected objects are from different diagrams?
+        if (selectedObjects.size() > 0) {
+            Set<Resource> diagrams = new HashSet<>();
+            for (Object o : selectedObjects) {
+                if (o instanceof Resource) {
+                    Resource res = (Resource)o;
+                    if (graph.isInstanceOf(res, DIA.Element)) {
+                        diagrams.add(graph.getPossibleObject(res, L0.PartOf));
+                    }
+                }
+            }
+            if (diagrams.size() == 1) {
+                return diagrams.iterator().next();
+            }
         }
-        
         return null;
 
     }
@@ -150,42 +163,51 @@ public class OpenDiagramFromConfigurationAdapter extends AbstractResourceEditorA
      * @param selectedObjects
      * @throws DatabaseException
      */
-    public static boolean openEditor(ReadGraph g, Resource r, final String editorId, final Collection<Object> selectedObjects) throws DatabaseException {
-
-        final Resource diagram = getDiagram(g, r, selectedObjects);
-        if (diagram == null)
-            return false;
-
-        final Resource configurationComposite = ComponentUtils.getPossibleDiagramComposite(g, diagram);
-        if (configurationComposite == null)
-            return false;
-
-        Pair<Resource, RVI> modelAndRVI = getModelAndRVI(g, configurationComposite);
+    public static boolean openEditor(ReadGraph g, Resource r, String editorId, Collection<Object> selectedObjects) throws DatabaseException {
+        Resource diagram = getDiagram(g, r, selectedObjects);
+        Resource configurationComposite = diagram != null ? ComponentUtils.getPossibleDiagramComposite(g, diagram) : null;
+        Pair<Resource, RVI> modelAndRVI = configurationComposite != null ? getModelAndRVI(g, configurationComposite) : null;
         //System.out.println("modelAndRVI: " + modelAndRVI);
         if (modelAndRVI == null)
             return false;
+        scheduleOpenEditor(editorId, diagram, modelAndRVI.first, modelAndRVI.second, selectedObjects);
+        return true;
+    }
 
-        final Runnable editorActivator = NavigateToTarget.editorActivator(editorId, diagram, modelAndRVI.first, modelAndRVI.second, part -> {
+    /**
+     * @param g
+     * @param configurationComposite
+     * @param editorId
+     * @param selectedObjects
+     * @throws DatabaseException
+     */
+    public static boolean openEditor(ReadGraph g, Resource r, String editorId, Collection<Object> selectedObjects, Resource model, RVI rvi) throws DatabaseException {
+        Resource diagram = getDiagram(g, r, selectedObjects);
+        if (diagram == null)
+            return false;
+        scheduleOpenEditor(editorId, diagram, model, rvi, selectedObjects);
+        return true;
+    }
+
+    /**
+     * @param g
+     * @param configurationComposite
+     * @param editorId
+     * @param selectedObjects
+     * @throws DatabaseException
+     */
+    private static void scheduleOpenEditor(String editorId, Resource diagram, Resource model, RVI rvi, Collection<Object> selectedObjects) throws DatabaseException {
+        Runnable editorActivator = NavigateToTarget.editorActivator(editorId, diagram, model, rvi, part -> {
             if (selectedObjects.isEmpty())
                 return;
-
-            final ICanvasContext openedCanvas = (ICanvasContext) part.getAdapter(ICanvasContext.class);
+            ICanvasContext openedCanvas = (ICanvasContext) part.getAdapter(ICanvasContext.class);
             assert openedCanvas != null;
             // CanvasContext-wide denial of initial zoom-to-fit on diagram open.
             openedCanvas.getDefaultHintContext().setHint(DiagramHints.KEY_INITIAL_ZOOM_TO_FIT, Boolean.FALSE);
-            //System.out.println("ASDF: " + element);
             ThreadUtils.asyncExec(openedCanvas.getThreadAccess(),
                     NavigateToTarget.elementSelectorZoomer(openedCanvas, selectedObjects, false));
         });
-
-        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                editorActivator.run();
-            }
-        });
-
-        return true;
+        PlatformUI.getWorkbench().getDisplay().asyncExec(editorActivator);
     }
 
 }