KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > SidebarTagList


1 /*
2  * SidebarTagList.java
3  *
4  * Copyright (C) 2000-2002 Peter Graves
5  * $Id: SidebarTagList.java,v 1.4 2003/11/30 00:06:22 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j;
23
24 import java.awt.event.InputEvent JavaDoc;
25 import java.awt.event.KeyEvent JavaDoc;
26 import java.awt.event.KeyListener JavaDoc;
27 import java.awt.event.MouseEvent JavaDoc;
28 import java.awt.event.MouseListener JavaDoc;
29 import java.awt.event.MouseMotionListener JavaDoc;
30 import java.util.List JavaDoc;
31 import javax.swing.SwingUtilities JavaDoc;
32 import javax.swing.ToolTipManager JavaDoc;
33
34 public class SidebarTagList extends SidebarList implements Constants,
35     NavigationComponent, KeyListener JavaDoc, MouseListener JavaDoc, MouseMotionListener JavaDoc
36 {
37     private Editor editor;
38     private Buffer buffer;
39     private List JavaDoc 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 JavaDoc 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         // Need to run tagger.
93
final Tagger tagger = buf.getMode().getTagger(buf);
94         if (tagger == null)
95             return;
96         Runnable JavaDoc runTaggerRunnable = new Runnable JavaDoc() {
97             public void run()
98             {
99                 boolean locked = false;
100                 try {
101                     buf.lockRead();
102                     locked = true;
103                 }
104                 catch (InterruptedException JavaDoc 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 JavaDoc[] listData = tags.toArray();
118                     Runnable JavaDoc replaceListDataRunnable = new Runnable JavaDoc() {
119                         public void run()
120                         {
121                             // Make sure user didn't change buffers while we
122
// were preparing the tag list.
123
replaceListData(buf, listData);
124                         }
125                     };
126                     SwingUtilities.invokeLater(replaceListDataRunnable);
127                 }
128             }
129         };
130         Thread JavaDoc thread =
131             new Thread JavaDoc(runTaggerRunnable, "SidebarTagList.refresh()");
132         thread.setDaemon(true);
133         thread.start();
134     }
135
136     private synchronized void replaceListData(Buffer buf, Object JavaDoc[] listData)
137     {
138         if (editor.getBuffer() == buf) {
139             setListData(listData);
140             setBuffer(buf);
141             updatePosition();
142         }
143     }
144
145     // Set the selection to the last tag before the position of the caret in
146
// the current editor.
147
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 JavaDoc getToolTipText(MouseEvent JavaDoc 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 JavaDoc e)
207     {
208         int keyCode = e.getKeyCode();
209         int modifiers = e.getModifiers();
210         // Mask off the bits we don't care about (Java 1.4).
211
modifiers &= 0x0f;
212         switch (keyCode) {
213             // Ignore modifier keystrokes.
214
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 JavaDoc e)
245     {
246         e.consume();
247         editor.getDispatcher().setEnabled(true);
248     }
249
250     public void keyTyped(KeyEvent JavaDoc e)
251     {
252         e.consume();
253     }
254
255     public void mousePressed(MouseEvent JavaDoc e)
256     {
257         LocationBar.cancelInput();
258         editor.ensureActive();
259         // Mask off the bits we don't care about (Java 1.4).
260
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 JavaDoc e) {}
274
275     public void mouseClicked(MouseEvent JavaDoc e) {}
276
277     public void mouseMoved(MouseEvent JavaDoc e)
278     {
279         String JavaDoc text = getToolTipText(e);
280         sidebar.getFrame().setStatusText(text != null ? text : "");
281     }
282
283     public void mouseEntered(MouseEvent JavaDoc e) {}
284
285     public void mouseExited(MouseEvent JavaDoc 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         // Force tool tip to be hidden.
294
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 JavaDoc e) {}
303 }
304
Popular Tags