View Javadoc

1   // Copyright 2003-2004, FreeHEP.
2   package hep.wired.util;
3   
4   import java.util.*;
5   import java.util.*;
6   import javax.swing.*;
7   import javax.swing.table.*;
8   
9   import org.freehep.swing.table.SortableTableModel;
10  
11  /***
12   * Keeps a list sorted in place.
13   *
14   * @author Mark Donszelmann
15   * @version $Id: SortableListTableModel.java 302 2004-07-01 21:06:06Z duns $
16   */
17  public abstract class SortableListTableModel extends AbstractTableModel implements SortableTableModel {
18  
19      private String[] names;
20      private Class[] types;
21      private List keys;
22      
23      private transient int sortOnColumn = UNSORTED;
24      private transient boolean sortAscending = true;
25      
26      public SortableListTableModel(String[] names, Class[] types, List keys) {
27          this.names = names;
28          this.types = types;
29          this.keys = keys;
30      }
31      
32      protected List getKeys() {
33          return keys;
34      }
35                           
36      public String getColumnName(int col) {
37          return names[col];
38      }
39              
40      public int getColumnCount() {
41          return names.length;
42      }
43  
44      public Class getColumnClass(int c) {
45          return (c < types.length) ? types[c] : String.class;
46      }
47      
48  
49      public int getRowCount() {
50          return keys.size();
51      }
52              
53      public void sort(int column, boolean ascending) {
54          if ((column != sortOnColumn) || (ascending !=  sortAscending)) {
55              sortOnColumn = column;
56              sortAscending = ascending;
57              sort();
58          }
59          super.fireTableDataChanged();
60      }
61      
62      public void fireTableDataChanged() {
63          sort();
64          super.fireTableDataChanged();
65      }
66      
67      public void fireTableRowsInserted(int firstRow,
68                                        int lastRow) {
69          sort();        
70          super.fireTableRowsInserted(firstRow, lastRow);
71      }   
72  
73      public void fireTableRowsUpdated(int firstRow,
74                                       int lastRow) {
75          sort();        
76          super.fireTableRowsUpdated(firstRow, lastRow);
77      }   
78       
79      public void fireTableRowsDeleted(int firstRow,
80                                       int lastRow) {
81          sort();        
82          super.fireTableRowsDeleted(firstRow, lastRow);
83      }
84  
85      public void fireTableCellUpdated(int row,
86                                       int column) {
87          if (column == sortOnColumn) sort();
88          super.fireTableCellUpdated(row, column);
89      }
90  
91      public void fireTableStructureChanged() {
92          sortOnColumn = UNSORTED;
93          sortAscending = true;
94          sort();
95          super.fireTableStructureChanged();
96      }
97              
98      protected abstract int compareKeys(Object key1, Object key2, int column, boolean ascending);
99  
100     private void sort() {
101         Collections.sort(keys, new Comparator() {
102             public int compare(Object o1, Object o2) {
103                 return compareKeys(o1, o2, sortOnColumn, sortAscending);
104             }
105         });
106     }
107 }