]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/handlers/e4/LinkBrowsingHandler.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / handlers / e4 / LinkBrowsingHandler.java
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/handlers/e4/LinkBrowsingHandler.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/handlers/e4/LinkBrowsingHandler.java
new file mode 100644 (file)
index 0000000..6c4e933
--- /dev/null
@@ -0,0 +1,301 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in 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
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.modeling.ui.diagramEditor.handlers.e4;\r
+\r
+import java.awt.Shape;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Rectangle2D;\r
+import java.util.Collection;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+import java.util.function.Consumer;\r
+\r
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.ResourceArray;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.common.utils.OrderedSetUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.management.ISessionContext;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.g2d.canvas.ICanvasContext;\r
+import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;\r
+import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency;\r
+import org.simantics.g2d.diagram.DiagramHints;\r
+import org.simantics.g2d.diagram.IDiagram;\r
+import org.simantics.g2d.diagram.handler.DataElementMap;\r
+import org.simantics.g2d.diagram.participant.Selection;\r
+import org.simantics.g2d.element.ElementHints;\r
+import org.simantics.g2d.element.ElementUtils;\r
+import org.simantics.g2d.element.IElement;\r
+import org.simantics.g2d.participant.CanvasBoundsParticipant;\r
+import org.simantics.g2d.participant.TransformUtil;\r
+import org.simantics.g2d.utils.GeometryUtils;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.modeling.ui.diagramEditor.e4.DiagramViewer;\r
+import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.ui.workbench.e4.E4WorkbenchUtils;\r
+import org.simantics.utils.page.MarginUtils;\r
+import org.simantics.utils.threads.ThreadUtils;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+\r
+/**\r
+ * StructuralBrowsingHandler supports visual browsing into subcomponents through\r
+ * mouse events.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class LinkBrowsingHandler extends AbstractCanvasParticipant {\r
+\r
+    @Dependency\r
+    CanvasBoundsParticipant canvasBounds;\r
+    @Dependency\r
+    Selection               selection;\r
+\r
+    DiagramViewer           viewer;\r
+    ISessionContext         sessionContext;\r
+\r
+    public LinkBrowsingHandler(DiagramViewer viewer, ISessionContext context) {\r
+\r
+//             System.out.println("LinkBrowsingHandler " + viewer + " " + viewer.structuralPath);\r
+\r
+        this.viewer = viewer;\r
+        this.sessionContext = context;\r
+\r
+    }\r
+\r
+    public static Runnable editorActivator(final MPart part, final ResourceArray input, final Consumer<MPart> successCallback) {\r
+        String sourcePartId = part.getElementId();\r
+        return editorActivator(sourcePartId, input, successCallback);\r
+    }\r
+\r
+    public Runnable elementSelectorZoomer(final ICanvasContext canvas, final Collection<Object> elementObjects, final boolean keepZoom) {\r
+        return new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                IDiagram diagram = canvas.getHintStack().getHint(DiagramHints.KEY_DIAGRAM);\r
+                assert diagram != null;\r
+                if (!zoomToSelection(canvas, diagram, selectElement(canvas, diagram, elementObjects), keepZoom)) {\r
+                    // Reschedule for later.\r
+                    ThreadUtils.asyncExec(canvas.getThreadAccess(), this);\r
+                }\r
+            }\r
+        };\r
+    }\r
+\r
+    public static Set<IElement> selectElement(final ICanvasContext canvas, final IDiagram diagram, final Collection<Object> elementObjects) {\r
+        // Select element\r
+        Set<IElement> selection = new HashSet<IElement>();\r
+        DataElementMap dataMap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);\r
+        for (Object obj : elementObjects) {\r
+            IElement element = dataMap.getElement(diagram, obj);\r
+            if (element == null) {\r
+                ErrorLogger.defaultLogWarning("No element to select for object " + obj, new Exception());\r
+            } else {\r
+                selection.add(element);\r
+            }\r
+        }\r
+        for (Selection s : canvas.getItemsByClass(Selection.class)) {\r
+            s.setSelection(0, selection);\r
+        }\r
+        return selection;\r
+    }\r
+\r
+    public boolean zoomToSelection(final ICanvasContext canvas, final IDiagram diagram, Set<IElement> selection, boolean keepZoom) {\r
+        TransformUtil util = canvas.getSingleItem(TransformUtil.class);\r
+        Rectangle2D controlBounds = canvasBounds.getControlBounds();\r
+        if (controlBounds == null)\r
+            return false;\r
+\r
+        Shape shp = ElementUtils.getElementBoundsOnDiagram(selection);\r
+        if (shp == null)\r
+            return false;\r
+\r
+        Rectangle2D diagramRect = shp.getBounds2D();\r
+        if (keepZoom) {\r
+            double scaleFactor = GeometryUtils.getScale(util.getTransform());\r
+            double cwh = controlBounds.getWidth() / (scaleFactor*2);\r
+            double chh = controlBounds.getHeight() / (scaleFactor*2);\r
+\r
+            AffineTransform view = new AffineTransform();\r
+            view.scale(scaleFactor, scaleFactor);\r
+            view.translate(-diagramRect.getCenterX()+cwh, -diagramRect.getCenterY()+chh);\r
+\r
+            util.setTransform(view);\r
+        } else {\r
+            MarginUtils.Margin margin = MarginUtils.marginOf(40, 0, 0);\r
+            MarginUtils.Margins margins = new MarginUtils.Margins(margin, margin, margin, margin);\r
+            util.fitArea(controlBounds, diagramRect, margins);\r
+        }\r
+        return true;\r
+    }\r
+\r
+    public static Runnable editorActivator(final String editorPartId, final ResourceArray input, final Consumer<MPart> successCallback) {\r
+        return new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                // open and activate new editor\r
+                MPart part = E4WorkbenchUtils.openEditor(editorPartId, "", "", input.get(0));\r
+                E4WorkbenchUtils.activatePart(part);\r
+                successCallback.accept(part);\r
+            }\r
+        };\r
+    }\r
+\r
+    public static Resource getOwnerList(ReadGraph g, Resource listElement) throws DatabaseException {\r
+        return OrderedSetUtils.getSingleOwnerList(g, listElement, DiagramResource.getInstance(g).Composite);\r
+    }\r
+\r
+    @EventHandler(priority = 0)\r
+    public boolean handleDoubleClick(MouseDoubleClickedEvent me) {\r
+\r
+        //System.out.println("LinkBrowsingHandler");\r
+\r
+        if (sessionContext == null)\r
+            return false;\r
+\r
+        Set<IElement> sel = selection.getSelection(0);\r
+\r
+        if (sel.size() == 1) {\r
+            IElement e = sel.iterator().next();\r
+            Object data = e.getHint(ElementHints.KEY_OBJECT);\r
+            if (data instanceof Resource) {\r
+                final Resource element = (Resource) data;\r
+                sessionContext.getSession().asyncRequest(new ReadRequest() {\r
+                    @Override\r
+                    public void run(ReadGraph graph) throws DatabaseException {\r
+\r
+                        //System.out.println("LinkBrowsingHandler0");\r
+\r
+                        ModelingResources mr = ModelingResources.getInstance(graph);\r
+                        DiagramResource dr = DiagramResource.getInstance(graph);\r
+                        StructuralResource2 sr = StructuralResource2.getInstance(graph);\r
+\r
+                        if (graph.isInstanceOf(element, dr.UpwardLink)) {\r
+\r
+//                            Resource component = viewer.structuralPath.resources[0];\r
+//                            Resource element = graph.getPossibleObject(component, mr.ComponentToElement);\r
+//                            Resource diagram = getOwnerList(graph, element);\r
+//\r
+//                            IEditorPart thisEditor = (IEditorPart) site.getPart();\r
+//                            site.getWorkbenchWindow().getShell().getDisplay().asyncExec(\r
+//                                    editorActivator(thisEditor, viewer.structuralPath.removeFromBeginning(1).prepended(diagram), new Callback<IEditorPart>() {\r
+//                                        @Override\r
+//                                        public void run(IEditorPart part) {\r
+//                                        }\r
+//                                    }));\r
+\r
+                        } else if (graph.isInstanceOf(element, dr.Link)) {\r
+\r
+                            //System.out.println("LinkBrowsingHandler2");\r
+\r
+//                                                     ContextMap parameters = new ContextMap();\r
+//                                                     parameters.put(ModelingOperationConstants.WORKBENCH_WINDOW, site.getWorkbenchWindow());\r
+//                                                     parameters.put(ModelingOperationConstants.WORKBENCH_PART, site.getPart());\r
+//                                                     parameters.put(IOperation.SUBJECT, element);\r
+\r
+                            Resource thisDiagram = getOwnerList(graph, element);\r
+                            if (thisDiagram == null) return;\r
+\r
+                            final Resource target = graph.getPossibleObject(element, dr.HasLinkTarget);\r
+                            if (target == null) return;\r
+\r
+                            final Resource otherDiagram = getOwnerList(graph, target);\r
+                            if (otherDiagram == null)\r
+                                return;\r
+\r
+                            final Resource component = graph.getPossibleObject(target, mr.ElementToComponent);\r
+                            if (component == null)\r
+                                return;\r
+\r
+                            Resource type = graph.getSingleType(component, sr.Component);\r
+                            if (type == null)\r
+                                return;\r
+\r
+                            Resource definedBy = graph.getPossibleObject(type, sr.IsDefinedBy);\r
+                            if (definedBy == null)\r
+                                return;\r
+\r
+                            final Resource diagram = graph.getPossibleObject(definedBy, mr.CompositeToDiagram);\r
+                            if (diagram == null)\r
+                                return;\r
+\r
+//                             PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {\r
+//                                 @Override\r
+//                                 public void run() {\r
+//                                     try {\r
+//                                         WorkbenchUtils.openEditor(site.getId(), new ResourceEditorInput(site.getId(), parentStructuralPath.prepended(diagram, component)));\r
+//                                     } catch (PartInitException e) {\r
+//                                         // TODO Auto-generated catch block\r
+//                                         e.printStackTrace();\r
+//                                     }\r
+//                                 }\r
+//                             });\r
+\r
+//                            IEditorPart thisEditor = (IEditorPart) site.getPart();\r
+//                            ResourceArray input = viewer.structuralPath.prepended(diagram, component);\r
+//                            System.out.println("Browsing link " + input);\r
+//                            site.getWorkbenchWindow().getShell().getDisplay().asyncExec(\r
+//                                    editorActivator(thisEditor, input, new Callback<IEditorPart>() {\r
+//                                        @Override\r
+//                                        public void run(IEditorPart part) {\r
+////                                                                                   final ICanvasContext openedCanvas = (ICanvasContext) part.getAdapter(ICanvasContext.class);\r
+////                                                                                   assert openedCanvas != null;\r
+////                                                                                   IDiagram diagram = (IDiagram) part.getAdapter(IDiagram.class);\r
+////                                                                                   assert diagram != null;\r
+//                                            // Disable automatic-zoom-to-fit\r
+////                                                                                   diagram.removeHint(DiagramHints.KEY_INITIAL_ZOOM_TO_FIT);\r
+////                                                                                   ThreadUtils.asyncExec(openedCanvas.getThreadAccess(),\r
+////                                                                                                   elementSelectorZoomer(openedCanvas, Collections.singleton((Object) target), false));\r
+//                                        }\r
+//                                    }));\r
+\r
+\r
+\r
+//                                                     System.out.println("LinkBrowsingHandler3");\r
+//\r
+//                                                     if (!thisDiagram.equals(otherDiagram)) {\r
+//\r
+//                                                             System.out.println("LinkBrowsingHandler4");\r
+//\r
+//                                                             // Find the structural path\r
+//                                                             Resource ownerComposite = graph.getPossibleObject(otherDiagram, mr.DiagramToComposite);\r
+//                                                             if (ownerComposite == null)\r
+//                                                                     return;\r
+//\r
+//                                                             Collection<ResourceArray> inputs = ComponentUtils.formInputs(graph, ownerComposite);\r
+//\r
+//\r
+//                                                             for (final ResourceArray input : inputs) {\r
+//                                                             }\r
+//                                                     }\r
+//                                                     return;\r
+\r
+                        }\r
+\r
+                        return;\r
+\r
+                    }\r
+\r
+                });\r
+\r
+\r
+            }\r
+\r
+        }\r
+        return false;\r
+    }\r
+\r
+}
\ No newline at end of file