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

History | View | Annotate | Download (3.45 KB)

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

    
3
import java.util.ArrayList;
4
import java.util.Comparator;
5
import java.util.List;
6
import java.util.Objects;
7
import javax.swing.AbstractListModel;
8
import javax.swing.SwingUtilities;
9
import org.apache.commons.io.FilenameUtils;
10
import org.apache.commons.lang3.ObjectUtils;
11
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.tools.util.LabeledValue;
13
import org.gvsig.tools.util.LabeledValueImpl;
14

    
15
/**
16
 *
17
 * @author jjdelcerro
18
 */
19
class FilteredListModel extends AbstractListModel {
20

    
21
    private List<LabeledValue> elements;
22
    private List<LabeledValue> filteredElements;
23
    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
    public LabeledValue getElementAt(int index) {
38
        return this.filteredElements.get(index);
39
    }
40

    
41
    void addElement(LabeledValue element) {
42
        this.elements.add(element);
43
        if (this.elements != this.filteredElements) {
44
            this.filteredElements.add(element);
45
        }
46
    }
47

    
48
    void addElement(Object element) {
49
        this.addElement(new LabeledValueImpl<>(Objects.toString(element, ""), element));
50
    }
51

    
52
    public void setFilter(String filter) {
53
        if (StringUtils.isBlank(filter)) {
54
            this.filter = null;
55
            this.filteredElements = this.elements;
56
        } else {
57
            if (!filter.contains("*")) {
58
                filter = filter + "*";
59
            }
60
            this.filter = filter;
61
            this.filteredElements = new ArrayList<>();
62
            for (LabeledValue element : elements) {
63
                if (FilenameUtils.wildcardMatch(element.getValue().toString().toLowerCase(), this.filter.toLowerCase())) {
64
                    this.filteredElements.add(element);
65
                }
66
            }
67
        }
68
        fireContentsChanged();
69
    }
70

    
71
    private void fireContentsChanged() {
72
        if( !SwingUtilities.isEventDispatchThread() ) {
73
            SwingUtilities.invokeLater(new Runnable() {
74
                @Override
75
                public void run() {
76
                    fireContentsChanged();
77
                }
78
            });
79
            return;
80
        }
81
        this.fireContentsChanged(this, 0, this.filteredElements.size());
82
     }
83

    
84
    public String getFilter() {
85
        return this.filter;
86
    }
87

    
88
    public void sort(final boolean ascending) {
89
        this.sortBackground(ascending);
90
    }
91
    
92
    private void sortBackground(final boolean ascending) {
93
        Thread th = new Thread(new Runnable() {
94
            @Override
95
            public void run() {
96
                sortForeground(ascending);
97
            }
98
        }, "FilteredListModelSorter");
99
        th.start();
100
    }
101

    
102
    private void sortForeground(final boolean ascending) {
103
        final List items = new ArrayList<>(elements);
104
        items.sort(new Comparator<Comparable>() {
105
            @Override
106
            public int compare(Comparable o1, Comparable o2) {
107
                int r = ObjectUtils.compare(o1, o2);
108
                if (ascending) {
109
                    return r;
110
                }
111
                return r * -1;
112
            }
113
        });
114
        elements = items;
115
        filteredElements = elements;
116
        if (filter != null) {
117
            setFilter(filter);
118
        } else {
119
            fireContentsChanged();
120
        }
121
    }
122

    
123
}