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