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