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

History | View | Annotate | Download (4.24 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.task.AbstractCancellableTask;
14
import org.gvsig.tools.util.LabeledValue;
15
import org.gvsig.tools.util.LabeledValueImpl;
16

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

    
23
    private List<LabeledValue> elements;
24
    private List<LabeledValue> filteredElements;
25
    private String filter;
26
    private boolean sorting;
27
    private AbstractCancellableTask th;
28

    
29
    public FilteredListModelImpl() {
30
        this.elements = new ArrayList<>();
31
        this.filteredElements = this.elements;
32
        this.filter = null;
33
        this.sorting = false;
34
        this.th = null;
35
    }
36

    
37
    @Override
38
    public int getSize() {
39
        return this.filteredElements.size();
40
    }
41

    
42
    @Override
43
    public void clear() {
44
        this.elements = new ArrayList<>();
45
        this.filteredElements = this.elements;
46
        this.filter = null;
47
        fireContentsChanged();
48
    }
49
    
50
    @Override
51
    public LabeledValue getElementAt(int index) {
52
        return this.filteredElements.get(index);
53
    }
54

    
55
    @Override
56
    public void addElement(LabeledValue element) {
57
        if( element==null ) {
58
            return;
59
        }
60
        this.elements.add(element);
61
        if (this.elements != this.filteredElements) {
62
            this.filteredElements.add(element);
63
        }
64
        fireContentsChanged();
65
    }
66

    
67
    @Override
68
    public void addElement(Object element) {
69
        this.addElement(new LabeledValueImpl<>(Objects.toString(element, ""), element));
70
    }
71

    
72
    
73
    @Override
74
    public void setFilter(String filter) {
75
        if (StringUtils.isBlank(filter)) {
76
            this.filter = null;
77
            this.filteredElements = this.elements;
78
        } else {
79
            if( StringUtils.containsAny(filter, "*?") ) {
80
                this.filter = filter;
81
            } else {
82
                this.filter = "*" + filter + "*";
83
            }
84
            this.filteredElements = new ArrayList<>();
85
            for (LabeledValue element : elements) {
86
                if (FilenameUtils.wildcardMatch(element.getLabel().toLowerCase(), this.filter.toLowerCase())) {
87
                    this.filteredElements.add(element);
88
                }
89
            }
90
        }
91
        fireContentsChanged();
92
    }
93

    
94
    private void fireContentsChanged() {
95
        if( !SwingUtilities.isEventDispatchThread() ) {
96
            SwingUtilities.invokeLater(() -> {
97
              fireContentsChanged();
98
            });
99
            return;
100
        }
101
        this.fireContentsChanged(this, 0, this.filteredElements.size());
102
     }
103

    
104
    @Override
105
    public String getFilter() {
106
        return this.filter;
107
    }
108

    
109
    @Override
110
    public void sort(final boolean ascending) {
111
        this.sortBackground(ascending);
112
    }
113
    
114
    private void sortBackground(final boolean ascending) {
115
        if (this.th != null) {
116
            this.th.cancelRequest();
117
        }
118
        this.th = new AbstractCancellableTask("FilteredListModelSorter") {
119
            @Override
120
            public void run() {
121
                final List items = new ArrayList<>(elements);
122
                items.sort(new Comparator<LabeledValue>() {
123
                    @Override
124
                    public int compare(LabeledValue o1, LabeledValue o2) {
125
                        int r = ObjectUtils.compare(o1.getLabel(), o2.getLabel());
126
                        if (ascending) {
127
                            return r;
128
                        }
129
                        return r * -1;
130
                    }
131
                });
132
                if (this.isCancellationRequested()) {
133
                    return;
134
                }
135
                elements = items;
136
                filteredElements = elements;
137
                if (filter != null) {
138
                    setFilter(filter);
139
                } else {
140
                    fireContentsChanged();
141
                }
142
            }
143
        };
144
        th.start();
145
    }
146

    
147
}