]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/editor/P3DContentOutlinePage.java
Merge "Additional SCL Bindings to G3D and Plant3D classes"
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / editor / P3DContentOutlinePage.java
1 package org.simantics.plant3d.editor;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.eclipse.jface.action.IMenuListener;
7 import org.eclipse.jface.action.IMenuManager;
8 import org.eclipse.jface.action.MenuManager;
9 import org.eclipse.jface.resource.JFaceResources;
10 import org.eclipse.jface.resource.LocalResourceManager;
11 import org.eclipse.jface.viewers.TreeViewer;
12 import org.eclipse.swt.events.MenuDetectEvent;
13 import org.eclipse.swt.events.MenuDetectListener;
14 import org.eclipse.swt.graphics.Image;
15 import org.eclipse.swt.widgets.Menu;
16 import org.simantics.db.Resource;
17 import org.simantics.g3d.scenegraph.base.INode;
18 import org.simantics.g3d.scenegraph.base.ParentNode;
19 import org.simantics.g3d.vtk.common.NodeSelectionProvider2;
20 import org.simantics.g3d.vtk.common.VTKContentOutlinePage;
21 import org.simantics.plant3d.Activator;
22 import org.simantics.plant3d.scenegraph.EndComponent;
23 import org.simantics.plant3d.scenegraph.Equipment;
24 import org.simantics.plant3d.scenegraph.Nozzle;
25 import org.simantics.plant3d.scenegraph.P3DRootNode;
26 import org.simantics.plant3d.scenegraph.PipeRun;
27 import org.simantics.plant3d.scenegraph.PipelineComponent;
28 import org.simantics.plant3d.scenegraph.TurnComponent;
29 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
30
31 public class P3DContentOutlinePage extends VTKContentOutlinePage<Resource, Object>{
32         
33         private static final boolean DEBUG = true;
34         protected Menu contextMenu;
35         
36         private LocalResourceManager manager = new LocalResourceManager(JFaceResources.getResources());
37         
38         private Image nozzleImage;
39         private Image pipeImage;
40         private Image tankImage;
41         private Image elbowImage;
42         private Image componentImage;
43         
44         public  P3DContentOutlinePage(ParentNode<? extends INode> rootNode, NodeSelectionProvider2<Resource,Object> provider) {
45                 super(rootNode,provider);
46                 
47                 nozzleImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Nozzle.png"));
48                 pipeImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Straight.png"));
49                 tankImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/tank.png"));
50                 elbowImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Elbow.png"));
51                 componentImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Component.png"));
52         }
53         
54         @Override
55         protected void createProviders(TreeViewer viewer) {
56                 viewer.setContentProvider(new ScenegraphContentProvider() {
57                         @Override
58                         public Object[] getChildren(Object parentElement) {
59                                 if (parentElement instanceof P3DRootNode) {
60                                         return ((P3DRootNode)parentElement).getChild().toArray();
61                                 }
62                                 if (parentElement instanceof PipeRun) {
63                                     if (DEBUG) {
64                                         List<Object> list = new ArrayList<Object>();
65                                         list.addAll(((PipeRun)parentElement).getControlPoints());
66                                         list.addAll(((PipeRun)parentElement).getSortedChild());
67                                         return list.toArray();
68                                     }
69                                     return ((PipeRun)parentElement).getSortedChild().toArray();
70                 }
71                                 if (DEBUG) {
72                                         if (parentElement instanceof PipelineComponent) {
73                                                 return new Object[]{((PipelineComponent) parentElement).getControlPoint()};
74                                         } else if (parentElement instanceof PipeControlPoint) {
75                                                 PipeControlPoint pcp = (PipeControlPoint) parentElement;
76                                                 Object arr[] = new Object[pcp.children.size()+1];
77                                                 arr[0] = pcp.getPipelineComponent();
78                                                 for (int i = 0; i < pcp.children.size();i++) {
79                                                         arr[i+1] = pcp.children.get(i);
80                                                 }
81                                                 return arr;
82                                         }
83                                 }
84                                 return super.getChildren(parentElement);
85                         }
86                         
87                         @Override
88                         public boolean hasChildren(Object element) {
89                                 if (element instanceof P3DRootNode) {
90                                         return ((P3DRootNode)element).getChild().size() > 0;
91                                 }
92                                 if (!DEBUG) {
93                                         if (element instanceof PipeRun) {
94                                                 return ((PipeRun)element).getChild().size() > 0;
95                                         }
96                                 } else {
97                                         if (element instanceof PipelineComponent) {
98                                                 return ((PipelineComponent) element).getControlPoint() != null;
99                                         } else if (element instanceof PipeControlPoint) {
100                                                 return ((PipeControlPoint) element).getPipelineComponent() != null;
101                                         }
102                                 }
103                                 return super.hasChildren(element);
104                         }
105                 });
106                 viewer.setLabelProvider(new P3DLabelProvider());
107                 
108                 hookContextMenu(viewer);
109                 viewer.getTree().addMenuDetectListener(new MenuDetectListener() {
110
111                         @Override
112                         public void menuDetected(MenuDetectEvent e) {
113                                 contextMenu.setLocation(e.x, e.y);
114                                 contextMenu.setVisible(true);
115                         }
116                 });
117                 
118         }
119         
120         @Override
121         public void dispose() {
122                 manager.dispose();
123                 super.dispose();
124         }
125         
126         protected void hookContextMenu(TreeViewer viewer) {
127         MenuManager menuMgr = new MenuManager("#PopupMenu");
128         menuMgr.setRemoveAllWhenShown(true);
129         menuMgr.addMenuListener(new IMenuListener() {
130             public void menuAboutToShow(IMenuManager manager) {
131                 createContextMenu(manager);
132             }
133         });
134         contextMenu = menuMgr.createContextMenu(viewer.getTree());
135         }
136         
137         protected void createContextMenu(IMenuManager manager) {
138                 
139         }
140
141         private class P3DLabelProvider extends ScenegraphLabelProvider {
142                 @Override
143                 public Image getImage(Object element) {
144                         if (element instanceof PipelineComponent) {
145                                 PipelineComponent comp = (PipelineComponent)element;
146                                 if (comp instanceof TurnComponent) {
147                                         return elbowImage;
148                                 } else if (comp instanceof EndComponent) {
149                                         return componentImage;
150                                 } else if (comp instanceof Nozzle) {
151                                         return nozzleImage;
152                                 } else if (comp.getControlPoint().isFixed()) {
153                                         return componentImage;
154                                 }
155                                 return pipeImage;
156                         } else if (element instanceof Equipment) {
157                                 return tankImage;
158                         } else if (element instanceof PipeRun) {
159                                 return pipeImage;
160                         }
161                         return null;
162                 }
163         }
164 }