1
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 }