Gridarta Editor
ShortcutsManager.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.gui.dialog.shortcuts;
21 
22 import java.awt.Component;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.Collection;
26 import java.util.Comparator;
27 import java.util.HashSet;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.prefs.AbstractPreferences;
31 import java.util.prefs.BackingStoreException;
32 import java.util.prefs.Preferences;
33 import javax.swing.Action;
34 import javax.swing.ActionMap;
35 import javax.swing.KeyStroke;
36 import net.sf.gridarta.MainControl;
40 import net.sf.japi.swing.action.ActionBuilder;
41 import net.sf.japi.swing.action.DummyAction;
42 import org.jetbrains.annotations.NotNull;
43 import org.jetbrains.annotations.Nullable;
44 
50 public class ShortcutsManager implements Iterable<Action> {
51 
55  @NotNull
56  private static final String PREFERENCES_SHORTCUT_PREFIX = "shortcut.";
57 
61  @NotNull
62  private static final String PREFERENCES_COMMENT_PREFIX = "prefs." + PREFERENCES_SHORTCUT_PREFIX;
63 
67  @NotNull
68  private final Collection<String> ignoreActions = new HashSet<>();
69 
73  @NotNull
74  private static final Comparator<Action> ACTION_COMPARATOR = new Comparator<Action>() {
75 
76  @Override
77  public int compare(@NotNull final Action o1, @NotNull final Action o2) {
78  return ActionUtils.getActionName(o1).compareToIgnoreCase(ActionUtils.getActionName(o2));
79  }
80 
81  };
82 
86  @NotNull
87  private final ActionBuilder actionBuilder;
88 
92  @NotNull
93  private final Preferences preferences = Preferences.userNodeForPackage(MainControl.class);
94 
99  public ShortcutsManager(@NotNull final ActionBuilder actionBuilder) {
100  this.actionBuilder = actionBuilder;
101  }
102 
106  public void loadShortcuts() {
107  ignoreActions.addAll(Arrays.asList(StringUtils.PATTERN_SPACES.split(ActionBuilderUtils.getString(actionBuilder, "shortcutsIgnoreActions"), 0)));
108 
109  for (final Action action : this) {
110  final Object acceleratorKey = action.getValue(Action.ACCELERATOR_KEY);
111  if (acceleratorKey != null) {
112  action.putValue(ActionUtils.DEFAULT_ACCELERATOR_KEY, acceleratorKey);
113  }
114  }
115 
116  final Preferences commentPreferences = new AbstractPreferences(null, "") {
117 
118  @Override
119  protected void putSpi(final String key, final String value) {
120  throw new UnsupportedOperationException("unsupported operation: key=" + key + ", value=" + value);
121  }
122 
123  @Nullable
124  @Override
125  protected String getSpi(@NotNull final String key) {
126  if (!key.startsWith(PREFERENCES_COMMENT_PREFIX)) {
127  return null;
128  }
129 
130  final String actionKey = key.substring(PREFERENCES_COMMENT_PREFIX.length());
131  final Action action = actionBuilder.getAction(actionKey);
132  if (action == null || !isValidAction(action)) {
133  return null;
134  }
135 
136  return actionBuilder.format("prefs.shortcut", ActionUtils.getActionName(action));
137  }
138 
139  @Override
140  protected void removeSpi(final String key) {
141  throw new UnsupportedOperationException("unsupported operation: key=" + key);
142  }
143 
144  @Override
145  protected void removeNodeSpi() {
146  throw new UnsupportedOperationException("unsupported operation");
147  }
148 
149  @Override
150  protected String [] keysSpi() {
151  throw new UnsupportedOperationException("unsupported operation");
152  }
153 
154  @Override
155  protected String[] childrenNamesSpi() {
156  throw new UnsupportedOperationException("unsupported operation");
157  }
158 
159  @Override
160  protected AbstractPreferences childSpi(final String name) {
161  throw new UnsupportedOperationException("unsupported operation: name=" + name);
162  }
163 
164  @Override
165  protected void syncSpi() {
166  // ignore
167  }
168 
169  @Override
170  protected void flushSpi() {
171  // ignore
172  }
173 
174  };
175  actionBuilder.addPref(commentPreferences);
176 
177  for (final Action action : this) {
178  final String value = preferences.get(PREFERENCES_SHORTCUT_PREFIX + ActionUtils.getActionId(action), null);
179  if (value != null) {
180  if (value.equals(ActionUtils.NO_SHORTCUT)) {
181  action.putValue(Action.ACCELERATOR_KEY, null);
182  } else {
183  final Object acceleratorKey = KeyStroke.getKeyStroke(value);
184  if (acceleratorKey != null) {
185  action.putValue(Action.ACCELERATOR_KEY, acceleratorKey);
186  }
187  }
188  }
189  }
190  }
191 
195  public void saveShortcuts() {
196  try {
197  for (final String key : preferences.keys()) {
198  if (key.startsWith(PREFERENCES_SHORTCUT_PREFIX)) {
199  preferences.remove(key);
200  }
201  }
202  } catch (final BackingStoreException ignored) {
203  // ignore: just keep excess keys
204  }
205 
206  for (final Action action : this) {
207  final String acceleratorKey = ActionUtils.getShortcutDescription(action, Action.ACCELERATOR_KEY);
208  final String defaultAcceleratorKey = ActionUtils.getShortcutDescription(action, ActionUtils.DEFAULT_ACCELERATOR_KEY);
209  final String preferencesKey = PREFERENCES_SHORTCUT_PREFIX + ActionUtils.getActionId(action);
210  if (acceleratorKey.equals(defaultAcceleratorKey)) {
211  preferences.remove(preferencesKey);
212  } else {
213  preferences.put(preferencesKey, acceleratorKey);
214  }
215  }
216  }
217 
222  public void showShortcutsDialog(@NotNull final Component parentComponent) {
223  final ShortcutsDialog shortcutsDialog = new ShortcutsDialog(parentComponent, this);
224  shortcutsDialog.showDialog(parentComponent);
225  }
226 
230  public void revertAll() {
231  for (final Action action : this) {
232  action.putValue(Action.ACCELERATOR_KEY, action.getValue(ActionUtils.DEFAULT_ACCELERATOR_KEY));
233  }
234  }
235 
240  @Override
241  public Iterator<Action> iterator() {
242  final List<Action> result = new ArrayList<>();
243  final ActionMap actionMap = actionBuilder.getActionMap();
244  for (final Object key : actionMap.allKeys()) {
245  if (key instanceof String) {
246  final Action action = actionMap.get(key);
247  assert action != null;
248  if (isValidAction(action)) {
249  result.add(action);
250  }
251  }
252  }
253  result.sort(ACTION_COMPARATOR);
254  return result.iterator();
255  }
256 
262  private boolean isValidAction(@NotNull final Action action) {
263  if (action instanceof DummyAction) {
264  return false;
265  }
266 
267  final String id;
268  try {
269  id = ActionUtils.getActionId(action);
270  } catch (final IllegalArgumentException ignored) {
271  return false;
272  }
273 
274  return !ignoreActions.contains(id);
275  }
276 
277 }
net.sf.gridarta.utils.ActionUtils.getActionId
static String getActionId(@NotNull final Action action)
Definition: ActionUtils.java:90
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager
Definition: ShortcutsManager.java:50
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.isValidAction
boolean isValidAction(@NotNull final Action action)
Definition: ShortcutsManager.java:262
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.ignoreActions
final Collection< String > ignoreActions
Definition: ShortcutsManager.java:68
net.sf.gridarta
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.actionBuilder
final ActionBuilder actionBuilder
Definition: ShortcutsManager.java:87
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.revertAll
void revertAll()
Definition: ShortcutsManager.java:230
net.sf
net.sf.gridarta.utils.ActionUtils.getActionName
static String getActionName(@NotNull final Action action)
Definition: ActionUtils.java:72
net.sf.gridarta.utils.ActionUtils.getShortcutDescription
static String getShortcutDescription(@NotNull final Action action, @NotNull final String key)
Definition: ActionUtils.java:163
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.saveShortcuts
void saveShortcuts()
Definition: ShortcutsManager.java:195
net.sf.gridarta.utils.ActionUtils
Definition: ActionUtils.java:33
net.sf.gridarta.utils.ActionUtils.NO_SHORTCUT
static final String NO_SHORTCUT
Definition: ActionUtils.java:52
net
net.sf.gridarta.utils.ActionUtils.DEFAULT_ACCELERATOR_KEY
static final String DEFAULT_ACCELERATOR_KEY
Definition: ActionUtils.java:58
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.iterator
Iterator< Action > iterator()
Definition: ShortcutsManager.java:241
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.PREFERENCES_SHORTCUT_PREFIX
static final String PREFERENCES_SHORTCUT_PREFIX
Definition: ShortcutsManager.java:56
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.showShortcutsDialog
void showShortcutsDialog(@NotNull final Component parentComponent)
Definition: ShortcutsManager.java:222
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.loadShortcuts
void loadShortcuts()
Definition: ShortcutsManager.java:106
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.preferences
final Preferences preferences
Definition: ShortcutsManager.java:93
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsDialog.showDialog
void showDialog(@NotNull final Component parentComponent)
Definition: ShortcutsDialog.java:209
net.sf.gridarta.utils.StringUtils
Definition: StringUtils.java:31
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.ShortcutsManager
ShortcutsManager(@NotNull final ActionBuilder actionBuilder)
Definition: ShortcutsManager.java:99
net.sf.gridarta.utils.StringUtils.PATTERN_SPACES
static final Pattern PATTERN_SPACES
Definition: StringUtils.java:73
net.sf.gridarta.utils.ActionBuilderUtils
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.ACTION_COMPARATOR
static final Comparator< Action > ACTION_COMPARATOR
Definition: ShortcutsManager.java:74
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsDialog
Definition: ShortcutsDialog.java:66
net.sf.gridarta.gui.dialog.shortcuts.ShortcutsManager.PREFERENCES_COMMENT_PREFIX
static final String PREFERENCES_COMMENT_PREFIX
Definition: ShortcutsManager.java:62
net.sf.gridarta.MainControl
Definition: MainControl.java:27