]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - dev/org.simantics.proconf.processeditor/src/fi/vtt/simantics/processeditor/actions/InsertNozzleAction.java
latest release (0.41)
[simantics/3d.git] / dev / org.simantics.proconf.processeditor / src / fi / vtt / simantics / processeditor / actions / InsertNozzleAction.java
diff --git a/dev/org.simantics.proconf.processeditor/src/fi/vtt/simantics/processeditor/actions/InsertNozzleAction.java b/dev/org.simantics.proconf.processeditor/src/fi/vtt/simantics/processeditor/actions/InsertNozzleAction.java
new file mode 100644 (file)
index 0000000..91733ab
--- /dev/null
@@ -0,0 +1,139 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.\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 fi.vtt.simantics.processeditor.actions;\r
+\r
+import java.util.List;\r
+\r
+import org.simantics.db.Graph;\r
+import org.simantics.db.GraphRequestAdapter;\r
+import org.simantics.db.GraphRequestStatus;\r
+import org.simantics.db.GraphRequestWithResult;\r
+import org.simantics.db.Resource;\r
+import org.simantics.layer0.utils.EntityFactory;\r
+import org.simantics.layer0.utils.IEntity;\r
+import org.simantics.layer0.utils.instantiation.Instance;\r
+import org.simantics.layer0.utils.instantiation.InstanceFactory;\r
+import org.simantics.proconf.g3d.actions.WriteAction;\r
+import org.simantics.proconf.g3d.base.G3DAPI;\r
+import org.simantics.proconf.g3d.base.G3DTools;\r
+import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
+import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
+import org.simantics.proconf.g3d.dnd.DropListener;\r
+\r
+import fi.vtt.simantics.processeditor.Activator;\r
+import fi.vtt.simantics.processeditor.ProcessResource;\r
+import fi.vtt.simantics.processeditor.common.PipingTools2;\r
+import fi.vtt.simantics.processeditor.dialogs.NozzleDialog;\r
+import fi.vtt.simantics.processeditor.stubs.Equipment;\r
+import fi.vtt.simantics.processeditor.stubs.Nozzle;\r
+\r
+\r
+\r
+public class InsertNozzleAction extends WriteAction implements DropListener {\r
+\r
+    Resource equipmentResource = null;\r
+    Resource nozzleType = null;\r
+    \r
+    public InsertNozzleAction(ThreeDimensionalEditorBase parent) {\r
+        super(parent,false);\r
+    }\r
+\r
+    @Override\r
+    public boolean canActivate() {\r
+       NozzleDialog dialog = new NozzleDialog(parent.getRenderingComposite().getShell(),"Select a nozzle", parent.getSession());\r
+       if (dialog.open() == NozzleDialog.CANCEL) {\r
+             equipmentResource = null;\r
+             return false;\r
+        }\r
+       Resource type = dialog.getComboValue();\r
+       if (type == null) {\r
+               equipmentResource = null;\r
+               return false;\r
+       }\r
+       nozzleType = type;      \r
+        return true;\r
+    }\r
+    \r
+    @Override\r
+    public GraphRequestStatus doChanges(Graph graph) throws Exception {\r
+       createNozzle(graph);\r
+       return GraphRequestStatus.transactionComplete();\r
+    }\r
+    \r
+    private void createNozzle(Graph graph) {\r
+       assert(nozzleType != null);\r
+       assert(equipmentResource != null);\r
+\r
+       Nozzle n = PipingTools2.instantiateNozzle(graph, nozzleType);\r
+       \r
+       Equipment equipment = new Equipment(graph, equipmentResource);\r
+       \r
+       G3DAPI.addNodeLocal(equipment,ProcessResource.plant3Dresource.HasNozzle, n);\r
+        //parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(n.getResource()));        \r
+        equipment = null;\r
+    }\r
+    \r
+    public boolean usable(Graph graph, List<Resource> resources) {\r
+        if (resources.size() != 1) {\r
+            return false;\r
+        }\r
+        Resource r = resources.iterator().next();\r
+        IEntity t = EntityFactory.create(graph,r);\r
+        if (t.isInstanceOf(ProcessResource.plant3Dresource.Equipment)) {\r
+            equipmentResource = r;\r
+            return true;\r
+        }\r
+        return false;\r
+    }\r
+    \r
+    @Override\r
+    public void init() {\r
+        setText("Insert Nozzle");\r
+        this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Nozzle.png"));\r
+    }\r
+    \r
+    public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) {\r
+               if(s.size() != 1)\r
+                       return false;\r
+               if (ids == null)\r
+                       return false;\r
+               if (ids.length != 1)\r
+                       return false;\r
+               final Resource r = ids[0];\r
+               final Resource selectedResource = s.iterator().next();\r
+               GraphRequestWithResult<Boolean> query = new GraphRequestWithResult<Boolean>() {\r
+                       @Override\r
+                       public Boolean performWithResult(Graph g) throws Exception {\r
+                               IEntity t = EntityFactory.create(g,r);\r
+                               if (!t.isInheritedFrom(ProcessResource.plant3Dresource.Nozzle))\r
+                                       return false;\r
+                               t = EntityFactory.create(g,selectedResource);\r
+                               if (t.isInstanceOf(ProcessResource.plant3Dresource.Equipment)) {\r
+                                       return true;\r
+                               }\r
+                               return false;\r
+                       }\r
+               };\r
+               parent.getSession().syncRead(query);\r
+               return query.getResult();\r
+       }\r
+    \r
+    public void doDrop(StructuredResourceSelection s, Resource[] ids) {\r
+       equipmentResource = s.iterator().next();\r
+       parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
+               @Override\r
+               public GraphRequestStatus perform(Graph g) throws Exception {\r
+                       createNozzle(g);\r
+                       return GraphRequestStatus.transactionComplete();\r
+               }\r
+       });\r
+    }\r
+}\r