Crossfire JXClient, Trunk
KeyEvent2.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.gui.keybindings;
24 
25 import java.awt.event.InputEvent;
26 import java.awt.event.KeyEvent;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29 
34 public class KeyEvent2 implements Comparable<KeyEvent2> {
35 
39  public static final int NONE = 0;
40 
44  public static final int ALT = InputEvent.ALT_DOWN_MASK;
45 
49  public static final int ALT_GRAPH = InputEvent.ALT_GRAPH_DOWN_MASK;
50 
54  public static final int CTRL = InputEvent.CTRL_DOWN_MASK;
55 
59  public static final int META = InputEvent.META_DOWN_MASK;
60 
64  public static final int SHIFT = InputEvent.SHIFT_DOWN_MASK;
65 
69  public static final int MASK = ALT|ALT_GRAPH|CTRL|META|SHIFT;
70 
74  private final int keyCode;
75 
79  private final char keyChar;
80 
85  private final int modifiers;
86 
93  public KeyEvent2(final int keyCode, final char keyChar, final int modifiers) {
94  this.keyCode = keyCode;
95  this.keyChar = keyChar;
96  this.modifiers = modifiers;
97  }
98 
103  public int getKeyCode() {
104  return keyCode;
105  }
106 
111  public char getKeyChar() {
112  return keyChar;
113  }
114 
120  public int getModifiers() {
121  return modifiers;
122  }
123 
130  public boolean matchesKeyEvent(@NotNull final KeyEvent2 keyEvent) {
131  if (keyCode == KeyEvent.VK_UNDEFINED) {
132  return keyChar == keyEvent.keyChar;
133  }
134  return keyCode == keyEvent.keyCode && modifiers == keyEvent.modifiers;
135  }
136 
137  @Override
138  public boolean equals(@Nullable final Object obj) {
139  if (obj == null || obj.getClass() != getClass()) {
140  return false;
141  }
142  final KeyEvent2 keyEvent = (KeyEvent2)obj;
143  if (keyCode != KeyEvent.VK_UNDEFINED && keyEvent.keyCode != KeyEvent.VK_UNDEFINED) {
144  return keyCode == keyEvent.keyCode && modifiers == keyEvent.modifiers;
145  }
146  //noinspection SimplifiableIfStatement
147  if (keyCode == KeyEvent.VK_UNDEFINED && keyEvent.keyCode == KeyEvent.VK_UNDEFINED) {
148  return keyChar == keyEvent.keyChar;
149  }
150  return false;
151  }
152 
153  @Override
154  public int hashCode() {
155  return keyCode == KeyEvent.VK_UNDEFINED ? keyChar : keyCode^modifiers;
156  }
157 
158  @Override
159  public int compareTo(@NotNull final KeyEvent2 o) {
160  final int cmp1 = Integer.compare(keyCode, o.keyCode);
161  if (cmp1 != 0) {
162  return cmp1;
163  }
164  final int cmp2 = Integer.compare(keyChar, o.keyChar);
165  if (cmp2 != 0) {
166  return cmp2;
167  }
168  return Integer.compare(modifiers, o.modifiers);
169  }
170 
171  @NotNull
172  @Override
173  public String toString() {
174  return "code="+keyCode+", char="+(keyChar == KeyEvent.CHAR_UNDEFINED ? "undefined" : keyChar)+", modifiers="+modifiers;
175  }
176 
182  @SuppressWarnings({"deprecation", "RedundantSuppression"}) // accesses deprecated constants like InputEvent.ALT_MASK
183  public static int convertModifiers(final int modifiers) {
184  int result = 0;
185  if ((modifiers&InputEvent.ALT_MASK) != 0) {
186  result |= InputEvent.ALT_DOWN_MASK;
187  }
188  if ((modifiers&InputEvent.ALT_GRAPH_MASK) != 0) {
189  result |= modifiers&InputEvent.ALT_GRAPH_DOWN_MASK;
190  }
191  if ((modifiers&InputEvent.CTRL_MASK) != 0) {
192  result |= InputEvent.CTRL_DOWN_MASK;
193  }
194  if ((modifiers&InputEvent.META_MASK) != 0) {
195  result |= InputEvent.META_DOWN_MASK;
196  }
197  if ((modifiers&InputEvent.SHIFT_MASK) != 0) {
198  result |= InputEvent.SHIFT_DOWN_MASK;
199  }
200  return result;
201  }
202 
208  @NotNull
209  public static String modifiersToString(final int modifiers) {
210  final StringBuilder sb = new StringBuilder();
211  if ((modifiers&ALT) != 0) {
212  sb.append("|alt");
213  }
214  if ((modifiers&ALT_GRAPH) != 0) {
215  sb.append("|alt_graph");
216  }
217  if ((modifiers&CTRL) != 0) {
218  sb.append("|ctrl");
219  }
220  if ((modifiers&META) != 0) {
221  sb.append("|meta");
222  }
223  if ((modifiers&SHIFT) != 0) {
224  sb.append("|shift");
225  }
226  return sb.length() == 0 ? "none" : sb.substring(1);
227  }
228 
236  public static int stringToModifiers(@NotNull final String modifiers) {
237  if (modifiers.equals("none")) {
238  return 0;
239  }
240 
241  int result = 0;
242  for (final String s : modifiers.split("\\|", -1)) {
243  switch (s) {
244  case "alt":
245  result |= ALT;
246  break;
247 
248  case "alt_graph":
249  result |= ALT_GRAPH;
250  break;
251 
252  case "ctrl":
253  result |= CTRL;
254  break;
255 
256  case "meta":
257  result |= META;
258  break;
259 
260  case "shift":
261  result |= SHIFT;
262  break;
263 
264  default:
265  System.err.println("Warning: ignoring unknown modifier '"+s+"' in keybinding");
266  break;
267  }
268  }
269  return result;
270  }
271 
272 }
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.matchesKeyEvent
boolean matchesKeyEvent(@NotNull final KeyEvent2 keyEvent)
Definition: KeyEvent2.java:130
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.getKeyChar
char getKeyChar()
Definition: KeyEvent2.java:111
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.modifiers
final int modifiers
Definition: KeyEvent2.java:85
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2
Definition: KeyEvent2.java:34
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.MASK
static final int MASK
Definition: KeyEvent2.java:69
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.getModifiers
int getModifiers()
Definition: KeyEvent2.java:120
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.ALT
static final int ALT
Definition: KeyEvent2.java:44
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.CTRL
static final int CTRL
Definition: KeyEvent2.java:54
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.equals
boolean equals(@Nullable final Object obj)
Definition: KeyEvent2.java:138
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.KeyEvent2
KeyEvent2(final int keyCode, final char keyChar, final int modifiers)
Definition: KeyEvent2.java:93
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.stringToModifiers
static int stringToModifiers(@NotNull final String modifiers)
Definition: KeyEvent2.java:236
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.getKeyCode
int getKeyCode()
Definition: KeyEvent2.java:103
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.modifiersToString
static String modifiersToString(final int modifiers)
Definition: KeyEvent2.java:209
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.compareTo
int compareTo(@NotNull final KeyEvent2 o)
Definition: KeyEvent2.java:159
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.META
static final int META
Definition: KeyEvent2.java:59
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.toString
String toString()
Definition: KeyEvent2.java:173
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.SHIFT
static final int SHIFT
Definition: KeyEvent2.java:64
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.keyCode
final int keyCode
Definition: KeyEvent2.java:74
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.hashCode
int hashCode()
Definition: KeyEvent2.java:154
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.NONE
static final int NONE
Definition: KeyEvent2.java:39
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.keyChar
final char keyChar
Definition: KeyEvent2.java:79
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.convertModifiers
static int convertModifiers(final int modifiers)
Definition: KeyEvent2.java:183
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2.ALT_GRAPH
static final int ALT_GRAPH
Definition: KeyEvent2.java:49