]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/g3d/ui/SceneGraphDebugger.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / ui / SceneGraphDebugger.java
diff --git a/org.simantics.g3d/src/org/simantics/g3d/ui/SceneGraphDebugger.java b/org.simantics.g3d/src/org/simantics/g3d/ui/SceneGraphDebugger.java
new file mode 100644 (file)
index 0000000..1eb4b31
--- /dev/null
@@ -0,0 +1,217 @@
+package org.simantics.g3d.ui;\r
+\r
+import org.eclipse.jface.layout.TreeColumnLayout;\r
+import org.eclipse.jface.viewers.CellLabelProvider;\r
+import org.eclipse.jface.viewers.ColumnWeightData;\r
+import org.eclipse.jface.viewers.TreeViewer;\r
+import org.eclipse.jface.viewers.TreeViewerColumn;\r
+import org.eclipse.jface.viewers.ViewerCell;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.IPartListener2;\r
+import org.eclipse.ui.IPartService;\r
+import org.eclipse.ui.IWorkbenchPage;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.IWorkbenchPartReference;\r
+import org.eclipse.ui.IWorkbenchWindow;\r
+import org.eclipse.ui.part.ViewPart;\r
+import org.simantics.g3d.scenegraph.base.INode;\r
+import org.simantics.objmap.graph.IMapping;\r
+import org.simantics.objmap.structural.IStructuralObject;\r
+\r
+public class SceneGraphDebugger extends ViewPart {\r
+\r
+       private TreeViewer viewer;\r
+       \r
+       private boolean linkToPart = true;\r
+       \r
+       IWorkbenchPart       lastPart;\r
+       \r
+       private IMapping<Object, Object> mapping;\r
+       \r
+       public SceneGraphDebugger() {\r
+               // TODO Auto-generated constructor stub\r
+       }\r
+\r
+       @Override\r
+       public void createPartControl(Composite parent) {\r
+\r
+               viewer = new TreeViewer(parent,SWT.SINGLE|SWT.FULL_SELECTION);\r
+\r
+               TreeColumnLayout layout = new TreeColumnLayout();\r
+        parent.setLayout(layout);\r
+        \r
+        viewer.setContentProvider(new ScenegraphOutlinePage.ScenegraphContentProvider());\r
+        viewer.getTree().setHeaderVisible(true);\r
+        \r
+        TreeViewerColumn nameColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
+        nameColumn.setLabelProvider(new CellLabelProvider() {\r
+                       \r
+                       @Override\r
+                       public void update(ViewerCell cell) {\r
+                               cell.setText(cell.getElement().toString());\r
+                       }\r
+               });\r
+        \r
+        TreeViewerColumn typeColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
+        typeColumn.setLabelProvider(new CellLabelProvider() {\r
+                       \r
+                       @Override\r
+                       public void update(ViewerCell cell) {\r
+                               cell.setText(cell.getElement().getClass().getSimpleName());\r
+                       }\r
+               });\r
+        \r
+        TreeViewerColumn contextColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
+        contextColumn.setLabelProvider(new CellLabelProvider() {\r
+                       \r
+                       @Override\r
+                       public void update(ViewerCell cell) {\r
+                               if (!(cell.getElement() instanceof IStructuralObject))\r
+                                       cell.setText("N/A");\r
+                               else {\r
+                                       IStructuralObject o = (IStructuralObject)cell.getElement();\r
+                                       if (o.getContext() != null) {\r
+                                               cell.setText(o.getContext().toString());\r
+                                       } else {\r
+                                               cell.setText("none");\r
+                                       }\r
+                                       \r
+                               }\r
+                                       \r
+                       }\r
+               });\r
+        \r
+        TreeViewerColumn mappingColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
+        mappingColumn.setLabelProvider(new CellLabelProvider() {\r
+                       \r
+                       @Override\r
+                       public void update(ViewerCell cell) {\r
+                               if (mapping == null)\r
+                                       cell.setText("N/A");\r
+                               else {\r
+                                       Object o = mapping.inverseGet(cell.getElement());\r
+                                       if (o != null) {\r
+                                               cell.setText(o.toString());\r
+                                       } else {\r
+                                               cell.setText("none");\r
+                                       }\r
+                                       \r
+                               }\r
+                                       \r
+                       }\r
+               });\r
+        \r
+        nameColumn.getColumn().setText("Name");\r
+        typeColumn.getColumn().setText("Type");\r
+        contextColumn.getColumn().setText("Context");\r
+        mappingColumn.getColumn().setText("Mapping");\r
+        \r
+        layout.setColumnData(nameColumn.getColumn(), new ColumnWeightData(10, true));\r
+        layout.setColumnData(typeColumn.getColumn(), new ColumnWeightData(10, true));\r
+        layout.setColumnData(contextColumn.getColumn(), new ColumnWeightData(10, true));\r
+        layout.setColumnData(mappingColumn.getColumn(), new ColumnWeightData(10, true));\r
+        \r
+        IPartService partService = (IPartService) getSite().getService(IPartService.class);\r
+        partService.addPartListener(partListener);\r
+        \r
+       }\r
+\r
+       @Override\r
+       public void setFocus() {\r
+               viewer.getTree().setFocus();\r
+       }\r
+       \r
+       protected void refresh() {\r
+        IWorkbenchPart part = null;\r
+        try {\r
+            IWorkbenchWindow window = getSite().getWorkbenchWindow();\r
+            if (window == null)\r
+                return;\r
+            IWorkbenchPage page = window.getActivePage();\r
+            if (page == null)\r
+                return;\r
+            part = page.getActiveEditor();\r
+            if (part == null)\r
+                return;\r
+        } finally {\r
+            if (part == null) {\r
+                setContentDescription("No scene graph nodes available.");\r
+                // TODO: Show info page instead of tree view.\r
+            }\r
+        }\r
+\r
+        refresh(part);\r
+    }\r
+       \r
+        @SuppressWarnings({ "unchecked", "rawtypes" })\r
+       protected boolean refresh(IWorkbenchPart part) {\r
+                if (viewer.getTree().isDisposed()) {\r
+                        IPartService partService = (IPartService) getSite().getService(IPartService.class);\r
+                        partService.removePartListener(partListener);\r
+                       return false;\r
+               }\r
+               boolean foundInput = false;\r
+               try {\r
+                   Object obj = null;\r
+                   if (part != null) {\r
+                       obj = part.getAdapter(INode.class);\r
+                   }\r
+\r
+                   if (obj != null) {\r
+                       mapping = (IMapping)part.getAdapter(IMapping.class);\r
+                       if (!viewer.getTree().isDisposed())\r
+                               viewer.setInput(obj);\r
+                       foundInput = true;\r
+                   }\r
+                   lastPart = part;\r
+                   return foundInput;\r
+               } finally {\r
+                   if (!foundInput) {\r
+                       setContentDescription("No scene graph nodes available.");\r
+                       // TODO: Show info page instead of tree view.\r
+                   }\r
+               }\r
+           }\r
+       \r
+        IPartListener2 partListener = new IPartListener2() {\r
+               @Override\r
+               public void partVisible(IWorkbenchPartReference partRef) {\r
+               }\r
+               @Override\r
+               public void partOpened(IWorkbenchPartReference partRef) {\r
+               }\r
+               @Override\r
+               public void partInputChanged(IWorkbenchPartReference partRef) {\r
+               }\r
+               @Override\r
+               public void partHidden(IWorkbenchPartReference partRef) {\r
+               }\r
+               @Override\r
+               public void partDeactivated(IWorkbenchPartReference partRef) {\r
+               }\r
+               @Override\r
+               public void partClosed(IWorkbenchPartReference partRef) {\r
+                   if (linkToPart) {\r
+                       IWorkbenchPart part = partRef.getPart(false);\r
+                       if (part != null)\r
+                           refresh(null);\r
+                   }\r
+               }\r
+               @Override\r
+               public void partBroughtToTop(IWorkbenchPartReference partRef) {\r
+               }\r
+               @Override\r
+               public void partActivated(IWorkbenchPartReference partRef) {\r
+                   if (linkToPart) {\r
+                       IWorkbenchPart part = partRef.getPart(false);\r
+                       if (part != null) {\r
+                           if (part != lastPart) {\r
+                               refresh(part);\r
+                           }\r
+                       }\r
+                   }\r
+               }\r
+           };\r
+\r
+}\r