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