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
/*
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
import java.util.Objects;
12
import javax.swing.AbstractListModel;
13
import javax.swing.SwingUtilities;
14
import org.apache.commons.io.FilenameUtils;
15
import org.apache.commons.lang3.ObjectUtils;
16
import org.apache.commons.lang3.StringUtils;
17
import org.gvsig.tools.util.LabeledValue;
18
import org.gvsig.tools.util.LabeledValueImpl;
19

    
20
/**
21
 *
22
 * @author jjdelcerro
23
 */
24
class FilteredListModel extends AbstractListModel {
25

    
26
    private List<LabeledValue> elements;
27
    private List<LabeledValue> filteredElements;
28
    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
    public LabeledValue getElementAt(int index) {
43
        return this.filteredElements.get(index);
44
    }
45

    
46
    void addElement(LabeledValue element) {
47
        this.elements.add(element);
48
        if (this.elements != this.filteredElements) {
49
            this.filteredElements.add(element);
50
        }
51
    }
52

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

    
57
    public void setFilter(String filter) {
58
        if (StringUtils.isEmpty(filter)) {
59
            this.filter = null;
60
            this.filteredElements = this.elements;
61
        } else {
62
            this.filter = filter;
63
            this.filteredElements = new ArrayList<>();
64
            for (LabeledValue element : elements) {
65
                if (FilenameUtils.wildcardMatch(element.getValue().toString().toLowerCase(), this.filter.toLowerCase())) {
66
                    this.filteredElements.add(element);
67
                }
68
            }
69
        }
70
        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
        this.fireContentsChanged(this, 0, this.filteredElements.size());
84
     }
85

    
86
    public String getFilter() {
87
        return this.filter;
88
    }
89

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

    
105
    private void sortForeground(final boolean ascending) {
106
        final List items = new ArrayList<>(elements);
107
        items.sort(new Comparator<Comparable>() {
108
            @Override
109
            public int compare(Comparable o1, Comparable o2) {
110
                int r = ObjectUtils.compare(o1, o2);
111
                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
    }
125

    
126
}