--- /dev/null
+package org.simantics.plant3d.editor;
+
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Menu;
+import org.simantics.db.Resource;
+import org.simantics.g3d.scenegraph.base.INode;
+import org.simantics.g3d.scenegraph.base.ParentNode;
+import org.simantics.g3d.vtk.common.NodeSelectionProvider2;
+import org.simantics.g3d.vtk.common.VTKContentOutlinePage;
+import org.simantics.plant3d.Activator;
+import org.simantics.plant3d.scenegraph.EndComponent;
+import org.simantics.plant3d.scenegraph.Equipment;
+import org.simantics.plant3d.scenegraph.InlineComponent;
+import org.simantics.plant3d.scenegraph.Nozzle;
+import org.simantics.plant3d.scenegraph.P3DRootNode;
+import org.simantics.plant3d.scenegraph.PipeRun;
+import org.simantics.plant3d.scenegraph.PipelineComponent;
+import org.simantics.plant3d.scenegraph.TurnComponent;
+import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
+
+public class P3DContentOutlinePage extends VTKContentOutlinePage<Resource, Object>{
+
+ private static final boolean DEBUG = false;
+ protected Menu contextMenu;
+
+ private LocalResourceManager manager = new LocalResourceManager(JFaceResources.getResources());
+
+ private Image nozzleImage;
+ private Image pipeImage;
+ private Image tankImage;
+ private Image elbowImage;
+ private Image componentImage;
+
+ public P3DContentOutlinePage(ParentNode<? extends INode> rootNode, NodeSelectionProvider2<Resource,Object> provider) {
+ super(rootNode,provider);
+
+ nozzleImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Nozzle.png"));
+ pipeImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Straight.png"));
+ tankImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/tank.png"));
+ elbowImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Elbow.png"));
+ componentImage = manager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Component.png"));
+ }
+
+ @Override
+ protected void createProviders(TreeViewer viewer) {
+ viewer.setContentProvider(new ScenegraphContentProvider() {
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof P3DRootNode) {
+ return ((P3DRootNode)parentElement).getChild().toArray();
+ }
+ if (!DEBUG) {
+ if (parentElement instanceof PipeRun) {
+ return ((PipeRun)parentElement).getSortedChild().toArray();
+ }
+ } else {
+ if (parentElement instanceof PipelineComponent) {
+ return new Object[]{((PipelineComponent) parentElement).getControlPoint()};
+ } else if (parentElement instanceof PipeControlPoint) {
+ return new Object[]{((PipeControlPoint) parentElement).getPipelineComponent()};
+ }
+ }
+ return super.getChildren(parentElement);
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ if (element instanceof P3DRootNode) {
+ return ((P3DRootNode)element).getChild().size() > 0;
+ }
+ if (!DEBUG) {
+ if (element instanceof PipeRun) {
+ return ((PipeRun)element).getChild().size() > 0;
+ }
+ } else {
+ if (element instanceof PipelineComponent) {
+ return ((PipelineComponent) element).getControlPoint() != null;
+ } else if (element instanceof PipeControlPoint) {
+ return ((PipeControlPoint) element).getPipelineComponent() != null;
+ }
+ }
+ return super.hasChildren(element);
+ }
+ });
+ viewer.setLabelProvider(new P3DLabelProvider());
+
+ hookContextMenu(viewer);
+ viewer.getTree().addMenuDetectListener(new MenuDetectListener() {
+
+ @Override
+ public void menuDetected(MenuDetectEvent e) {
+ contextMenu.setLocation(e.x, e.y);
+ contextMenu.setVisible(true);
+ }
+ });
+
+ }
+
+ @Override
+ public void dispose() {
+ manager.dispose();
+ super.dispose();
+ }
+
+ protected void hookContextMenu(TreeViewer viewer) {
+ MenuManager menuMgr = new MenuManager("#PopupMenu");
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ createContextMenu(manager);
+ }
+ });
+ contextMenu = menuMgr.createContextMenu(viewer.getTree());
+ }
+
+ protected void createContextMenu(IMenuManager manager) {
+
+ }
+
+ private class P3DLabelProvider extends ScenegraphLabelProvider {
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof PipelineComponent) {
+ PipelineComponent comp = (PipelineComponent)element;
+ if (comp instanceof TurnComponent) {
+ return elbowImage;
+ } else if (comp instanceof EndComponent) {
+ return componentImage;
+ } else if (comp instanceof Nozzle) {
+ return nozzleImage;
+ } else if (comp.getControlPoint().isFixed()) {
+ return componentImage;
+ }
+ return pipeImage;
+ } else if (element instanceof Equipment) {
+ return tankImage;
+ } else if (element instanceof PipeRun) {
+ return pipeImage;
+ }
+ return null;
+ }
+ }
+}