1 7 package javax.swing; 8 9 10 import java.util.*; 11 import java.awt.*; 12 import java.awt.event.*; 13 import java.applet.*; 14 import java.beans.*; 15 import javax.swing.event.*; 16 17 45 class KeyboardManager { 46 47 static KeyboardManager currentManager = new KeyboardManager (); 48 49 52 Hashtable containerMap = new Hashtable(); 53 54 58 Hashtable componentKeyStrokeMap = new Hashtable(); 59 60 public static KeyboardManager getCurrentManager() { 61 return currentManager; 62 } 63 64 public static void setCurrentManager(KeyboardManager km) { 65 currentManager = km; 66 } 67 68 74 public void registerKeyStroke(KeyStroke k, JComponent c) { 75 Container topContainer = getTopAncestor(c); 76 if (topContainer == null) { 77 return; 78 } 79 Hashtable keyMap = (Hashtable)containerMap.get(topContainer); 80 81 if (keyMap == null) { keyMap = registerNewTopContainer(topContainer); 83 } 84 85 Object tmp = keyMap.get(k); 86 if (tmp == null) { 87 keyMap.put(k,c); 88 } else if (tmp instanceof Vector) { Vector v = (Vector)tmp; 90 if (!v.contains(c)) { v.addElement(c); 92 } 93 } else if (tmp instanceof JComponent ) { 94 if (tmp != c) { Vector v = new Vector(); 99 v.addElement(tmp); 100 v.addElement(c); 101 keyMap.put(k, v); 102 } 103 } else { 104 System.out.println("Unexpected condition in registerKeyStroke"); 105 Thread.dumpStack(); 106 } 107 108 componentKeyStrokeMap.put(new ComponentKeyStrokePair(c,k), topContainer); 109 110 } 111 112 115 private static Container getTopAncestor(JComponent c) { 116 for(Container p = c.getParent(); p != null; p = p.getParent()) { 117 if (p instanceof Window && ((Window)p).isFocusableWindow() || 118 p instanceof Applet || p instanceof JInternalFrame ) { 119 120 return p; 121 } 122 } 123 return null; 124 } 125 126 public void unregisterKeyStroke(KeyStroke ks, JComponent c) { 127 128 131 ComponentKeyStrokePair ckp = new ComponentKeyStrokePair(c,ks); 132 133 Object topContainer = componentKeyStrokeMap.get(ckp); 134 135 if (topContainer == null) { return; 137 } 138 139 Hashtable keyMap = (Hashtable)containerMap.get(topContainer); 140 if (keyMap == null) { Thread.dumpStack(); 142 return; 143 } 144 145 Object tmp = keyMap.get(ks); 146 if (tmp == null) { Thread.dumpStack(); 148 return; 149 } 150 151 if (tmp instanceof JComponent && tmp == c) { 152 keyMap.remove(ks); } else if (tmp instanceof Vector ) { Vector v = (Vector)tmp; 156 v.removeElement(c); 157 if ( v.isEmpty() ) { 158 keyMap.remove(ks); } 161 } 162 163 if ( keyMap.isEmpty() ) { containerMap.remove(topContainer); } 167 168 componentKeyStrokeMap.remove(ckp); 169 } 170 171 178 public boolean fireKeyboardAction(KeyEvent e, boolean pressed, Container topAncestor) { 179 180 if (e.isConsumed()) { 181 System.out.println("Aquired pre-used event!"); 182 Thread.dumpStack(); 183 } 184 185 KeyStroke ks; 186 187 188 if(e.getID() == KeyEvent.KEY_TYPED) { 189 ks=KeyStroke.getKeyStroke(e.getKeyChar()); 190 } else { 191 ks=KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers(), !pressed); 192 } 193 194 Hashtable keyMap = (Hashtable)containerMap.get(topAncestor); 195 if (keyMap != null) { 197 Object tmp = keyMap.get(ks); 198 199 if (tmp == null) { 200 } else if ( tmp instanceof JComponent ) { 202 JComponent c = (JComponent )tmp; 203 if ( c.isShowing() && c.isEnabled() ) { fireBinding(c, ks, e, pressed); 205 } 206 } else if ( tmp instanceof Vector) { Vector v = (Vector)tmp; 208 for (int counter = v.size() - 1; counter >= 0; counter--) { 214 JComponent c = (JComponent )v.elementAt(counter); 215 if ( c.isShowing() && c.isEnabled() ) { fireBinding(c, ks, e, pressed); 218 if (e.isConsumed()) 219 return true; 220 } 221 } 222 } else { 223 System.out.println( "Unexpected condition in fireKeyboardAction " + tmp); 224 Thread.dumpStack(); 226 } 227 } 228 229 if (e.isConsumed()) { 230 return true; 231 } 232 if ( keyMap != null) { 236 Vector v = (Vector)keyMap.get(JMenuBar .class); 237 if (v != null) { 238 Enumeration iter = v.elements(); 239 while (iter.hasMoreElements()) { 240 JMenuBar mb = (JMenuBar )iter.nextElement(); 241 if ( mb.isShowing() && mb.isEnabled() ) { fireBinding(mb, ks, e, pressed); 243 if (e.isConsumed()) { 244 return true; 245 } 246 } 247 } 248 } 249 } 250 251 return e.isConsumed(); 252 } 253 254 void fireBinding(JComponent c, KeyStroke ks, KeyEvent e, boolean pressed) { 255 if (c.processKeyBinding(ks, e, JComponent.WHEN_IN_FOCUSED_WINDOW, 256 pressed)) { 257 e.consume(); 258 } 259 } 260 261 public void registerMenuBar(JMenuBar mb) { 262 Container top = getTopAncestor(mb); 263 Hashtable keyMap = (Hashtable)containerMap.get(top); 264 265 if (keyMap == null) { keyMap = registerNewTopContainer(top); 267 } 268 Vector menuBars = (Vector)keyMap.get(JMenuBar .class); 270 271 if (menuBars == null) { menuBars = new Vector(); 274 keyMap.put(JMenuBar .class, menuBars); 275 } 276 277 if (!menuBars.contains(mb)) { 278 menuBars.addElement(mb); 279 } 280 } 281 282 283 public void unregisterMenuBar(JMenuBar mb) { 284 Object topContainer = getTopAncestor(mb); 285 Hashtable keyMap = (Hashtable)containerMap.get(topContainer); 286 if (keyMap!=null) { 287 Vector v = (Vector)keyMap.get(JMenuBar .class); 288 if (v != null) { 289 v.removeElement(mb); 290 if (v.isEmpty()) { 291 keyMap.remove(JMenuBar .class); 292 if (keyMap.isEmpty()) { 293 containerMap.remove(topContainer); 295 } 296 } 297 } 298 } 299 } 300 protected Hashtable registerNewTopContainer(Container topContainer) { 301 Hashtable keyMap = new Hashtable(); 302 containerMap.put(topContainer, keyMap); 303 return keyMap; 304 } 305 306 311 class ComponentKeyStrokePair { 312 Object component; 313 Object keyStroke; 314 315 public ComponentKeyStrokePair(Object comp, Object key) { 316 component = comp; 317 keyStroke = key; 318 } 319 320 public boolean equals(Object o) { 321 if ( !(o instanceof ComponentKeyStrokePair)) { 322 return false; 323 } 324 ComponentKeyStrokePair ckp = (ComponentKeyStrokePair)o; 325 return ((component.equals(ckp.component)) && (keyStroke.equals(ckp.keyStroke))); 326 } 327 328 public int hashCode() { 329 return component.hashCode() * keyStroke.hashCode(); 330 } 331 332 } 333 334 } | Popular Tags |