History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/awt/AWTEvent.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/awt/AWTEvent.java+611−0
@@ -0,0 +1,611 @@
1+/*
2+ * Copyright (c) 1996, 2011, Oracle and/or its affiliates. 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. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+
26+package java.awt;
27+
28+import java.util.EventObject;
29+import java.awt.event.*;
30+import java.awt.peer.ComponentPeer;
31+import java.awt.peer.LightweightPeer;
32+import java.lang.reflect.Field;
33+import sun.awt.AWTAccessor;
34+import sun.util.logging.PlatformLogger;
35+
36+import java.security.AccessControlContext;
37+import java.security.AccessController;
38+import java.io.ObjectInputStream;
39+import java.io.IOException;
40+
41+/**
42+ * The root event class for all AWT events.
43+ * This class and its subclasses supercede the original
44+ * java.awt.Event class.
45+ * Subclasses of this root AWTEvent class defined outside of the
46+ * java.awt.event package should define event ID values greater than
47+ * the value defined by RESERVED_ID_MAX.
48+ * <p>
49+ * The event masks defined in this class are needed by Component subclasses
50+ * which are using Component.enableEvents() to select for event types not
51+ * selected by registered listeners. If a listener is registered on a
52+ * component, the appropriate event mask is already set internally by the
53+ * component.
54+ * <p>
55+ * The masks are also used to specify to which types of events an
56+ * AWTEventListener should listen. The masks are bitwise-ORed together
57+ * and passed to Toolkit.addAWTEventListener.
58+ *
59+ * @see Component#enableEvents
60+ * @see Toolkit#addAWTEventListener
61+ *
62+ * @see java.awt.event.ActionEvent
63+ * @see java.awt.event.AdjustmentEvent
64+ * @see java.awt.event.ComponentEvent
65+ * @see java.awt.event.ContainerEvent
66+ * @see java.awt.event.FocusEvent
67+ * @see java.awt.event.InputMethodEvent
68+ * @see java.awt.event.InvocationEvent
69+ * @see java.awt.event.ItemEvent
70+ * @see java.awt.event.HierarchyEvent
71+ * @see java.awt.event.KeyEvent
72+ * @see java.awt.event.MouseEvent
73+ * @see java.awt.event.MouseWheelEvent
74+ * @see java.awt.event.PaintEvent
75+ * @see java.awt.event.TextEvent
76+ * @see java.awt.event.WindowEvent
77+ *
78+ * @author Carl Quinn
79+ * @author Amy Fowler
80+ * @since 1.1
81+ */
82+public abstract class AWTEvent extends EventObject {
83+ private static final PlatformLogger log = PlatformLogger.getLogger("java.awt.AWTEvent");
84+ private byte bdata[];
85+
86+ /**
87+ * The event's id.
88+ * @serial
89+ * @see #getID()
90+ * @see #AWTEvent
91+ */
92+ protected int id;
93+
94+ /**
95+ * Controls whether or not the event is sent back down to the peer once the
96+ * source has processed it - false means it's sent to the peer; true means
97+ * it's not. Semantic events always have a 'true' value since they were
98+ * generated by the peer in response to a low-level event.
99+ * @serial
100+ * @see #consume
101+ * @see #isConsumed
102+ */
103+ protected boolean consumed = false;
104+
105+ /*
106+ * The event's AccessControlContext.
107+ */
108+ private transient volatile AccessControlContext acc =
109+ AccessController.getContext();
110+
111+ /*
112+ * Returns the acc this event was constructed with.
113+ */
114+ final AccessControlContext getAccessControlContext() {
115+ if (acc == null) {
116+ throw new SecurityException("AWTEvent is missing AccessControlContext");
117+ }
118+ return acc;
119+ }
120+
121+ transient boolean focusManagerIsDispatching = false;
122+ transient boolean isPosted;
123+
124+ /**
125+ * Indicates whether this AWTEvent was generated by the system as
126+ * opposed to by user code.
127+ */
128+ private transient boolean isSystemGenerated;
129+
130+ /**
131+ * The event mask for selecting component events.
132+ */
133+ public final static long COMPONENT_EVENT_MASK = 0x01;
134+
135+ /**
136+ * The event mask for selecting container events.
137+ */
138+ public final static long CONTAINER_EVENT_MASK = 0x02;
139+
140+ /**
141+ * The event mask for selecting focus events.
142+ */
143+ public final static long FOCUS_EVENT_MASK = 0x04;
144+
145+ /**
146+ * The event mask for selecting key events.
147+ */
148+ public final static long KEY_EVENT_MASK = 0x08;
149+
150+ /**
151+ * The event mask for selecting mouse events.
152+ */
153+ public final static long MOUSE_EVENT_MASK = 0x10;
154+
155+ /**
156+ * The event mask for selecting mouse motion events.
157+ */
158+ public final static long MOUSE_MOTION_EVENT_MASK = 0x20;
159+
160+ /**
161+ * The event mask for selecting window events.
162+ */
163+ public final static long WINDOW_EVENT_MASK = 0x40;
164+
165+ /**
166+ * The event mask for selecting action events.
167+ */
168+ public final static long ACTION_EVENT_MASK = 0x80;
169+
170+ /**
171+ * The event mask for selecting adjustment events.
172+ */
173+ public final static long ADJUSTMENT_EVENT_MASK = 0x100;
174+
175+ /**
176+ * The event mask for selecting item events.
177+ */
178+ public final static long ITEM_EVENT_MASK = 0x200;
179+
180+ /**
181+ * The event mask for selecting text events.
182+ */
183+ public final static long TEXT_EVENT_MASK = 0x400;
184+
185+ /**
186+ * The event mask for selecting input method events.
187+ */
188+ public final static long INPUT_METHOD_EVENT_MASK = 0x800;
189+
190+ /**
191+ * The pseudo event mask for enabling input methods.
192+ * We're using one bit in the eventMask so we don't need
193+ * a separate field inputMethodsEnabled.
194+ */
195+ final static long INPUT_METHODS_ENABLED_MASK = 0x1000;
196+
197+ /**
198+ * The event mask for selecting paint events.
199+ */
200+ public final static long PAINT_EVENT_MASK = 0x2000;
201+
202+ /**
203+ * The event mask for selecting invocation events.
204+ */
205+ public final static long INVOCATION_EVENT_MASK = 0x4000;
206+
207+ /**
208+ * The event mask for selecting hierarchy events.
209+ */
210+ public final static long HIERARCHY_EVENT_MASK = 0x8000;
211+
212+ /**
213+ * The event mask for selecting hierarchy bounds events.
214+ */
215+ public final static long HIERARCHY_BOUNDS_EVENT_MASK = 0x10000;
216+
217+ /**
218+ * The event mask for selecting mouse wheel events.
219+ * @since 1.4
220+ */
221+ public final static long MOUSE_WHEEL_EVENT_MASK = 0x20000;
222+
223+ /**
224+ * The event mask for selecting window state events.
225+ * @since 1.4
226+ */
227+ public final static long WINDOW_STATE_EVENT_MASK = 0x40000;
228+
229+ /**
230+ * The event mask for selecting window focus events.
231+ * @since 1.4
232+ */
233+ public final static long WINDOW_FOCUS_EVENT_MASK = 0x80000;
234+
235+ /**
236+ * WARNING: there are more mask defined privately. See
237+ * SunToolkit.GRAB_EVENT_MASK.
238+ */
239+
240+ /**
241+ * The maximum value for reserved AWT event IDs. Programs defining
242+ * their own event IDs should use IDs greater than this value.
243+ */
244+ public final static int RESERVED_ID_MAX = 1999;
245+
246+ // security stuff
247+ private static Field inputEvent_CanAccessSystemClipboard_Field = null;
248+
249+ /*
250+ * JDK 1.1 serialVersionUID
251+ */
252+ private static final long serialVersionUID = -1825314779160409405L;
253+
254+ static {
255+ /* ensure that the necessary native libraries are loaded */
256+ Toolkit.loadLibraries();
257+ if (!GraphicsEnvironment.isHeadless()) {
258+ initIDs();
259+ }
260+ AWTAccessor.setAWTEventAccessor(
261+ new AWTAccessor.AWTEventAccessor() {
262+ public void setPosted(AWTEvent ev) {
263+ ev.isPosted = true;
264+ }
265+ public void setSystemGenerated(AWTEvent ev) {
266+ ev.isSystemGenerated = true;
267+ }
268+ public boolean isSystemGenerated(AWTEvent ev) {
269+ return ev.isSystemGenerated;
270+ }
271+
272+ public AccessControlContext getAccessControlContext(AWTEvent ev) {
273+ return ev.getAccessControlContext();
274+ }
275+ });
276+ }
277+
278+ private static synchronized Field get_InputEvent_CanAccessSystemClipboard() {
279+ if (inputEvent_CanAccessSystemClipboard_Field == null) {
280+ inputEvent_CanAccessSystemClipboard_Field =
281+ (Field)java.security.AccessController.doPrivileged(
282+ new java.security.PrivilegedAction() {
283+ public Object run() {
284+ Field field = null;
285+ try {
286+ field = InputEvent.class.
287+ getDeclaredField("canAccessSystemClipboard");
288+ field.setAccessible(true);
289+ return field;
290+ } catch (SecurityException e) {
291+ if (log.isLoggable(PlatformLogger.FINE)) {
292+ log.fine("AWTEvent.get_InputEvent_CanAccessSystemClipboard() got SecurityException ", e);
293+ }
294+ } catch (NoSuchFieldException e) {
295+ if (log.isLoggable(PlatformLogger.FINE)) {
296+ log.fine("AWTEvent.get_InputEvent_CanAccessSystemClipboard() got NoSuchFieldException ", e);
297+ }
298+ }
299+ return null;
300+ }
301+ });
302+ }
303+
304+ return inputEvent_CanAccessSystemClipboard_Field;
305+ }
306+
307+ /**
308+ * Initialize JNI field and method IDs for fields that may be
309+ * accessed from C.
310+ */
311+ private static native void initIDs();
312+
313+ /**
314+ * Constructs an AWTEvent object from the parameters of a 1.0-style event.
315+ * @param event the old-style event
316+ */
317+ public AWTEvent(Event event) {
318+ this(event.target, event.id);
319+ }
320+
321+ /**
322+ * Constructs an AWTEvent object with the specified source object and type.
323+ *
324+ * @param source the object where the event originated
325+ * @param id the event type
326+ */
327+ public AWTEvent(Object source, int id) {
328+ super(source);
329+ this.id = id;
330+ switch(id) {
331+ case ActionEvent.ACTION_PERFORMED:
332+ case ItemEvent.ITEM_STATE_CHANGED:
333+ case AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED:
334+ case TextEvent.TEXT_VALUE_CHANGED:
335+ consumed = true;
336+ break;
337+ default:
338+ }
339+ }
340+
341+ /**
342+ * Retargets an event to a new source. This method is typically used to
343+ * retarget an event to a lightweight child Component of the original
344+ * heavyweight source.
345+ * <p>
346+ * This method is intended to be used only by event targeting subsystems,
347+ * such as client-defined KeyboardFocusManagers. It is not for general
348+ * client use.
349+ *
350+ * @param newSource the new Object to which the event should be dispatched
351+ * @since 1.4
352+ */
353+ public void setSource(Object newSource) {
354+ if (source == newSource) {
355+ return;
356+ }
357+
358+ Component comp = null;
359+ if (newSource instanceof Component) {
360+ comp = (Component)newSource;
361+ while (comp != null && comp.peer != null &&
362+ (comp.peer instanceof LightweightPeer)) {
363+ comp = comp.parent;
364+ }
365+ }
366+
367+ synchronized (this) {
368+ source = newSource;
369+ if (comp != null) {
370+ ComponentPeer peer = comp.peer;
371+ if (peer != null) {
372+ nativeSetSource(peer);
373+ }
374+ }
375+ }
376+ }
377+
378+ private native void nativeSetSource(ComponentPeer peer);
379+
380+ /**
381+ * Returns the event type.
382+ */
383+ public int getID() {
384+ return id;
385+ }
386+
387+ /**
388+ * Returns a String representation of this object.
389+ */
390+ public String toString() {
391+ String srcName = null;
392+ if (source instanceof Component) {
393+ srcName = ((Component)source).getName();
394+ } else if (source instanceof MenuComponent) {
395+ srcName = ((MenuComponent)source).getName();
396+ }
397+ return getClass().getName() + "[" + paramString() + "] on " +
398+ (srcName != null? srcName : source);
399+ }
400+
401+ /**
402+ * Returns a string representing the state of this <code>Event</code>.
403+ * This method is intended to be used only for debugging purposes, and the
404+ * content and format of the returned string may vary between
405+ * implementations. The returned string may be empty but may not be
406+ * <code>null</code>.
407+ *
408+ * @return a string representation of this event
409+ */
410+ public String paramString() {
411+ return "";
412+ }
413+
414+ /**
415+ * Consumes this event, if this event can be consumed. Only low-level,
416+ * system events can be consumed
417+ */
418+ protected void consume() {
419+ switch(id) {
420+ case KeyEvent.KEY_PRESSED:
421+ case KeyEvent.KEY_RELEASED:
422+ case MouseEvent.MOUSE_PRESSED:
423+ case MouseEvent.MOUSE_RELEASED:
424+ case MouseEvent.MOUSE_MOVED:
425+ case MouseEvent.MOUSE_DRAGGED:
426+ case MouseEvent.MOUSE_ENTERED:
427+ case MouseEvent.MOUSE_EXITED:
428+ case MouseEvent.MOUSE_WHEEL:
429+ case InputMethodEvent.INPUT_METHOD_TEXT_CHANGED:
430+ case InputMethodEvent.CARET_POSITION_CHANGED:
431+ consumed = true;
432+ break;
433+ default:
434+ // event type cannot be consumed
435+ }
436+ }
437+
438+ /**
439+ * Returns whether this event has been consumed.
440+ */
441+ protected boolean isConsumed() {
442+ return consumed;
443+ }
444+
445+ /**
446+ * Converts a new event to an old one (used for compatibility).
447+ * If the new event cannot be converted (because no old equivalent
448+ * exists) then this returns null.
449+ *
450+ * Note: this method is here instead of in each individual new
451+ * event class in java.awt.event because we don't want to make
452+ * it public and it needs to be called from java.awt.
453+ */
454+ Event convertToOld() {
455+ Object src = getSource();
456+ int newid = id;
457+
458+ switch(id) {
459+ case KeyEvent.KEY_PRESSED:
460+ case KeyEvent.KEY_RELEASED:
461+ KeyEvent ke = (KeyEvent)this;
462+ if (ke.isActionKey()) {
463+ newid = (id == KeyEvent.KEY_PRESSED?
464+ Event.KEY_ACTION : Event.KEY_ACTION_RELEASE);
465+ }
466+ int keyCode = ke.getKeyCode();
467+ if (keyCode == KeyEvent.VK_SHIFT ||
468+ keyCode == KeyEvent.VK_CONTROL ||
469+ keyCode == KeyEvent.VK_ALT) {
470+ return null; // suppress modifier keys in old event model.
471+ }
472+ // no mask for button1 existed in old Event - strip it out
473+ return new Event(src, ke.getWhen(), newid, 0, 0,
474+ Event.getOldEventKey(ke),
475+ (ke.getModifiers() & ~InputEvent.BUTTON1_MASK));
476+
477+ case MouseEvent.MOUSE_PRESSED:
478+ case MouseEvent.MOUSE_RELEASED:
479+ case MouseEvent.MOUSE_MOVED:
480+ case MouseEvent.MOUSE_DRAGGED:
481+ case MouseEvent.MOUSE_ENTERED:
482+ case MouseEvent.MOUSE_EXITED:
483+ MouseEvent me = (MouseEvent)this;
484+ // no mask for button1 existed in old Event - strip it out
485+ Event olde = new Event(src, me.getWhen(), newid,
486+ me.getX(), me.getY(), 0,
487+ (me.getModifiers() & ~InputEvent.BUTTON1_MASK));
488+ olde.clickCount = me.getClickCount();
489+ return olde;
490+
491+ case FocusEvent.FOCUS_GAINED:
492+ return new Event(src, Event.GOT_FOCUS, null);
493+
494+ case FocusEvent.FOCUS_LOST:
495+ return new Event(src, Event.LOST_FOCUS, null);
496+
497+ case WindowEvent.WINDOW_CLOSING:
498+ case WindowEvent.WINDOW_ICONIFIED:
499+ case WindowEvent.WINDOW_DEICONIFIED:
500+ return new Event(src, newid, null);
501+
502+ case ComponentEvent.COMPONENT_MOVED:
503+ if (src instanceof Frame || src instanceof Dialog) {
504+ Point p = ((Component)src).getLocation();
505+ return new Event(src, 0, Event.WINDOW_MOVED, p.x, p.y, 0, 0);
506+ }
507+ break;
508+
509+ case ActionEvent.ACTION_PERFORMED:
510+ ActionEvent ae = (ActionEvent)this;
511+ String cmd;
512+ if (src instanceof Button) {
513+ cmd = ((Button)src).getLabel();
514+ } else if (src instanceof MenuItem) {
515+ cmd = ((MenuItem)src).getLabel();
516+ } else {
517+ cmd = ae.getActionCommand();
518+ }
519+ return new Event(src, 0, newid, 0, 0, 0, ae.getModifiers(), cmd);
520+
521+ case ItemEvent.ITEM_STATE_CHANGED:
522+ ItemEvent ie = (ItemEvent)this;
523+ Object arg;
524+ if (src instanceof List) {
525+ newid = (ie.getStateChange() == ItemEvent.SELECTED?
526+ Event.LIST_SELECT : Event.LIST_DESELECT);
527+ arg = ie.getItem();
528+ } else {
529+ newid = Event.ACTION_EVENT;
530+ if (src instanceof Choice) {
531+ arg = ie.getItem();
532+
533+ } else { // Checkbox
534+ arg = Boolean.valueOf(ie.getStateChange() == ItemEvent.SELECTED);
535+ }
536+ }
537+ return new Event(src, newid, arg);
538+
539+ case AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED:
540+ AdjustmentEvent aje = (AdjustmentEvent)this;
541+ switch(aje.getAdjustmentType()) {
542+ case AdjustmentEvent.UNIT_INCREMENT:
543+ newid = Event.SCROLL_LINE_DOWN;
544+ break;
545+ case AdjustmentEvent.UNIT_DECREMENT:
546+ newid = Event.SCROLL_LINE_UP;
547+ break;
548+ case AdjustmentEvent.BLOCK_INCREMENT:
549+ newid = Event.SCROLL_PAGE_DOWN;
550+ break;
551+ case AdjustmentEvent.BLOCK_DECREMENT:
552+ newid = Event.SCROLL_PAGE_UP;
553+ break;
554+ case AdjustmentEvent.TRACK:
555+ if (aje.getValueIsAdjusting()) {
556+ newid = Event.SCROLL_ABSOLUTE;
557+ }
558+ else {
559+ newid = Event.SCROLL_END;
560+ }
561+ break;
562+ default:
563+ return null;
564+ }
565+ return new Event(src, newid, Integer.valueOf(aje.getValue()));
566+
567+ default:
568+ }
569+ return null;
570+ }
571+
572+ /**
573+ * Copies all private data from this event into that.
574+ * Space is allocated for the copied data that will be
575+ * freed when the that is finalized. Upon completion,
576+ * this event is not changed.
577+ */
578+ void copyPrivateDataInto(AWTEvent that) {
579+ that.bdata = this.bdata;
580+ // Copy canAccessSystemClipboard value from this into that.
581+ if (this instanceof InputEvent && that instanceof InputEvent) {
582+ Field field = get_InputEvent_CanAccessSystemClipboard();
583+ if (field != null) {
584+ try {
585+ boolean b = field.getBoolean(this);
586+ field.setBoolean(that, b);
587+ } catch(IllegalAccessException e) {
588+ if (log.isLoggable(PlatformLogger.FINE)) {
589+ log.fine("AWTEvent.copyPrivateDataInto() got IllegalAccessException ", e);
590+ }
591+ }
592+ }
593+ }
594+ that.isSystemGenerated = this.isSystemGenerated;
595+ }
596+
597+ void dispatched() {
598+ if (this instanceof InputEvent) {
599+ Field field = get_InputEvent_CanAccessSystemClipboard();
600+ if (field != null) {
601+ try {
602+ field.setBoolean(this, false);
603+ } catch(IllegalAccessException e) {
604+ if (log.isLoggable(PlatformLogger.FINE)) {
605+ log.fine("AWTEvent.dispatched() got IllegalAccessException ", e);
606+ }
607+ }
608+ }
609+ }
610+ }
611+} // class AWTEvent