1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.ui.behaviors;
39
40 import java.awt.AWTEvent;
41 import java.awt.event.MouseEvent;
42 import java.util.Iterator;
43 import org.jogamp.java3d.Behavior;
44 import org.jogamp.java3d.Transform3D;
45 import org.jogamp.java3d.TransformGroup;
46 import org.jogamp.java3d.WakeupCriterion;
47 import org.jogamp.java3d.WakeupOnAWTEvent;
48
49
50
51
52
53
54 public class MouseZoom extends MouseBehavior {
55
56 private double zFactor = 0.0002;
57 private MouseBehaviorCallback callback = null;
58 private int mouseButton = MouseEvent.BUTTON2_DOWN_MASK;
59 private int doneID = 0;
60
61
62
63
64
65
66
67 public MouseZoom(int flags, TransformGroup VPTG) {
68 super(flags, VPTG);
69 }
70
71
72
73
74
75
76
77
78
79
80 public MouseZoom(int flags, TransformGroup VPTG, Behavior behavior, int postID, int dID) {
81 super(flags, VPTG, behavior, postID);
82 doneID = dID;
83 }
84
85
86
87
88
89
90
91
92 public double getFactor() {
93 return zFactor;
94 }
95
96
97
98
99
100
101
102
103 public void setFactor(double factor) {
104 zFactor = factor;
105 }
106
107
108 public void initialize() {
109 super.initialize();
110 if ((flags & INVERT_INPUT) == INVERT_INPUT) {
111 zFactor *= -1;
112 invert = true;
113 }
114 }
115
116
117 public void processStimulus(Iterator<WakeupCriterion> criteria) {
118 boolean done = false;
119 while (criteria.hasNext()) {
120 WakeupCriterion wakeup = criteria.next();
121 if (wakeup instanceof WakeupOnAWTEvent) {
122 AWTEvent[] event = ((WakeupOnAWTEvent) wakeup).getAWTEvent();
123 for (AWTEvent awtEvent : event) {
124 processMouseEvent((MouseEvent) awtEvent);
125 int id = awtEvent.getID();
126 MouseEvent mevent = (MouseEvent) awtEvent;
127 int mod = mevent.getModifiersEx();
128 boolean middleButton = ((mod & mouseButton) == mouseButton);
129 if (!middleButton) {
130 middleButton = ((mod & MouseEvent.ALT_DOWN_MASK) == MouseEvent.ALT_DOWN_MASK);
131 }
132 if ((id == MouseEvent.MOUSE_DRAGGED) && middleButton) {
133 y = ((MouseEvent) awtEvent).getY();
134 int dy = y - yLast;
135 if (!reset) {
136 transformGroup.getTransform(currXform);
137 double z = (-1.0) * dy * zFactor;
138 double scale = currXform.getScale() + z;
139 if (scale > 0) {
140 currXform.setScale(scale);
141 transformGroup.setTransform(currXform);
142 transformChanged(currXform);
143 }
144 if (callback != null) {
145 callback.transformChanged(MouseBehaviorCallback.ZOOM, currXform);
146 }
147 } else {
148 reset = false;
149 }
150 xLast = x;
151 yLast = y;
152 }
153 if (id == MouseEvent.MOUSE_PRESSED) {
154 xLast = ((MouseEvent) awtEvent).getX();
155 yLast = ((MouseEvent) awtEvent).getY();
156 } else if (id == MouseEvent.MOUSE_RELEASED) {
157 done = true;
158 }
159 }
160 }
161 }
162 if (!done) {
163 wakeupOn(mouseCriterion);
164 } else {
165 reset = true;
166 mouseButton = MouseEvent.BUTTON2_DOWN_MASK;
167 postId(doneID);
168 wakeupOn(postCriterion);
169 }
170 }
171
172
173
174
175
176
177 public void setMouseButton(int button) {
178 mouseButton = button;
179 }
180
181
182
183
184
185
186
187
188
189 public void setupCallback(MouseBehaviorCallback c) {
190 callback = c;
191 }
192
193
194
195
196
197
198 public void transformChanged(Transform3D transform) {}
199 }