1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*
*/
package javax.media.j3d;
import java.awt.AWTEvent;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/**
* Class that specifies a Behavior wakeup when a specific AWT event occurs.
*/
public final class WakeupOnAWTEvent extends WakeupCriterion {
// different types of WakeupIndexedList that use in BehaviorStructure
static final int COND_IN_BS_LIST = 0;
// total number of different IndexedUnorderedSet types
static final int TOTAL_INDEXED_UNORDER_SET_TYPES = 1;
// one of these two variables must be equal to zero
int AwtId;
long EventMask;
long enableAWTEventTS = 0L;
final ArrayList<AWTEvent> events = new ArrayList<AWTEvent>();
/**
* Constructs a new WakeupOnAWTEvent object that informs the Java 3D
* scheduler to wake up the specified Behavior object whenever the
* specified AWT event occurs.
* @param AWTId the AWT ids that this behavior wishes to intercept
*/
public WakeupOnAWTEvent(int AWTId) {
this.AwtId = AWTId;
this.EventMask = 0L;
WakeupIndexedList.init(this, TOTAL_INDEXED_UNORDER_SET_TYPES);
}
/**
* Constructs a new WakeupOnAWTEvent using Ored EVENT_MASK values.
* @param eventMask the AWT EVENT_MASK values Ored together
*/
public WakeupOnAWTEvent(long eventMask) {
this.EventMask = eventMask;
this.AwtId = 0;
WakeupIndexedList.init(this, TOTAL_INDEXED_UNORDER_SET_TYPES);
}
/**
* Retrieves the array of consecutive AWT event that triggered this wakeup.
* A value of null implies that this event was not the trigger for the
* behavior wakeup.
* @return either null (if not resposible for wakeup) or the array of
* AWTEvents responsible for the wakeup.
*/
public AWTEvent[] getAWTEvent() {
synchronized (events) {
AWTEvent[] eventArray = events.toArray(new AWTEvent[events.size()]);
events.clear();
return eventArray;
}
}
/**
* Sets the AWT event that will cause a behavior wakeup.
* @param event The event causing this wakeup
*/
void addAWTEvent(AWTEvent event) {
synchronized (events) {
events.add(event);
}
this.setTriggered();
}
/**
* This is a callback from BehaviorStructure. It is
* used to add wakeupCondition to behavior structure.
*/
@Override
void addBehaviorCondition(BehaviorStructure bs) {
resetBehaviorCondition(bs);
bs.wakeupOnAWTEvent.add(this);
}
/**
* This is a callback from BehaviorStructure. It is
* used to remove wakeupCondition from behavior structure.
*/
@Override
void removeBehaviorCondition(BehaviorStructure bs) {
bs.wakeupOnAWTEvent.remove(this);
}
/**
* Perform task in addBehaviorCondition() that has to be
* set every time the condition met.
*/
@Override
void resetBehaviorCondition(BehaviorStructure bs) {
if (enableAWTEventTS != bs.awtEventTimestamp) {
if ((AwtId >= FocusEvent.FOCUS_FIRST && AwtId <= FocusEvent.FOCUS_LAST) ||
(EventMask & AWTEvent.FOCUS_EVENT_MASK) != 0) {
behav.universe.enableFocusEvents();
}
if ((AwtId >= KeyEvent.KEY_FIRST && AwtId <= KeyEvent.KEY_LAST) ||
(EventMask & AWTEvent.KEY_EVENT_MASK) != 0) {
behav.universe.enableKeyEvents();
}
if ((AwtId >= MouseEvent.MOUSE_FIRST) &&
(AwtId <= MouseEvent.MOUSE_LAST)) {
if ((AwtId == MouseEvent.MOUSE_DRAGGED) ||
(AwtId == MouseEvent.MOUSE_MOVED)) {
behav.universe.enableMouseMotionEvents();
}
else if (AwtId == MouseEvent.MOUSE_WHEEL) {
behav.universe.enableMouseWheelEvents();
}
else if (AwtId == MouseEvent.MOUSE_CLICKED ||
AwtId == MouseEvent.MOUSE_ENTERED ||
AwtId == MouseEvent.MOUSE_EXITED ||
AwtId == MouseEvent.MOUSE_PRESSED ||
AwtId == MouseEvent.MOUSE_RELEASED) {
behav.universe.enableMouseEvents();
}
} else {
if ((EventMask & AWTEvent.MOUSE_EVENT_MASK) != 0) {
behav.universe.enableMouseEvents();
}
if ((EventMask & AWTEvent.MOUSE_MOTION_EVENT_MASK) != 0) {
behav.universe.enableMouseMotionEvents();
}
if ((EventMask & AWTEvent.MOUSE_WHEEL_EVENT_MASK) != 0) {
behav.universe.enableMouseWheelEvents();
}
}
enableAWTEventTS = bs.awtEventTimestamp;
}
}
}
|