Revision 1997

View differences:

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/DefaultToolsSwingManager.java
13 13
import java.io.File;
14 14
import java.lang.reflect.InvocationTargetException;
15 15
import java.lang.reflect.Method;
16
import java.util.function.Predicate;
17 16
import javax.swing.AbstractAction;
18 17
import javax.swing.AbstractButton;
19 18
import javax.swing.Action;
......
32 31
import javax.swing.JTabbedPane;
33 32
import javax.swing.JTextField;
34 33
import javax.swing.JViewport;
35
import javax.swing.SwingConstants;
34
import javax.swing.table.TableModel;
36 35
import javax.swing.text.DefaultEditorKit;
37 36
import javax.swing.text.JTextComponent;
38 37
import javax.swing.tree.TreeModel;
39 38
import org.apache.commons.lang3.StringUtils;
40 39
import org.gvsig.tools.ToolsLocator;
41
import org.gvsig.tools.bookmarksandhistory.Bookmark;
42 40
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
43 41
import org.gvsig.tools.bookmarksandhistory.History;
44 42
import org.gvsig.tools.i18n.I18nManager;
......
47 45
import org.gvsig.tools.swing.api.ColorChooserController;
48 46
import org.gvsig.tools.swing.api.CompoundIcon;
49 47
import org.gvsig.tools.swing.api.DropDown;
48
import org.gvsig.tools.swing.api.FilteredTableModel;
50 49
import org.gvsig.tools.swing.api.JListWithCheckbox;
51 50
import org.gvsig.tools.swing.api.SimpleImage;
52 51
import org.gvsig.tools.swing.api.ToolsSwingLocator;
......
565 564
        return controller;
566 565
    }
567 566

  
567
    @Override
568
    public FilteredTableModel createFilteredTableModel(TableModel tableModel, int filterColumn) {
569
        FilteredTableModelImpl model = new FilteredTableModelImpl(tableModel, filterColumn);
570
        return model;
571
    }
568 572

  
569 573
}
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/FilteredTableModelImpl.java
1
package org.gvsig.tools.swing.impl;
2

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

  
15
/**
16
 *
17
 * @author jjdelcerro
18
 */
19
class FilteredTableModelImpl extends AbstractTableModel implements FilteredTableModel {
20

  
21
    private final TableModel baseModel ;
22
    private final int filterColumn;
23

  
24
    private String filter;
25
    private List<Integer> filteredElements;
26

  
27
    public FilteredTableModelImpl(TableModel tableModel, int filterColumn) {
28
        this.baseModel = tableModel;
29
        this.filterColumn = filterColumn;
30
        this.filteredElements = null;
31
        this.setFilter(null);
32
    }
33

  
34
    @Override
35
    public String getColumnName(int column) {
36
        return this.baseModel.getColumnName(column);
37
    }
38

  
39
    @Override
40
    public final void setFilter(String filter) {
41
        if (StringUtils.isBlank(filter)) {
42
            this.filter = null;
43
            this.filteredElements = new ArrayList<>(this.baseModel.getRowCount());
44
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
45
                filteredElements.add(i);
46

  
47
            }
48
        } else {
49
            this.filter = filter;
50
            this.filteredElements = new ArrayList<>();
51
            for (int i = 0; i < this.baseModel.getRowCount(); i++) {
52
                Object value = this.baseModel.getValueAt(i, this.filterColumn);
53
                if (FilenameUtils.wildcardMatch(Objects.toString(value, "").toLowerCase(), this.filter.toLowerCase())) {
54
                    this.filteredElements.add(i);
55
                }
56
            }
57
        }
58
        fireContentsChanged();
59
    }
60

  
61
    private void fireContentsChanged() {
62
        if( !SwingUtilities.isEventDispatchThread() ) {
63
            SwingUtilities.invokeLater(new Runnable() {
64
                @Override
65
                public void run() {
66
                    fireContentsChanged();
67
                }
68
            });
69
            return;
70
        }
71
        this.fireTableDataChanged();
72
     }
73

  
74
    @Override
75
    public String getFilter() {
76
        return this.filter;
77
    }
78

  
79
    @Override
80
    public void sort(final boolean ascending) {
81
        this.sortBackground(ascending);
82
    }
83
    
84
    private void sortBackground(final boolean ascending) {
85
        Thread th = new Thread(new Runnable() {
86
            @Override
87
            public void run() {
88
                sortForeground(ascending);
89
            }
90
        }, "FilteredTableModelSorter");
91
        th.start();
92
    }
93

  
94
    private void sortForeground(final boolean ascending) {
95
        filteredElements.sort(new Comparator<Integer>() {
96
            @Override
97
            public int compare(Integer row1, Integer row2) {
98
                try {
99
                    Comparable o1 = (Comparable) baseModel.getValueAt(row1, filterColumn);
100
                    Comparable o2 = (Comparable) baseModel.getValueAt(row2, filterColumn);
101
                    int r = ObjectUtils.compare(o1, o2);
102
                    if (ascending) {
103
                        return r;
104
                    }
105
                    return r * -1;
106
                } catch(Exception ex) {
107
                    return 0;
108
                }
109
            }
110
        });
111
        fireContentsChanged();
112
    }
113

  
114
    @Override
115
    public int getRowCount() {
116
        return this.filteredElements.size();
117
    }
118

  
119
    @Override
120
    public int getColumnCount() {
121
        return this.baseModel.getColumnCount();
122
    }
123

  
124
    @Override
125
    public Object getValueAt(int rowIndex, int columnIndex) {
126
        int row = this.filteredElements.get(rowIndex);
127
        return this.baseModel.getValueAt(row, columnIndex);
128
    }
129
}
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/FilteredListModel.java
1
package org.gvsig.tools.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
            this.filter = filter;
58
            this.filteredElements = new ArrayList<>();
59
            for (LabeledValue element : elements) {
60
                if (FilenameUtils.wildcardMatch(element.getValue().toString().toLowerCase(), this.filter.toLowerCase())) {
61
                    this.filteredElements.add(element);
62
                }
63
            }
64
        }
65
        fireContentsChanged();
66
    }
67

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

  
81
    public String getFilter() {
82
        return this.filter;
83
    }
84

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

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

  
120
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.api/src/main/java/org/gvsig/tools/swing/api/FilteredTableModel.java
1
package org.gvsig.tools.swing.api;
2

  
3
import javax.swing.table.TableModel;
4

  
5
/**
6
 *
7
 * @author jjdelcerro
8
 */
9
public interface FilteredTableModel extends TableModel {
10

  
11
    String getFilter();
12

  
13
    void setFilter(String filter);
14

  
15
    void sort(final boolean ascending);
16
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.api/src/main/java/org/gvsig/tools/swing/api/ToolsSwingManager.java
18 18
import javax.swing.JSlider;
19 19
import javax.swing.JTabbedPane;
20 20
import javax.swing.JTextField;
21
import javax.swing.table.TableModel;
21 22
import javax.swing.text.JTextComponent;
22 23
import javax.swing.tree.TreeModel;
23 24
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
......
240 241
    public BookmarksController createBookmarksController(Bookmarks bookmarks, JButton button);
241 242
    
242 243
    public HistoryController createHistoryController(History history, JButton button);
243
    
244

  
245
    public FilteredTableModel createFilteredTableModel(TableModel model, int filterColumn);
244 246
}

Also available in: Unified diff