]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/VTKContentOutlinePage.java
7c64fec045411bbea50a668ffb437058b1e9fb2a
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / common / VTKContentOutlinePage.java
1 package org.simantics.g3d.vtk.common;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 \r
7 import org.eclipse.jface.viewers.ISelection;\r
8 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
9 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
10 import org.eclipse.jface.viewers.StructuredSelection;\r
11 import org.eclipse.swt.widgets.Composite;\r
12 import org.simantics.g3d.scenegraph.IG3DNode;\r
13 import org.simantics.g3d.scenegraph.base.INode;\r
14 import org.simantics.g3d.scenegraph.base.ParentNode;\r
15 import org.simantics.g3d.tools.AdaptationUtils;\r
16 import org.simantics.g3d.ui.ScenegraphOutlinePage;\r
17 \r
18 public class VTKContentOutlinePage<DBObject,JavaObject> extends ScenegraphOutlinePage{\r
19         private NodeSelectionProvider2<DBObject,JavaObject> provider;\r
20         \r
21         public VTKContentOutlinePage(ParentNode<? extends INode> rootNode, NodeSelectionProvider2<DBObject,JavaObject> provider) {\r
22                 super(rootNode);\r
23                 this.provider = provider;\r
24         }\r
25         \r
26         private boolean outsideSelection = false;\r
27         \r
28         @Override\r
29         public void createControl(Composite parent) {\r
30 \r
31                 super.createControl(parent);\r
32 \r
33                 provider.addSelectionChangedListener(new ISelectionChangedListener() {\r
34                         \r
35                         @Override\r
36                         public void selectionChanged(SelectionChangedEvent event) {\r
37                                 Object source = event.getSource();\r
38                                 if (source == VTKContentOutlinePage.this)\r
39                                         return;\r
40                                 ISelection s = event.getSelection();\r
41                                 Collection<INode> nodes = AdaptationUtils.adaptToCollection(s, INode.class);\r
42                                 outsideSelection = true;\r
43                                 getTreeViewer().setSelection(new StructuredSelection(nodes.toArray()),true);\r
44                                 outsideSelection = false;\r
45                                 \r
46                         }\r
47                 });\r
48         }\r
49         \r
50         List<INode> selectedNodes = new ArrayList<INode>();\r
51         \r
52         @SuppressWarnings("unchecked")\r
53         @Override\r
54         protected void fireSelectionChanged(ISelection selection) {\r
55                 if (outsideSelection)\r
56                         return;\r
57                 // TreeViewer provides selected object in tree order, not in selected order.\r
58                 Collection<INode> selectedUnsortedNodes = AdaptationUtils.adaptToCollection(selection, INode.class);\r
59                 List<INode> toRemove = new ArrayList<INode>();\r
60                 for (INode node : selectedNodes) {\r
61                         if (!selectedUnsortedNodes.contains(node))\r
62                                 toRemove.add(node);\r
63                 }\r
64                 for (INode node : toRemove)\r
65                         selectedNodes.remove(node);\r
66                 for (INode node : selectedUnsortedNodes) {\r
67                         if (!selectedNodes.contains(node))\r
68                                 selectedNodes.add(node);\r
69                 }\r
70                 \r
71                 List<VTKSelectionItem<DBObject>> selectedItems = new ArrayList<VTKSelectionItem<DBObject>>();\r
72                 for (INode node : selectedNodes) {\r
73                         DBObject r = provider.mapping.inverseGet((JavaObject)node);\r
74                         selectedItems.add(new VTKSelectionItem<DBObject>(null, (IG3DNode)node, r));\r
75                 }\r
76                 \r
77                 super.fireSelectionChanged(new StructuredSelection(selectedItems));\r
78         }\r
79         \r
80 \r
81 }\r