blob: 460e189e5d46a39b322b2a422e01acfb8538e4e1 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.awt.motif;
27
28import java.awt.Toolkit;
29import java.awt.Component;
30
31import java.awt.Point;
32import java.awt.dnd.DnDConstants;
33import java.awt.dnd.DragSource;
34import java.awt.dnd.MouseDragGestureRecognizer;
35import java.awt.dnd.DragGestureListener;
36
37import java.awt.event.InputEvent;
38import java.awt.event.MouseEvent;
39import java.awt.event.MouseListener;
40import java.awt.event.MouseMotionListener;
41
42import java.lang.reflect.*;
43
44import sun.awt.dnd.SunDragSourceContextPeer;
45
46/**
47 * <p>
48 * This subclass of MouseDragGestureRecognizer defines a DragGestureRecognizer
49 * for Mouse based gestures on OSF/Motif.
50 * </p>
51 *
52 * @author Laurence P. G. Cable
53 *
54 * @see java.awt.dnd.DragGestureListener
55 * @see java.awt.dnd.DragGestureEvent
56 * @see java.awt.dnd.DragSource
57 */
58
59class MMouseDragGestureRecognizer extends MouseDragGestureRecognizer {
60
61 private static final long serialVersionUID = -841711780352520383L;
62
63 /*
64 * constant for number of pixels hysterisis before drag is determined
65 * to have started
66 */
67
68 protected static int motionThreshold;
69
70
71 protected static final int ButtonMask = InputEvent.BUTTON1_DOWN_MASK |
72 InputEvent.BUTTON2_DOWN_MASK |
73 InputEvent.BUTTON3_DOWN_MASK;
74
75 /**
76 * construct a new MMouseDragGestureRecognizer
77 *
78 * @param ds The DragSource for the Component c
79 * @param c The Component to observe
80 * @param act The actions permitted for this Drag
81 * @param dgl The DragGestureRecognizer to notify when a gesture is detected
82 *
83 */
84
85 protected MMouseDragGestureRecognizer(DragSource ds, Component c, int act, DragGestureListener dgl) {
86 super(ds, c, act, dgl);
87 }
88
89 /**
90 * construct a new MMouseDragGestureRecognizer
91 *
92 * @param ds The DragSource for the Component c
93 * @param c The Component to observe
94 * @param act The actions permitted for this Drag
95 */
96
97 protected MMouseDragGestureRecognizer(DragSource ds, Component c, int act) {
98 this(ds, c, act, null);
99 }
100
101 /**
102 * construct a new MMouseDragGestureRecognizer
103 *
104 * @param ds The DragSource for the Component c
105 * @param c The Component to observe
106 */
107
108 protected MMouseDragGestureRecognizer(DragSource ds, Component c) {
109 this(ds, c, DnDConstants.ACTION_NONE);
110 }
111
112 /**
113 * construct a new MMouseDragGestureRecognizer
114 *
115 * @param ds The DragSource for the Component c
116 */
117
118 protected MMouseDragGestureRecognizer(DragSource ds) {
119 this(ds, null);
120 }
121
122 /**
123 * determine the drop action from the event
124 */
125
126 protected int mapDragOperationFromModifiers(MouseEvent e) {
127 int mods = e.getModifiersEx();
128 int btns = mods & ButtonMask;
129
130 // Do not allow right mouse button drag since Motif DnD does not
131 // terminate drag operation on right mouse button release.
132 if (!(btns == InputEvent.BUTTON1_DOWN_MASK ||
133 btns == InputEvent.BUTTON2_DOWN_MASK)) {
134 return DnDConstants.ACTION_NONE;
135 }
136
137 return
138 SunDragSourceContextPeer.convertModifiersToDropAction(mods,
139 getSourceActions());
140 }
141
142 /**
143 * Invoked when the mouse has been clicked on a component.
144 */
145
146 public void mouseClicked(MouseEvent e) {
147 // do nothing
148 }
149
150 /**
151 * Invoked when a mouse button has been pressed on a component.
152 */
153
154 public void mousePressed(MouseEvent e) {
155 events.clear();
156
157 if (mapDragOperationFromModifiers(e) != DnDConstants.ACTION_NONE) {
158 try {
159 motionThreshold = DragSource.getDragThreshold();
160 } catch (Exception exc) {
161 motionThreshold = 5;
162 }
163 appendEvent(e);
164 }
165 }
166
167 /**
168 * Invoked when a mouse button has been released on a component.
169 */
170
171 public void mouseReleased(MouseEvent e) {
172 events.clear();
173 }
174
175 /**
176 * Invoked when the mouse enters a component.
177 */
178
179 public void mouseEntered(MouseEvent e) {
180 events.clear();
181 }
182
183 /**
184 * Invoked when the mouse exits a component.
185 */
186
187 public void mouseExited(MouseEvent e) {
188 if (!events.isEmpty()) { // gesture pending
189 int dragAction = mapDragOperationFromModifiers(e);
190
191 if (dragAction == DnDConstants.ACTION_NONE) {
192 events.clear();
193 }
194 }
195 }
196
197 /**
198 * Invoked when a mouse button is pressed on a component.
199 */
200
201 public void mouseDragged(MouseEvent e) {
202 if (!events.isEmpty()) { // gesture pending
203 int dop = mapDragOperationFromModifiers(e);
204
205
206 if (dop == DnDConstants.ACTION_NONE) {
207 return;
208 }
209
210 MouseEvent trigger = (MouseEvent)events.get(0);
211
212 Point origin = trigger.getPoint();
213 Point current = e.getPoint();
214
215 int dx = Math.abs(origin.x - current.x);
216 int dy = Math.abs(origin.y - current.y);
217
218 if (dx > motionThreshold || dy > motionThreshold) {
219 fireDragGestureRecognized(dop, ((MouseEvent)getTriggerEvent()).getPoint());
220 } else
221 appendEvent(e);
222 }
223 }
224
225 /**
226 * Invoked when the mouse button has been moved on a component
227 * (with no buttons no down).
228 */
229
230 public void mouseMoved(MouseEvent e) {
231 // do nothing
232 }
233}