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

History | View | Annotate | Download (3.82 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.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

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

    
21
    private final TableModel baseModel ;
22
    private final int filterColumn;
23

    
24
    private String filter;
25
    private List<Integer> filteredElements;
26

    
27
    public FilteredTableModelImpl(TableModel tableModel, int filterColumn) {
28
        this.baseModel = tableModel;
29
        this.filterColumn = filterColumn;
30
        this.filteredElements = null;
31
        this.setFilter(null);
32
    }
33

    
34
    @Override
35
    public String getColumnName(int column) {
36
        return this.baseModel.getColumnName(column);
37
    }
38

    
39
    @Override
40
    public final void setFilter(String filter) {
41
        if (StringUtils.isBlank(filter)) {
42
            this.filter = null;
43
            this.filteredElements = new ArrayList<>(this.baseModel.getRowCount());
44
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
45
                filteredElements.add(i);
46

    
47
            }
48
        } else {
49
            this.filter = filter;
50
            this.filteredElements = new ArrayList<>();
51
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
52
                Object value = this.baseModel.getValueAt(i, this.filterColumn);
53
                if (FilenameUtils.wildcardMatch(Objects.toString(value, "").toLowerCase(), this.filter.toLowerCase())) {
54
                    this.filteredElements.add(i);
55
                }
56
            }
57
        }
58
        fireContentsChanged();
59
    }
60

    
61
    private void fireContentsChanged() {
62
        if( !SwingUtilities.isEventDispatchThread() ) {
63
            SwingUtilities.invokeLater(new Runnable() {
64
                @Override
65
                public void run() {
66
                    fireContentsChanged();
67
                }
68
            });
69
            return;
70
        }
71
        this.fireTableDataChanged();
72
     }
73

    
74
    @Override
75
    public String getFilter() {
76
        return this.filter;
77
    }
78

    
79
    @Override
80
    public void sort(final boolean ascending) {
81
        this.sortBackground(ascending);
82
    }
83
    
84
    private void sortBackground(final boolean ascending) {
85
        Thread th = new Thread(new Runnable() {
86
            @Override
87
            public void run() {
88
                sortForeground(ascending);
89
            }
90
        }, "FilteredTableModelSorter");
91
        th.start();
92
    }
93

    
94
    private void sortForeground(final boolean ascending) {
95
        filteredElements.sort(new Comparator<Integer>() {
96
            @Override
97
            public int compare(Integer row1, Integer row2) {
98
                try {
99
                    Comparable o1 = (Comparable) baseModel.getValueAt(row1, filterColumn);
100
                    Comparable o2 = (Comparable) baseModel.getValueAt(row2, filterColumn);
101
                    int r = ObjectUtils.compare(o1, o2);
102
                    if (ascending) {
103
                        return r;
104
                    }
105
                    return r * -1;
106
                } catch(Exception ex) {
107
                    return 0;
108
                }
109
            }
110
        });
111
        fireContentsChanged();
112
    }
113

    
114
    @Override
115
    public int getRowCount() {
116
        return this.filteredElements.size();
117
    }
118

    
119
    @Override
120
    public int getColumnCount() {
121
        return this.baseModel.getColumnCount();
122
    }
123

    
124
    @Override
125
    public Object getValueAt(int rowIndex, int columnIndex) {
126
        int row = this.filteredElements.get(rowIndex);
127
        return this.baseModel.getValueAt(row, columnIndex);
128
    }
129
}