--- /dev/null
+package org.simantics.modeling.ui.actions;\r
+\r
+import java.awt.geom.Point2D;\r
+\r
+import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.handlers.HandlerUtil;\r
+import org.eclipse.ui.part.MultiPageEditorPart;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.ResourceArray;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.utils.OrderedSetUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.diagram.stubs.G2DResource;\r
+import org.simantics.diagram.synchronization.graph.AddElement;\r
+import org.simantics.g2d.canvas.ICanvasContext;\r
+import org.simantics.g2d.participant.MouseUtil;\r
+import org.simantics.g2d.participant.MouseUtil.MouseInfo;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.layer0.utils.direct.GraphUtils;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.ui.SimanticsUI;\r
+import org.simantics.ui.workbench.IResourceEditorInput;\r
+import org.simantics.ui.workbench.ResourceEditorInput;\r
+\r
+/**\r
+ * Base class for shape creation handlers of the symbol editor.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ */\r
+public abstract class CreateShapeHandler extends AbstractHandler {\r
+\r
+ public abstract String getDefaultElementData();\r
+\r
+ public Object addElement(final double mposX, final double mposY, final Resource composite) {\r
+ final String data = getDefaultElementData();\r
+ SimanticsUI.getSession().asyncRequest(new WriteRequest() {\r
+ @Override\r
+ public void perform(WriteGraph g) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(g);\r
+ DiagramResource dr = DiagramResource.getInstance(g);\r
+ G2DResource g2d = G2DResource.getInstance(g);\r
+ Resource svgElement = GraphUtils.create(g,\r
+ L0.InstanceOf, dr.SVGElement,\r
+ g2d.HasSVGDocument, data);\r
+ g.addLiteral(svgElement, dr.HasTransform, dr.IsTransformOf,\r
+ g2d.Transform,\r
+ new double[] {1.0, 0.0, 0.0, 1.0, mposX, mposY},\r
+ Bindings.DOUBLE_ARRAY);\r
+ OrderedSetUtils.add(g, composite, svgElement);\r
+ g.claim(composite, L0.ConsistsOf, svgElement);\r
+ AddElement.claimFreshElementName(g, composite, svgElement);\r
+ }\r
+ });\r
+\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public Object execute(ExecutionEvent event) throws ExecutionException {\r
+ IWorkbenchPart ap = HandlerUtil.getActivePart(event);\r
+ IEditorPart viewer = null;\r
+ if (ap instanceof MultiPageEditorPart) {\r
+ MultiPageEditorPart rfe = (MultiPageEditorPart) ap;\r
+ IResourceEditorInput in = (ResourceEditorInput) rfe.getEditorInput();\r
+ final ResourceArray ra = in.getResourceArray();\r
+ ResourceArray symbolEditorInput;\r
+ try {\r
+ symbolEditorInput = SimanticsUI.getSession().syncRequest(new Read<ResourceArray>() {\r
+ @Override\r
+ public ResourceArray perform(ReadGraph graph) throws DatabaseException {\r
+ StructuralResource2 sr = StructuralResource2.getInstance(graph);\r
+ ModelingResources mr = ModelingResources.getInstance(graph);\r
+ Resource symbol = graph.getPossibleObject(ra.resources[0], mr.ComponentTypeToSymbol);\r
+ Resource definedBy = symbol != null ? graph.getPossibleObject(symbol, sr.IsDefinedBy) : null;\r
+ ResourceArray result = definedBy != null ? new ResourceArray(definedBy) : ResourceArray.EMPTY;\r
+ return result;\r
+ }\r
+ });\r
+\r
+ IEditorPart[] eps = rfe.findEditors(new ResourceEditorInput("org.simantics.modeling.ui.symbolEditor", symbolEditorInput));\r
+ if (eps.length == 0) {\r
+ System.out.println("symbol editor part not found from multi page editor part: " + ap);\r
+ return null;\r
+ }\r
+ viewer = eps[0];\r
+ } catch (DatabaseException e) {\r
+ e.printStackTrace();\r
+ return null;\r
+ }\r
+ } else if (ap instanceof IEditorPart) {\r
+ viewer = (IEditorPart) ap;\r
+ } else {\r
+ return null;\r
+ }\r
+ ICanvasContext ctx = (ICanvasContext) viewer.getAdapter(ICanvasContext.class);\r
+ if (ctx == null) {\r
+ System.out.println("No canvas context");\r
+ return null;\r
+ }\r
+ MouseInfo minfo = ctx.getSingleItem(MouseUtil.class).getMousePressedInfo(0);\r
+ if(minfo == null) {\r
+ System.out.println("No mouse info");\r
+ return null;\r
+ }\r
+ final Point2D mpos = minfo.canvasPosition;\r
+ IResourceEditorInput input = (IResourceEditorInput)viewer.getEditorInput();\r
+ Resource composite = input.getResource();\r
+\r
+ return addElement(mpos.getX(), mpos.getY(), composite);\r
+ }\r
+\r
+}
\ No newline at end of file