Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / FilteredTableModelImpl.java @ 2339

History | View | Annotate | Download (4.97 KB)

1 1997 jjdelcerro
package org.gvsig.tools.swing.impl;
2
3
import org.gvsig.tools.swing.api.FilteredTableModel;
4
import java.util.ArrayList;
5
import java.util.List;
6
import java.util.Objects;
7
import javax.swing.SwingUtilities;
8 2002 jjdelcerro
import javax.swing.event.TableModelEvent;
9 1997 jjdelcerro
import javax.swing.table.AbstractTableModel;
10
import javax.swing.table.TableModel;
11
import org.apache.commons.io.FilenameUtils;
12
import org.apache.commons.lang3.ObjectUtils;
13
import org.apache.commons.lang3.StringUtils;
14 2285 jjdelcerro
import org.gvsig.tools.swing.api.FilteredModel;
15 1997 jjdelcerro
16
/**
17
 *
18
 * @author jjdelcerro
19
 */
20
class FilteredTableModelImpl extends AbstractTableModel implements FilteredTableModel {
21
22
    private final TableModel baseModel ;
23
    private final int filterColumn;
24
25
    private String filter;
26
    private List<Integer> filteredElements;
27 2285 jjdelcerro
    private FilteredModel.FilterFunction filterfn;
28 2287 omartinez
    private boolean caseSensitive;
29 1997 jjdelcerro
30 2285 jjdelcerro
    public FilteredTableModelImpl(TableModel tableModel, int theFilterColumn) {
31 1997 jjdelcerro
        this.baseModel = tableModel;
32 2285 jjdelcerro
        this.filterColumn = theFilterColumn;
33 1997 jjdelcerro
        this.filteredElements = null;
34
        this.setFilter(null);
35 2285 jjdelcerro
        this.baseModel.addTableModelListener((TableModelEvent e) -> {
36
            fireContentsChanged();
37 2002 jjdelcerro
        });
38 2285 jjdelcerro
        this.filterfn = (Object model, Object row, String filter1) -> {
39
            int  i = (Integer) row;
40
            Object value = baseModel.getValueAt(i, filterColumn);
41
            return FilenameUtils.wildcardMatch(
42
                    Objects.toString(value, "").toLowerCase(),
43
                    filter1.toLowerCase()
44
            );
45
        };
46 1997 jjdelcerro
    }
47
48
    @Override
49 2285 jjdelcerro
    public void setFilterFunction(FilterFunction filter) {
50
        this.filterfn = filter;
51
    }
52
53
    @Override
54 1997 jjdelcerro
    public String getColumnName(int column) {
55
        return this.baseModel.getColumnName(column);
56
    }
57
58
    @Override
59 2002 jjdelcerro
    public Class<?> getColumnClass(int columnIndex) {
60
        return this.baseModel.getColumnClass(columnIndex);
61
    }
62
63
    @Override
64 1997 jjdelcerro
    public final void setFilter(String filter) {
65
        if (StringUtils.isBlank(filter)) {
66
            this.filter = null;
67
            this.filteredElements = new ArrayList<>(this.baseModel.getRowCount());
68
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
69
                filteredElements.add(i);
70
71
            }
72
        } else {
73 2007 jjdelcerro
            if( StringUtils.containsAny(filter, "*?") ) {
74
                this.filter = filter;
75
            } else {
76
                this.filter = filter + "*";
77
            }
78 1997 jjdelcerro
            this.filteredElements = new ArrayList<>();
79
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
80 2285 jjdelcerro
                if( this.filterfn.test(this.baseModel, i, this.filter) ) {
81 1997 jjdelcerro
                    this.filteredElements.add(i);
82
                }
83
            }
84
        }
85
        fireContentsChanged();
86
    }
87
88
    private void fireContentsChanged() {
89
        if( !SwingUtilities.isEventDispatchThread() ) {
90 2285 jjdelcerro
            SwingUtilities.invokeLater(this::fireContentsChanged);
91 1997 jjdelcerro
            return;
92
        }
93
        this.fireTableDataChanged();
94
     }
95
96
    @Override
97
    public String getFilter() {
98
        return this.filter;
99
    }
100
101
    @Override
102
    public void sort(final boolean ascending) {
103
        this.sortBackground(ascending);
104
    }
105
106
    private void sortBackground(final boolean ascending) {
107 2285 jjdelcerro
        Thread th = new Thread(() -> {
108
            sortForeground(ascending);
109 1997 jjdelcerro
        }, "FilteredTableModelSorter");
110
        th.start();
111
    }
112
113
    private void sortForeground(final boolean ascending) {
114 2285 jjdelcerro
        filteredElements.sort((Integer row1, Integer row2) -> {
115
            try {
116
                Comparable o1 = (Comparable) baseModel.getValueAt(row1, filterColumn);
117
                Comparable o2 = (Comparable) baseModel.getValueAt(row2, filterColumn);
118
                int r = ObjectUtils.compare(o1, o2);
119
                if (ascending) {
120
                    return r;
121 1997 jjdelcerro
                }
122 2285 jjdelcerro
                return r * -1;
123
            } catch(Exception ex) {
124
                return 0;
125 1997 jjdelcerro
            }
126
        });
127
        fireContentsChanged();
128
    }
129
130
    @Override
131
    public int getRowCount() {
132
        return this.filteredElements.size();
133
    }
134
135
    @Override
136
    public int getColumnCount() {
137
        return this.baseModel.getColumnCount();
138
    }
139
140
    @Override
141
    public Object getValueAt(int rowIndex, int columnIndex) {
142
        int row = this.filteredElements.get(rowIndex);
143
        return this.baseModel.getValueAt(row, columnIndex);
144
    }
145 2002 jjdelcerro
146
    @Override
147
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
148
        int row = this.filteredElements.get(rowIndex);
149
        this.baseModel.setValueAt(aValue, row, columnIndex);
150
    }
151
152
    @Override
153
    public boolean isCellEditable(int rowIndex, int columnIndex) {
154
        int row = this.filteredElements.get(rowIndex);
155
        return this.baseModel.isCellEditable(row, columnIndex);
156
    }
157 2287 omartinez
158
    @Override
159
    public void setCaseSensitive(boolean sensitive) {
160
        this.caseSensitive = sensitive;
161
    }
162
163
    @Override
164
    public boolean isCaseSensitive() {
165
        return this.caseSensitive;
166
    }
167 2002 jjdelcerro
168 1997 jjdelcerro
}