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

History | View | Annotate | Download (3.58 KB)

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