1. /*
  2. * @(#)AWTEvent.java 1.50 03/01/27
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package java.awt;
  8. import java.util.EventObject;
  9. import java.awt.event.*;
  10. import java.awt.peer.ComponentPeer;
  11. import java.awt.peer.LightweightPeer;
  12. /**
  13. * The root event class for all AWT events.
  14. * This class and its subclasses supercede the original
  15. * java.awt.Event class.
  16. * Subclasses of this root AWTEvent class defined outside of the
  17. * java.awt.event package should define event ID values greater than
  18. * the value defined by RESERVED_ID_MAX.
  19. * <p>
  20. * The event masks defined in this class are needed by Component subclasses
  21. * which are using Component.enableEvents() to select for event types not
  22. * selected by registered listeners. If a listener is registered on a
  23. * component, the appropriate event mask is already set internally by the
  24. * component.
  25. * <p>
  26. * The masks are also used to specify to which types of events an
  27. * AWTEventListener should listen. The masks are bitwise-ORed together
  28. * and passed to Toolkit.addAWTEventListener.
  29. *
  30. * @see Component#enableEvents
  31. * @see Toolkit#addAWTEventListener
  32. *
  33. * @see java.awt.event.ActionEvent
  34. * @see java.awt.event.AdjustmentEvent
  35. * @see java.awt.event.ComponentEvent
  36. * @see java.awt.event.ContainerEvent
  37. * @see java.awt.event.FocusEvent
  38. * @see java.awt.event.InputMethodEvent
  39. * @see java.awt.event.InvocationEvent
  40. * @see java.awt.event.ItemEvent
  41. * @see java.awt.event.HierarchyEvent
  42. * @see java.awt.event.KeyEvent
  43. * @see java.awt.event.MouseEvent
  44. * @see java.awt.event.MouseWheelEvent
  45. * @see java.awt.event.PaintEvent
  46. * @see java.awt.event.TextEvent
  47. * @see java.awt.event.WindowEvent
  48. *
  49. * @author Carl Quinn
  50. * @author Amy Fowler
  51. * @version 1.50 01/27/03
  52. * @since 1.1
  53. */
  54. public abstract class AWTEvent extends EventObject {
  55. private byte bdata[];
  56. /**
  57. * The event's id.
  58. * @serial
  59. * @see #getID()
  60. * @see #AWTEvent
  61. */
  62. protected int id;
  63. /**
  64. * Controls whether or not the event is sent back down to the peer once the
  65. * source has processed it - false means it's sent to the peer; true means
  66. * it's not. Semantic events always have a 'true' value since they were
  67. * generated by the peer in response to a low-level event.
  68. * @serial
  69. * @see #consume
  70. * @see #isConsumed
  71. */
  72. protected boolean consumed = false;
  73. transient boolean focusManagerIsDispatching = false;
  74. /**
  75. * The event mask for selecting component events.
  76. */
  77. public final static long COMPONENT_EVENT_MASK = 0x01;
  78. /**
  79. * The event mask for selecting container events.
  80. */
  81. public final static long CONTAINER_EVENT_MASK = 0x02;
  82. /**
  83. * The event mask for selecting focus events.
  84. */
  85. public final static long FOCUS_EVENT_MASK = 0x04;
  86. /**
  87. * The event mask for selecting key events.
  88. */
  89. public final static long KEY_EVENT_MASK = 0x08;
  90. /**
  91. * The event mask for selecting mouse events.
  92. */
  93. public final static long MOUSE_EVENT_MASK = 0x10;
  94. /**
  95. * The event mask for selecting mouse motion events.
  96. */
  97. public final static long MOUSE_MOTION_EVENT_MASK = 0x20;
  98. /**
  99. * The event mask for selecting window events.
  100. */
  101. public final static long WINDOW_EVENT_MASK = 0x40;
  102. /**
  103. * The event mask for selecting action events.
  104. */
  105. public final static long ACTION_EVENT_MASK = 0x80;
  106. /**
  107. * The event mask for selecting adjustment events.
  108. */
  109. public final static long ADJUSTMENT_EVENT_MASK = 0x100;
  110. /**
  111. * The event mask for selecting item events.
  112. */
  113. public final static long ITEM_EVENT_MASK = 0x200;
  114. /**
  115. * The event mask for selecting text events.
  116. */
  117. public final static long TEXT_EVENT_MASK = 0x400;
  118. /**
  119. * The event mask for selecting input method events.
  120. */
  121. public final static long INPUT_METHOD_EVENT_MASK = 0x800;
  122. /**
  123. * The pseudo event mask for enabling input methods.
  124. * We're using one bit in the eventMask so we don't need
  125. * a separate field inputMethodsEnabled.
  126. */
  127. final static long INPUT_METHODS_ENABLED_MASK = 0x1000;
  128. /**
  129. * The event mask for selecting paint events.
  130. */
  131. public final static long PAINT_EVENT_MASK = 0x2000;
  132. /**
  133. * The event mask for selecting invocation events.
  134. */
  135. public final static long INVOCATION_EVENT_MASK = 0x4000;
  136. /**
  137. * The event mask for selecting hierarchy events.
  138. */
  139. public final static long HIERARCHY_EVENT_MASK = 0x8000;
  140. /**
  141. * The event mask for selecting hierarchy bounds events.
  142. */
  143. public final static long HIERARCHY_BOUNDS_EVENT_MASK = 0x10000;
  144. /**
  145. * The event mask for selecting mouse wheel events.
  146. * @since 1.4
  147. */
  148. public final static long MOUSE_WHEEL_EVENT_MASK = 0x20000;
  149. /**
  150. * The event mask for selecting window state events.
  151. * @since 1.4
  152. */
  153. public final static long WINDOW_STATE_EVENT_MASK = 0x40000;
  154. /**
  155. * The event mask for selecting window focus events.
  156. * @since 1.4
  157. */
  158. public final static long WINDOW_FOCUS_EVENT_MASK = 0x80000;
  159. /**
  160. * The maximum value for reserved AWT event IDs. Programs defining
  161. * their own event IDs should use IDs greater than this value.
  162. */
  163. public final static int RESERVED_ID_MAX = 1999;
  164. /*
  165. * JDK 1.1 serialVersionUID
  166. */
  167. private static final long serialVersionUID = -1825314779160409405L;
  168. static {
  169. /* ensure that the necessary native libraries are loaded */
  170. Toolkit.loadLibraries();
  171. if (!GraphicsEnvironment.isHeadless()) {
  172. initIDs();
  173. }
  174. }
  175. /**
  176. * Initialize JNI field and method IDs for fields that may be
  177. * accessed from C.
  178. */
  179. private static native void initIDs();
  180. /**
  181. * Constructs an AWTEvent object from the parameters of a 1.0-style event.
  182. * @param event the old-style event
  183. */
  184. public AWTEvent(Event event) {
  185. this(event.target, event.id);
  186. }
  187. /**
  188. * Constructs an AWTEvent object with the specified source object and type.
  189. * @param source the object where the event originated
  190. * @id the event type
  191. */
  192. public AWTEvent(Object source, int id) {
  193. super(source);
  194. this.id = id;
  195. switch(id) {
  196. case ActionEvent.ACTION_PERFORMED:
  197. case ItemEvent.ITEM_STATE_CHANGED:
  198. case AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED:
  199. case TextEvent.TEXT_VALUE_CHANGED:
  200. consumed = true;
  201. break;
  202. default:
  203. }
  204. }
  205. /**
  206. * Retargets an event to a new source. This method is typically used to
  207. * retarget an event to a lightweight child Component of the original
  208. * heavyweight source.
  209. * <p>
  210. * This method is intended to be used only by event targeting subsystems,
  211. * such as client-defined KeyboardFocusManagers. It is not for general
  212. * client use.
  213. *
  214. * @param newSource the new Object to which the event should be dispatched
  215. */
  216. public void setSource(Object newSource) {
  217. if (source == newSource) {
  218. return;
  219. }
  220. Component comp = null;
  221. if (newSource instanceof Component) {
  222. comp = (Component)newSource;
  223. while (comp != null && comp.peer != null &&
  224. (comp.peer instanceof LightweightPeer)) {
  225. comp = comp.parent;
  226. }
  227. }
  228. synchronized (this) {
  229. source = newSource;
  230. if (comp != null) {
  231. ComponentPeer peer = comp.peer;
  232. if (peer != null) {
  233. nativeSetSource(peer);
  234. }
  235. }
  236. }
  237. }
  238. private native void nativeSetSource(ComponentPeer peer);
  239. /**
  240. * Returns the event type.
  241. */
  242. public int getID() {
  243. return id;
  244. }
  245. /**
  246. * Returns a String representation of this object.
  247. */
  248. public String toString() {
  249. String srcName = null;
  250. if (source instanceof Component) {
  251. srcName = ((Component)source).getName();
  252. } else if (source instanceof MenuComponent) {
  253. srcName = ((MenuComponent)source).getName();
  254. }
  255. return getClass().getName() + "[" + paramString() + "] on " +
  256. (srcName != null? srcName : source);
  257. }
  258. /**
  259. * Returns a string representing the state of this <code>Event</code>.
  260. * This method is intended to be used only for debugging purposes, and the
  261. * content and format of the returned string may vary between
  262. * implementations. The returned string may be empty but may not be
  263. * <code>null</code>.
  264. *
  265. * @return a string representation of this event
  266. */
  267. public String paramString() {
  268. return "";
  269. }
  270. /**
  271. * Consumes this event, if this event can be consumed. Only low-level,
  272. * system events can be consumed
  273. */
  274. protected void consume() {
  275. switch(id) {
  276. case KeyEvent.KEY_PRESSED:
  277. case KeyEvent.KEY_RELEASED:
  278. case MouseEvent.MOUSE_PRESSED:
  279. case MouseEvent.MOUSE_RELEASED:
  280. case MouseEvent.MOUSE_MOVED:
  281. case MouseEvent.MOUSE_DRAGGED:
  282. case MouseEvent.MOUSE_ENTERED:
  283. case MouseEvent.MOUSE_EXITED:
  284. case MouseEvent.MOUSE_WHEEL:
  285. case InputMethodEvent.INPUT_METHOD_TEXT_CHANGED:
  286. case InputMethodEvent.CARET_POSITION_CHANGED:
  287. consumed = true;
  288. break;
  289. default:
  290. // event type cannot be consumed
  291. }
  292. }
  293. /**
  294. * Returns whether this event has been consumed.
  295. */
  296. protected boolean isConsumed() {
  297. return consumed;
  298. }
  299. /**
  300. * Converts a new event to an old one (used for compatibility).
  301. * If the new event cannot be converted (because no old equivalent
  302. * exists) then this returns null.
  303. *
  304. * Note: this method is here instead of in each individual new
  305. * event class in java.awt.event because we don't want to make
  306. * it public and it needs to be called from java.awt.
  307. */
  308. Event convertToOld() {
  309. Object src = getSource();
  310. int newid = id;
  311. switch(id) {
  312. case KeyEvent.KEY_PRESSED:
  313. case KeyEvent.KEY_RELEASED:
  314. KeyEvent ke = (KeyEvent)this;
  315. if (ke.isActionKey()) {
  316. newid = (id == KeyEvent.KEY_PRESSED?
  317. Event.KEY_ACTION : Event.KEY_ACTION_RELEASE);
  318. }
  319. int keyCode = ke.getKeyCode();
  320. if (keyCode == KeyEvent.VK_SHIFT ||
  321. keyCode == KeyEvent.VK_CONTROL ||
  322. keyCode == KeyEvent.VK_ALT) {
  323. return null; // suppress modifier keys in old event model.
  324. }
  325. // no mask for button1 existed in old Event - strip it out
  326. return new Event(src, ke.getWhen(), newid, 0, 0,
  327. Event.getOldEventKey(ke),
  328. (ke.getModifiers() & ~InputEvent.BUTTON1_MASK));
  329. case MouseEvent.MOUSE_PRESSED:
  330. case MouseEvent.MOUSE_RELEASED:
  331. case MouseEvent.MOUSE_MOVED:
  332. case MouseEvent.MOUSE_DRAGGED:
  333. case MouseEvent.MOUSE_ENTERED:
  334. case MouseEvent.MOUSE_EXITED:
  335. MouseEvent me = (MouseEvent)this;
  336. // no mask for button1 existed in old Event - strip it out
  337. Event olde = new Event(src, me.getWhen(), newid,
  338. me.getX(), me.getY(), 0,
  339. (me.getModifiers() & ~InputEvent.BUTTON1_MASK));
  340. olde.clickCount = me.getClickCount();
  341. return olde;
  342. case FocusEvent.FOCUS_GAINED:
  343. return new Event(src, Event.GOT_FOCUS, null);
  344. case FocusEvent.FOCUS_LOST:
  345. return new Event(src, Event.LOST_FOCUS, null);
  346. case WindowEvent.WINDOW_CLOSING:
  347. case WindowEvent.WINDOW_ICONIFIED:
  348. case WindowEvent.WINDOW_DEICONIFIED:
  349. return new Event(src, newid, null);
  350. case ComponentEvent.COMPONENT_MOVED:
  351. if (src instanceof Frame || src instanceof Dialog) {
  352. Point p = ((Component)src).getLocation();
  353. return new Event(src, 0, Event.WINDOW_MOVED, p.x, p.y, 0, 0);
  354. }
  355. break;
  356. case ActionEvent.ACTION_PERFORMED:
  357. ActionEvent ae = (ActionEvent)this;
  358. String cmd;
  359. if (src instanceof Button) {
  360. cmd = ((Button)src).getLabel();
  361. } else if (src instanceof MenuItem) {
  362. cmd = ((MenuItem)src).getLabel();
  363. } else {
  364. cmd = ae.getActionCommand();
  365. }
  366. return new Event(src, 0, newid, 0, 0, 0, ae.getModifiers(), cmd);
  367. case ItemEvent.ITEM_STATE_CHANGED:
  368. ItemEvent ie = (ItemEvent)this;
  369. Object arg;
  370. if (src instanceof List) {
  371. newid = (ie.getStateChange() == ItemEvent.SELECTED?
  372. Event.LIST_SELECT : Event.LIST_DESELECT);
  373. arg = ie.getItem();
  374. } else {
  375. newid = Event.ACTION_EVENT;
  376. if (src instanceof Choice) {
  377. arg = ie.getItem();
  378. } else { // Checkbox
  379. arg = new Boolean(ie.getStateChange() == ItemEvent.SELECTED);
  380. }
  381. }
  382. return new Event(src, newid, arg);
  383. case AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED:
  384. AdjustmentEvent aje = (AdjustmentEvent)this;
  385. switch(aje.getAdjustmentType()) {
  386. case AdjustmentEvent.UNIT_INCREMENT:
  387. newid = Event.SCROLL_LINE_DOWN;
  388. break;
  389. case AdjustmentEvent.UNIT_DECREMENT:
  390. newid = Event.SCROLL_LINE_UP;
  391. break;
  392. case AdjustmentEvent.BLOCK_INCREMENT:
  393. newid = Event.SCROLL_PAGE_DOWN;
  394. break;
  395. case AdjustmentEvent.BLOCK_DECREMENT:
  396. newid = Event.SCROLL_PAGE_UP;
  397. break;
  398. case AdjustmentEvent.TRACK:
  399. if (aje.getValueIsAdjusting()) {
  400. newid = Event.SCROLL_ABSOLUTE;
  401. }
  402. else {
  403. newid = Event.SCROLL_END;
  404. }
  405. break;
  406. default:
  407. return null;
  408. }
  409. return new Event(src, newid, new Integer(aje.getValue()));
  410. default:
  411. }
  412. return null;
  413. }
  414. /**
  415. * Copies all private data from this event into that.
  416. * Space is allocated for the copied data that will be
  417. * freed when the that is finalized. Upon completion,
  418. * this event is not changed.
  419. */
  420. void copyPrivateDataInto(AWTEvent that) {
  421. that.bdata = this.bdata;
  422. }
  423. } // class AWTEvent