1 21 22 package org.armedbear.j; 23 24 import java.awt.event.InputEvent ; 25 import java.awt.event.KeyEvent ; 26 import javax.swing.JLabel ; 27 import javax.swing.JTextField ; 28 import javax.swing.SwingUtilities ; 29 30 public final class DescribeKeyDialog extends AbstractDialog 31 { 32 private static final String title = "Describe Key"; 33 private static final String prompt = "Describe key:"; 34 35 private final Editor editor; 36 private final Buffer buffer; 37 private boolean seenKeyPressed; 38 private boolean disposed; 39 private String keyStrokeText; 40 41 private DescribeKeyDialog(Editor editor) 42 { 43 super(editor, title, true); this.editor = editor; 45 buffer = editor.getBuffer(); 46 JTextField textField = new JTextField (20); 47 addLabelAndTextField(new JLabel (prompt), textField); 48 addVerticalStrut(); 49 addCancel(); 50 pack(); 51 textField.setFocusTraversalKeysEnabled(false); 52 textField.requestFocus(); 53 } 54 55 public void keyPressed(KeyEvent e) 56 { 57 final int keycode = e.getKeyCode(); 58 if (keycode == KeyEvent.VK_SHIFT || keycode == KeyEvent.VK_CONTROL || 60 keycode == KeyEvent.VK_ALT || keycode == KeyEvent.VK_META) 61 return; 62 seenKeyPressed = true; 63 final int modifiers = e.getModifiers(); 64 KeyMapping mapping = new KeyMapping(keycode, modifiers, null); 65 keyStrokeText = mapping.getKeyText(); 66 describeKey(e.getKeyChar(), keycode, modifiers); 67 } 68 69 public void keyTyped(KeyEvent e) 70 { 71 final char c = e.getKeyChar(); 72 final int modifiers = e.getModifiers(); 73 if (modifiers == 0 || modifiers == InputEvent.SHIFT_MASK) { 74 if (c > ' ') { 76 FastStringBuffer sb = new FastStringBuffer('\''); 77 sb.append(c); 78 sb.append('\''); 79 keyStrokeText = sb.toString(); 80 } 81 } 82 describeKey(c, e.getKeyCode(), modifiers); 83 } 84 85 public void keyReleased(KeyEvent e) 86 { 87 if (seenKeyPressed && !disposed) { 88 dispose(); 89 Runnable r = new Runnable () { 91 public void run() 92 { 93 MessageDialog.showMessageDialog(editor, 94 keyStrokeText + " is not mapped", title); 95 } 96 }; 97 SwingUtilities.invokeLater(r); 98 } 99 } 100 101 private void describeKey(char keyChar, int keyCode, int modifiers) 102 { 103 if (disposed) 104 return; 105 modifiers &= 0x0f; 107 if (keyCode == 0 && modifiers == InputEvent.SHIFT_MASK) modifiers = 0; boolean local = false; 110 final Mode mode = buffer.getMode(); 111 KeyMapping mapping = 112 mode.getKeyMap().lookup(keyChar, keyCode, modifiers); 113 if (mapping != null) 114 local = true; 115 else { 116 mapping = 117 KeyMap.getGlobalKeyMap().lookup(keyChar, keyCode, modifiers); 118 } 119 final FastStringBuffer sb = new FastStringBuffer(); 120 if (mapping != null) { 121 sb.append(mapping.getKeyText()); 122 sb.append(" is mapped to "); 123 sb.append(mapping.getCommand()); 124 if (local) { 125 sb.append(" ("); 126 sb.append(mode.toString()); 127 sb.append(" mode)"); 128 } else 129 sb.append(" (global mapping)"); 130 dispose(); 131 Runnable r = new Runnable () { 133 public void run() 134 { 135 MessageDialog.showMessageDialog(editor, sb.toString(), 136 "Describe Key"); 137 } 138 }; 139 SwingUtilities.invokeLater(r); 140 } 141 } 142 143 public void dispose() 144 { 145 disposed = true; 146 super.dispose(); 147 } 148 149 public static void describeKey() 150 { 151 DescribeKeyDialog d = new DescribeKeyDialog(Editor.currentEditor()); 152 d.centerDialog(); 153 d.show(); 154 } 155 } 156 | Popular Tags |