1 package net.sourceforge.pmd.swingui;
2
3 import net.sourceforge.pmd.swingui.event.ListenerList;
4 import net.sourceforge.pmd.swingui.event.SetupFilesEvent;
5 import net.sourceforge.pmd.swingui.event.SetupFilesEventListener;
6 import net.sourceforge.pmd.swingui.event.StatusBarEvent;
7
8 import javax.swing.BorderFactory;
9 import javax.swing.Icon;
10 import javax.swing.JTree;
11 import javax.swing.UIManager;
12 import javax.swing.border.EtchedBorder;
13 import javax.swing.tree.DefaultTreeCellRenderer;
14 import javax.swing.tree.TreePath;
15 import java.awt.Component;
16 import java.io.File;
17
18 /***
19 *
20 * @author Donald A. Leckie
21 * @since August 17, 2002
22 * @version $Revision: 1.20 $, $Date: 2003/05/28 18:08:32 $
23 */
24 class DirectoryTree extends JTree {
25
26 /***
27 *******************************************************************************
28 *
29 */
30 protected DirectoryTree(String rootName) {
31 super(new DirectoryTreeModel(rootName));
32
33 setRootVisible(true);
34 setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
35 setCellRenderer(new DirectoryTreeNodeRenderer());
36 ((DirectoryTreeModel) getModel()).setDirectoryTree(this);
37 setBackground(UIManager.getColor("pmdTreeBackground"));
38 ListenerList.addListener((SetupFilesEventListener) new SetupFilesEventHandler());
39 }
40
41 /***
42 *******************************************************************************
43 *
44 */
45 protected void expandRootNode() {
46 DirectoryTreeModel treeModel = (DirectoryTreeModel) getModel();
47 DirectoryTreeNode treeNode = (DirectoryTreeNode) treeModel.getRoot();
48 TreePath treePath = new TreePath(treeNode.getPath());
49 expandPath(treePath);
50 }
51
52 /***
53 *******************************************************************************
54 *
55 */
56 protected DirectoryTreeNode getSelectedNode() {
57 TreePath path = getSelectionModel().getSelectionPath();
58
59 return (DirectoryTreeNode) path.getLastPathComponent();
60 }
61
62 /***
63 *********************************************************************************
64 *********************************************************************************
65 *********************************************************************************
66 */
67 private class SetupFilesEventHandler implements SetupFilesEventListener {
68
69 /***
70 ****************************************************************************
71 *
72 * @param event
73 */
74 public void startSetup(SetupFilesEvent event) {
75 }
76
77 /***
78 ****************************************************************************
79 *
80 * @param event
81 */
82 public void stopSetup(SetupFilesEvent event) {
83 }
84
85 /***
86 ****************************************************************************
87 *
88 * @param event
89 */
90 public void setFileList(SetupFilesEvent event) {
91 File[] directories = event.getFileList();
92 String name = "Locating root directories.";
93 SetupFilesThread setupFilesThread = new SetupFilesThread(name, directories);
94 setupFilesThread.start();
95 }
96 }
97
98 /***
99 ********************************************************************************
100 ********************************************************************************
101 ********************************************************************************
102 */
103 private class SetupFilesThread extends Thread {
104 private File[] m_rootDirectories;
105
106 /***
107 ****************************************************************************
108 *
109 * @param name
110 */
111 private SetupFilesThread(String threadName, File[] rootDirectories) {
112 super(threadName);
113
114 m_rootDirectories = rootDirectories;
115 }
116
117 /***
118 ***************************************************************************
119 *
120 */
121 public void run() {
122 setup();
123 process();
124 cleanup();
125 }
126
127 /***
128 ***************************************************************************
129 *
130 */
131 protected void setup() {
132 SetupFilesEvent.notifyStartSetup(this);
133 StatusBarEvent.notifyStartAnimation(this);
134 }
135
136 /***
137 ***************************************************************************
138 *
139 */
140 protected void process() {
141 StatusBarEvent.notifyShowMessage(this, "Locating root directories. Please wait...");
142 DirectoryTreeModel treeModel = (DirectoryTreeModel) getModel();
143 treeModel.setupFiles(m_rootDirectories);
144 expandRootNode();
145 }
146
147 /***
148 ***************************************************************************
149 *
150 */
151 protected void cleanup() {
152 StatusBarEvent.notifyStopAnimation(this);
153 SetupFilesEvent.notifyStopSetup(this);
154 }
155 }
156
157 /***
158 ********************************************************************************
159 ********************************************************************************
160 ********************************************************************************
161 */
162 private class DirectoryTreeNodeRenderer extends DefaultTreeCellRenderer {
163
164 private Icon m_defaultClosedIcon;
165 private Icon m_defaultLeafIcon;
166 private Icon m_defaultOpenIcon;
167
168 /***
169 ***************************************************************************
170 *
171 */
172 protected DirectoryTreeNodeRenderer() {
173 super();
174
175 m_defaultClosedIcon = getDefaultClosedIcon();
176 m_defaultLeafIcon = getDefaultLeafIcon();
177 m_defaultOpenIcon = getDefaultOpenIcon();
178 setBackgroundNonSelectionColor(UIManager.getColor("pmdTreeBackground"));
179 }
180
181 /***
182 **************************************************************************
183 *
184 * @param tree
185 * @param object
186 * @param isSelected
187 * @param isExpanded
188 * @param isLeaf
189 * @param row
190 * @param hasFocus
191 *
192 * @return
193 */
194 public Component getTreeCellRendererComponent(JTree tree, Object object, boolean isSelected, boolean isExpanded, boolean isLeaf, int row, boolean hasFocus) {
195 DirectoryTreeNode treeNode = (DirectoryTreeNode) object;
196 Object userObject = treeNode.getUserObject();
197
198 if (userObject instanceof String) {
199 // The root node will display either an open or closed icon.
200 setClosedIcon(m_defaultClosedIcon);
201 setLeafIcon(m_defaultClosedIcon);
202 setOpenIcon(m_defaultOpenIcon);
203 } else if (((File) userObject).isFile()) {
204 // A file cannot have any children; therefore, the default icon settings are used.
205 setClosedIcon(m_defaultClosedIcon);
206 setLeafIcon(m_defaultLeafIcon);
207 setOpenIcon(m_defaultOpenIcon);
208 } else {
209 // A directory may or may not have children. The following conditions are used:
210 //
211 // For a file
212 // files are not viewed in the tree
213 // For a directory
214 // has no children --- use closed folder icon
215 // has children
216 // is expanded --- use open folder icon
217 // is collapsed --- use closed folder icon
218 //
219 setClosedIcon(m_defaultClosedIcon);
220 setLeafIcon(m_defaultClosedIcon);
221 setOpenIcon(m_defaultOpenIcon);
222 }
223
224 return super.getTreeCellRendererComponent(tree, object, isSelected, isExpanded, isLeaf, row, hasFocus);
225 }
226 }
227 }
This page was automatically generated by Maven