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