]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/SelectionHighlighter.java
Compiler warning elimination
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / common / SelectionHighlighter.java
1 /*******************************************************************************
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
3  * Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.g3d.vtk.common;
13
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.List;
17
18 import org.eclipse.jface.viewers.ISelection;
19 import org.eclipse.jface.viewers.ISelectionChangedListener;
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
21 import org.simantics.g3d.scenegraph.IG3DNode;
22 import org.simantics.g3d.scenegraph.NodeHighlighter;
23 import org.simantics.g3d.scenegraph.NodeHighlighter.HighlightEventType;
24 import org.simantics.g3d.scenegraph.NodeHighlighter.HighlightObjectType;
25 import org.simantics.g3d.scenegraph.base.INode;
26 import org.simantics.g3d.tools.AdaptationUtils;
27 import org.simantics.utils.threads.AWTThread;
28 import org.simantics.utils.threads.ThreadUtils;
29
30 import vtk.vtkActor;
31 import vtk.vtkAlgorithm;
32 import vtk.vtkAlgorithmOutput;
33 import vtk.vtkFeatureEdges;
34 import vtk.vtkMapper;
35 import vtk.vtkProp;
36 import vtk.vtkProperty;
37
38 public class SelectionHighlighter<DBObject> implements ISelectionChangedListener {
39
40         protected VtkView panel;
41         protected VTKNodeMap<DBObject,?> nodeMap;
42         
43         protected List<IG3DNode> selectedNodes = new ArrayList<IG3DNode>();
44         protected List<vtkActor> selectedActors = new ArrayList<vtkActor>();
45         
46         protected HighlightObjectType type = HighlightObjectType.Node;
47         
48         public SelectionHighlighter(VtkView panel, VTKNodeMap<DBObject,?> nodeMap) {
49                 this.panel = panel;
50                 this.nodeMap = nodeMap;
51         }
52         
53         @Override
54         public void selectionChanged(SelectionChangedEvent event) {
55                 final ISelection s = event.getSelection();
56                 
57                 if (Thread.currentThread().equals(panel.getThreadQueue().getThread()))
58                         highlight(s);
59                 else {
60                         ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
61                                 @Override
62                                 public void run() {
63                                         highlight(s);
64                                         //System.out.println(this.getClass().getName() + " highlight ");
65                                         //panel.Render();
66                                         panel.refresh();
67                                 }
68                         });
69                 }
70                         
71         }
72         
73         protected void hilight(INode node, HighlightEventType type) {
74                 if (node instanceof NodeHighlighter) {
75                         ((NodeHighlighter)node).highlight(type);
76                         return;
77                 }
78                 if (type == HighlightEventType.Selection) {
79                         setSelectedColor(node); 
80                 } else if (type == HighlightEventType.ClearSelection) {
81                         setDefaultColor(node);
82                 }
83         }
84         
85         protected void hilight(vtkActor actor, HighlightEventType type) {
86                 if (type == HighlightEventType.Selection) {
87                         setColor(actor,false,new double[]{1,0,0});
88                         setColor(actor,true,new double[]{1,0,1});
89                 } else if (type == HighlightEventType.ClearSelection) {
90                         setColor(actor,false,new double[]{1,1,0});
91                         setColor(actor,true,new double[]{0,0,0});
92                 }
93         }
94         
95         protected void highlight(ISelection s) {
96                 highlight(s, HighlightEventType.Selection, HighlightEventType.ClearSelection);
97         }
98         
99         protected void highlight(ISelection s, HighlightEventType apply, HighlightEventType clear) {
100         
101                 boolean changed = false;
102                 if (type == HighlightObjectType.Node) {
103                         Collection<IG3DNode> currentSelectedNodes = AdaptationUtils.adaptToCollection(s,IG3DNode.class);//getSelectedNodes(currentSelectedActors);
104                         if (currentSelectedNodes.size() == 0) {
105                                 Collection<vtkProp> currentSelectedActors = AdaptationUtils.adaptToCollection(s, vtkProp.class);
106                                 currentSelectedNodes = getSelectedNodes(currentSelectedActors);
107                         }
108                         for (IG3DNode node : selectedNodes) {
109                                 if (!currentSelectedNodes.contains(node)) {
110                                         hilight((INode)node, clear);
111                                         changed = true;
112                                 }
113                         }
114                         for (IG3DNode node : currentSelectedNodes) {
115                                 if (!selectedNodes.contains(node)) {
116                                         hilight((INode)node, apply);
117                                         changed = true;
118                                 }
119                         }
120                         selectedNodes.clear();
121                         selectedNodes.addAll(currentSelectedNodes);
122                         //selectedNodes = currentSelectedNodes;
123                         
124                 } else {
125                         
126                         Collection<vtkActor> currentSelectedActors = AdaptationUtils.adaptToCollection(s, vtkActor.class);
127                         
128                         for (vtkActor act : selectedActors) {
129                                 if (!currentSelectedActors.contains(act)) {
130                                         hilight(act,clear);
131                                         changed = true;
132                                 }
133                         }
134                         for (vtkActor act : currentSelectedActors) {
135                                 if (!selectedActors.contains(act)) {
136                                         hilight(act,apply);
137                                         changed = true;
138                                 }
139                         }
140                         selectedActors.clear();
141                         selectedActors.addAll(currentSelectedActors);
142                 }
143                 if (changed) {
144                         panel.refresh();
145                 }
146         }
147         
148         protected List<IG3DNode> getSelectedNodes(Collection<vtkProp> selectedActors) {
149                 List<IG3DNode> currentSelectedNodes = new ArrayList<IG3DNode>();
150                 
151                 for (vtkProp a : selectedActors) {
152                         INode node = nodeMap.getNode((vtkProp)a);
153                         if (node == null || !(node instanceof IG3DNode))
154                                 continue;
155                         if (!currentSelectedNodes.contains(node))
156                                 currentSelectedNodes.add((IG3DNode)node);
157                 }
158                 return currentSelectedNodes;
159         }
160         
161         protected void setDefaultColor(INode node) {
162                 double color[] = new double[]{1,1,0};
163                 setColor(node, false, color);
164         }
165         
166         protected void setSelectedColor(INode node) {
167                 double color[] = new double[]{1,0,0};
168                 setColor(node, false, color);
169         }
170         
171         public void setColor(INode node, boolean edge, double color[]) {
172                 for (vtkProp prop : nodeMap.getRenderObjects(node)) {
173                         if (prop instanceof vtkActor) {
174                                 vtkActor act = (vtkActor)prop;
175                                 setColor(act, edge, color);
176                         }
177                 }
178         }
179         
180         protected void setColor(vtkActor act, boolean edge, double color[]) {
181                 
182                 vtkMapper mapper = act.GetMapper();
183                 vtkAlgorithmOutput out = mapper.GetInputConnection(0, 0);
184                 vtkAlgorithm producer = out.GetProducer();
185                 boolean isEdge = (producer instanceof vtkFeatureEdges);
186                 producer.Delete();
187                 if (isEdge == edge) {
188                         vtkProperty property = act.GetProperty();
189                         property.SetColor(color);
190                         property.Delete();
191                 }
192                 out.Delete();
193                 mapper.Delete();
194         }
195 }