1 22 23 package org.gjt.sp.jedit.gui; 24 25 import java.awt.*; 27 import java.awt.event.*; 28 import javax.swing.*; 29 import javax.swing.border.EmptyBorder ; 30 import javax.swing.event.*; 31 import org.gjt.sp.jedit.*; 32 import org.gjt.sp.jedit.msg.RegisterChanged; 33 import org.gjt.sp.jedit.msg.PropertiesChanged; 34 36 public class RegisterViewer extends JPanel implements EBComponent, ActionListener 37 { 38 public RegisterViewer(View view, String position) 40 { 41 super(new BorderLayout()); 42 this.view = view; 43 Box toolBar = new Box(BoxLayout.X_AXIS); 44 JLabel label = new JLabel( 45 jEdit.getProperty("view-registers.title")); 46 label.setBorder(new EmptyBorder (0,0,3,0)); 47 toolBar.add(label); 48 49 toolBar.add(Box.createGlue()); 50 51 RolloverButton pasteRegister = new RolloverButton( 52 GUIUtilities.loadIcon("Paste.png")); 53 pasteRegister.setToolTipText(GUIUtilities.prettifyMenuLabel( 54 jEdit.getProperty("paste-string-register.label"))); 55 pasteRegister.addActionListener(this); 56 pasteRegister.setActionCommand("paste-string-register"); 57 toolBar.add(pasteRegister); 58 59 RolloverButton clearRegister = new RolloverButton( 60 GUIUtilities.loadIcon("Clear.png")); 61 clearRegister.setToolTipText(GUIUtilities.prettifyMenuLabel( 62 jEdit.getProperty("clear-string-register.label"))); 63 clearRegister.addActionListener(this); 64 clearRegister.setActionCommand("clear-string-register"); 65 toolBar.add(clearRegister); 66 67 68 add(BorderLayout.NORTH,toolBar); 69 70 DefaultListModel registerModel = new DefaultListModel(); 71 registerList = new JList(registerModel); 72 registerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 73 registerList.setCellRenderer(new Renderer()); 74 registerList.addListSelectionListener(new ListHandler()); 75 registerList.addMouseListener(new MouseHandler()); 76 77 contentTextArea = new JTextArea(10,20); 78 contentTextArea.setEditable(true); 79 documentHandler = new DocumentHandler(); 80 contentTextArea.addFocusListener(new FocusHandler()); 82 83 int orientation = JSplitPane.HORIZONTAL_SPLIT; 84 if (position.equals(DockableWindowManager.LEFT) || 85 position.equals(DockableWindowManager.RIGHT)) 86 orientation = JSplitPane.VERTICAL_SPLIT; 87 88 add(BorderLayout.CENTER,splitPane = new JSplitPane(orientation, 89 jEdit.getBooleanProperty("appearance.continuousLayout"), 90 new JScrollPane(registerList), 91 new JScrollPane(contentTextArea))); 92 93 refreshList(); 94 } 96 public void actionPerformed(ActionEvent evt) 98 { 99 String cmd = evt.getActionCommand(); 100 if (cmd.equals("paste-string-register")) 101 insertRegister(); 102 else if (cmd.equals("clear-string-register")) 103 { 104 Object o = registerList.getSelectedValue(); 105 if (o == null) 106 return; 107 else if (o instanceof Character ) 108 { 109 Registers.clearRegister(((Character )o).charValue()); 110 refreshList(); 111 } 112 } 113 } 115 public void handleMessage(EBMessage msg) 117 { 118 if (msg instanceof RegisterChanged) 119 { 120 if (((RegisterChanged)msg).getRegisterName() != '%') 121 refreshList(); 122 } 123 else if (msg instanceof PropertiesChanged) 124 { 125 GUIUtilities.initContinuousLayout(splitPane); 126 } 127 128 } 130 public void addNotify() 132 { 133 super.addNotify(); 134 EditBus.addToBus(this); 135 } 137 public void removeNotify() 139 { 140 super.removeNotify(); 141 EditBus.removeFromBus(this); 142 } 144 146 private JList registerList; 148 private JTextArea contentTextArea; 149 private DocumentHandler documentHandler; 150 private View view; 151 private boolean editing; 152 private JSplitPane splitPane; 153 155 private void refreshList() 157 { 158 DefaultListModel registerModel = (DefaultListModel)registerList.getModel(); 159 Object o = registerList.getSelectedValue(); 160 int selected = -1; 161 if (o != null && o instanceof Character ) 162 selected = ((Character )o).charValue(); 163 164 registerModel.removeAllElements(); 165 Registers.Register[] registers = Registers.getRegisters(); 166 167 int index = 0; 168 for(int i = 0; i < registers.length; i++) 169 { 170 Registers.Register reg = registers[i]; 171 if(reg == null) 172 continue; 173 if (i == '%') 174 continue; 175 176 String value = reg.toString(); 177 if(value == null) continue; 179 if (i == selected) 180 index = registerModel.size(); 181 registerModel.addElement(new Character ((char)i)); 182 } 183 184 if(registerModel.getSize() == 0) 185 { 186 registerModel.addElement(jEdit.getProperty("view-registers.none")); 187 registerList.setEnabled(false); 188 } 189 else 190 registerList.setEnabled(true); 191 registerList.setSelectedIndex(index); 192 } 194 private void updateSelected() 196 { 197 Object o = registerList.getSelectedValue(); 198 if (o == null) 199 return; 200 else if (o instanceof Character ) 201 { 202 Registers.Register reg = Registers.getRegister(((Character )o).charValue()); 203 if (!editing) 204 { 205 contentTextArea.setText(reg.toString()); 206 contentTextArea.setEditable(true); 207 } 208 } 209 else 210 { 211 if (!editing) 212 { 213 contentTextArea.setText(""); 214 contentTextArea.setEditable(false); 215 } 216 } 217 if (!editing) 218 contentTextArea.setCaretPosition(0); 219 } 221 private void insertRegister() 223 { 224 Object o = registerList.getSelectedValue(); 225 if (o == null || !(o instanceof Character )) 226 return; 227 Registers.Register reg = Registers.getRegister(((Character )o).charValue()); 228 view.getTextArea().setSelectedText(reg.toString()); 229 view.getTextArea().requestFocus(); 230 } 232 234 236 static class Renderer extends DefaultListCellRenderer 238 { 239 public Component getListCellRendererComponent( 240 JList list, Object value, int index, 241 boolean isSelected, boolean cellHasFocus) 242 { 243 super.getListCellRendererComponent(list,value, 244 index,isSelected,cellHasFocus); 245 246 if(value instanceof Character ) 247 { 248 char name = ((Character )value).charValue(); 249 250 String label; 251 252 if(name == '\n') 253 label = "\n"; 254 else if(name == '\t') 255 label = "\t"; 256 else if(name == '$') 257 label = jEdit.getProperty("view-registers.clipboard"); 258 else if(name == '%') 259 label = jEdit.getProperty("view-registers.selection"); 260 else 261 label = String.valueOf(name); 262 String registerValue = Registers.getRegister(name).toString(); 263 if (registerValue.length() > 100) 264 registerValue = registerValue.substring(0,100)+"..."; 265 registerValue = registerValue.replaceAll("\n"," "); 266 registerValue = registerValue.replaceAll("\t"," "); 267 setText(label+" : "+registerValue); 268 } 269 270 return this; 271 } 272 } 274 class ListHandler implements ListSelectionListener 276 { 277 public void valueChanged(ListSelectionEvent evt) 278 { 279 Object value = registerList.getSelectedValue(); 280 if(!(value instanceof Character )) 281 return; 282 283 char name = ((Character )value).charValue(); 284 285 Registers.Register reg = Registers.getRegister(name); 286 if(reg == null) 287 return; 288 updateSelected(); 289 } 290 } 292 class MouseHandler extends MouseAdapter 294 { 295 303 304 public void mouseClicked(MouseEvent evt) 305 { 306 if (evt.getClickCount() % 2 == 0) 307 insertRegister(); 308 } 309 } 311 class DocumentHandler implements DocumentListener 313 { 314 public void changedUpdate(DocumentEvent e) 315 { 316 updateRegisterSafely(); 317 } 318 319 public void insertUpdate(DocumentEvent e) 320 { 321 updateRegisterSafely(); 322 } 323 324 public void removeUpdate(DocumentEvent e) 325 { 326 updateRegisterSafely(); 327 } 328 329 private void updateRegisterSafely() 330 { 331 try 332 { 333 editing = true; 334 updateRegister(); 335 } 336 finally 337 { 338 editing = false; 339 } 340 } 341 342 private void updateRegister() 343 { 344 Object value = registerList.getSelectedValue(); 345 if(!(value instanceof Character )) 346 return; 347 char name = ((Character )value).charValue(); 348 Registers.setRegister(name,contentTextArea.getText()); 349 } 350 } 352 class FocusHandler implements FocusListener 354 { 355 public void focusGained(FocusEvent e) 356 { 357 contentTextArea.getDocument().addDocumentListener(documentHandler); 358 } 359 public void focusLost(FocusEvent e) 360 { 361 contentTextArea.getDocument().removeDocumentListener(documentHandler); 362 } 363 } 365 } 367 | Popular Tags |