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 / FilteredListModelImpl.java @ 2073

History | View | Annotate | Download (3.68 KB)

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

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

    
16
/**
17
 *
18
 * @author jjdelcerro
19
 */
20
class FilteredListModelImpl extends AbstractListModel implements FilteredListModel {
21

    
22
    private List<LabeledValue> elements;
23
    private List<LabeledValue> filteredElements;
24
    private String filter;
25

    
26
    public FilteredListModelImpl() {
27
        this.elements = new ArrayList<>();
28
        this.filteredElements = this.elements;
29
        this.filter = null;
30
    }
31

    
32
    @Override
33
    public int getSize() {
34
        return this.filteredElements.size();
35
    }
36

    
37
    @Override
38
    public LabeledValue getElementAt(int index) {
39
        return this.filteredElements.get(index);
40
    }
41

    
42
    public void addElement(LabeledValue element) {
43
        if( element==null ) {
44
            return;
45
        }
46
        this.elements.add(element);
47
        if (this.elements != this.filteredElements) {
48
            this.filteredElements.add(element);
49
        }
50
    }
51

    
52
    public void addElement(Object element) {
53
        this.addElement(new LabeledValueImpl<>(Objects.toString(element, ""), element));
54
    }
55

    
56
    @Override
57
    public void setFilter(String filter) {
58
        if (StringUtils.isBlank(filter)) {
59
            this.filter = null;
60
            this.filteredElements = this.elements;
61
        } else {
62
            if( StringUtils.containsAny(filter, "*?") ) {
63
                this.filter = filter;
64
            } else {
65
                this.filter = filter + "*";
66
            }
67
            this.filteredElements = new ArrayList<>();
68
            for (LabeledValue element : elements) {
69
                if (FilenameUtils.wildcardMatch(element.getLabel().toLowerCase(), this.filter.toLowerCase())) {
70
                    this.filteredElements.add(element);
71
                }
72
            }
73
        }
74
        fireContentsChanged();
75
    }
76

    
77
    private void fireContentsChanged() {
78
        if( !SwingUtilities.isEventDispatchThread() ) {
79
            SwingUtilities.invokeLater(new Runnable() {
80
                @Override
81
                public void run() {
82
                    fireContentsChanged();
83
                }
84
            });
85
            return;
86
        }
87
        this.fireContentsChanged(this, 0, this.filteredElements.size());
88
     }
89

    
90
    public String getFilter() {
91
        return this.filter;
92
    }
93

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

    
109
    private void sortForeground(final boolean ascending) {
110
        final List items = new ArrayList<>(elements);
111
        items.sort(new Comparator<LabeledValue>() {
112
            @Override
113
            public int compare(LabeledValue o1, LabeledValue o2) {
114
                int r = ObjectUtils.compare(o1.getLabel(), o2.getLabel());
115
                if (ascending) {
116
                    return r;
117
                }
118
                return r * -1;
119
            }
120
        });
121
        elements = items;
122
        filteredElements = elements;
123
        if (filter != null) {
124
            setFilter(filter);
125
        } else {
126
            fireContentsChanged();
127
        }
128
    }
129

    
130
}