1 21 22 package org.armedbear.j; 23 24 import java.awt.event.InputEvent ; 25 import java.awt.event.KeyEvent ; 26 import java.awt.event.KeyListener ; 27 import java.awt.event.MouseEvent ; 28 import java.awt.event.MouseListener ; 29 import java.awt.event.MouseMotionListener ; 30 import java.util.List ; 31 import javax.swing.SwingUtilities ; 32 import javax.swing.ToolTipManager ; 33 34 public class SidebarTagList extends SidebarList implements Constants, 35 NavigationComponent, KeyListener , MouseListener , MouseMotionListener 36 { 37 private Editor editor; 38 private Buffer buffer; 39 private List tags; 40 41 public SidebarTagList(Sidebar sidebar, Editor editor) 42 { 43 super(sidebar); 44 this.editor = editor; 45 addKeyListener(this); 46 addMouseListener(this); 47 addMouseMotionListener(this); 48 } 49 50 public final Editor getEditor() 51 { 52 return editor; 53 } 54 55 public synchronized final void setEditor(Editor editor) 56 { 57 this.editor = editor; 58 } 59 60 public final Buffer getBuffer() 61 { 62 return buffer; 63 } 64 65 public final void setBuffer(Buffer buffer) 66 { 67 this.buffer = buffer; 68 } 69 70 public final String getLabelText() 71 { 72 File file = editor.getBuffer().getFile(); 73 return file != null ? file.getName() : null; 74 } 75 76 public synchronized void refresh() 77 { 78 if (!SwingUtilities.isEventDispatchThread()) 79 Debug.bug("SidebarTagList.refresh() called from background thread!"); 80 final Buffer buf = editor.getBuffer(); 81 if (buf == null) 82 return; 83 if (tags != null && tags == buf.getTags()) 84 return; 85 tags = buf.getTags(); 86 if (tags != null) { 87 setListData(tags.toArray()); 88 setBuffer(buf); 89 updatePosition(); 90 return; 91 } 92 final Tagger tagger = buf.getMode().getTagger(buf); 94 if (tagger == null) 95 return; 96 Runnable runTaggerRunnable = new Runnable () { 97 public void run() 98 { 99 boolean locked = false; 100 try { 101 buf.lockRead(); 102 locked = true; 103 } 104 catch (InterruptedException e) { 105 Log.error(e); 106 } 107 if (locked) { 108 try { 109 tagger.run(); 110 tags = buf.getTags(); 111 } 112 finally { 113 buf.unlockRead(); 114 } 115 } 116 if (tags != null) { 117 final Object [] listData = tags.toArray(); 118 Runnable replaceListDataRunnable = new Runnable () { 119 public void run() 120 { 121 replaceListData(buf, listData); 124 } 125 }; 126 SwingUtilities.invokeLater(replaceListDataRunnable); 127 } 128 } 129 }; 130 Thread thread = 131 new Thread (runTaggerRunnable, "SidebarTagList.refresh()"); 132 thread.setDaemon(true); 133 thread.start(); 134 } 135 136 private synchronized void replaceListData(Buffer buf, Object [] listData) 137 { 138 if (editor.getBuffer() == buf) { 139 setListData(listData); 140 setBuffer(buf); 141 updatePosition(); 142 } 143 } 144 145 public synchronized void updatePosition() 148 { 149 if (tags == null) 150 return; 151 final Position dot = editor.getDot(); 152 if (dot == null) 153 return; 154 final Line dotLine = dot.getLine(); 155 int index = -1; 156 Line lastTagLine = null; 157 final int size = tags.size(); 158 for (int i = 0; i < size; i++) { 159 LocalTag t = (LocalTag) tags.get(i); 160 if (t.getPosition().isAfter(dot)) { 161 if (t.getLine() == dotLine && t.getLine() != lastTagLine) { 162 index = i; 163 lastTagLine = t.getLine(); 164 } 165 break; 166 } else { 167 index = i; 168 lastTagLine = t.getLine(); 169 } 170 } 171 if (index != getSelectedIndex()) { 172 if (index >= 0) { 173 setSelectedIndex(index); 174 centerIndex(index); 175 } else { 176 clearSelection(); 177 ensureIndexIsVisible(0); 178 } 179 } 180 } 181 182 private synchronized void gotoTag() 183 { 184 if (tags == null) 185 return; 186 int index = getSelectedIndex(); 187 if (index >= 0 && index < tags.size()) { 188 LocalTag tag = (LocalTag) tags.get(index); 189 tag.gotoTag(editor); 190 } 191 editor.setFocusToDisplay(); 192 } 193 194 public synchronized String getToolTipText(MouseEvent e) 195 { 196 if (tags != null) { 197 int index = locationToIndex(e.getPoint()); 198 if (index >= 0 && index < tags.size()) { 199 LocalTag t = (LocalTag) tags.get(index); 200 return t.getToolTipText(); 201 } 202 } 203 return null; 204 } 205 206 public void keyPressed(KeyEvent e) 207 { 208 int keyCode = e.getKeyCode(); 209 int modifiers = e.getModifiers(); 210 modifiers &= 0x0f; 212 switch (keyCode) { 213 case KeyEvent.VK_SHIFT: 215 case KeyEvent.VK_CONTROL: 216 case KeyEvent.VK_ALT: 217 case KeyEvent.VK_META: 218 return; 219 case KeyEvent.VK_ENTER: 220 e.consume(); 221 gotoTag(); 222 if (modifiers == KeyEvent.ALT_MASK) 223 sidebar.getFrame().frameToggleSidebar(); 224 return; 225 case KeyEvent.VK_TAB: 226 e.consume(); 227 if (modifiers == 0) { 228 if (sidebar.getBufferList() != null) { 229 updatePosition(); 230 editor.setFocus(sidebar.getBufferList()); 231 } 232 } 233 return; 234 case KeyEvent.VK_ESCAPE: 235 e.consume(); 236 sidebar.setBuffer(); 237 updatePosition(); 238 editor.setFocusToDisplay(); 239 return; 240 } 241 editor.getDispatcher().setEnabled(false); 242 } 243 244 public void keyReleased(KeyEvent e) 245 { 246 e.consume(); 247 editor.getDispatcher().setEnabled(true); 248 } 249 250 public void keyTyped(KeyEvent e) 251 { 252 e.consume(); 253 } 254 255 public void mousePressed(MouseEvent e) 256 { 257 LocationBar.cancelInput(); 258 editor.ensureActive(); 259 int modifiers = e.getModifiers() & 0x1f; 261 if (modifiers == InputEvent.BUTTON1_MASK || 262 modifiers == InputEvent.BUTTON2_MASK) { 263 if (modifiers == InputEvent.BUTTON2_MASK) 264 setSelectedIndex(locationToIndex(e.getPoint())); 265 paintImmediately(0, 0, getWidth(), getHeight()); 266 Editor.setCurrentEditor(editor); 267 sidebar.setUpdateFlag(SIDEBAR_SET_BUFFER); 268 gotoTag(); 269 } else 270 editor.setFocusToDisplay(); 271 } 272 273 public void mouseReleased(MouseEvent e) {} 274 275 public void mouseClicked(MouseEvent e) {} 276 277 public void mouseMoved(MouseEvent e) 278 { 279 String text = getToolTipText(e); 280 sidebar.getFrame().setStatusText(text != null ? text : ""); 281 } 282 283 public void mouseEntered(MouseEvent e) {} 284 285 public void mouseExited(MouseEvent e) 286 { 287 final Frame frame = sidebar.getFrame(); 288 final StatusBar statusBar = frame.getStatusBar(); 289 if (statusBar != null) { 290 statusBar.setText(null); 291 statusBar.repaintNow(); 292 } 293 ToolTipManager.sharedInstance().setEnabled(false); 295 ToolTipManager.sharedInstance().setEnabled(true); 296 if (frame.getFocusedComponent() == this) { 297 updatePosition(); 298 editor.setFocusToDisplay(); 299 } 300 } 301 302 public void mouseDragged(MouseEvent e) {} 303 } 304 | Popular Tags |