*******************************************************************************/\r
package org.simantics.processeditor.views;\r
\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.eclipse.jface.action.Action;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.ISelectionChangedListener;\r
import org.eclipse.jface.viewers.SelectionChangedEvent;\r
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;\r
import org.simantics.db.Graph;\r
import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.EntityFactory;\r
import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.Property;\r
-import org.simantics.processeditor.Activator;\r
import org.simantics.processeditor.ProcessResource;\r
+import org.simantics.processeditor.actions.ConfigureFloorAction;\r
import org.simantics.processeditor.actions.InsertComponentAction;\r
import org.simantics.processeditor.actions.InsertEquipmentAction;\r
import org.simantics.processeditor.actions.InsertNozzleAction;\r
import org.simantics.processeditor.actions.RoutePipeAction;\r
+import org.simantics.processeditor.adapters.ProcessEditorAdapter;\r
+import org.simantics.processeditor.adapters.ProcessEditorSelectionAdapter;\r
import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipingRules;\r
-import org.simantics.processeditor.dialogs.FloorConfigureDialog;\r
-import org.simantics.processeditor.scenegraph.NonVisibleNode;\r
-import org.simantics.processeditor.scenegraph.PipeComponentNode;\r
-import org.simantics.processeditor.scenegraph.PipeRunNode;\r
-import org.simantics.processeditor.scenegraph.PipelineComponentNode;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
import org.simantics.processeditor.stubs.Plant;\r
-import org.simantics.processeditor.stubs.Plant3DResource;\r
import org.simantics.processeditor.tools.PlantEditContribution;\r
import org.simantics.processeditor.tools.PlantVisualizationContribution;\r
import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
import org.simantics.proconf.g3d.base.ScenegraphAdapter;\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapterImpl;\r
import org.simantics.proconf.g3d.base.SelectionAdapter;\r
import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
-import org.simantics.proconf.g3d.scenegraph.ParameterizedModelNode;\r
import org.simantics.proconf.g3d.shapes.FloorShape;\r
import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.utils.ui.ErrorLogger;\r
import org.simantics.utils.ui.jface.MenuTools;\r
\r
import com.jme.math.Vector3f;\r
\r
private Resource plantResource = null;\r
\r
- private Action configureFloorAction = null;\r
+ private ConfigureFloorAction configureFloorAction = null;\r
\r
private Geometry floorShape = null;\r
\r
\r
@Override\r
protected ScenegraphAdapter createScenegraphAdapter() {\r
- return new ProcessEditorAdapter(session,getRenderingComponent());\r
+ return new ProcessEditorAdapter(this,session,getRenderingComponent());\r
}\r
\r
@Override\r
floorShape = FloorShape.getShape(getRenderingComponent().getDisplaySystem().getRenderer(), 100.f,0.2f);\r
getRenderingComponent().getNoCastRoot().attachChild(floorShape);\r
floorShape.setLocalTranslation(new Vector3f(0.f,-0.01f,0.f));\r
+ configureFloorAction.setFloorShape(floorShape);\r
}\r
\r
@Override\r
\r
//actions.add(new ShowTrendsAction(this));\r
\r
- configureFloorAction = new Action() {\r
- public void run() {\r
- FloorConfigureDialog dialog = new FloorConfigureDialog(ProcessEditor.this.parent.getShell());\r
- if (dialog.open() == FloorConfigureDialog.CANCEL)\r
- return;\r
- if (dialog.isFloorEnabled()) {\r
- if (floorShape.getParent() == null)\r
- getRenderingComponent().getNoCastRoot().attachChild(floorShape);\r
- } else {\r
- floorShape.removeFromParent();\r
- }\r
- floorShape.setLocalTranslation(new Vector3f(0.f,(float)dialog.getFloorHeight(),0.f));\r
- \r
- }\r
- };\r
- configureFloorAction.setText("Configure floor");\r
- configureFloorAction.setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/shape_align_bottom.png"));\r
+ configureFloorAction = new ConfigureFloorAction(this);\r
\r
// ContextActionFactory extended[] = ContextActionRegistry.getActions("fi.vtt.proconf.shapeeditor.processeditorview");\r
// for (ContextActionFactory c : extended) {\r
MenuTools.getOrCreate(getMenuID(),"Advanced", menuManager).add(configureFloorAction);\r
}\r
\r
- protected class ProcessEditorAdapter extends ScenegraphAdapterImpl {\r
- \r
- public ProcessEditorAdapter(Session session, JmeRenderingComponent component) {\r
- super(session, component);\r
- }\r
- \r
- private class NormalScenegraphQuery extends ScenegraphQuery {\r
- \r
- public NormalScenegraphQuery(Resource node) {\r
- super(node);\r
- } \r
- \r
- \r
- @Override\r
- public void shapeAdded(Graph graph, IGraphicsNode node) {\r
- // FIXME : this won't work like in previous ProConf\r
- }\r
- }\r
- \r
- private Map<Resource,PipeRunControlPointQuery> pipeRunQueries = new HashMap<Resource, PipeRunControlPointQuery>();\r
-\r
- protected ScenegraphQuery newSubnodeListener(G3DNode node) {\r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.PipeRun)) {\r
- PipeRunControlPointQuery query = new PipeRunControlPointQuery(node.getResource());\r
- pipeRunQueries.put(node.getResource(), query);\r
- node.getGraph().performQuery(query);\r
- }\r
- return new NormalScenegraphQuery(node.getResource());\r
- \r
- }\r
- \r
- @Override\r
- protected NodePropertyQuery newRootPropertyListener(G3DNode root) {\r
- // currently Plant does not have any properties.\r
- return null;\r
- }\r
- \r
- private class TransformationQuery extends NodeTransformationQuery {\r
- \r
- public TransformationQuery(Resource res) {\r
- super(res);\r
- }\r
- \r
- @Override\r
- public void shapeUpdated(Graph graph, IGraphicsNode shape) {\r
- //if (shape instanceof IGeometryNode) {\r
- // updateGeometry((IGeometryNode)shape);\r
- //} else {\r
- shape.updateTransform(graph);\r
- //}\r
- }\r
- }\r
- \r
- @Override\r
- protected NodeTransformationQuery newTransformationListener(G3DNode root) {\r
- return new TransformationQuery(root.getResource());\r
- }\r
- \r
- private class NormalNodePropertyQuery extends org.simantics.proconf.g3d.base.ScenegraphAdapterImpl.NodePropertyQuery {\r
- \r
- public NormalNodePropertyQuery(Resource resource) {\r
- super(resource);\r
- }\r
-\r
- @Override\r
- public void shapeUpdated(Graph graph,IGraphicsNode shape) {\r
- if (shape instanceof IGeometryNode) {\r
- updateGeometry((IGeometryNode)shape);\r
- } else {\r
- shape.updateTransform(graph);\r
- }\r
- }\r
- }\r
- @Override\r
- protected NodePropertyQuery newPropertyListener(G3DNode node) {\r
- return new NormalNodePropertyQuery(node.getResource());\r
- }\r
- \r
- @Override\r
- protected IGraphicsNode instantiateNode(IGraphicsNode parent,\r
- G3DNode node) {\r
- Plant3DResource p3r = ProcessResource.plant3Dresource;\r
- IGraphicsNode newNode = null;\r
- try {\r
- if (node.isInstanceOf(p3r.Equipment)) {\r
- newNode = new ParameterizedModelNode(\r
- ProcessEditor.this, parent, node.getGraph(),\r
- node.getResource(), p3r.HasGraphics);\r
- } else if (node.isInstanceOf(p3r.PipeRun)) {\r
- newNode = new PipeRunNode(parent, node.getGraph(), node.getResource());\r
- } else if (node.isInstanceOf(p3r.Nozzle)) {\r
- newNode = new ParameterizedModelNode(\r
- ProcessEditor.this, parent, node.getGraph(),\r
- node.getResource(), p3r.HasGraphics);\r
- // CodedComponent must be handled first since it uses\r
- // hard-coded geometries\r
- // TODO : is this really necessary, or could we unify\r
- // PipeComponentNode, InlineComponentNode,...\r
- } else if (node.isInstanceOf(p3r.CodedComponent)) {\r
- newNode = new PipeComponentNode(ProcessEditor.this,\r
- parent, node.getGraph(), node.getResource());\r
- } else if (node.isInstanceOf(p3r.NonVisibleComponent)) {\r
- newNode = new NonVisibleNode(parent, node.getGraph(), node.getResource());\r
- } else if (node.isInstanceOf(p3r.PipelineComponent)) {\r
- newNode = new PipelineComponentNode(ProcessEditor.this,\r
- parent, node.getGraph(), node.getResource());\r
- } \r
-\r
- // } else if (node instanceof Shape) // Markers (ar/mobile)\r
- // needed this\r
- // newNode = new ShapeNode(TestProcessEditor.this,parent,node);\r
- if (newNode != null) {\r
- if (newNode instanceof ISelectableNode)\r
- ((ISelectableNode) newNode).setVisible(true);\r
- if (newNode instanceof IGeometryNode) {\r
- updateGeometry((IGeometryNode) newNode);\r
- }\r
- return newNode;\r
- }\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError("Cannot handle node " + node.getResource(), e);\r
- return null;\r
- }\r
- ErrorLogger.defaultLogError("Cannot handle node " + node.getResource(), null);\r
- return null;\r
-\r
- }\r
-\r
- /**\r
- * This is used to create elbows and straight pipes to pipeline TODO :\r
- * this should be done with rule-engine!\r
- * \r
- * \r
- * @author Marko Luukkainen\r
- * \r
- */\r
- protected class PipeRunControlPointQuery extends NodeQuery {\r
- private List<Resource> removed = new ArrayList<Resource>();\r
- private List<Resource> added = new ArrayList<Resource>();\r
-\r
- public PipeRunControlPointQuery(Resource r) {\r
- super(r);\r
- if (DEBUG) System.out.println("Created PipeRunControlPointQuery for " + r);\r
-\r
- }\r
-\r
- @Override\r
- protected Object compute2(Graph graph) {\r
- PipeRun run = new PipeRun(graph, nodeResource);\r
- Collection<IEntity> cps = run\r
- .getRelatedObjects(ProcessResource.plant3Dresource.HasControlPoints);\r
- List<Resource> res = new ArrayList<Resource>();\r
- for (IEntity t : cps)\r
- res.add(t.getResource());\r
- return res;\r
- }\r
-\r
- @Override\r
- public boolean updated(Graph graph, Object oldResult,\r
- Object newResult) {\r
- \r
- removed.clear();\r
- added.clear();\r
-\r
- List<Resource> oldCps = (List<Resource>) oldResult;\r
- List<Resource> newCps = (List<Resource>) newResult;\r
- if (oldCps == null)\r
- oldCps = new ArrayList<Resource>();\r
-\r
- for (Resource r : oldCps) {\r
- if (!newCps.contains(r))\r
- removed.add(r);\r
- }\r
-\r
- for (Resource r : newCps) {\r
- if (!oldCps.contains(r))\r
- added.add(r);\r
- }\r
- for (Resource r : removed)\r
- removeControlPoint(graph, r);\r
- for (Resource r : added) {\r
- addControlPoint(graph, r);\r
- // ControlPointTools.addControlPoint(new\r
- // PipeRun(graph,pipeRun), new PipeControlPoint(graph, r));\r
- }\r
-\r
- return (added.size() > 0 || removed.size() > 0);\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- super.dispose();\r
- for (ControlPointPropertyQuery q : controlPointPropertyQueries.values())\r
- q.dispose();\r
- controlPointPropertyQueries.clear();\r
- }\r
- \r
- private Map<Resource,ControlPointPropertyQuery> controlPointPropertyQueries = new HashMap<Resource, ControlPointPropertyQuery>();\r
- \r
- private void addControlPoint(Graph graph, Resource resource) {\r
- ControlPointPropertyQuery query = new ControlPointPropertyQuery(resource);\r
- graph.performQuery(query);\r
- controlPointPropertyQueries.put(resource,query);\r
- }\r
- \r
- private void removeControlPoint(Graph graph, Resource resource) {\r
- ControlPointPropertyQuery query = controlPointPropertyQueries.remove(resource);\r
- query.dispose();\r
- ControlPointTools.removeControlPoint(new PipeControlPoint(\r
- graph, resource));\r
- }\r
-\r
- }\r
\r
- protected class ControlPointPropertyQuery extends NodeQuery {\r
- boolean initialized = false;\r
- \r
- public ControlPointPropertyQuery(Resource r) {\r
- super(r);\r
- if (DEBUG) System.out.println("Created ControlPointPropertyQuery for " + r);\r
- }\r
- \r
- @Override\r
- public List<Object> compute2(Graph g) {\r
- IEntity t = EntityFactory.create(g,nodeResource);\r
- \r
- Collection<Property> properties = t.getRelatedProperties(ProcessResource.builtins.HasProperty);\r
- List<Object> propertyValues = new ArrayList<Object>();\r
- p(properties,propertyValues);\r
-\r
- return propertyValues;\r
- }\r
- \r
- private void p(Collection<Property> properties, List<Object> propertyValues) {\r
- for (Property p : properties) {\r
- Collection<Property> subProperties = p.getRelatedProperties(p.getGraph().getBuiltins().HasProperty);\r
- if (subProperties.size() != 0) {\r
- p(subProperties,propertyValues);\r
- } \r
- if (p.hasValue()){\r
- propertyValues.add(p.getValue());\r
- }\r
- }\r
- }\r
- \r
- @Override\r
- public boolean updated(Graph graph, Object oldResult, Object newResult) {\r
- PipingRules.pipeControlPointPositionUpdate(graph, this.nodeResource);\r
- if (initialized) {\r
- //PipingRules.pipeControlPointPositionUpdate(graph, this.nodeResource);\r
- } else {\r
- initialized = true;\r
- }\r
- return true;\r
- }\r
- }\r
- \r
- @Override\r
- protected void removeNode(Resource parent, Resource r) {\r
- super.removeNode(parent, r);\r
- PipeRunControlPointQuery q = pipeRunQueries.get(r);\r
- if (q != null)\r
- q.dispose();\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- super.dispose();\r
- }\r
- }\r
- \r
@Override\r
protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
- if (!(selection instanceof StructuredResourceSelection)) {\r
- return;\r
- }\r
- \r
- StructuredResourceSelection s = (StructuredResourceSelection) selection;\r
+ StructuredResourceSelection s = SelectionAdapter.transformSelection(selection);\r
+\r
selectionAdapter.setCurrentSelection(s);\r
viewChanged = true;\r
- \r
- //if (s.getRootSelection() == null) {\r
- if (!(part instanceof ProcessEditor)) {\r
- //System.out.println("ShapeEditorView.pageSelectionChanged() no root selection");\r
- ((ProcessEditorSelectionAdapter)selectionAdapter).setEditorSelection(true);\r
- return;\r
+\r
+ /*\r
+ if (part instanceof ProcessEditor) {\r
+ ProcessEditor sender = (ProcessEditor)part;\r
+ if (!sender.getPlantResource().equals(plantResource)) {\r
+ selectionAdapter.setCurrentSelection(new StructuredResourceSelection());\r
+ selectionAdapter.setEditorSelection();\r
+ return;\r
+ }\r
} \r
- //if (!s.getRootSelection().getResource().getId().equals(plant.getResource().getId())) {\r
- ProcessEditor sender = (ProcessEditor)part;\r
- if (!sender.getPlantResource().equals(plantResource)) {\r
-// System.out.println("ShapeEditorView.pageSelectionChanged() not right group "\r
-// + s.getRootSelection().getResource().getId() + " != " + model.getResource().getId());\r
- selectionAdapter.setCurrentSelection(new StructuredResourceSelection());\r
- ((ProcessEditorSelectionAdapter)selectionAdapter).setEditorSelection(false);\r
- return;\r
- }\r
+ */\r
+ \r
selectionAdapter.setEditorSelection();\r
\r
}\r
protected SelectionAdapter createSelectionAdapter() {\r
return new ProcessEditorSelectionAdapter(adapter);\r
}\r
- \r
- protected class ProcessEditorSelectionAdapter extends SelectionAdapter {\r
- \r
- \r
- public ProcessEditorSelectionAdapter(ScenegraphAdapter adapter) {\r
- super(adapter);\r
- }\r
-\r
- @Override\r
- public void setEditorSelection() {\r
- List<IGraphicsNode> sel = getSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes())\r
- if (o instanceof ISelectableNode) {\r
- if (sel.contains(o)) {\r
- ((ISelectableNode)o).setSelected(true);\r
- } else {\r
- ((ISelectableNode)o).setSelected(false);\r
- }\r
- }\r
- }\r
- \r
- public void setEditorSelection(boolean addShapes) {\r
\r
- List<IGraphicsNode> sel = getSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes())\r
- if (o instanceof ISelectableNode) {\r
- if (sel.contains(o)) {\r
- ((ISelectableNode)o).setSelected(true);\r
- } else {\r
- ((ISelectableNode)o).setSelected(false);\r
- }\r
- }\r
- }\r
-\r
- @Override\r
- protected void setEditorHighlightSelection() {\r
- List<IGraphicsNode> sel = getInteractiveSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes())\r
- if (o instanceof ISelectableNode) {\r
- if (sel.contains(o)) {\r
- ((ISelectableNode)o).setHighlighted(true);\r
- } else {\r
- ((ISelectableNode)o).setHighlighted(false);\r
- }\r
- }\r
- }\r
- }\r
- \r
@Override\r
protected void hookDragAndDrop() {\r
super.hookDragAndDrop();\r
});\r
}\r
});\r
- \r
- \r
- \r
+\r
return page;\r
}\r
return null;\r