source: trunk/src/org/expeditee/gio/input/StandardInputEventListeners.java@ 1097

Last change on this file since 1097 was 1097, checked in by davidb, 6 years ago

Newly structured files from Corey's work on logic/graphics separation

File size: 6.4 KB
Line 
1package org.expeditee.gio.input;
2
3import org.expeditee.actions.Actions;
4import org.expeditee.actions.Simple;
5import org.expeditee.gio.InputManager;
6import org.expeditee.gio.input.InputEvent.InputType;
7import org.expeditee.gio.input.KBMInputEvent.EventType;
8import org.expeditee.gio.input.KBMInputEvent.Key;
9import org.expeditee.gio.input.KBMInputEvent.MouseButton;
10import org.expeditee.gui.FrameUtils;
11import org.expeditee.gui.Help;
12import org.expeditee.stats.Logger;
13import org.expeditee.stats.SessionStats;
14
15/**
16 * Static class to house all of the standard Expeditee input listeners.
17 *
18 * @author cts16
19 */
20public class StandardInputEventListeners {
21
22 /** Cannot be constructed, static class only. */
23 private StandardInputEventListeners()
24 {
25 }
26
27 /** Registers the standard input listeners with the given input manager. */
28 public static void registerWith(InputManager manager)
29 {
30 if (manager == null) return;
31
32 // Register the listeners in priority order
33 manager.registerInputEventListener(kbmStateListener);
34 manager.registerInputEventListener(helpListener);
35 manager.registerInputEventListener(statisticsListener);
36 manager.registerInputEventListener(agentListener);
37 manager.registerInputEventListener(simpleListener);
38 }
39
40 /*
41 *
42 * Expeditee's standard input-event listeners.
43 *
44 */
45
46 /** An input listener to track the state of all keys and mouse buttons. */
47 public static final KBMStateListener kbmStateListener = new KBMStateListener();
48 public static class KBMStateListener implements InputEventListener
49 {
50 private Boolean[] _keyState = new Boolean[Key.values().length];
51 private Boolean[] _mouseState = new Boolean[MouseButton.values().length];
52
53 @Override
54 public boolean onInputEvent(InputEvent event)
55 {
56 // Only interested in keyboard/mouse events
57 if (event.getInputType() != InputType.KBM) return false;
58
59 // Cast the event
60 KBMInputEvent kbmEvent = (KBMInputEvent) event;
61
62 // Track any key state changes
63 if (kbmEvent.getKeyDown() != null) {
64 _keyState[kbmEvent.getKeyDown().ordinal()] = true;
65 } else if (kbmEvent.getKeyUp() != null) {
66 _keyState[kbmEvent.getKeyUp().ordinal()] = false;
67 }
68
69 // Track any mouse button state changes
70 if (kbmEvent.getMouseButtonDown() != null) {
71 _mouseState[kbmEvent.getMouseButtonDown().ordinal()] = true;
72 } else if (kbmEvent.getMouseButtonUp() != null) {
73 _mouseState[kbmEvent.getMouseButtonUp().ordinal()] = false;
74 }
75
76 return false;
77 }
78
79 public boolean isKeyDown(Key key)
80 {
81 return (key != null) && (_keyState[key.ordinal()] == Boolean.TRUE);
82 }
83
84 public boolean isMouseButtonDown(MouseButton button)
85 {
86 return (button != null) && (_mouseState[button.ordinal()] == Boolean.TRUE);
87 }
88
89 public boolean isOnlyMouseButtonDown(MouseButton button)
90 {
91 if (button == null) return false;
92
93 for (MouseButton b : MouseButton.values()) {
94 if ((b == button && !isMouseButtonDown(b)) || (b != button && isMouseButtonDown(b))) return false;
95 }
96
97 return true;
98 }
99
100 public boolean isAnyMouseButtonDown()
101 {
102 for (MouseButton button : MouseButton.values()) {
103 if (isMouseButtonDown(button)) return true;
104 }
105
106 return false;
107 }
108 };
109
110 /** An input listener to monitor the input for statistical purposes. */
111 private static InputEventListener statisticsListener = new InputEventListener()
112 {
113 @Override
114 public boolean onInputEvent(InputEvent event) {
115 // Only interested in keyboard/mouse events
116 if (event.getInputType() != InputEvent.InputType.KBM) return false;
117 KBMInputEvent kbmEvent = (KBMInputEvent) event;
118 if (kbmEvent.getEventType() == EventType.KEY_DOWN) {
119 // Notify the change in stats
120 // TODO: Will changing this to the Expeditee KBMInputEvent upset stats? cts16
121 SessionStats.AddFrameEvent("k" + kbmEvent.getKeyText());
122
123 // Used for calculating frame stats (response time)
124 FrameUtils.ResponseTimer.restart();
125
126 // Watch for escape key
127 if (kbmEvent.getKeyDown() == Key.ESC) SessionStats.Escape();
128
129 if (kbmStateListener.isKeyDown(Key.CTRL)) {
130 Logger.Log(Logger.USER, Logger.CONTROL_CHAR, "User pressing: Ctrl+" + kbmEvent.getKeyText());
131 }
132 } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) {
133 SessionStats.MouseClicked(kbmEvent.getMouseButtonDown());
134 switch (kbmEvent.getMouseButtonDown()) {
135 case LEFT:
136 SessionStats.AddFrameEvent("Ld");
137 break;
138 case MIDDLE:
139 SessionStats.AddFrameEvent("Md");
140 break;
141 case RIGHT:
142 SessionStats.AddFrameEvent("Rd");
143 break;
144 default:
145 break;
146 }
147 } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_UP) {
148 FrameUtils.ResponseTimer.restart();
149 switch (kbmEvent.getMouseButtonUp()) {
150 case LEFT:
151 SessionStats.AddFrameEvent("Lu");
152 break;
153 case MIDDLE:
154 SessionStats.AddFrameEvent("Mu");
155 break;
156 case RIGHT:
157 SessionStats.AddFrameEvent("Ru");
158 break;
159 default:
160 break;
161 }
162 }
163 return false;
164 }
165 };
166
167 /** An input listener to monitor keyboard input for running agents. */
168 private static InputEventListener agentListener = new InputEventListener() {
169 @Override
170 public boolean onInputEvent(InputEvent event) {
171 // Only interested in keyboard/mouse events
172 if (event.getInputType() != InputType.KBM) return false;
173 KBMInputEvent kbmEvent = (KBMInputEvent) event;
174 if (Actions.isAgentRunning()) {
175 if (kbmEvent.getKeyDown() == Key.ESC || kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) {
176 Actions.stopAgent();
177 } else if (kbmEvent.getEventType() == EventType.KEY_DOWN) {
178 Actions.interruptAgent();
179 }
180 }
181 return false;
182 }
183 };
184
185 /** An input listener to consume keyboard input for running Simple programs. */
186 private static InputEventListener simpleListener = new InputEventListener() {
187 @Override
188 public boolean onInputEvent(InputEvent event) {
189 // Only interested in keyboard/mouse events
190 if (event.getInputType() != InputEvent.InputType.KBM) return false;
191 if (Simple.consumeKeyboardInput()) return true;
192 return false;
193 }
194 };
195
196 /** An input listener to update the message-bay help text. */
197 private static InputEventListener helpListener = new InputEventListener()
198 {
199 @Override
200 public boolean onInputEvent(InputEvent event) {
201 // Only interested in keyboard/mouse events
202 if (event.getInputType() != InputEvent.InputType.KBM) return false;
203 Help.updateStatus(kbmStateListener.isKeyDown(Key.CTRL), kbmStateListener.isKeyDown(Key.SHIFT));
204 return false;
205 }
206 };
207}
Note: See TracBrowser for help on using the repository browser.