50 |
import java.awt.datatransfer.Transferable; |
import java.awt.datatransfer.Transferable; |
51 |
import java.awt.datatransfer.UnsupportedFlavorException; |
import java.awt.datatransfer.UnsupportedFlavorException; |
52 |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionEvent; |
|
import java.awt.event.ActionListener; |
|
53 |
import java.awt.event.InputMethodListener; |
import java.awt.event.InputMethodListener; |
54 |
import java.awt.event.KeyEvent; |
import java.awt.event.KeyEvent; |
55 |
import java.awt.event.MouseEvent; |
import java.awt.event.MouseEvent; |
72 |
import javax.swing.KeyStroke; |
import javax.swing.KeyStroke; |
73 |
import javax.swing.Scrollable; |
import javax.swing.Scrollable; |
74 |
import javax.swing.SwingConstants; |
import javax.swing.SwingConstants; |
|
import javax.swing.Timer; |
|
75 |
import javax.swing.TransferHandler; |
import javax.swing.TransferHandler; |
76 |
import javax.swing.UIManager; |
import javax.swing.UIManager; |
77 |
import javax.swing.event.CaretEvent; |
import javax.swing.event.CaretEvent; |
302 |
} |
} |
303 |
|
|
304 |
/** |
/** |
|
* The timer that lets the caret blink. |
|
|
*/ |
|
|
private class CaretBlinkTimer extends Timer implements ActionListener |
|
|
{ |
|
|
/** |
|
|
* Creates a new CaretBlinkTimer object with a default delay of 1 second. |
|
|
*/ |
|
|
public CaretBlinkTimer() |
|
|
{ |
|
|
super(1000, null); |
|
|
addActionListener(this); |
|
|
} |
|
|
|
|
|
/** |
|
|
* Lets the caret blink. |
|
|
*/ |
|
|
public void actionPerformed(ActionEvent ev) |
|
|
{ |
|
|
Caret c = caret; |
|
|
if (c != null) |
|
|
c.setVisible(!c.isVisible()); |
|
|
} |
|
|
|
|
|
/** |
|
|
* Updates the blink delay according to the current caret. |
|
|
*/ |
|
|
public void update() |
|
|
{ |
|
|
stop(); |
|
|
Caret c = caret; |
|
|
if (c != null) |
|
|
{ |
|
|
setDelay(c.getBlinkRate()); |
|
|
if (editable) |
|
|
start(); |
|
|
else |
|
|
c.setVisible(false); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
305 |
* According to <a |
* According to <a |
306 |
* href="http://java.sun.com/products/jfc/tsc/special_report/kestrel/keybindings.html">this |
* href="http://java.sun.com/products/jfc/tsc/special_report/kestrel/keybindings.html">this |
307 |
* report</a>, a pair of private classes wraps a {@link |
* report</a>, a pair of private classes wraps a {@link |
657 |
private char focusAccelerator = '\0'; |
private char focusAccelerator = '\0'; |
658 |
private NavigationFilter navigationFilter; |
private NavigationFilter navigationFilter; |
659 |
|
|
|
private CaretBlinkTimer caretBlinkTimer; |
|
|
|
|
660 |
/** |
/** |
661 |
* Get a Keymap from the global keymap table, by name. |
* Get a Keymap from the global keymap table, by name. |
662 |
* |
* |
864 |
Hashtable acts = new Hashtable(actions.length); |
Hashtable acts = new Hashtable(actions.length); |
865 |
for (int i = 0; i < actions.length; ++i) |
for (int i = 0; i < actions.length; ++i) |
866 |
acts.put(actions[i].getValue(Action.NAME), actions[i]); |
acts.put(actions[i].getValue(Action.NAME), actions[i]); |
867 |
for (int i = 0; i < bindings.length; ++i) |
for (int i = 0; i < bindings.length; ++i) |
868 |
if (acts.containsKey(bindings[i].actionName)) |
if (acts.containsKey(bindings[i].actionName)) |
869 |
map.addActionForKeyStroke(bindings[i].key, (Action) acts.get(bindings[i].actionName)); |
map.addActionForKeyStroke(bindings[i].key, (Action) acts.get(bindings[i].actionName)); |
870 |
} |
} |
914 |
creatingKeymap = true; |
creatingKeymap = true; |
915 |
} |
} |
916 |
|
|
|
caretBlinkTimer = new CaretBlinkTimer(); |
|
|
|
|
917 |
setFocusable(true); |
setFocusable(true); |
918 |
setEditable(true); |
setEditable(true); |
919 |
enableEvents(AWTEvent.KEY_EVENT_MASK); |
enableEvents(AWTEvent.KEY_EVENT_MASK); |
921 |
|
|
922 |
// need to do this after updateUI() |
// need to do this after updateUI() |
923 |
if (creatingKeymap) |
if (creatingKeymap) |
924 |
loadKeymap(defkeymap, |
loadKeymap( |
925 |
new KeyBinding[] { |
defkeymap, |
926 |
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), |
new KeyBinding[] { |
927 |
DefaultEditorKit.backwardAction), |
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), |
928 |
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), |
DefaultEditorKit.backwardAction), |
929 |
DefaultEditorKit.forwardAction), |
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), |
930 |
new KeyBinding(KeyStroke.getKeyStroke("typed \b"), |
DefaultEditorKit.forwardAction), |
931 |
DefaultEditorKit.deletePrevCharAction), |
new KeyBinding(KeyStroke.getKeyStroke("typed \b"), |
932 |
new KeyBinding(KeyStroke.getKeyStroke("typed \u007f"), |
DefaultEditorKit.deletePrevCharAction), |
933 |
DefaultEditorKit.deleteNextCharAction) |
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_X, |
934 |
}, |
KeyEvent.CTRL_DOWN_MASK), |
935 |
|
DefaultEditorKit.cutAction), |
936 |
|
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_C, |
937 |
|
KeyEvent.CTRL_DOWN_MASK), |
938 |
|
DefaultEditorKit.copyAction), |
939 |
|
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_V, |
940 |
|
KeyEvent.CTRL_DOWN_MASK), |
941 |
|
DefaultEditorKit.pasteAction), |
942 |
|
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, |
943 |
|
KeyEvent.SHIFT_DOWN_MASK), |
944 |
|
DefaultEditorKit.selectionBackwardAction), |
945 |
|
new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, |
946 |
|
KeyEvent.SHIFT_DOWN_MASK), |
947 |
|
DefaultEditorKit.selectionForwardAction), |
948 |
|
new KeyBinding(KeyStroke.getKeyStroke("typed \u007f"), |
949 |
|
DefaultEditorKit.deleteNextCharAction) |
950 |
|
}, |
951 |
getActions()); |
getActions()); |
952 |
} |
} |
953 |
|
|
1168 |
if (editable == newValue) |
if (editable == newValue) |
1169 |
return; |
return; |
1170 |
|
|
|
if (newValue == true) |
|
|
caretBlinkTimer.start(); |
|
|
else |
|
|
{ |
|
|
caretBlinkTimer.stop(); |
|
|
caret.setVisible(false); |
|
|
} |
|
|
|
|
1171 |
boolean oldValue = editable; |
boolean oldValue = editable; |
1172 |
editable = newValue; |
editable = newValue; |
1173 |
firePropertyChange("editable", oldValue, newValue); |
firePropertyChange("editable", oldValue, newValue); |
1196 |
Caret oldCaret = caret; |
Caret oldCaret = caret; |
1197 |
caret = newCaret; |
caret = newCaret; |
1198 |
|
|
|
caretBlinkTimer.update(); |
|
|
|
|
1199 |
if (caret != null) |
if (caret != null) |
1200 |
caret.install(this); |
caret.install(this); |
1201 |
|
|
1363 |
start = Math.max(start, 0); |
start = Math.max(start, 0); |
1364 |
start = Math.min(start, length); |
start = Math.min(start, length); |
1365 |
|
|
1366 |
end = Math.max(end, 0); |
end = Math.max(end, start); |
1367 |
end = Math.min(end, length); |
end = Math.min(end, length); |
1368 |
|
|
1369 |
setCaretPosition(start); |
setCaretPosition(start); |