1 33 34 package edu.rice.cs.drjava.ui; 35 36 import javax.swing.*; 37 import java.awt.event.ActionEvent ; 38 import java.awt.event.KeyEvent ; 39 import java.awt.Toolkit ; 40 import java.awt.Event ; 41 import javax.swing.text.DefaultEditorKit ; 42 import java.io.Serializable ; 43 44 import edu.rice.cs.drjava.DrJava; 45 import edu.rice.cs.drjava.config.*; 46 import edu.rice.cs.drjava.model.repl.*; 47 import edu.rice.cs.util.text.ConsoleDocument; 48 import edu.rice.cs.util.swing.Utilities; 49 50 51 public class ConsoleController extends AbstractConsoleController implements Serializable { 52 protected ConsoleDocument _doc; 53 54 55 private Object _inputWaitObject = new Object (); 56 57 58 private boolean _blockedForConsoleInput; 59 60 public ConsoleController(final ConsoleDocument doc, InteractionsDJDocument adapter) { 61 super(adapter, new InteractionsPane("CONSOLE_KEYMAP", adapter) { 62 public int getPromptPos() { return doc.getPromptPos(); } 63 }); 64 _doc = doc; 65 _blockedForConsoleInput = false; 66 _pane.setEditable(false); 67 69 _init(); 70 } 71 72 73 public ConsoleDocument getConsoleDoc() { return _doc; } 74 75 76 public InputListener getInputListener() { return _inputListener; } 77 78 protected void _setupModel() { 79 _adapter.addDocumentListener(new CaretUpdateListener()); 80 _doc.setBeep(_pane.getBeep()); 81 } 82 83 84 protected InputListener _inputListener = new InputListener() { 85 public String getConsoleInput() { 86 Utilities.invokeAndWait(new Runnable () { 89 public void run() { _pane.setEditable(true); } 90 }); 91 _waitForInput(); 93 String s = _doc.getCurrentInput(); 94 _doc.disablePrompt(); 95 return s; 96 } 97 }; 98 99 100 Object getInputWaitObject() { return _inputWaitObject; } 101 102 103 protected void _waitForInput() { 104 synchronized(_inputWaitObject) { 105 try { 106 _blockedForConsoleInput = true; 107 while (_blockedForConsoleInput) _inputWaitObject.wait(); 108 } 109 catch (InterruptedException ie) { 110 111 } 112 } 113 } 114 115 116 protected void _setupView() { 117 super._setupView(); 118 119 int mask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); 121 122 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), enterAction); 123 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, Event.SHIFT_MASK), newLineAction); 124 125 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_B, mask), clearCurrentAction); 126 127 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_LEFT, 0), moveLeftAction); 132 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), moveLeftAction); 133 134 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_RIGHT, 0), moveRightAction); 135 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), moveRightAction); 136 137 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, 0), moveUpDownAction); 138 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), moveUpDownAction); 139 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0), moveUpDownAction); 140 _pane.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), moveUpDownAction); 141 _pane.addActionForKeyStroke(DrJava.getConfig().getSetting(OptionConstants.KEY_PASTE_FROM_HISTORY), pasteAction); 142 } 143 144 145 Action pasteAction = new DefaultEditorKit.PasteAction () { 146 public void actionPerformed(ActionEvent e) { } 147 }; 148 149 AbstractAction enterAction = new EnterAction(); 150 private class EnterAction extends AbstractAction implements Serializable { 151 public void actionPerformed(ActionEvent e) { 152 synchronized(_inputWaitObject) { 153 if (_blockedForConsoleInput) { 154 _pane.setEditable(false); 155 _pane.getCaret().setVisible(false); 156 _doc.insertNewLine(_doc.getLength()); 157 _blockedForConsoleInput = false; 158 _inputWaitObject.notify(); } 160 } 161 } 162 } 163 164 165 AbstractAction moveLeftAction = new LeftAction(); 166 private class LeftAction extends AbstractAction implements Serializable { 167 public void actionPerformed(ActionEvent e) { 168 int position = _pane.getCaretPosition(); 169 if (position < _doc.getPromptPos()) moveToPrompt(); 170 else if (position == _doc.getPromptPos())_pane.getBeep().run(); 171 else _pane.setCaretPosition(position - 1); 173 } 174 } 175 176 177 AbstractAction moveRightAction = new RightAction(); 178 179 private class RightAction extends AbstractAction implements Serializable { 180 public void actionPerformed(ActionEvent e) { 181 int position = _pane.getCaretPosition(); 182 if (position < _doc.getPromptPos()) moveToEnd(); 183 else if (position >= _doc.getLength()) _pane.getBeep().run(); 184 else _pane.setCaretPosition(position + 1); 186 } 187 } 188 189 190 193 AbstractAction moveUpDownAction = new UpDownAction(); 194 private class UpDownAction extends AbstractAction implements Serializable { 195 public void actionPerformed(ActionEvent e) { 196 int position = _pane.getCaretPosition(); 197 if (position < _doc.getPromptPos()) moveToPrompt(); 198 else _pane.getBeep().run(); 199 } 200 } 201 } 202 203 | Popular Tags |