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

History | View | Annotate | Download (4.66 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
            this.filter = filter;
63
            this.filteredElements = new ArrayList<>();
64
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
65
                Object value = this.baseModel.getValueAt(i, this.filterColumn);
66
                if (FilenameUtils.wildcardMatch(Objects.toString(value, "").toLowerCase(), this.filter.toLowerCase())) {
67
                    this.filteredElements.add(i);
68
                }
69
            }
70
        }
71
        fireContentsChanged();
72
    }
73

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

    
87
    @Override
88
    public String getFilter() {
89
        return this.filter;
90
    }
91

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

    
107
    private void sortForeground(final boolean ascending) {
108
        filteredElements.sort(new Comparator<Integer>() {
109
            @Override
110
            public int compare(Integer row1, Integer row2) {
111
                try {
112
                    Comparable o1 = (Comparable) baseModel.getValueAt(row1, filterColumn);
113
                    Comparable o2 = (Comparable) baseModel.getValueAt(row2, filterColumn);
114
                    int r = ObjectUtils.compare(o1, o2);
115
                    if (ascending) {
116
                        return r;
117
                    }
118
                    return r * -1;
119
                } catch(Exception ex) {
120
                    return 0;
121
                }
122
            }
123
        });
124
        fireContentsChanged();
125
    }
126

    
127
    @Override
128
    public int getRowCount() {
129
        return this.filteredElements.size();
130
    }
131

    
132
    @Override
133
    public int getColumnCount() {
134
        return this.baseModel.getColumnCount();
135
    }
136

    
137
    @Override
138
    public Object getValueAt(int rowIndex, int columnIndex) {
139
        int row = this.filteredElements.get(rowIndex);
140
        return this.baseModel.getValueAt(row, columnIndex);
141
    }
142

    
143
    @Override
144
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
145
        int row = this.filteredElements.get(rowIndex);
146
        this.baseModel.setValueAt(aValue, row, columnIndex);
147
    }
148

    
149
    @Override
150
    public boolean isCellEditable(int rowIndex, int columnIndex) {
151
        int row = this.filteredElements.get(rowIndex);
152
        return this.baseModel.isCellEditable(row, columnIndex);
153
    }
154
    
155
}