KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2  * DirectoryTree.java
3  *
4  * Copyright (C) 2000-2003 Peter Graves
5  * $Id: DirectoryTree.java,v 1.6 2003/07/23 15:52:14 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.Color JavaDoc;
25 import java.awt.Component JavaDoc;
26 import java.awt.Graphics JavaDoc;
27 import java.awt.Point JavaDoc;
28 import java.awt.event.InputEvent JavaDoc;
29 import java.awt.event.KeyEvent JavaDoc;
30 import java.awt.event.KeyListener JavaDoc;
31 import java.awt.event.MouseEvent JavaDoc;
32 import java.awt.event.MouseListener JavaDoc;
33 import java.awt.event.MouseMotionListener JavaDoc;
34 import javax.swing.JTree JavaDoc;
35 import javax.swing.SwingUtilities JavaDoc;
36 import javax.swing.event.TreeExpansionEvent JavaDoc;
37 import javax.swing.event.TreeExpansionListener JavaDoc;
38 import javax.swing.event.TreeSelectionEvent JavaDoc;
39 import javax.swing.event.TreeSelectionListener JavaDoc;
40 import javax.swing.tree.DefaultMutableTreeNode JavaDoc;
41 import javax.swing.tree.DefaultTreeCellRenderer JavaDoc;
42 import javax.swing.tree.TreeModel JavaDoc;
43 import javax.swing.tree.TreePath JavaDoc;
44 import javax.swing.tree.TreeSelectionModel JavaDoc;
45
46 public final class DirectoryTree extends SidebarTree implements NavigationComponent,
47     TreeSelectionListener JavaDoc, TreeExpansionListener JavaDoc, MouseListener JavaDoc,
48     MouseMotionListener JavaDoc, KeyListener JavaDoc
49 {
50     private Editor editor;
51     private DirectoryTreeModel treeModel;
52
53     private DirectoryTree(Editor editor, TreeModel JavaDoc model)
54     {
55         super(model);
56         this.editor = editor;
57         getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
58         setScrollsOnExpand(false);
59         addTreeSelectionListener(this);
60         addTreeExpansionListener(this);
61         addMouseListener(this);
62         addMouseMotionListener(this);
63         addKeyListener(this);
64         setCellRenderer(new DirectoryTreeCellRenderer(this));
65     }
66
67     public static DirectoryTree getDirectoryTree(Editor editor)
68     {
69         if (editor.getCurrentDirectory().isLocal()) {
70             if (editor.localDirectoryTree == null)
71                 editor.localDirectoryTree = new DirectoryTree(editor, null);
72             return editor.localDirectoryTree;
73         }
74         return new DirectoryTree(editor, null);
75     }
76
77     public final String JavaDoc getLabelText()
78     {
79         return editor.getBuffer().getFile().getName();
80     }
81
82     public DirectoryTreeModel getTreeModel()
83     {
84         return treeModel;
85     }
86
87     public Editor getEditor()
88     {
89         return editor;
90     }
91
92     public void refresh()
93     {
94         if (!SwingUtilities.isEventDispatchThread())
95             Debug.bug("DirectoryTree.refresh() called from background thread!");
96         Runnable JavaDoc refreshRunnable = new Runnable JavaDoc() {
97             public void run()
98             {
99                 File file = editor.getBuffer().getFile();
100                 if (file == null)
101                     return;
102                 if (treeModel == null) {
103                     treeModel = DirectoryTreeModel.getTreeModel(file);
104                     if (treeModel != null) {
105                         final DefaultMutableTreeNode JavaDoc node = getNode(file);
106                         Runnable JavaDoc completionRunnable = new Runnable JavaDoc() {
107                             public void run()
108                             {
109                                 setModel(treeModel);
110                                 if (node != null)
111                                     scrollNodeToCenter(node);
112                             }
113                         };
114                         SwingUtilities.invokeLater(completionRunnable);
115                     }
116                 } else {
117                     DefaultMutableTreeNode JavaDoc selectedNode = null;
118                     TreePath JavaDoc path = getSelectionPath();
119                     if (path != null) {
120                         selectedNode =
121                             (DefaultMutableTreeNode JavaDoc) path.getLastPathComponent();
122                     }
123                     final DefaultMutableTreeNode JavaDoc node = getNode(file);
124                     if (node != null && node != selectedNode) {
125                         Runnable JavaDoc completionRunnable = new Runnable JavaDoc() {
126                             public void run()
127                             {
128                                 scrollNodeToCenter(node);
129                             }
130                         };
131                         SwingUtilities.invokeLater(completionRunnable);
132                     }
133                 }
134             }
135         };
136         new Thread JavaDoc(refreshRunnable).start();
137     }
138
139     private void expandNode(DefaultMutableTreeNode JavaDoc node)
140     {
141         DirectoryTreeElement treeElement =
142             (DirectoryTreeElement) node.getUserObject();
143         File file = treeElement.getFile();
144         expandNode(node, file);
145     }
146
147     private void expandNode(DefaultMutableTreeNode JavaDoc node, File file)
148     {
149         treeModel.expandNode(node, file);
150     }
151
152     private DefaultMutableTreeNode JavaDoc getNode(File file)
153     {
154         if (treeModel == null || file == null)
155             return null;
156         return treeModel.getNode(file);
157     }
158
159     public void updatePosition()
160     {
161         int limit = getRowCount();
162         int rowToBeSelected = -1;
163         String JavaDoc path = editor.getBuffer().getFile().canonicalPath();
164         for (int row = 0; row < limit; row++) {
165             TreePath JavaDoc treepath = getPathForRow(row);
166             if (treepath != null) {
167                 DefaultMutableTreeNode JavaDoc node =
168                     (DefaultMutableTreeNode JavaDoc) treepath.getLastPathComponent();
169                 if (node != null) {
170                     // On Windows the user object might be a string (host name).
171
if (node.getUserObject() instanceof DirectoryTreeElement) {
172                         DirectoryTreeElement treeElement =
173                             (DirectoryTreeElement) node.getUserObject();
174                         if (path.equals(treeElement.getPath())) {
175                             rowToBeSelected = row;
176                             break;
177                         }
178                     }
179                 }
180             }
181         }
182         if (rowToBeSelected >= 0) {
183             int[] selectedRows = getSelectionRows();
184             if (selectedRows != null && selectedRows.length == 1 &&
185                 selectedRows[0] == rowToBeSelected)
186                 ; // No change.
187
else {
188                 setSelectionRow(rowToBeSelected);
189                 scrollRowToCenter(rowToBeSelected);
190             }
191         } else
192             clearSelection();
193     }
194
195     public void valueChanged(TreeSelectionEvent JavaDoc e) {}
196
197     public void treeCollapsed(TreeExpansionEvent JavaDoc e) {}
198
199     public void treeExpanded(TreeExpansionEvent JavaDoc e) {}
200
201     public void keyPressed(KeyEvent JavaDoc e)
202     {
203         int keyCode = e.getKeyCode();
204         int modifiers = e.getModifiers();
205
206         switch (keyCode) {
207             // Ignore modifier keystrokes.
208
case KeyEvent.VK_SHIFT:
209             case KeyEvent.VK_CONTROL:
210             case KeyEvent.VK_ALT:
211             case KeyEvent.VK_META:
212                 return;
213
214             case KeyEvent.VK_ENTER: {
215                 e.consume();
216                 TreePath JavaDoc path = getSelectionPath();
217                 if (path != null) {
218                     DefaultMutableTreeNode JavaDoc node =
219                         (DefaultMutableTreeNode JavaDoc) path.getLastPathComponent();
220                     if (node.getUserObject() instanceof DirectoryTreeElement) {
221                         DirectoryTreeElement treeElement =
222                             (DirectoryTreeElement) node.getUserObject();
223                         File file = treeElement.getFile();
224                         editor.setWaitCursor();
225                         expandNode(node, file);
226                         editor.setDefaultCursor();
227                         if (e.getModifiers() == InputEvent.BUTTON2_MASK)
228                             editor.setFocusToDisplay();
229                         repaint();
230                         ((Directory)editor.getBuffer()).changeDirectory(file);
231                         editor.updateDisplay();
232                     }
233                 }
234                 editor.setFocusToDisplay();
235                 if (modifiers == KeyEvent.ALT_MASK)
236                     editor.toggleSidebar();
237                 return;
238             }
239
240             case KeyEvent.VK_TAB:
241                 e.consume();
242                 if (modifiers == 0) {
243                     if (editor.getSidebar().getBufferList() != null)
244                         editor.setFocus(editor.getSidebar().getBufferList());
245                 }
246                 return;
247
248             case KeyEvent.VK_ESCAPE:
249                 e.consume();
250                 editor.getSidebar().setBuffer();
251                 editor.getSidebar().updatePosition();
252                 editor.setFocusToDisplay();
253                 return;
254         }
255
256         editor.getDispatcher().setEnabled(false);
257     }
258
259     public void keyReleased(KeyEvent JavaDoc e)
260     {
261         e.consume();
262         editor.getDispatcher().setEnabled(true);
263     }
264
265     public void keyTyped(KeyEvent JavaDoc e)
266     {
267         e.consume();
268     }
269
270     private boolean ignoreMouseClicked;
271
272     public void mousePressed(MouseEvent JavaDoc e)
273     {
274         ignoreMouseClicked = false;
275         LocationBar.cancelInput();
276         editor.ensureActive();
277         int modifiers = e.getModifiers();
278         if (modifiers == InputEvent.BUTTON1_MASK ||
279             modifiers == InputEvent.BUTTON2_MASK) {
280             Point JavaDoc point = e.getPoint();
281             if (e.getModifiers() == InputEvent.BUTTON2_MASK) {
282                 int row = getRowForLocation(point.x, point.y);
283                 setSelectionRow(row);
284             }
285             editor.setFocus(this);
286             TreePath JavaDoc treepath = getPathForLocation(point.x, point.y);
287             if (treepath == null) {
288                 ignoreMouseClicked = true;
289                 e.consume();
290             }
291         } else
292             editor.setFocusToDisplay();
293     }
294
295     public void mouseReleased(MouseEvent JavaDoc e) {}
296
297     public void mouseClicked(MouseEvent JavaDoc e)
298     {
299         if (ignoreMouseClicked) {
300             e.consume();
301             editor.setFocusToDisplay();
302             return;
303         }
304         final int modifiers = e.getModifiers();
305         if (modifiers != InputEvent.BUTTON1_MASK &&
306             modifiers != InputEvent.BUTTON2_MASK) {
307             e.consume();
308             editor.setFocusToDisplay();
309             return;
310         }
311         Point JavaDoc point = e.getPoint();
312         TreePath JavaDoc treepath = getPathForLocation(point.x, point.y);
313         if (treepath != null) {
314             DefaultMutableTreeNode JavaDoc node =
315                 (DefaultMutableTreeNode JavaDoc) treepath.getLastPathComponent();
316             DirectoryTreeElement treeElement =
317                 (DirectoryTreeElement) node.getUserObject();
318             File file = treeElement.getFile();
319             editor.setWaitCursor();
320             expandNode(node, file);
321             expandPath(treepath);
322             editor.setDefaultCursor();
323             if (modifiers == InputEvent.BUTTON1_MASK ||
324                 modifiers == InputEvent.BUTTON2_MASK)
325                 editor.setFocusToDisplay();
326             repaint();
327             ((Directory)editor.getBuffer()).changeDirectory(file);
328             editor.updateDisplay();
329         }
330     }
331
332     public void mouseMoved(MouseEvent JavaDoc e) {}
333
334     public void mouseEntered(MouseEvent JavaDoc e) {}
335
336     public void mouseExited(MouseEvent JavaDoc e)
337     {
338         editor.setFocusToDisplay();
339     }
340
341     public void mouseDragged(MouseEvent JavaDoc e) {}
342
343     private static class DirectoryTreeCellRenderer extends DefaultTreeCellRenderer JavaDoc
344     {
345         private DirectoryTree tree;
346         private Editor editor;
347
348         private static Color JavaDoc noFocusSelectionBackground =
349             new Color JavaDoc(208, 208, 208);
350
351         private Color JavaDoc oldBackgroundSelectionColor;
352
353         public DirectoryTreeCellRenderer(DirectoryTree tree)
354         {
355             super();
356             this.tree = tree;
357             editor = tree.getEditor();
358             oldBackgroundSelectionColor = getBackgroundSelectionColor();
359
360             setOpenIcon(Utilities.getIconFromFile("dir_open.png"));
361             setClosedIcon(Utilities.getIconFromFile("dir_close.png"));
362             setLeafIcon(Utilities.getIconFromFile("dir_close.png"));
363         }
364
365         public Component JavaDoc getTreeCellRendererComponent(
366             JTree JavaDoc tree,
367             Object JavaDoc value,
368             boolean selected,
369             boolean expanded,
370             boolean leaf,
371             int row,
372             boolean hasFocus)
373         {
374             super.getTreeCellRendererComponent(tree, value, selected, expanded,
375                                                leaf, row, hasFocus);
376             if (selected)
377                 super.setForeground(getTextSelectionColor());
378             else
379                 super.setForeground(getTextNonSelectionColor());
380             if (editor.getFocusedComponent() == tree)
381                 setBackgroundSelectionColor(oldBackgroundSelectionColor);
382             else
383                 setBackgroundSelectionColor(noFocusSelectionBackground);
384             return this;
385         }
386
387         public void paintComponent(Graphics JavaDoc g)
388         {
389             Display.setRenderingHints(g);
390             super.paintComponent(g);
391         }
392     }
393 }
394
Popular Tags