1 package net.sourceforge.pmd.swingui;
2
3 import net.sourceforge.pmd.swingui.event.DirectoryTableEvent;
4 import net.sourceforge.pmd.swingui.event.DirectoryTableEventListener;
5 import net.sourceforge.pmd.swingui.event.ListenerList;
6
7 import javax.swing.JLabel;
8 import javax.swing.JTable;
9 import javax.swing.ListSelectionModel;
10 import javax.swing.SwingConstants;
11 import javax.swing.UIManager;
12 import javax.swing.border.BevelBorder;
13 import javax.swing.border.Border;
14 import javax.swing.border.CompoundBorder;
15 import javax.swing.border.EtchedBorder;
16 import javax.swing.event.ListSelectionEvent;
17 import javax.swing.event.ListSelectionListener;
18 import javax.swing.table.DefaultTableCellRenderer;
19 import javax.swing.table.JTableHeader;
20 import javax.swing.table.TableColumn;
21 import javax.swing.table.TableColumnModel;
22 import java.awt.Color;
23 import java.awt.Component;
24 import java.awt.Font;
25 import java.awt.Point;
26 import java.awt.Rectangle;
27 import java.awt.event.MouseAdapter;
28 import java.awt.event.MouseEvent;
29 import java.io.File;
30 import java.util.Arrays;
31 import java.util.Comparator;
32 import java.util.Vector;
33
34 /***
35 *
36 * @author Donald A. Leckie
37 * @since August 25, 2002
38 * @version $Revision: 1.20 $, $Date: 2003/05/28 18:08:32 $
39 */
40 class DirectoryTable extends JTable {
41
42 private boolean m_sortAscending = true;
43
44 /***
45 ********************************************************************************
46 *
47 * @param directoryTree
48 */
49 protected DirectoryTable(DirectoryTree directoryTree, String fileExtension) {
50 super(new DirectoryTableModel(directoryTree, fileExtension));
51
52 setShowGrid(false);
53 setRowSelectionAllowed(false);
54 setColumnSelectionAllowed(false);
55 setCellSelectionEnabled(true);
56 getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
57 setBackground(UIManager.getColor("pmdTableBackground"));
58 setRowHeight(20);
59 setSelectionBackground(Color.blue);
60 setSelectionForeground(Color.white);
61 getSelectionModel().addListSelectionListener(new ListSelectionHandler());
62
63 TableColumnModel columnModel = getColumnModel();
64 JTableHeader tableHeader = getTableHeader();
65
66 columnModel.setColumnMargin(2);
67 tableHeader.addMouseListener(new TableHeaderMouseListener());
68
69 //
70 // Create the column renderers.
71 //
72 ColumnHeaderRenderer headerRenderer;
73 DefaultTableCellRenderer cellRenderer;
74 TableColumn column;
75
76 //
77 // Create renderers for the file name column.
78 //
79 column = columnModel.getColumn(DirectoryTableModel.FILE_NAME_COLUMN);
80 headerRenderer = new ColumnHeaderRenderer();
81 cellRenderer = new DefaultTableCellRenderer();
82
83 cellRenderer.setIcon(UIManager.getIcon("document"));
84 headerRenderer.setHorizontalAlignment(JLabel.LEFT);
85 column.setHeaderRenderer(headerRenderer);
86 cellRenderer.setHorizontalAlignment(JLabel.LEFT);
87 column.setCellRenderer(cellRenderer);
88
89 //
90 // Create a cell renderer for the file size column.
91 //
92 column = columnModel.getColumn(DirectoryTableModel.FILE_SIZE_COLUMN);
93 headerRenderer = new ColumnHeaderRenderer();
94 cellRenderer = new DefaultTableCellRenderer();
95
96 headerRenderer.setHorizontalAlignment(JLabel.RIGHT);
97 column.setHeaderRenderer(headerRenderer);
98 cellRenderer.setHorizontalAlignment(JLabel.RIGHT);
99 column.setCellRenderer(cellRenderer);
100
101 //
102 // Create a cell renderer for the file last modified date column.
103 //
104 column = columnModel.getColumn(DirectoryTableModel.FILE_LAST_MODIFIED_COLUMN);
105 headerRenderer = new ColumnHeaderRenderer();
106 cellRenderer = new DefaultTableCellRenderer();
107
108 headerRenderer.setHorizontalAlignment(JLabel.LEFT);
109 column.setHeaderRenderer(headerRenderer);
110 cellRenderer.setHorizontalAlignment(JLabel.LEFT);
111 column.setCellRenderer(cellRenderer);
112
113 //
114 // Listeners
115 //
116 ListenerList.addListener((DirectoryTableEventListener) new DirectoryTableEventHandler());
117 }
118
119 /***
120 ********************************************************************************
121 *
122 * @return
123 */
124 protected File getSelectedFile() {
125 ListSelectionModel selectionModel = getSelectionModel();
126 int row = selectionModel.getAnchorSelectionIndex();
127 DirectoryTableModel tableModel = (DirectoryTableModel) getModel();
128
129 return tableModel.getFile(row);
130 }
131
132 /***
133 ********************************************************************************
134 ********************************************************************************
135 ********************************************************************************
136 */
137 private class ColumnHeaderRenderer extends DefaultTableCellRenderer {
138
139 private Font m_boldFont;
140 private Border m_border;
141 private Color m_background;
142 private Color m_foreground;
143
144 /***
145 *********************************************************************************
146 *
147 */
148 protected ColumnHeaderRenderer() {
149 super();
150
151 Font oldFont;
152 BevelBorder bevelBorder;
153 EtchedBorder etchedBorder;
154
155 oldFont = getFont();
156 m_boldFont = new Font(oldFont.getName(), Font.BOLD, oldFont.getSize());
157 bevelBorder = new BevelBorder(BevelBorder.RAISED);
158 etchedBorder = new EtchedBorder(EtchedBorder.RAISED);
159 m_border = new CompoundBorder(etchedBorder, bevelBorder);
160 m_background = UIManager.getColor("pmdTableHeaderBackground");
161 m_foreground = UIManager.getColor("pmdTableHeaderForeground");
162 }
163
164 /***
165 *********************************************************************************
166 *
167 * @param table
168 * @param value
169 * @param isSelected
170 * @param hasFocus
171 * @param row
172 * @param column
173 *
174 * @return
175 */
176 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
177 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
178
179 setFont(m_boldFont);
180 setBorder(m_border);
181 setBackground(m_background);
182 setForeground(m_foreground);
183 setHorizontalAlignment(SwingConstants.CENTER);
184
185 return this;
186 }
187 }
188
189 /***
190 ********************************************************************************
191 ********************************************************************************
192 ********************************************************************************
193 */
194 private class TableHeaderMouseListener extends MouseAdapter {
195
196 /***
197 ****************************************************************************
198 *
199 * @param event
200 */
201 public void mouseReleased(MouseEvent event) {
202 int sortColumn;
203 JTableHeader tableHeader;
204 Point mouseLocation;
205 Rectangle columnHeaderArea;
206
207 m_sortAscending = !m_sortAscending;
208 mouseLocation = event.getPoint();
209 tableHeader = getTableHeader();
210 sortColumn = tableHeader.columnAtPoint(mouseLocation);
211
212 if (sortColumn >= 0) {
213 // When the cursor is resizing a column, the mouse released event will
214 // reach here. To prevent sorting happening during resizing, the column
215 // header area is inset on the left and right by 10 pixels each.
216 columnHeaderArea = tableHeader.getHeaderRect(sortColumn);
217 columnHeaderArea.x -= 10;
218 columnHeaderArea.width -= 20;
219
220 if (columnHeaderArea.contains(mouseLocation)) {
221 sort(sortColumn, m_sortAscending);
222 }
223 }
224 }
225
226 /***
227 ****************************************************************************
228 *
229 * @param sortColumn
230 */
231 protected void sort(int sortColumn, boolean sortAscending) {
232 TableSortComparator comparator;
233 DirectoryTableModel tableModel;
234 Vector tableData;
235 int rowCount;
236 Vector[] rows;
237
238 comparator = new TableSortComparator(sortColumn, sortAscending);
239 tableModel = (DirectoryTableModel) getModel();
240 tableData = tableModel.getDataVector();
241 rowCount = tableData.size();
242 rows = new Vector[rowCount];
243 rows = (Vector[]) tableData.toArray(rows);
244
245 Arrays.sort(rows, comparator);
246
247 for (int n = 0; n < rowCount; n++) {
248 tableData.set(n, rows[n]);
249 }
250
251 tableModel.fireTableDataChanged();
252 }
253 }
254
255 /***
256 ********************************************************************************
257 ********************************************************************************
258 ********************************************************************************
259 */
260 private class TableSortComparator implements Comparator {
261
262 private int m_sortColumn;
263 private boolean m_sortAscending;
264
265 /***
266 ****************************************************************************
267 *
268 * @param sortColumn
269 * @param sortAscending
270 */
271 private TableSortComparator(int sortColumn, boolean sortAscending) {
272 m_sortColumn = sortColumn;
273 m_sortAscending = sortAscending;
274 }
275
276 /***
277 ****************************************************************************
278 *
279 * @param keyA
280 * @param keyB
281 *
282 * @int result
283 */
284 public int compare(Object rowA, Object rowB) {
285 String keyA = (String) ((Vector) rowA).get(m_sortColumn);
286 String keyB = (String) ((Vector) rowB).get(m_sortColumn);
287
288 if (m_sortAscending) {
289 return keyA.compareTo(keyB);
290 }
291
292 return keyB.compareTo(keyA);
293 }
294
295 /***
296 ****************************************************************************
297 *
298 * @param object
299 */
300 public boolean equals(Object object) {
301 return (object == this);
302 }
303 }
304
305 /***
306 ********************************************************************************
307 ********************************************************************************
308 ********************************************************************************
309 */
310 private class ListSelectionHandler implements ListSelectionListener {
311
312 /***
313 ****************************************************************************
314 *
315 * @param event
316 */
317 public void valueChanged(ListSelectionEvent event) {
318 // Swing may generate a change event more than once. All change events, except
319 // the last event, will have the "value is adjusting" flag set true. We want only
320 // the last event.
321 if (event.getValueIsAdjusting() == false) {
322 File file = getSelectedFile();
323
324 if (file != null) {
325 DirectoryTableEvent.notifyFileSelectionChanged(this, file);
326 }
327 }
328 }
329 }
330
331 /***
332 ********************************************************************************
333 ********************************************************************************
334 ********************************************************************************
335 */
336 private class DirectoryTableEventHandler implements DirectoryTableEventListener {
337
338 /***
339 ******************************************************************************
340 *
341 * @param event
342 */
343 public void requestSelectedFile(DirectoryTableEvent event) {
344 File file = getSelectedFile();
345
346 if (file != null) {
347 DirectoryTableEvent.notifySelectedFile(this, file);
348 }
349 }
350
351 /***
352 ******************************************************************************
353 *
354 * @param event
355 */
356 public void fileSelectionChanged(DirectoryTableEvent event) {
357
358 }
359
360 /***
361 ******************************************************************************
362 *
363 * @param event
364 */
365 public void fileSelected(DirectoryTableEvent event) {
366 }
367 }
368 }
This page was automatically generated by Maven