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 @ 2007

History | View | Annotate | Download (4.8 KB)

1
package org.gvsig.tools.swing.impl;
2

    
3
import org.gvsig.tools.swing.api.FilteredTableModel;
4
import java.util.ArrayList;
5
import java.util.Comparator;
6
import java.util.List;
7
import java.util.Objects;
8
import javax.swing.SwingUtilities;
9
import javax.swing.event.TableModelEvent;
10
import javax.swing.event.TableModelListener;
11
import javax.swing.table.AbstractTableModel;
12
import javax.swing.table.TableModel;
13
import org.apache.commons.io.FilenameUtils;
14
import org.apache.commons.lang3.ObjectUtils;
15
import org.apache.commons.lang3.StringUtils;
16

    
17
/**
18
 *
19
 * @author jjdelcerro
20
 */
21
class FilteredTableModelImpl extends AbstractTableModel implements FilteredTableModel {
22

    
23
    private final TableModel baseModel ;
24
    private final int filterColumn;
25

    
26
    private String filter;
27
    private List<Integer> filteredElements;
28

    
29
    public FilteredTableModelImpl(TableModel tableModel, int filterColumn) {
30
        this.baseModel = tableModel;
31
        this.filterColumn = filterColumn;
32
        this.filteredElements = null;
33
        this.setFilter(null);
34
        this.baseModel.addTableModelListener(new TableModelListener() {
35
            @Override
36
            public void tableChanged(TableModelEvent e) {
37
                fireContentsChanged();
38
            }
39
        });
40
    }
41

    
42
    @Override
43
    public String getColumnName(int column) {
44
        return this.baseModel.getColumnName(column);
45
    }
46

    
47
    @Override
48
    public Class<?> getColumnClass(int columnIndex) {
49
        return this.baseModel.getColumnClass(columnIndex);
50
    }
51
    
52
    @Override
53
    public final void setFilter(String filter) {
54
        if (StringUtils.isBlank(filter)) {
55
            this.filter = null;
56
            this.filteredElements = new ArrayList<>(this.baseModel.getRowCount());
57
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
58
                filteredElements.add(i);
59

    
60
            }
61
        } else {
62
            if( StringUtils.containsAny(filter, "*?") ) {
63
                this.filter = filter;
64
            } else {
65
                this.filter = filter + "*";
66
            }
67
            this.filteredElements = new ArrayList<>();
68
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
69
                Object value = this.baseModel.getValueAt(i, this.filterColumn);
70
                if (FilenameUtils.wildcardMatch(Objects.toString(value, "").toLowerCase(), this.filter.toLowerCase())) {
71
                    this.filteredElements.add(i);
72
                }
73
            }
74
        }
75
        fireContentsChanged();
76
    }
77

    
78
    private void fireContentsChanged() {
79
        if( !SwingUtilities.isEventDispatchThread() ) {
80
            SwingUtilities.invokeLater(new Runnable() {
81
                @Override
82
                public void run() {
83
                    fireContentsChanged();
84
                }
85
            });
86
            return;
87
        }
88
        this.fireTableDataChanged();
89
     }
90

    
91
    @Override
92
    public String getFilter() {
93
        return this.filter;
94
    }
95

    
96
    @Override
97
    public void sort(final boolean ascending) {
98
        this.sortBackground(ascending);
99
    }
100
    
101
    private void sortBackground(final boolean ascending) {
102
        Thread th = new Thread(new Runnable() {
103
            @Override
104
            public void run() {
105
                sortForeground(ascending);
106
            }
107
        }, "FilteredTableModelSorter");
108
        th.start();
109
    }
110

    
111
    private void sortForeground(final boolean ascending) {
112
        filteredElements.sort(new Comparator<Integer>() {
113
            @Override
114
            public int compare(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
                    }
122
                    return r * -1;
123
                } catch(Exception ex) {
124
                    return 0;
125
                }
126
            }
127
        });
128
        fireContentsChanged();
129
    }
130

    
131
    @Override
132
    public int getRowCount() {
133
        return this.filteredElements.size();
134
    }
135

    
136
    @Override
137
    public int getColumnCount() {
138
        return this.baseModel.getColumnCount();
139
    }
140

    
141
    @Override
142
    public Object getValueAt(int rowIndex, int columnIndex) {
143
        int row = this.filteredElements.get(rowIndex);
144
        return this.baseModel.getValueAt(row, columnIndex);
145
    }
146

    
147
    @Override
148
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
149
        int row = this.filteredElements.get(rowIndex);
150
        this.baseModel.setValueAt(aValue, row, columnIndex);
151
    }
152

    
153
    @Override
154
    public boolean isCellEditable(int rowIndex, int columnIndex) {
155
        int row = this.filteredElements.get(rowIndex);
156
        return this.baseModel.isCellEditable(row, columnIndex);
157
    }
158
    
159
}