| MouseFollower.java |
1 package fi.jyu.mit.graphics;
2 import java.awt.event.MouseAdapter;
3 import java.awt.event.MouseEvent;
4
5
6 /**
7 * Luokka jolla voidaan siirtää kuvia hiiren klikkauksen kohdalle.
8 * TODO: ei (ehkä) toimi jos paneelia on skaalattu. Tarvitsee toteuttaa
9 * ensin käänteiskuvaus. Samoin ei toimi jos peruspolkua on muutettu.
10 * @author Vesa Lappalainen
11 * @version 20.8.2008
12 * @version 8.3.2012
13 */
14 public class MouseFollower extends MouseAdapter {
15 public interface MouseMoveFollower {
16 public void mouseMoved(RPoint rp);
17 }
18
19 private Transformable object;
20 private MouseMoveFollower follower = null;
21 private SpacePanel panel;
22 private boolean currentDrag = false;
23 private boolean currentMove = false;
24 private boolean currentPressed = true;
25
26 /**
27 * Alustetaan hiiren seuraaja.
28 * @param panel paneli jossa tapahtumia muutoksia seurataan
29 * @param object olio jota siirretään hiiren mukaan.
30 * @param x olion koordinaatti johon keskitetään
31 * @param y olion koordinaatti johon keskitetään
32 * @param z olion koordinaatti johon keskitetään
33 * @param drag liikutetaan
34 */
35 @SuppressWarnings("unused")
36 public MouseFollower(SpacePanel panel, Transformable object, double x,double y, double z,boolean drag) { // NOPMD
37 this.object = object;
38 this.panel = panel;
39 panel.addMouseListener(this);
40 startFollow(drag);
41 }
42
43 /**
44 * Alustetaan hiiren seuraaja.
45 * @param panel paneli jossa tapahtumia muutoksia seurataan
46 * @param follower käsittelijä jota kutsutaan kun hiiri liikahtaa
47 * @param drag jos true, kutsutaan hiiri pohjassa liikuttelusta, muuten vain klikkauksesta
48 */
49 public MouseFollower(SpacePanel panel, MouseMoveFollower follower,boolean drag) {
50 this.follower = follower;
51 this.panel = panel;
52 startFollow(drag);
53 }
54
55 /**
56 * Alustetaan hiiren seuraaja siten, että z-koordinaatin arvo on nolla ja liikutetaan on tosi
57 * @param panel paneeli jossa tapahtumia muutoksia seurataan
58 * @param object olio jota siirretään hiiren mukaan.
59 * @param x olion koordinaatti johon keskitetään
60 * @param y olion koordinaatti johon keskitetään
61 */
62 public MouseFollower(SpacePanel panel, Transformable object, double x,double y) {
63 this(panel,object,x,y,0,true);
64 }
65
66
67 /**
68 * Alustetaan hiiren seuraaja siten, että z-koordinaatin arvo on nolla ja liikutetaan on tosi
69 * @param panel paneeli jossa tapahtumia muutoksia seurataan
70 * @param object olio jota siirretään hiiren mukaan.
71 * @param drag jos true, kutsutaan hiiri pohjassa liikuttelusta, muuten vain klikkauksesta
72 */
73 public MouseFollower(SpacePanel panel, Transformable object, boolean drag) {
74 this(panel,object,0,0,0,drag);
75 }
76
77
78 /**
79 * Alustetaan hiiren seuraaja siten, että z-koordinaatin arvo on nolla ja liikutetaan on tosi
80 * @param panel paneeli jossa tapahtumia muutoksia seurataan
81 * @param object olio jota siirretään hiiren mukaan.
82 */
83 public MouseFollower(SpacePanel panel, Transformable object) {
84 this(panel,object,0,0,0,false);
85 }
86
87
88 /**
89 * Lopetetaan hiiren seuraaminen
90 */
91 public void stopFollow() {
92 panel.removeMouseListener(this);
93 panel.removeMouseMotionListener(this);
94 }
95
96
97 /**
98 * Aloitetaan hiiren seuraaminen
99 * @param drag jos true, kutsutaan hiiri pohjassa liikuttelusta, muuten vain klikkauksesta
100 */
101 public void startFollow(boolean drag) {
102 stopFollow();
103 panel.addMouseListener(this);
104 panel.addMouseMotionListener(this);
105 currentDrag = drag;
106 }
107
108
109 /**
110 * Aloitetaan hiiren seuraaminen
111 */
112 public void startFollow() {
113 startFollow(currentDrag);
114 }
115
116
117 /**
118 * Palautetaan panelin ruutpistettä vastaava reaalimaailman piste tasosta z=0
119 * @param panel mhinkä paneelin piste
120 * @param x panelin ruutupisteen x-koordinaatti
121 * @param y panelin ruutupisteen x-koordinaatti
122 * @param sp piste johon palautetaan klikatuin pisteen laitekoordinaatit
123 * @return reaalimaailman piste
124 */
125 public static RPoint getRPoint(SpacePanel panel, double x, double y, RPoint sp) {
126 RPoint rp = new RPoint();
127 panel.getFullTransform().getInversion().transform(x,y,0,sp,rp);
128 return rp;
129 }
130
131
132 /**
133 * Palautetaan panelin ruutpistettä vastaava reaalimaailman piste tasosta z=0
134 * @param panel mhinkä paneelin piste
135 * @param x panelin ruutupisteen x-koordinaatti
136 * @param y panelin ruutupisteen x-koordinaatti
137 * @return reaalimaailman piste
138 */
139 public static RPoint getRPoint(SpacePanel panel, double x, double y) {
140 return getRPoint(panel, x, y, new RPoint());
141 }
142
143
144 /**
145 * Palautetaan mouse eventtiä vastaava reaalimaailman piste tasosta z=0
146 * @param panel mhinkä paneelin piste
147 * @param e hiiren tapahtuman tiedot
148 * @param sp piste johon palautetaan klikatuin pisteen laitekoordinaatit
149 * @return reaalimaailman piste
150 */
151 public static RPoint getRPoint(SpacePanel panel, MouseEvent e, RPoint sp) {
152 return getRPoint(panel,e.getX(),e.getY(),sp);
153 }
154
155 /**
156 * Palautetaan mouse eventtiä vastaava reaalimaailman piste tasosta z=0
157 * @param panel mhinkä paneelin piste
158 * @param e hiiren tapahtuman tiedot
159 * @return reaalimaailman piste
160 */
161 public static RPoint getRPoint(SpacePanel panel, MouseEvent e) {
162 return getRPoint(panel, e,new RPoint());
163 }
164
165
166 /**
167 * This is only for inner purposes
168 * @param e MouseEvent
169 */
170 private void doMove(MouseEvent e) {
171 // if ( ! (e.getComponent() instanceof SpacePanel) ) return;
172 SpacePanel panel = (SpacePanel)e.getComponent();
173 RPoint sp = new RPoint();
174 if ( object != null ) {
175 BasicShape comp = (BasicShape)object;
176 SPoint op = comp.getPoint(panel.getFullTransform(), 0, 0, 0);
177 RPoint rp = getRPoint(panel,e.getX()-op.getX(),e.getY()-op.getY(),sp);
178 RPoint rp0 = getRPoint(panel,0,0,sp);
179 //comp.setTransform(new TranslateMatrix(sp.getX()-op.getX(),sp.getY()-op.getY(),0).multiply(comp.getTransform(null)));
180 comp.setTransform(new TranslateMatrix(rp.getX()-rp0.getX(),rp.getY()-rp0.getY(),0).multiply(comp.getTransform(null)));
181 }
182 if ( follower != null ) {
183 RPoint rp = getRPoint(panel,e,sp);
184 follower.mouseMoved(rp);
185 }
186 }
187
188
189 /**
190 * Hiiren painalluksen tapahtumankäsittelijä
191 * @param e käsiteltävä hiiritapahtuma
192 */
193 @Override
194 public void mousePressed(MouseEvent e) {
195 if ( currentPressed )
196 doMove(e);
197 }
198
199
200 /**
201 * Hiiren raahauksen tapahtumankäsittelijä
202 * @param e käsiteltävä hiiritapahtuma
203 */
204 @Override
205 public void mouseDragged(MouseEvent e) {
206 if ( currentDrag )
207 doMove(e);
208 }
209
210
211 /**
212 * Tyhjä toteutus metodille. MouseAdapter Java 6:ssa sisältää tyhjät
213 * toteutukset MouseMotionListener-rajapinnan metodeille. Javan versiot
214 * 1.5:stä aiempiin eivät näitä sisällä.
215 *
216 * @param e ei käytetä.
217 * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
218 */
219 @Override
220 public void mouseMoved(MouseEvent e) {
221 if ( currentMove )
222 doMove(e);
223 }
224
225
226 /**
227 * @return seurataanko liikuttelua
228 */
229 public boolean isMove() {
230 return currentMove;
231 }
232
233
234 /**
235 * Asetetaan seuraamaan liikuttelua
236 * @param move päälle vaiko pois
237 */
238 public void setMove(boolean move) {
239 this.currentMove = move;
240 }
241
242
243 /**
244 * @return Seurataanko clikkausta
245 */
246 public boolean isPressed() {
247 return currentPressed;
248 }
249
250
251 /**
252 * Asetetaan seuraamaan klikkausta
253 * @param pressed päälle vaiko pois
254 */
255 public void setPressed(boolean pressed) {
256 this.currentPressed = pressed;
257 }
258
259
260 /**
261 * @return seurataanko raahaamista
262 */
263 public boolean isDrag() {
264 return currentDrag;
265 }
266
267
268 /**
269 * Asetetaan seuraamaan raahaamista
270 * @param drag
271 */
272 public void setDrag(boolean drag) {
273 this.currentDrag = drag;
274 }
275 }
276