--- /dev/null
+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