Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.swing / org.gvsig.expressionevaluator.swing.impl / src / main / java / org / gvsig / expressionevaluator / swing / impl / FilteredListModel.java @ 44397

History | View | Annotate | Download (3.35 KB)

1 43939 jjdelcerro
package org.gvsig.expressionevaluator.swing.impl;
2
3
import java.util.ArrayList;
4
import java.util.Comparator;
5
import java.util.List;
6 44259 jjdelcerro
import java.util.Objects;
7 43939 jjdelcerro
import javax.swing.AbstractListModel;
8
import javax.swing.SwingUtilities;
9
import org.apache.commons.io.FilenameUtils;
10 44259 jjdelcerro
import org.apache.commons.lang3.ObjectUtils;
11 43939 jjdelcerro
import org.apache.commons.lang3.StringUtils;
12 44259 jjdelcerro
import org.gvsig.tools.util.LabeledValue;
13
import org.gvsig.tools.util.LabeledValueImpl;
14 43939 jjdelcerro
15
/**
16
 *
17
 * @author jjdelcerro
18
 */
19
class FilteredListModel extends AbstractListModel {
20 43983 jjdelcerro
21 44259 jjdelcerro
    private List<LabeledValue> elements;
22
    private List<LabeledValue> filteredElements;
23 43939 jjdelcerro
    private String filter;
24
25
    public FilteredListModel() {
26
        this.elements = new ArrayList<>();
27
        this.filteredElements = this.elements;
28
        this.filter = null;
29
    }
30
31
    @Override
32
    public int getSize() {
33
        return this.filteredElements.size();
34
    }
35
36
    @Override
37 44259 jjdelcerro
    public LabeledValue getElementAt(int index) {
38 43939 jjdelcerro
        return this.filteredElements.get(index);
39
    }
40
41 44259 jjdelcerro
    void addElement(LabeledValue element) {
42 43939 jjdelcerro
        this.elements.add(element);
43
        if (this.elements != this.filteredElements) {
44
            this.filteredElements.add(element);
45
        }
46
    }
47
48 44259 jjdelcerro
    void addElement(Object element) {
49
        this.addElement(new LabeledValueImpl<>(Objects.toString(element, ""), element));
50
    }
51
52 43939 jjdelcerro
    public void setFilter(String filter) {
53 44397 jjdelcerro
        if (StringUtils.isBlank(filter)) {
54 43939 jjdelcerro
            this.filter = null;
55
            this.filteredElements = this.elements;
56
        } else {
57 43983 jjdelcerro
            this.filter = filter;
58 43939 jjdelcerro
            this.filteredElements = new ArrayList<>();
59 44259 jjdelcerro
            for (LabeledValue element : elements) {
60 43983 jjdelcerro
                if (FilenameUtils.wildcardMatch(element.getValue().toString().toLowerCase(), this.filter.toLowerCase())) {
61 43939 jjdelcerro
                    this.filteredElements.add(element);
62
                }
63
            }
64
        }
65 43983 jjdelcerro
        fireContentsChanged();
66
    }
67
68
    private void fireContentsChanged() {
69
        if( !SwingUtilities.isEventDispatchThread() ) {
70
            SwingUtilities.invokeLater(new Runnable() {
71
                @Override
72
                public void run() {
73
                    fireContentsChanged();
74
                }
75
            });
76
            return;
77
        }
78 43939 jjdelcerro
        this.fireContentsChanged(this, 0, this.filteredElements.size());
79 43983 jjdelcerro
     }
80
81
    public String getFilter() {
82
        return this.filter;
83 43939 jjdelcerro
    }
84 43983 jjdelcerro
85
    public void sort(final boolean ascending) {
86
        this.sortBackground(ascending);
87
    }
88 43939 jjdelcerro
89 43983 jjdelcerro
    private void sortBackground(final boolean ascending) {
90 43939 jjdelcerro
        Thread th = new Thread(new Runnable() {
91
            @Override
92
            public void run() {
93 43983 jjdelcerro
                sortForeground(ascending);
94 43939 jjdelcerro
            }
95
        }, "FilteredListModelSorter");
96
        th.start();
97
    }
98
99 43983 jjdelcerro
    private void sortForeground(final boolean ascending) {
100 44259 jjdelcerro
        final List items = new ArrayList<>(elements);
101
        items.sort(new Comparator<Comparable>() {
102 43983 jjdelcerro
            @Override
103 44259 jjdelcerro
            public int compare(Comparable o1, Comparable o2) {
104
                int r = ObjectUtils.compare(o1, o2);
105 43983 jjdelcerro
                if (ascending) {
106
                    return r;
107
                }
108
                return r * -1;
109
            }
110
        });
111
        elements = items;
112
        filteredElements = elements;
113
        if (filter != null) {
114
            setFilter(filter);
115
        } else {
116
            fireContentsChanged();
117
        }
118 43939 jjdelcerro
    }
119 43983 jjdelcerro
120 43939 jjdelcerro
}