--- /dev/null
+/*******************************************************************************\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