1
2
3
4
5
6
7
8 package edu.uci.ics.jung.visualization3d;
9
10
11
12
13 import java.awt.event.MouseEvent;
14
15 import javax.media.j3d.Bounds;
16 import javax.media.j3d.BranchGroup;
17 import javax.media.j3d.Canvas3D;
18 import javax.media.j3d.TransformGroup;
19 import javax.swing.event.ChangeListener;
20
21 import com.sun.j3d.utils.picking.PickResult;
22 import com.sun.j3d.utils.picking.PickTool;
23 import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior;
24
25 import edu.uci.ics.jung.visualization.picking.PickedState;
26 import edu.uci.ics.jung.visualization.util.ChangeEventSupport;
27 import edu.uci.ics.jung.visualization.util.DefaultChangeEventSupport;
28
29
30
31
32
33
34 public class PickVertexBehavior<V,E> extends PickTranslateBehavior implements ChangeEventSupport {
35
36 Bounds bounds;
37 BranchGroup root;
38 ChangeEventSupport support = new DefaultChangeEventSupport(this);
39 PickedState<V> pickedState;
40
41 public PickVertexBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds, PickedState<V> pickedState){
42 super(root, canvas, bounds);
43 this.setSchedulingBounds(bounds);
44 this.bounds = bounds;
45 this.root = root;
46 this.pickedState = pickedState;
47 pickCanvas.setMode(PickTool.GEOMETRY);
48 }
49
50 public void updateScene(int xpos, int ypos){
51
52 if(mevent.getButton() == MouseEvent.BUTTON1) {
53 int buttonOne = MouseEvent.BUTTON1_MASK;
54 int shiftButtonOne = MouseEvent.BUTTON1_MASK | MouseEvent.SHIFT_MASK;
55 int modifiers = mevent.getModifiers();
56 if(modifiers == buttonOne) {
57
58 pickedState.clear();
59 doPick(xpos, ypos);
60 } else if(modifiers == shiftButtonOne) {
61 doPick(xpos, ypos);
62 }
63 }
64 }
65
66 private void doPick(int xpos, int ypos) {
67 pickCanvas.setShapeLocation(xpos, ypos);
68 PickResult result = pickCanvas.pickClosest();
69 if(result != null) {
70
71 TransformGroup tg = (TransformGroup)result.getNode(PickResult.TRANSFORM_GROUP);
72 if(tg instanceof VertexGroup) {
73
74 System.err.println("picked "+tg);
75 pickedState.pick(((VertexGroup<V>)tg).vertex, true);
76 fireStateChanged();
77 }
78 }
79 }
80
81 public void addChangeListener(ChangeListener l) {
82 support.addChangeListener(l);
83
84 }
85
86 public void fireStateChanged() {
87 support.fireStateChanged();
88
89 }
90
91 public ChangeListener[] getChangeListeners() {
92 return support.getChangeListeners();
93 }
94
95 public void removeChangeListener(ChangeListener l) {
96 support.removeChangeListener(l);
97 }
98 }
99