View Javadoc
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