1 33 34 package edu.rice.cs.drjava.ui; 35 36 import edu.rice.cs.drjava.*; 37 import edu.rice.cs.drjava.config.*; 38 import javax.swing.*; 39 import java.util.*; 40 import java.awt.event.*; 41 42 48 public class KeyBindingManager { 49 50 public static final KeyBindingManager Singleton = new KeyBindingManager(); 51 52 private KeyBindingManager() { } 53 54 private Hashtable<KeyStroke, KeyStrokeData> _keyToDataMap = new Hashtable<KeyStroke, KeyStrokeData>(); 56 private Hashtable<Action, KeyStrokeData> _actionToDataMap = new Hashtable<Action, KeyStrokeData>(); 57 58 private MainFrame _mainFrame = null; 59 60 private ActionMap _actionMap; 62 63 68 private boolean _shouldCheckConflict = true; 69 70 public void setMainFrame (MainFrame mainFrame) { _mainFrame = mainFrame; } 71 72 75 public void setActionMap (ActionMap actionMap) { _actionMap = actionMap; } 76 77 public void setShouldCheckConflict (boolean bool) { _shouldCheckConflict = bool; } 78 79 public Enumeration getKeyStrokeData() { return _actionToDataMap.elements(); } 80 81 public void put(Option<KeyStroke> kso, Action a, JMenuItem jmi, String name) { 82 KeyStroke ks = DrJava.getConfig().getSetting(kso); 83 KeyStrokeData ksd = new KeyStrokeData(ks, a, jmi, name, kso); 84 _keyToDataMap.put(ks, ksd); 85 _actionToDataMap.put(a, ksd); 86 87 if (kso != null) { 89 DrJava.getConfig().addOptionListener(kso, new KeyStrokeOptionListener(jmi, a, ks)); 90 } 91 } 92 93 97 public Action get(KeyStroke ks) { 98 KeyStrokeData ksd = _keyToDataMap.get(ks); 99 if (ksd == null) return null; 100 return ksd.getAction(); 101 } 102 103 public String getName(KeyStroke ks) { 104 KeyStrokeData ksd = _keyToDataMap.get(ks); 105 if (ksd == null) return null; 106 return ksd.getName(); 107 } 108 109 public String getName(Action a) { 110 KeyStrokeData ksd = _actionToDataMap.get(a); 111 if (ksd == null) return null; 112 return ksd.getName(); 113 } 114 121 126 public void addShiftAction(Option<KeyStroke> opt, String shiftS) { 127 Action shiftA = _actionMap.get(shiftS); 128 addShiftAction(opt, shiftA); 129 } 130 131 136 public void addShiftAction(Option<KeyStroke> opt, Action shiftA) { 137 KeyStroke ks = DrJava.getConfig().getSetting(opt); 138 139 KeyStrokeData normal = _keyToDataMap.get(ks); 140 normal.setShiftAction(shiftA); 141 142 KeyStrokeData ksd = new KeyStrokeData(addShiftModifier(ks), shiftA, null, "Selection " + normal.getName(), null); 143 144 _keyToDataMap.put(addShiftModifier(ks), ksd); 145 _actionToDataMap.put(shiftA, ksd); 146 } 147 148 152 public KeyStroke addShiftModifier(KeyStroke k) { 153 return KeyStroke.getKeyStroke(k.getKeyCode(), k.getModifiers() | InputEvent.SHIFT_MASK, k.isOnKeyRelease() ); 154 } 155 156 162 private boolean shouldUpdate(KeyStroke ks, Action a) { 164 if (ks == KeyStrokeOption.NULL_KEYSTROKE) { 165 return true; 167 } 168 169 if (!_keyToDataMap.containsKey(ks) ) { 170 177 return true; 178 } 179 else if (_keyToDataMap.get(ks).getAction().equals(a)) { 180 return false; 182 } 183 else { if (_shouldCheckConflict) { 185 KeyStrokeOption opt = new KeyStrokeOption(null,null); 186 KeyStrokeData conflictKSD = _keyToDataMap.get(ks); 187 String key = opt.format(ks); 188 KeyStrokeData newKSD = _actionToDataMap.get(a); 189 String text = "\""+ key +"\"" + " is already assigned to \"" + conflictKSD.getName() + 190 "\".\nWould you like to assign \"" + key + "\" to \"" + newKSD.getName() + "\"?"; 191 int rc = JOptionPane.showConfirmDialog(_mainFrame, text, "DrJava", JOptionPane.YES_NO_CANCEL_OPTION); 192 193 switch (rc) { 194 case JOptionPane.YES_OPTION: 195 return true; 196 case JOptionPane.NO_OPTION: 197 return false; 198 case JOptionPane.CLOSED_OPTION: 199 return false; 200 case JOptionPane.CANCEL_OPTION: 201 return false; 202 default: 203 throw new RuntimeException ("Invalid rc: " + rc); 204 } 205 } 206 else return true; 207 } 208 } 209 210 213 public class KeyStrokeOptionListener implements OptionListener<KeyStroke> { 214 protected JMenuItem _jmi; protected Action _a; protected KeyStroke _ks; 218 public KeyStrokeOptionListener(JMenuItem jmi, Action a, KeyStroke ks) { 219 _jmi = jmi; 220 _a = a; 221 _ks = ks; 222 } 223 224 public KeyStrokeOptionListener(Action a, KeyStroke ks) { 225 _jmi = null; 226 _a = a; 227 _ks = ks; 228 } 229 230 private void _updateMenuItem (KeyStrokeData data) { 231 JMenuItem jmi = data.getJMenuItem(); 232 233 if (jmi != null) { 236 KeyStroke ks = data.getKeyStroke(); 237 if (ks != KeyStrokeOption.NULL_KEYSTROKE) { 238 jmi.setAccelerator(ks); 241 } 242 else { 243 jmi.setAccelerator(null); 245 } 246 } 247 } 248 249 public void optionChanged(OptionEvent<KeyStroke> oce) { 250 if (shouldUpdate(oce.value, _a)) 251 { 252 KeyStrokeData data = _actionToDataMap.get(_a); 253 if (data == null) { 254 return; 256 } 257 258 if (data.equals(_keyToDataMap.get(_ks))) { 261 _keyToDataMap.remove(_ks); 262 } 263 264 if (_keyToDataMap.containsKey(oce.value) && _shouldCheckConflict) { 266 KeyStrokeData conflictKSD = _keyToDataMap.get(oce.value); 268 conflictKSD.setKeyStroke(KeyStrokeOption.NULL_KEYSTROKE); 269 _updateMenuItem(conflictKSD); 270 _keyToDataMap.remove(oce.value); 271 DrJava.getConfig().setSetting(conflictKSD.getOption(), KeyStrokeOption.NULL_KEYSTROKE); 272 } 273 274 if (oce.value != KeyStrokeOption.NULL_KEYSTROKE) { 275 _keyToDataMap.put(oce.value,data); 276 } 277 data.setKeyStroke(oce.value); 278 _updateMenuItem(data); 279 280 Action shiftAction = data.getShiftAction(); 282 if (shiftAction != null) { 283 KeyStrokeData shiftKSD = _actionToDataMap.get(shiftAction); 285 _keyToDataMap.remove(shiftKSD.getKeyStroke()); 286 shiftKSD.setKeyStroke(addShiftModifier(oce.value)); 287 _keyToDataMap.put(shiftKSD.getKeyStroke(), shiftKSD); 288 } 290 291 _ks = oce.value; 292 } 293 else if (_ks != oce.value) { 294 DrJava.getConfig().setSetting(oce.option, _ks); 295 } 296 } 297 } 298 299 public static class KeyStrokeData { 300 private KeyStroke _ks; 301 private Action _a; 302 private JMenuItem _jmi; 303 private String _name; 304 private Option<KeyStroke> _kso; 305 private Action _shiftA; 306 307 public KeyStrokeData(KeyStroke ks, Action a, JMenuItem jmi, String name, Option<KeyStroke> kso) { 308 _ks = ks; 309 _a = a; 310 _jmi = jmi; 311 _name = name; 312 _kso = kso; 313 _shiftA = null; 314 } 315 316 public KeyStroke getKeyStroke() { return _ks; } 317 public Action getAction() { return _a; } 318 public JMenuItem getJMenuItem() { return _jmi; } 319 public String getName() { return _name; } 320 public Option<KeyStroke> getOption() { return _kso; } 321 public Action getShiftAction() { return _shiftA; } 322 323 public void setKeyStroke(KeyStroke ks) { _ks = ks; } 324 public void setAction(Action a) { _a = a; } 325 public void setJMenuItem(JMenuItem jmi) { _jmi = jmi; } 326 public void setName(String name) { _name = name; } 327 public void setOption(Option<KeyStroke> kso) { _kso = kso; } 328 public void setShiftAction(Action shiftA) { _shiftA = shiftA; } 329 } 330 } 331 | Popular Tags |