1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 package jaxx.runtime.swing.table.filter;
34
35 import java.io.Serializable;
36 import java.util.Collection;
37 import java.util.Collections;
38 import java.util.Set;
39
40 import javax.swing.DefaultRowSorter;
41 import javax.swing.JTable;
42 import javax.swing.RowFilter;
43 import javax.swing.RowSorter;
44 import javax.swing.table.TableModel;
45 import javax.swing.table.TableRowSorter;
46
47 public class JTableFilter extends AbstractTableFilter<JTable> {
48
49 private static final long serialVersionUID = 1L;
50
51 private final TableRowFilter filter = new TableRowFilter();
52
53 public JTableFilter( JTable table) {
54 super(table);
55 }
56
57 @Override
58 protected boolean execute(int col, Collection<Object> items) {
59
60 RowSorter<?> rs = getTable().getRowSorter();
61
62 if (!( rs instanceof DefaultRowSorter )) return false;
63
64 DefaultRowSorter<?, ?> drs = (DefaultRowSorter<?, ?>) rs;
65
66 @SuppressWarnings("unchecked")
67 RowFilter<Object,Object> prevFilter = (RowFilter<Object, Object>) drs.getRowFilter();
68 if ( !(prevFilter instanceof TableRowFilter)) {
69 filter.setParentFilter(prevFilter);
70 }
71
72 drs.setRowFilter(filter);
73 return true;
74
75 }
76
77 class TableRowFilter extends RowFilter<Object,Object> implements Serializable {
78
79 private static final long serialVersionUID = 1L;
80
81 private RowFilter<Object, Object> parentFilter;
82
83 public RowFilter<Object, Object> getParentFilter() {
84 return parentFilter;
85 }
86
87 public void setParentFilter( RowFilter<Object, Object> parentFilter ) {
88 this.parentFilter = (parentFilter == null || parentFilter == this )? null: parentFilter;
89 }
90
91 @Override
92 public boolean include( final RowFilter.Entry<? extends Object, ? extends Object> entry) {
93
94
95 if ( parentFilter != null && !parentFilter.include(entry)) return false;
96
97 return includeRow( new TableFilter.Row() {
98
99 @Override
100 public Object getValue(int column) { return entry.getValue(column); }
101
102 @Override
103 public int getValueCount() { return entry.getValueCount(); }
104
105 });
106
107 }
108
109 }
110
111 public void modelChanged( TableModel model ) {
112 getTable().setRowSorter( new TableRowSorter<TableModel>( model ));
113 }
114
115 @Override
116 public Set<Object> distinctValuesForColumn(int i) {
117
118 return null;
119 }
120
121 @Override
122 public String toString(Object o) {
123
124 return null;
125 }
126
127 public void clear() {
128 super.clear();
129 Collection<Object> items = Collections.emptyList();
130 for( int column=0; column<getTable().getModel().getColumnCount(); column++) {
131 execute(column, items);
132 }
133 }
134 }