]> gerrit.simantics Code Review - simantics/3d.git/blob - 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
1 package org.simantics.g3d.ui;\r
2 \r
3 import org.eclipse.jface.layout.TreeColumnLayout;\r
4 import org.eclipse.jface.viewers.CellLabelProvider;\r
5 import org.eclipse.jface.viewers.ColumnWeightData;\r
6 import org.eclipse.jface.viewers.TreeViewer;\r
7 import org.eclipse.jface.viewers.TreeViewerColumn;\r
8 import org.eclipse.jface.viewers.ViewerCell;\r
9 import org.eclipse.swt.SWT;\r
10 import org.eclipse.swt.widgets.Composite;\r
11 import org.eclipse.ui.IPartListener2;\r
12 import org.eclipse.ui.IPartService;\r
13 import org.eclipse.ui.IWorkbenchPage;\r
14 import org.eclipse.ui.IWorkbenchPart;\r
15 import org.eclipse.ui.IWorkbenchPartReference;\r
16 import org.eclipse.ui.IWorkbenchWindow;\r
17 import org.eclipse.ui.part.ViewPart;\r
18 import org.simantics.g3d.scenegraph.base.INode;\r
19 import org.simantics.objmap.graph.IMapping;\r
20 import org.simantics.objmap.structural.IStructuralObject;\r
21 \r
22 public class SceneGraphDebugger extends ViewPart {\r
23 \r
24         private TreeViewer viewer;\r
25         \r
26         private boolean linkToPart = true;\r
27         \r
28         IWorkbenchPart       lastPart;\r
29         \r
30         private IMapping<Object, Object> mapping;\r
31         \r
32         public SceneGraphDebugger() {\r
33                 // TODO Auto-generated constructor stub\r
34         }\r
35 \r
36         @Override\r
37         public void createPartControl(Composite parent) {\r
38 \r
39                 viewer = new TreeViewer(parent,SWT.SINGLE|SWT.FULL_SELECTION);\r
40 \r
41                 TreeColumnLayout layout = new TreeColumnLayout();\r
42         parent.setLayout(layout);\r
43         \r
44         viewer.setContentProvider(new ScenegraphOutlinePage.ScenegraphContentProvider());\r
45         viewer.getTree().setHeaderVisible(true);\r
46         \r
47         TreeViewerColumn nameColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
48         nameColumn.setLabelProvider(new CellLabelProvider() {\r
49                         \r
50                         @Override\r
51                         public void update(ViewerCell cell) {\r
52                                 cell.setText(cell.getElement().toString());\r
53                         }\r
54                 });\r
55         \r
56         TreeViewerColumn typeColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
57         typeColumn.setLabelProvider(new CellLabelProvider() {\r
58                         \r
59                         @Override\r
60                         public void update(ViewerCell cell) {\r
61                                 cell.setText(cell.getElement().getClass().getSimpleName());\r
62                         }\r
63                 });\r
64         \r
65         TreeViewerColumn contextColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
66         contextColumn.setLabelProvider(new CellLabelProvider() {\r
67                         \r
68                         @Override\r
69                         public void update(ViewerCell cell) {\r
70                                 if (!(cell.getElement() instanceof IStructuralObject))\r
71                                         cell.setText("N/A");\r
72                                 else {\r
73                                         IStructuralObject o = (IStructuralObject)cell.getElement();\r
74                                         if (o.getContext() != null) {\r
75                                                 cell.setText(o.getContext().toString());\r
76                                         } else {\r
77                                                 cell.setText("none");\r
78                                         }\r
79                                         \r
80                                 }\r
81                                         \r
82                         }\r
83                 });\r
84         \r
85         TreeViewerColumn mappingColumn = new TreeViewerColumn(viewer, SWT.LEFT);\r
86         mappingColumn.setLabelProvider(new CellLabelProvider() {\r
87                         \r
88                         @Override\r
89                         public void update(ViewerCell cell) {\r
90                                 if (mapping == null)\r
91                                         cell.setText("N/A");\r
92                                 else {\r
93                                         Object o = mapping.inverseGet(cell.getElement());\r
94                                         if (o != null) {\r
95                                                 cell.setText(o.toString());\r
96                                         } else {\r
97                                                 cell.setText("none");\r
98                                         }\r
99                                         \r
100                                 }\r
101                                         \r
102                         }\r
103                 });\r
104         \r
105         nameColumn.getColumn().setText("Name");\r
106         typeColumn.getColumn().setText("Type");\r
107         contextColumn.getColumn().setText("Context");\r
108         mappingColumn.getColumn().setText("Mapping");\r
109         \r
110         layout.setColumnData(nameColumn.getColumn(), new ColumnWeightData(10, true));\r
111         layout.setColumnData(typeColumn.getColumn(), new ColumnWeightData(10, true));\r
112         layout.setColumnData(contextColumn.getColumn(), new ColumnWeightData(10, true));\r
113         layout.setColumnData(mappingColumn.getColumn(), new ColumnWeightData(10, true));\r
114         \r
115         IPartService partService = (IPartService) getSite().getService(IPartService.class);\r
116         partService.addPartListener(partListener);\r
117         \r
118         }\r
119 \r
120         @Override\r
121         public void setFocus() {\r
122                 viewer.getTree().setFocus();\r
123         }\r
124         \r
125         protected void refresh() {\r
126         IWorkbenchPart part = null;\r
127         try {\r
128             IWorkbenchWindow window = getSite().getWorkbenchWindow();\r
129             if (window == null)\r
130                 return;\r
131             IWorkbenchPage page = window.getActivePage();\r
132             if (page == null)\r
133                 return;\r
134             part = page.getActiveEditor();\r
135             if (part == null)\r
136                 return;\r
137         } finally {\r
138             if (part == null) {\r
139                 setContentDescription("No scene graph nodes available.");\r
140                 // TODO: Show info page instead of tree view.\r
141             }\r
142         }\r
143 \r
144         refresh(part);\r
145     }\r
146         \r
147          @SuppressWarnings({ "unchecked", "rawtypes" })\r
148         protected boolean refresh(IWorkbenchPart part) {\r
149                  if (viewer.getTree().isDisposed()) {\r
150                          IPartService partService = (IPartService) getSite().getService(IPartService.class);\r
151                          partService.removePartListener(partListener);\r
152                         return false;\r
153                 }\r
154                 boolean foundInput = false;\r
155                 try {\r
156                     Object obj = null;\r
157                     if (part != null) {\r
158                         obj = part.getAdapter(INode.class);\r
159                     }\r
160 \r
161                     if (obj != null) {\r
162                         mapping = (IMapping)part.getAdapter(IMapping.class);\r
163                         if (!viewer.getTree().isDisposed())\r
164                                 viewer.setInput(obj);\r
165                         foundInput = true;\r
166                     }\r
167                     lastPart = part;\r
168                     return foundInput;\r
169                 } finally {\r
170                     if (!foundInput) {\r
171                         setContentDescription("No scene graph nodes available.");\r
172                         // TODO: Show info page instead of tree view.\r
173                     }\r
174                 }\r
175             }\r
176         \r
177          IPartListener2 partListener = new IPartListener2() {\r
178                 @Override\r
179                 public void partVisible(IWorkbenchPartReference partRef) {\r
180                 }\r
181                 @Override\r
182                 public void partOpened(IWorkbenchPartReference partRef) {\r
183                 }\r
184                 @Override\r
185                 public void partInputChanged(IWorkbenchPartReference partRef) {\r
186                 }\r
187                 @Override\r
188                 public void partHidden(IWorkbenchPartReference partRef) {\r
189                 }\r
190                 @Override\r
191                 public void partDeactivated(IWorkbenchPartReference partRef) {\r
192                 }\r
193                 @Override\r
194                 public void partClosed(IWorkbenchPartReference partRef) {\r
195                     if (linkToPart) {\r
196                         IWorkbenchPart part = partRef.getPart(false);\r
197                         if (part != null)\r
198                             refresh(null);\r
199                     }\r
200                 }\r
201                 @Override\r
202                 public void partBroughtToTop(IWorkbenchPartReference partRef) {\r
203                 }\r
204                 @Override\r
205                 public void partActivated(IWorkbenchPartReference partRef) {\r
206                     if (linkToPart) {\r
207                         IWorkbenchPart part = partRef.getPart(false);\r
208                         if (part != null) {\r
209                             if (part != lastPart) {\r
210                                 refresh(part);\r
211                             }\r
212                         }\r
213                     }\r
214                 }\r
215             };\r
216 \r
217 }\r