Crossfire JXClient, Trunk
KeybindingsManager.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 
28 import java.io.IOException;
29 import java.nio.file.Path;
30 import java.util.Map;
31 import java.util.TreeMap;
32 import java.util.function.Predicate;
33 import org.jetbrains.annotations.NotNull;
34 import org.jetbrains.annotations.Nullable;
35 
40 public class KeybindingsManager {
41 
45  @NotNull
46  public static final String DEFAULT = "d";
47 
51  @NotNull
52  public static final String GLOBAL = "g";
53 
57  @NotNull
58  public static final String CHARACTER = "c";
59 
63  @NotNull
65 
69  @NotNull
71 
76  @Nullable
78 
83  @Nullable
85 
90  @Nullable
92 
99  public KeybindingsManager(@NotNull final Path keybindingsFileVersion2, @NotNull final Path keybindingsFileVersion1, @NotNull final GUICommandFactory guiCommandFactory) {
100  this.guiCommandFactory = guiCommandFactory;
101  globalKeyBindings = new KeyBindings(keybindingsFileVersion2, keybindingsFileVersion1, guiCommandFactory);
102  }
103 
109  this.defaultKeyBindings = defaultKeyBindings;
110  }
111 
118  public boolean removeKeyBinding(final boolean perCharacter) {
119  if (perCharacter && characterKeyBindings == null) {
120  return false;
121  }
122 
123  keyBindingState = new KeyBindingState(characterKeyBindings, perCharacter ? null : globalKeyBindings, null);
124  return true;
125  }
126 
131  public boolean windowClosing() {
132  if (keyBindingState == null) {
133  return false;
134  }
135 
136  keyBindingState = null;
137  return true;
138  }
139 
147  public boolean createKeyBinding(final boolean perCharacter, @NotNull final CommandList cmdList) {
148  final KeyBindings bindings = getKeyBindings(perCharacter);
149  if (bindings == null) {
150  return false;
151  }
152 
153  keyBindingState = new KeyBindingState(bindings, null, cmdList);
154  return true;
155  }
156 
164  @Nullable
165  private KeyBindings getKeyBindings(final boolean perCharacter) {
166  return perCharacter ? characterKeyBindings : globalKeyBindings;
167  }
168 
175  public void loadPerCharacterBindings(@NotNull final CharSequence hostname, @NotNull final CharSequence character) {
176  try {
178  } catch (final IOException ex) {
179  characterKeyBindings = null;
180  System.err.println("Cannot read keybindings file for "+character+" on "+hostname+": "+ex.getMessage());
181  return;
182  }
183 
185  }
186 
192  if (characterKeyBindings != null) {
194  characterKeyBindings = null;
195  }
196  }
197 
201  public void saveGlobalKeybindings() {
203  }
204 
208  public void loadGlobalKeybindings() {
210  }
211 
216  public boolean keyReleased() {
217  if (keyBindingState == null) {
218  return false;
219  }
220 
221  if (!keyBindingState.keyReleased()) {
222  return false;
223  }
224 
225  keyBindingState = null;
226  return true;
227  }
228 
234  public boolean keyPressed(@NotNull final KeyEvent2 keyEvent) {
235  if (keyBindingState == null) {
236  return false;
237  }
238 
239  keyBindingState.keyPressed(keyEvent);
240  return true;
241  }
242 
248  public boolean escPressed() {
249  if (keyBindingState == null) {
250  return false;
251  }
252 
253  keyBindingState = null;
254  return true;
255  }
256 
262  public boolean handleKeyPress(@NotNull final KeyEvent2 e) {
264  return true;
265  }
266 
268  return true;
269  }
270 
271  //noinspection RedundantIfStatement
273  return true;
274  }
275 
276  return false;
277  }
278 
286  @NotNull
287  public Map<KeyBinding, String> getBindings(@NotNull final Predicate<KeyBinding> predicate) {
288  final Map<KeyBinding, String> matches = new TreeMap<>();
289 
290  /*
291  * character-specific bindings override global ones, so need to check for
292  * duplicates
293  */
294  if (characterKeyBindings != null) {
295  for (final KeyBinding keyBinding : characterKeyBindings.getBindings(predicate)) {
296  matches.put(keyBinding, CHARACTER);
297  }
298  }
299  for (KeyBinding candidate : globalKeyBindings.getBindings(predicate)) {
300  boolean used = false;
301  for (KeyBinding check : matches.keySet()) {
302  if (check.equals(candidate)) {
303  used = true;
304  break;
305  }
306  }
307  if (!used) {
308  matches.put(candidate, GLOBAL);
309  }
310  }
311  if (defaultKeyBindings != null) {
312  for (KeyBinding candidate : defaultKeyBindings.getBindings(predicate)) {
313  boolean used = false;
314  for (KeyBinding check : matches.keySet()) {
315  if (check.equals(candidate)) {
316  used = true;
317  break;
318  }
319  }
320  if (!used) {
321  matches.put(candidate, DEFAULT);
322  }
323  }
324  }
325 
326  return matches;
327  }
328 
329 }
com.realtime.crossfire.jxclient.settings.Filenames.getKeybindingsFileVersion2
static Path getKeybindingsFileVersion2(@Nullable final CharSequence hostname, @Nullable final CharSequence character)
Definition: Filenames.java:124
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.DEFAULT
static final String DEFAULT
Definition: KeybindingsManager.java:46
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.defaultKeyBindings
KeyBindings defaultKeyBindings
Definition: KeybindingsManager.java:84
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2
Definition: KeyEvent2.java:34
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.GLOBAL
static final String GLOBAL
Definition: KeybindingsManager.java:52
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindings.handleKeyPress
boolean handleKeyPress(@NotNull final KeyEvent2 e)
Definition: KeyBindings.java:320
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.removeKeyBinding
boolean removeKeyBinding(final boolean perCharacter)
Definition: KeybindingsManager.java:118
com.realtime.crossfire.jxclient.gui.commandlist.CommandList
Definition: CommandList.java:34
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.escPressed
boolean escPressed()
Definition: KeybindingsManager.java:248
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindingState.keyPressed
void keyPressed(@NotNull final KeyEvent2 keyEvent)
Definition: KeyBindingState.java:88
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.setDefaultKeyBindings
void setDefaultKeyBindings(@NotNull final KeyBindings defaultKeyBindings)
Definition: KeybindingsManager.java:108
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindings.saveKeyBindings
void saveKeyBindings()
Definition: KeyBindings.java:189
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.CHARACTER
static final String CHARACTER
Definition: KeybindingsManager.java:58
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindingState
Definition: KeyBindingState.java:33
com.realtime.crossfire.jxclient.gui.commandlist
Definition: CommandList.java:23
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.loadGlobalKeybindings
void loadGlobalKeybindings()
Definition: KeybindingsManager.java:208
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.saveGlobalKeybindings
void saveGlobalKeybindings()
Definition: KeybindingsManager.java:201
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.windowClosing
boolean windowClosing()
Definition: KeybindingsManager.java:131
com.realtime.crossfire.jxclient.settings
Definition: CommandHistory.java:23
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.handleKeyPress
boolean handleKeyPress(@NotNull final KeyEvent2 e)
Definition: KeybindingsManager.java:262
com.realtime.crossfire.jxclient.gui.commandlist.GUICommandFactory
Definition: GUICommandFactory.java:32
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.guiCommandFactory
final GUICommandFactory guiCommandFactory
Definition: KeybindingsManager.java:64
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.createKeyBinding
boolean createKeyBinding(final boolean perCharacter, @NotNull final CommandList cmdList)
Definition: KeybindingsManager.java:147
com.realtime.crossfire.jxclient.gui
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindingState.keyReleased
boolean keyReleased()
Definition: KeyBindingState.java:99
com.realtime.crossfire.jxclient.gui.keybindings.KeyBinding
Definition: KeyBinding.java:37
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.keyReleased
boolean keyReleased()
Definition: KeybindingsManager.java:216
com.realtime.crossfire.jxclient.settings.Filenames.getKeybindingsFileVersion1
static Path getKeybindingsFileVersion1(@Nullable final CharSequence hostname, @Nullable final CharSequence character)
Definition: Filenames.java:138
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindings.getBindings
Collection< KeyBinding > getBindings(@NotNull final Predicate< KeyBinding > predicate)
Definition: KeyBindings.java:345
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.KeybindingsManager
KeybindingsManager(@NotNull final Path keybindingsFileVersion2, @NotNull final Path keybindingsFileVersion1, @NotNull final GUICommandFactory guiCommandFactory)
Definition: KeybindingsManager.java:99
com.realtime.crossfire
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.loadPerCharacterBindings
void loadPerCharacterBindings(@NotNull final CharSequence hostname, @NotNull final CharSequence character)
Definition: KeybindingsManager.java:175
com.realtime
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.getBindings
Map< KeyBinding, String > getBindings(@NotNull final Predicate< KeyBinding > predicate)
Definition: KeybindingsManager.java:287
com
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindings.loadKeyBindings
void loadKeyBindings()
Definition: KeyBindings.java:146
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.globalKeyBindings
final KeyBindings globalKeyBindings
Definition: KeybindingsManager.java:70
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindings
Definition: KeyBindings.java:47
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.unloadPerCharacterBindings
void unloadPerCharacterBindings()
Definition: KeybindingsManager.java:191
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.getKeyBindings
KeyBindings getKeyBindings(final boolean perCharacter)
Definition: KeybindingsManager.java:165
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.characterKeyBindings
KeyBindings characterKeyBindings
Definition: KeybindingsManager.java:77
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.keyBindingState
KeyBindingState keyBindingState
Definition: KeybindingsManager.java:91
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager.keyPressed
boolean keyPressed(@NotNull final KeyEvent2 keyEvent)
Definition: KeybindingsManager.java:234
com.realtime.crossfire.jxclient.settings.Filenames
Definition: Filenames.java:37
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager
Definition: KeybindingsManager.java:40