]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d.csg/src/org/simantics/g3d/csg/editor/CSGEditor2.java
Using SWT thread with Plant3d
[simantics/3d.git] / org.simantics.g3d.csg / src / org / simantics / g3d / csg / editor / CSGEditor2.java
index 8f5db6554a0808ffacf4d581c6a28352baa02f51..bed448737e623040ddf4ca9809f62e3d3135e3d5 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
- * Industry THTH ry.\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 org.simantics.g3d.csg.editor;\r
-\r
-import java.awt.Component;\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-\r
-import org.eclipse.jface.action.IMenuListener;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.MenuManager;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.DisposeEvent;\r
-import org.eclipse.swt.events.DisposeListener;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Menu;\r
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.common.request.ReadRequest;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.g3d.csg.actions.AddBooleanOpAction2;\r
-import org.simantics.g3d.csg.actions.AddPrimitiveAction2;\r
-import org.simantics.g3d.csg.actions.SplitBooleanOpAction2;\r
-import org.simantics.g3d.csg.scenegraph2.BarrelNode;\r
-import org.simantics.g3d.csg.scenegraph2.BoxNode;\r
-import org.simantics.g3d.csg.scenegraph2.CSGparentNode;\r
-import org.simantics.g3d.csg.scenegraph2.CSGrootNode;\r
-import org.simantics.g3d.csg.scenegraph2.ConeNode;\r
-import org.simantics.g3d.csg.scenegraph2.CylinderNode;\r
-import org.simantics.g3d.csg.scenegraph2.DifferenceNode;\r
-import org.simantics.g3d.csg.scenegraph2.EllipticCylinderNode;\r
-import org.simantics.g3d.csg.scenegraph2.ICSGnode;\r
-import org.simantics.g3d.csg.scenegraph2.IntersectionNode;\r
-import org.simantics.g3d.csg.scenegraph2.RectangularSolidNode;\r
-import org.simantics.g3d.csg.scenegraph2.RegularPrismNode;\r
-import org.simantics.g3d.csg.scenegraph2.SchemaBuilder;\r
-import org.simantics.g3d.csg.scenegraph2.SphereNode;\r
-import org.simantics.g3d.csg.scenegraph2.TorusNode;\r
-import org.simantics.g3d.csg.scenegraph2.UnionNode;\r
-import org.simantics.g3d.scenegraph.IG3DNode;\r
-import org.simantics.g3d.scenegraph.NodeMap;\r
-import org.simantics.g3d.scenegraph.base.INode;\r
-import org.simantics.g3d.vtk.action.RemoveAction;\r
-import org.simantics.g3d.vtk.action.RotateAction;\r
-import org.simantics.g3d.vtk.action.TranslateAction;\r
-import org.simantics.g3d.vtk.action.vtkCameraAndSelectorAction;\r
-import org.simantics.g3d.vtk.common.HoverHighlighter;\r
-import org.simantics.g3d.vtk.common.InteractiveVtkPanel;\r
-import org.simantics.g3d.vtk.common.NodeSelectionProvider2;\r
-import org.simantics.g3d.vtk.common.SelectionHighlighter;\r
-import org.simantics.g3d.vtk.common.VTKContentOutlinePage;\r
-import org.simantics.g3d.vtk.shape.vtkShape;\r
-import org.simantics.g3d.vtk.utils.vtkPanelUtil;\r
-import org.simantics.objmap.graph.IMapping;\r
-import org.simantics.objmap.graph.Mappings;\r
-import org.simantics.objmap.graph.schema.IMappingSchema;\r
-import org.simantics.selectionview.StandardPropertyPage;\r
-import org.simantics.ui.workbench.IPropertyPage;\r
-import org.simantics.ui.workbench.IResourceEditorInput;\r
-import org.simantics.ui.workbench.ResourceEditorPart;\r
-import org.simantics.utils.threads.AWTThread;\r
-import org.simantics.utils.threads.ThreadUtils;\r
-import org.simantics.utils.ui.ExceptionUtils;\r
-import org.simantics.utils.ui.SWTAWTComponent;\r
-\r
-import vtk.vtkActor;\r
-import vtk.vtkCameraPass;\r
-import vtk.vtkDefaultPass;\r
-import vtk.vtkLightsPass;\r
-import vtk.vtkRenderPassCollection;\r
-import vtk.vtkRenderer;\r
-import vtk.vtkSequencePass;\r
-\r
-public class CSGEditor2  extends ResourceEditorPart {\r
-       private Composite parent;\r
-       private Resource input;\r
-       private InteractiveVtkPanel panel;\r
-       private SWTAWTComponent component;\r
-       \r
-       private CSGrootNode rootNode;\r
-       private IMapping<Resource,Object> mapping;\r
-       \r
-       private NodeSelectionProvider2<Resource,Object> selectionProvider;\r
-       \r
-       private vtkCameraAndSelectorAction cameraAction;\r
-       private TranslateAction translateAction;\r
-       private RotateAction rotateAction;\r
-       private RemoveAction removeAction;\r
-       \r
-       //private  ScenegraphOutlinePage outlinePage;\r
-       \r
-       private CSGNodeMap nodeMap;\r
-\r
-\r
-\r
-       @Override\r
-       public void createPartControl(Composite parent) {\r
-               this.parent = parent;\r
-               parent.setLayout (new FillLayout ());\r
-               component = new SWTAWTComponent(parent,SWT.NONE) {\r
-                       \r
-                       @Override\r
-                       protected Component createSwingComponent() {\r
-                               if (panel == null) {\r
-                                       panel = new InteractiveVtkPanel();\r
-                                       vtkPanelUtil.registerPanel(panel);\r
-                                       createScene();\r
-                               }\r
-                               return panel;\r
-                       }\r
-               };\r
-\r
-               IResourceEditorInput rei = (IResourceEditorInput)getEditorInput();\r
-               input = rei.getResource();\r
-               \r
-               \r
-               //IActionBars actionBars = getEditorSite().getActionBars();\r
-\r
-               hookContextMenu();\r
-               \r
-               component.syncPopulate();\r
-               \r
-               panel.addMouseListener(new java.awt.event.MouseAdapter() {\r
-                       @Override\r
-                       public void mouseClicked(final java.awt.event.MouseEvent e) {\r
-                               if (e.getButton() == java.awt.event.MouseEvent.BUTTON3) {\r
-                                       Display.getDefault().asyncExec(new Runnable() {\r
-                                               public void run() {\r
-                                                       contextMenu.setLocation(e.getXOnScreen(), e.getYOnScreen());\r
-                                                       contextMenu.setVisible(true);\r
-                                               }\r
-                                       });\r
-                               }\r
-                       }\r
-               });\r
-               \r
-\r
-               cameraAction = new vtkCameraAndSelectorAction(panel);   \r
-               panel.setDefaultAction(cameraAction);\r
-               panel.useDefaultAction();\r
-               \r
-               try {\r
-                       getSession().syncRequest(new ReadRequest() {\r
-                               \r
-                               @SuppressWarnings({ "rawtypes", "unchecked" })\r
-                               @Override\r
-                               public void run(ReadGraph graph) throws DatabaseException {\r
-                                       IMappingSchema schema = SchemaBuilder.getSchema(graph);\r
-                                       mapping = Mappings.createWithListening(schema);\r
-                                       rootNode = (CSGrootNode)mapping.map(graph, input);\r
-                                       nodeMap = new CSGNodeMap(getSession(), mapping, panel,(CSGrootNode)rootNode);\r
-                               }\r
-                       });\r
-                       \r
-                       if (rootNode == null)\r
-                               throw new RuntimeException("Scenegraph loading failed.");\r
-                       populate();\r
-                       \r
-                       selectionProvider = new NodeSelectionProvider2<Resource,Object>(this,mapping,nodeMap);\r
-\r
-                       cameraAction.addSelectionChangedListener(selectionProvider);\r
-\r
-                       cameraAction.addHoverChangedListener(new HoverHighlighter(panel,nodeMap));\r
-                       selectionProvider.addSelectionChangedListener(new SelectionHighlighter(panel,nodeMap));\r
-                       \r
-                       getSite().setSelectionProvider(selectionProvider);\r
-                       getSite().getPage().addPostSelectionListener(selectionProvider);\r
-                       \r
-                       //outlinePage = new ScenegraphOutlinePage(rootNode);\r
-                       \r
-                       \r
-                       parent.addDisposeListener(new DisposeListener() {\r
-                               \r
-                               @Override\r
-                               public void widgetDisposed(DisposeEvent e) {\r
-                                       getSite().getPage().removePostSelectionListener(selectionProvider);\r
-                                       ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
-                                               \r
-                                               @Override\r
-                                               public void run() {\r
-                                                       nodeMap.delete();\r
-                                                       vtkPanelUtil.unregisterPanel(panel);\r
-\r
-                                               }\r
-                                       });\r
-                                       mapping.dispose();\r
-                                       component.dispose();\r
-                                       \r
-                                       \r
-                               }\r
-                       });\r
-               } catch (DatabaseException e1) {\r
-                       ExceptionUtils.logAndShowError("Cannot open CSG editor",e1);\r
-                       return;\r
-               }\r
-               \r
-               translateAction = new TranslateAction(panel,nodeMap);\r
-               rotateAction = new RotateAction(panel,nodeMap);\r
-               removeAction = new RemoveAction(nodeMap) {\r
-                       public void setNode(IG3DNode node) {\r
-                               super.setNode(node);\r
-                               if (node.getParent() instanceof CSGparentNode)\r
-                                       setEnabled(false);\r
-                               \r
-                       }\r
-               };\r
-               \r
-               \r
-       }\r
-       \r
-       \r
-\r
-       \r
-       public void populate() {\r
-               ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
-                       \r
-                       @Override\r
-                       public void run() {\r
-                               nodeMap.populate();\r
-                       }\r
-               });\r
-               \r
-       }\r
-       \r
-       \r
-       \r
-       @Override\r
-       public void setFocus() {\r
-               component.setFocus();\r
-       }\r
-       \r
-       private void createScene() {\r
-               vtkRenderer ren1 = panel.GetRenderer();\r
-               \r
-               boolean multiPass = false;\r
-               if (multiPass) {\r
-                       \r
-                       vtkLightsPass lightsPass = new vtkLightsPass();\r
-                       vtkDefaultPass defaultPass = new vtkDefaultPass();\r
-                       \r
-                       \r
-                       vtkRenderPassCollection passes = new vtkRenderPassCollection();\r
-                       passes.AddItem(lightsPass);\r
-                       passes.AddItem(defaultPass);\r
-                       \r
-                       vtkSequencePass seq = new vtkSequencePass();\r
-                       seq.SetPasses(passes);\r
-                       \r
-               \r
-                       \r
-                       vtkCameraPass cameraPass = new vtkCameraPass();\r
-                       cameraPass.SetDelegatePass(seq);\r
-                       \r
-                       ren1.SetPass(cameraPass);\r
-                       \r
-               }\r
-//             ren1.GetRenderWindow().LineSmoothingOn();\r
-//             ren1.GetRenderWindow().PointSmoothingOn();\r
-//             ren1.GetRenderWindow().PolygonSmoothingOn();\r
-//             ren1.GetRenderWindow().SetMultiSamples(2);\r
-\r
-               \r
-\r
-               ren1.SetBackground2(1,1,1); // background color white\r
-               ren1.SetBackground(0.9,0.9,0.9);\r
-               ren1.SetGradientBackground(true);\r
-\r
-          // vtkActor grid = vtkShape.createGridActor(8,1.0,1|2|4);\r
-           vtkActor grid = vtkShape.createGridActor(8,1.0, 2 );\r
-           grid.SetPickable(0);\r
-           ren1.AddActor(grid);\r
-           panel.addDeletable(grid);\r
-           \r
-\r
-               \r
-       }\r
-       \r
-       protected Menu contextMenu;\r
-       \r
-       protected void hookContextMenu() {\r
-        MenuManager menuMgr = new MenuManager("#PopupMenu");\r
-        menuMgr.setRemoveAllWhenShown(true);\r
-        menuMgr.addMenuListener(new IMenuListener() {\r
-            public void menuAboutToShow(IMenuManager manager) {\r
-               final IMenuManager m = manager;\r
-                       List<IG3DNode> selected = selectionProvider.getSelectedNodes();\r
-                       if (selected.size() == 0) {\r
-                               m.add(new AddPrimitiveAction2(rootNode, BarrelNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, BoxNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, ConeNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, CylinderNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, EllipticCylinderNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, RectangularSolidNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, RegularPrismNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, SphereNode.class));\r
-                               m.add(new AddPrimitiveAction2(rootNode, TorusNode.class));\r
-                       } else if (selected.size() == 1) {\r
-                               m.add(translateAction);\r
-                                       m.add(rotateAction);\r
-                                       m.add(removeAction);\r
-                                       ICSGnode node = (ICSGnode)selected.get(0);\r
-                                       translateAction.setNode(node);\r
-                                       rotateAction.setNode(node);\r
-                                       removeAction.setNode(node);\r
-                                       if (node instanceof CSGparentNode) {\r
-                                               m.add(new SplitBooleanOpAction2(rootNode,(CSGparentNode)node));\r
-                                       }\r
-                       } else if (selected.size() == 2) {\r
-                               if (selected.get(0).getParent().equals(rootNode) && selected.get(1).getParent().equals(rootNode)) {\r
-                                       Collection<ICSGnode> nodes = new ArrayList<ICSGnode>();\r
-                                       for (IG3DNode n : selected)\r
-                                               nodes.add((ICSGnode)n);\r
-                                       m.add(new AddBooleanOpAction2(rootNode, DifferenceNode.class, nodes));\r
-                                       m.add(new AddBooleanOpAction2(rootNode, IntersectionNode.class, nodes));\r
-                                       m.add(new AddBooleanOpAction2(rootNode, UnionNode.class, nodes));\r
-                               }\r
-                       }\r
-//             try {\r
-//                                     SimanticsUI.getSession().syncRequest(new ReadRequest() {\r
-//                                             \r
-//                                             @Override\r
-//                                             public void run(ReadGraph graph) throws DatabaseException {\r
-//                                                     Layer0 l0 = Layer0.getInstance(graph);\r
-//                                                     CSG csg = CSG.getInstance(graph);\r
-//                                                     Resource ontology = graph.getResource("http://www.simantics.org/CSG-0.1");\r
-//                                                     \r
-//                                                     if (selectionProvider.getSelectedResources().size() == 0) {\r
-//                                                             List<NamedResource> primitives = new ArrayList<NamedResource>();\r
-//                                                             for (Resource r : graph.getObjects(ontology, l0.ConsistsOf)) {\r
-//                                                                     if (graph.isInheritedFrom(r, csg.Primitive) && !r.equals(csg.Primitive)) {\r
-//                                                                             primitives.add(new NamedResource((String)graph.getRelatedValue(r, l0.HasName), r));\r
-//                                                                     }\r
-//                                                             }\r
-//                                                             \r
-//                                                             Collections.sort(primitives);\r
-//                                                             for (NamedResource n : primitives) {\r
-//                                                                     m.add(new AddPrimitiveAction(graph, n.getResource(),input));\r
-//                                                             }\r
-//                                                     }\r
-//                                                     if (selectionProvider.getSelectedResources().size() == 2) {\r
-//                                                             List<NamedResource> booleanOps = new ArrayList<NamedResource>();\r
-//                                                             for (Resource r : graph.getObjects(ontology, l0.ConsistsOf)) {\r
-//                                                                     if (graph.isInheritedFrom(r, csg.BooleanOperation) && !r.equals(csg.BooleanOperation)) {\r
-//                                                                             booleanOps.add(new NamedResource((String)graph.getRelatedValue(r, l0.HasName), r));\r
-//                                                                     }\r
-//                                                             }\r
-//                                                             \r
-//                                                             Collections.sort(booleanOps);\r
-//                                                             for (NamedResource n : booleanOps) {\r
-//                                                                     m.add(new AddBooleanOpAction(graph, n.getResource(), input, selectionProvider.getSelectedResources()));\r
-//                                                             }\r
-//                                                     }\r
-//                                                     if (selectionProvider.getSelectedResources().size() == 1) {\r
-//                                                             m.add(translateAction);\r
-//                                                             m.add(rotateAction);\r
-//                                                             m.add(removeAction);\r
-//                                                             Resource selected = selectionProvider.getSelectedResources().get(0);\r
-//                                                             translateAction.setNode((IG3DNode2)mapping.get(selected));\r
-//                                                             rotateAction.setNode((IG3DNode2)mapping.get(selected));\r
-//                                                             removeAction.setNode((IG3DNode2)mapping.get(selected));\r
-//                                                             if (graph.isInstanceOf(selected, csg.BooleanOperation)) {\r
-//                                                                     m.add(new SplitBooleanOpAction(input,selected));\r
-//                                                             }\r
-//                                                             \r
-//                                                             \r
-//                                                     }\r
-//                                                     \r
-//                                             }\r
-//                                     });\r
-//                             } catch (DatabaseException e) {\r
-//                                     // TODO Auto-generated catch block\r
-//                                     e.printStackTrace();\r
-//                             }\r
-                \r
-            }\r
-        });\r
-\r
-        contextMenu = menuMgr.createContextMenu(parent);\r
-    }\r
-       \r
-       private IContentOutlinePage createOutline() {\r
-               if (rootNode == null || selectionProvider == null)\r
-                       return null;\r
-               IContentOutlinePage outlinePage = new VTKContentOutlinePage<Resource,Object>(rootNode, selectionProvider);\r
-               outlinePage.addSelectionChangedListener(new ISelectionChangedListener() {\r
-                       \r
-                       @Override\r
-                       public void selectionChanged(SelectionChangedEvent event) {\r
-                               selectionProvider.selectionChanged(event);\r
-                       }\r
-               });\r
-               return outlinePage;\r
-       }\r
-\r
-       @SuppressWarnings("rawtypes")\r
-       @Override\r
-       public Object getAdapter(Class adapter) {\r
-               if (IPropertyPage.class.equals(adapter))\r
-                       return new StandardPropertyPage(getSite(),getPropertyContexts());\r
-               if (IContentOutlinePage.class.equals(adapter)) {\r
-                       return createOutline();\r
-               }\r
-               if (NodeMap.class.equals(adapter)) {\r
-                       return nodeMap;\r
-               }\r
-               if (INode.class.equals(adapter)) {\r
-                       return rootNode;\r
-               }\r
-               if (IMapping.class.equals(adapter)) {\r
-                       return mapping;\r
-               }\r
-               if (InteractiveVtkPanel.class.equals(adapter)) {\r
-                       return panel;\r
-               }\r
-               return super.getAdapter(adapter);\r
-       }\r
-       \r
-       public Set<String> getPropertyContexts() {\r
-               Set<String> result = new HashSet<String>();\r
-               result.add("http://www.simantics.org/Project-1.0/ProjectBrowseContext");\r
-               return result;\r
-       }\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
+ * Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.g3d.csg.editor;
+
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.request.ReadRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.g3d.csg.actions.AddBooleanOpAction2;
+import org.simantics.g3d.csg.actions.AddPrimitiveAction2;
+import org.simantics.g3d.csg.actions.SplitBooleanOpAction2;
+import org.simantics.g3d.csg.scenegraph2.BarrelNode;
+import org.simantics.g3d.csg.scenegraph2.BoxNode;
+import org.simantics.g3d.csg.scenegraph2.CSGparentNode;
+import org.simantics.g3d.csg.scenegraph2.CSGrootNode;
+import org.simantics.g3d.csg.scenegraph2.ConeNode;
+import org.simantics.g3d.csg.scenegraph2.CylinderNode;
+import org.simantics.g3d.csg.scenegraph2.DifferenceNode;
+import org.simantics.g3d.csg.scenegraph2.EllipticCylinderNode;
+import org.simantics.g3d.csg.scenegraph2.ICSGnode;
+import org.simantics.g3d.csg.scenegraph2.IntersectionNode;
+import org.simantics.g3d.csg.scenegraph2.RectangularSolidNode;
+import org.simantics.g3d.csg.scenegraph2.RegularPrismNode;
+import org.simantics.g3d.csg.scenegraph2.SchemaBuilder;
+import org.simantics.g3d.csg.scenegraph2.SphereNode;
+import org.simantics.g3d.csg.scenegraph2.TorusNode;
+import org.simantics.g3d.csg.scenegraph2.UnionNode;
+import org.simantics.g3d.scenegraph.IG3DNode;
+import org.simantics.g3d.scenegraph.NodeMap;
+import org.simantics.g3d.scenegraph.base.INode;
+import org.simantics.g3d.vtk.action.RemoveAction;
+import org.simantics.g3d.vtk.awt.InteractiveVtkPanel;
+import org.simantics.g3d.vtk.awt.RotateAction;
+import org.simantics.g3d.vtk.awt.TranslateAction;
+import org.simantics.g3d.vtk.awt.vtkCameraAndSelectorAction;
+import org.simantics.g3d.vtk.common.HoverHighlighter;
+import org.simantics.g3d.vtk.common.NodeSelectionProvider2;
+import org.simantics.g3d.vtk.common.SelectionHighlighter;
+import org.simantics.g3d.vtk.common.VTKContentOutlinePage;
+import org.simantics.g3d.vtk.common.VtkView;
+import org.simantics.g3d.vtk.shape.vtkShape;
+import org.simantics.g3d.vtk.utils.vtkPanelUtil;
+import org.simantics.objmap.graph.IMapping;
+import org.simantics.objmap.graph.Mappings;
+import org.simantics.objmap.graph.schema.IMappingSchema;
+import org.simantics.selectionview.StandardPropertyPage;
+import org.simantics.ui.workbench.IPropertyPage;
+import org.simantics.ui.workbench.IResourceEditorInput;
+import org.simantics.ui.workbench.ResourceEditorPart;
+import org.simantics.utils.threads.AWTThread;
+import org.simantics.utils.threads.ThreadUtils;
+import org.simantics.utils.ui.ExceptionUtils;
+import org.simantics.utils.ui.SWTAWTComponent;
+
+import vtk.vtkActor;
+import vtk.vtkCameraPass;
+import vtk.vtkDefaultPass;
+import vtk.vtkLightsPass;
+import vtk.vtkRenderPassCollection;
+import vtk.vtkRenderer;
+import vtk.vtkSequencePass;
+
+public class CSGEditor2  extends ResourceEditorPart {
+       private Composite parent;
+       private Resource input;
+       private InteractiveVtkPanel panel;
+       private SWTAWTComponent component;
+       
+       private CSGrootNode rootNode;
+       private IMapping<Resource,Object> mapping;
+       
+       private NodeSelectionProvider2<Resource,Object> selectionProvider;
+       
+       private vtkCameraAndSelectorAction cameraAction;
+       private TranslateAction translateAction;
+       private RotateAction rotateAction;
+       private RemoveAction removeAction;
+       
+       //private  ScenegraphOutlinePage outlinePage;
+       
+       private CSGNodeMap nodeMap;
+
+
+
+       @Override
+       public void createPartControl(Composite parent) {
+               this.parent = parent;
+               parent.setLayout (new FillLayout ());
+               component = new SWTAWTComponent(parent,SWT.NONE) {
+                       
+                       @Override
+                       protected Component createSwingComponent() {
+                               if (panel == null) {
+                                       panel = new InteractiveVtkPanel();
+                                       vtkPanelUtil.registerPanel(panel);
+                                       createScene();
+                               }
+                               return panel;
+                       }
+               };
+
+               IResourceEditorInput rei = (IResourceEditorInput)getEditorInput();
+               input = rei.getResource();
+               
+               
+               //IActionBars actionBars = getEditorSite().getActionBars();
+
+               hookContextMenu();
+               
+               component.syncPopulate();
+               
+               panel.addMouseListener(new java.awt.event.MouseAdapter() {
+                       @Override
+                       public void mouseClicked(final java.awt.event.MouseEvent e) {
+                               if (e.getButton() == java.awt.event.MouseEvent.BUTTON3) {
+                                       Display.getDefault().asyncExec(new Runnable() {
+                                               public void run() {
+                                                       contextMenu.setLocation(e.getXOnScreen(), e.getYOnScreen());
+                                                       contextMenu.setVisible(true);
+                                               }
+                                       });
+                               }
+                       }
+               });
+               
+
+               cameraAction = new vtkCameraAndSelectorAction(panel);   
+               panel.setDefaultAction(cameraAction);
+               panel.useDefaultAction();
+               
+               try {
+                       getSession().syncRequest(new ReadRequest() {
+                               
+                               @SuppressWarnings({ "rawtypes", "unchecked" })
+                               @Override
+                               public void run(ReadGraph graph) throws DatabaseException {
+                                       IMappingSchema schema = SchemaBuilder.getSchema(graph);
+                                       mapping = Mappings.createWithListening(schema);
+                                       rootNode = (CSGrootNode)mapping.map(graph, input);
+                                       nodeMap = new CSGNodeMap(getSession(), mapping, panel,(CSGrootNode)rootNode);
+                               }
+                       });
+                       
+                       if (rootNode == null)
+                               throw new RuntimeException("Scenegraph loading failed.");
+                       populate();
+                       
+                       selectionProvider = new NodeSelectionProvider2<Resource,Object>(this,mapping,nodeMap);
+
+                       cameraAction.addSelectionChangedListener(selectionProvider);
+
+                       cameraAction.addHoverChangedListener(new HoverHighlighter(panel,nodeMap));
+                       selectionProvider.addSelectionChangedListener(new SelectionHighlighter(panel,nodeMap));
+                       
+                       getSite().setSelectionProvider(selectionProvider);
+                       getSite().getPage().addPostSelectionListener(selectionProvider);
+                       
+                       //outlinePage = new ScenegraphOutlinePage(rootNode);
+                       
+                       
+                       parent.addDisposeListener(new DisposeListener() {
+                               
+                               @Override
+                               public void widgetDisposed(DisposeEvent e) {
+                                       getSite().getPage().removePostSelectionListener(selectionProvider);
+                                       ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
+                                               
+                                               @Override
+                                               public void run() {
+                                                       nodeMap.delete();
+                                                       vtkPanelUtil.unregisterPanel(panel);
+
+                                               }
+                                       });
+                                       mapping.dispose();
+                                       component.dispose();
+                                       
+                                       
+                               }
+                       });
+               } catch (DatabaseException e1) {
+                       ExceptionUtils.logAndShowError("Cannot open CSG editor",e1);
+                       return;
+               }
+               
+               translateAction = new TranslateAction(panel,nodeMap);
+               rotateAction = new RotateAction(panel,nodeMap);
+               removeAction = new RemoveAction(nodeMap) {
+                       public void setNode(IG3DNode node) {
+                               super.setNode(node);
+                               if (node.getParent() instanceof CSGparentNode)
+                                       setEnabled(false);
+                               
+                       }
+               };
+               
+               
+       }
+       
+       
+
+       
+       public void populate() {
+               ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
+                       
+                       @Override
+                       public void run() {
+                               nodeMap.populate();
+                       }
+               });
+               
+       }
+       
+       
+       
+       @Override
+       public void setFocus() {
+               component.setFocus();
+       }
+       
+       private void createScene() {
+               vtkRenderer ren1 = panel.GetRenderer();
+               
+               boolean multiPass = false;
+               if (multiPass) {
+                       
+                       vtkLightsPass lightsPass = new vtkLightsPass();
+                       vtkDefaultPass defaultPass = new vtkDefaultPass();
+                       
+                       
+                       vtkRenderPassCollection passes = new vtkRenderPassCollection();
+                       passes.AddItem(lightsPass);
+                       passes.AddItem(defaultPass);
+                       
+                       vtkSequencePass seq = new vtkSequencePass();
+                       seq.SetPasses(passes);
+                       
+               
+                       
+                       vtkCameraPass cameraPass = new vtkCameraPass();
+                       cameraPass.SetDelegatePass(seq);
+                       
+                       ren1.SetPass(cameraPass);
+                       
+               }
+//             ren1.GetRenderWindow().LineSmoothingOn();
+//             ren1.GetRenderWindow().PointSmoothingOn();
+//             ren1.GetRenderWindow().PolygonSmoothingOn();
+//             ren1.GetRenderWindow().SetMultiSamples(2);
+
+               
+
+               ren1.SetBackground2(1,1,1); // background color white
+               ren1.SetBackground(0.9,0.9,0.9);
+               ren1.SetGradientBackground(true);
+
+          // vtkActor grid = vtkShape.createGridActor(8,1.0,1|2|4);
+           vtkActor grid = vtkShape.createGridActor(8,1.0, 2 );
+           grid.SetPickable(0);
+           ren1.AddActor(grid);
+           panel.addDeletable(grid);
+           
+
+               
+       }
+       
+       protected Menu contextMenu;
+       
+       protected void hookContextMenu() {
+        MenuManager menuMgr = new MenuManager("#PopupMenu");
+        menuMgr.setRemoveAllWhenShown(true);
+        menuMgr.addMenuListener(new IMenuListener() {
+            public void menuAboutToShow(IMenuManager manager) {
+               final IMenuManager m = manager;
+                       List<IG3DNode> selected = selectionProvider.getSelectedNodes();
+                       if (selected.size() == 0) {
+                               m.add(new AddPrimitiveAction2(rootNode, BarrelNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, BoxNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, ConeNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, CylinderNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, EllipticCylinderNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, RectangularSolidNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, RegularPrismNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, SphereNode.class));
+                               m.add(new AddPrimitiveAction2(rootNode, TorusNode.class));
+                       } else if (selected.size() == 1) {
+                               m.add(translateAction);
+                                       m.add(rotateAction);
+                                       m.add(removeAction);
+                                       ICSGnode node = (ICSGnode)selected.get(0);
+                                       translateAction.setNode(node);
+                                       rotateAction.setNode(node);
+                                       removeAction.setNode(node);
+                                       if (node instanceof CSGparentNode) {
+                                               m.add(new SplitBooleanOpAction2(rootNode,(CSGparentNode)node));
+                                       }
+                       } else if (selected.size() == 2) {
+                               if (selected.get(0).getParent().equals(rootNode) && selected.get(1).getParent().equals(rootNode)) {
+                                       Collection<ICSGnode> nodes = new ArrayList<ICSGnode>();
+                                       for (IG3DNode n : selected)
+                                               nodes.add((ICSGnode)n);
+                                       m.add(new AddBooleanOpAction2(rootNode, DifferenceNode.class, nodes));
+                                       m.add(new AddBooleanOpAction2(rootNode, IntersectionNode.class, nodes));
+                                       m.add(new AddBooleanOpAction2(rootNode, UnionNode.class, nodes));
+                               }
+                       }
+//             try {
+//                                     SimanticsUI.getSession().syncRequest(new ReadRequest() {
+//                                             
+//                                             @Override
+//                                             public void run(ReadGraph graph) throws DatabaseException {
+//                                                     Layer0 l0 = Layer0.getInstance(graph);
+//                                                     CSG csg = CSG.getInstance(graph);
+//                                                     Resource ontology = graph.getResource("http://www.simantics.org/CSG-0.1");
+//                                                     
+//                                                     if (selectionProvider.getSelectedResources().size() == 0) {
+//                                                             List<NamedResource> primitives = new ArrayList<NamedResource>();
+//                                                             for (Resource r : graph.getObjects(ontology, l0.ConsistsOf)) {
+//                                                                     if (graph.isInheritedFrom(r, csg.Primitive) && !r.equals(csg.Primitive)) {
+//                                                                             primitives.add(new NamedResource((String)graph.getRelatedValue(r, l0.HasName), r));
+//                                                                     }
+//                                                             }
+//                                                             
+//                                                             Collections.sort(primitives);
+//                                                             for (NamedResource n : primitives) {
+//                                                                     m.add(new AddPrimitiveAction(graph, n.getResource(),input));
+//                                                             }
+//                                                     }
+//                                                     if (selectionProvider.getSelectedResources().size() == 2) {
+//                                                             List<NamedResource> booleanOps = new ArrayList<NamedResource>();
+//                                                             for (Resource r : graph.getObjects(ontology, l0.ConsistsOf)) {
+//                                                                     if (graph.isInheritedFrom(r, csg.BooleanOperation) && !r.equals(csg.BooleanOperation)) {
+//                                                                             booleanOps.add(new NamedResource((String)graph.getRelatedValue(r, l0.HasName), r));
+//                                                                     }
+//                                                             }
+//                                                             
+//                                                             Collections.sort(booleanOps);
+//                                                             for (NamedResource n : booleanOps) {
+//                                                                     m.add(new AddBooleanOpAction(graph, n.getResource(), input, selectionProvider.getSelectedResources()));
+//                                                             }
+//                                                     }
+//                                                     if (selectionProvider.getSelectedResources().size() == 1) {
+//                                                             m.add(translateAction);
+//                                                             m.add(rotateAction);
+//                                                             m.add(removeAction);
+//                                                             Resource selected = selectionProvider.getSelectedResources().get(0);
+//                                                             translateAction.setNode((IG3DNode2)mapping.get(selected));
+//                                                             rotateAction.setNode((IG3DNode2)mapping.get(selected));
+//                                                             removeAction.setNode((IG3DNode2)mapping.get(selected));
+//                                                             if (graph.isInstanceOf(selected, csg.BooleanOperation)) {
+//                                                                     m.add(new SplitBooleanOpAction(input,selected));
+//                                                             }
+//                                                             
+//                                                             
+//                                                     }
+//                                                     
+//                                             }
+//                                     });
+//                             } catch (DatabaseException e) {
+//                                     // TODO Auto-generated catch block
+//                                     e.printStackTrace();
+//                             }
+                
+            }
+        });
+
+        contextMenu = menuMgr.createContextMenu(parent);
+    }
+       
+       private IContentOutlinePage createOutline() {
+               if (rootNode == null || selectionProvider == null)
+                       return null;
+               IContentOutlinePage outlinePage = new VTKContentOutlinePage<Resource,Object>(rootNode, selectionProvider);
+               outlinePage.addSelectionChangedListener(new ISelectionChangedListener() {
+                       
+                       @Override
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               selectionProvider.selectionChanged(event);
+                       }
+               });
+               return outlinePage;
+       }
+
+       @SuppressWarnings("rawtypes")
+       @Override
+       public Object getAdapter(Class adapter) {
+               if (IPropertyPage.class.equals(adapter))
+                       return new StandardPropertyPage(getSite(),getPropertyContexts());
+               if (IContentOutlinePage.class.equals(adapter)) {
+                       return createOutline();
+               }
+               if (NodeMap.class.equals(adapter)) {
+                       return nodeMap;
+               }
+               if (INode.class.equals(adapter)) {
+                       return rootNode;
+               }
+               if (IMapping.class.equals(adapter)) {
+                       return mapping;
+               }
+               if (InteractiveVtkPanel.class.equals(adapter)) {
+                       return panel;
+               }
+               if (VtkView.class.equals(adapter))
+                       return panel;
+               return super.getAdapter(adapter);
+       }
+       
+       public Set<String> getPropertyContexts() {
+               Set<String> result = new HashSet<String>();
+               result.add("http://www.simantics.org/Project-1.0/ProjectBrowseContext");
+               return result;
+       }
+}