Revision 2260

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/DefaultFilteredListController.java
8 8
import java.awt.event.ActionEvent;
9 9
import java.awt.event.KeyAdapter;
10 10
import java.awt.event.KeyEvent;
11
import javax.swing.ImageIcon;
11 12
import javax.swing.JButton;
12 13
import javax.swing.JList;
13
import javax.swing.event.ChangeEvent;
14
import javax.swing.ListModel;
14 15
import javax.swing.event.ChangeListener;
15 16
import javax.swing.text.JTextComponent;
16 17
import org.gvsig.tools.swing.api.ChangeListenerHelper;
......
18 19
import org.gvsig.tools.swing.api.FilteredListModel;
19 20
import org.gvsig.tools.swing.api.ToolsSwingLocator;
20 21
import org.gvsig.tools.swing.api.ToolsSwingManager;
22
import org.gvsig.tools.swing.icontheme.IconTheme;
23
import org.gvsig.tools.swing.icontheme.IconThemeManager;
21 24

  
22 25
/**
23 26
 *
......
25 28
 */
26 29
public class DefaultFilteredListController implements FilteredListController {
27 30

  
28
  private final JList list;
29
  private final JTextComponent text;
30
  private final JButton button;
31
  private ChangeListenerHelper changeListenerHelper;
31
    private final JList list;
32
    private final JTextComponent text;
33
    private final JButton button;
34
    private final ChangeListenerHelper changeListenerHelper;
35
    private FilteredListModel model;
32 36

  
33
  public DefaultFilteredListController(JList list, JTextComponent text, JButton button) {
34
    this.list = list;
35
    this.text = text;
36
    this.button = button;
37
    this.changeListenerHelper = new DefaultChangeListenerHelper();
38
    this.initComponents();
39
  }
37
    public DefaultFilteredListController(JList list, JTextComponent text, JButton button) {
38
        this.list = list;
39
        this.text = text;
40
        this.button = button;
41
        this.changeListenerHelper = new DefaultChangeListenerHelper();
42
        this.model = null;
43
        this.initComponents();
44
    }
40 45

  
41
  private void initComponents() {
42
    ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
43
    FilteredListModel model = toolsSwingManager.createFilteredListModel();
44
    this.list.setModel(model);
45
    toolsSwingManager.addClearButton(this.text, (ActionEvent e) -> {
46
      text.setText("");
47
      this.getModel().setFilter(null);
48
      changeListenerHelper.fireEvent();
49
    });
50
    toolsSwingManager.setDefaultPopupMenu(this.text);
51
    this.text.addKeyListener(new KeyAdapter() {
52
      @Override
53
      public void keyTyped(KeyEvent e) {
54
        if (e.getKeyChar() == '\n') {
55
          getModel().setFilter(text.getText());
56
          changeListenerHelper.fireEvent();
46
    private void initComponents() {
47
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
48
        toolsSwingManager.addClearButton(this.text, (ActionEvent e) -> {
49
            text.setText("");
50
            this.getModel().setFilter(null);
51
            changeListenerHelper.fireEvent();
52
        });
53
        toolsSwingManager.setDefaultPopupMenu(this.text);
54
        this.text.addKeyListener(new KeyAdapter() {
55
            @Override
56
            public void keyTyped(KeyEvent e) {
57
                if (e.getKeyChar() == '\n') {
58
                    getModel().setFilter(text.getText());
59
                    changeListenerHelper.fireEvent();
60
                }
61
            }
62
        });
63
        this.button.setIcon(this.getIcon("common-filter"));
64
        if (this.button.getText().equals("...")) {
65
            this.button.setText("");
57 66
        }
58
      }
59
    });
60
    this.button.addActionListener((ActionEvent e) -> {
61
      this.getModel().setFilter(text.getText());
62
      changeListenerHelper.fireEvent();
63
    });
64
  }
65 67

  
66
  @Override
67
  public FilteredListModel createModel() {
68
    ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
69
    FilteredListModel model = toolsSwingManager.createFilteredListModel();
70
    return model;
71
  }
68
        this.button.addActionListener((ActionEvent e) -> {
69
            this.getModel().setFilter(text.getText());
70
            changeListenerHelper.fireEvent();
71
        });
72
    }
72 73

  
73
  @Override
74
  public FilteredListModel getModel() {
75
    return (FilteredListModel) this.list.getModel();
76
  }
74
    protected ImageIcon getIcon(String name) {
75
        IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
76
        IconTheme theme = iconThemeManager.getCurrent();
77
        ImageIcon icon = theme.get(name);
78
        return icon;
79
    }
77 80

  
78 81
    @Override
82
    public FilteredListModel createModel() {
83
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
84
        FilteredListModel theModel = toolsSwingManager.createFilteredListModel();
85
        return theModel;
86
    }
87

  
88
    @Override
89
    public FilteredListModel getModel() {
90
        ListModel model0 = this.list.getModel();
91
        if( model == null ) {
92
            if( model0 instanceof FilteredListModel ) {
93
                model = (FilteredListModel) model0;
94
                model.setFilter(text.getText());
95
                return model;
96
            }
97
            model = new FilteredListModelImpl(model0);
98
            model.setFilter(text.getText());
99
            list.setModel(model);
100
            return model;
101
        }
102

  
103
        if( model == model0 ) {
104
            return model;
105
        }
106
        if( model0 instanceof FilteredListModel ) {
107
            model = (FilteredListModel) model0;
108
            model.setFilter(text.getText());
109
            return model;
110
        }
111
        model = new FilteredListModelImpl(model0);
112
        model.setFilter(text.getText());
113
        list.setModel(model);
114
        return model;
115
    }
116

  
117
    @Override
79 118
    public void addChangeListener(ChangeListener listener) {
80 119
        this.changeListenerHelper.addChangeListener(listener);
81 120
    }
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
616 616

  
617 617
    @Override
618 618
    public FilteredListModel createFilteredListModel() {
619
        FilteredListModel model = new FilteredListModelImpl();
619
        FilteredListModel model = new FilteredListModelImpl(null);
620 620
        return model;
621 621
    }
622 622

  
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
1 1
package org.gvsig.tools.swing.impl;
2 2

  
3
import java.util.AbstractList;
3 4
import org.gvsig.tools.swing.api.FilteredListModel;
4
import java.util.ArrayList;
5
import java.util.Comparator;
6 5
import java.util.List;
7 6
import java.util.Objects;
8 7
import javax.swing.AbstractListModel;
8
import javax.swing.DefaultListModel;
9
import javax.swing.ListModel;
9 10
import javax.swing.SwingUtilities;
10 11
import org.apache.commons.io.FilenameUtils;
11 12
import org.apache.commons.lang3.ObjectUtils;
......
20 21
 */
21 22
class FilteredListModelImpl extends AbstractListModel implements FilteredListModel {
22 23

  
23
    private List<LabeledValue> elements;
24
    private List<LabeledValue> filteredElements;
24
    private static class ListModelToListAdapter extends AbstractList {
25

  
26
        private final ListModel model;
27

  
28
        public ListModelToListAdapter(ListModel model) {
29
            this.model = model;
30
        }
31
        
32
        @Override
33
        public Object get(int index) {
34
            return this.model.getElementAt(index);
35
        }
36

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

  
42
        @Override
43
        public Object set(int index, Object element) {
44
            if( !(model instanceof DefaultListModel) ) {
45
                throw new IllegalStateException("The model is unmodifiable.");
46
            }            
47
            return ((DefaultListModel)this.model).set(index, element);
48
        }
49
        
50
    }
51

  
52
    private ListModel elements;
53
    private DefaultListModel<LabeledValue> filteredElements;
25 54
    private String filter;
26
    private boolean sorting;
27 55
    private AbstractCancellableTask th;
28 56

  
29
    public FilteredListModelImpl() {
30
        this.elements = new ArrayList<>();
31
        this.filteredElements = this.elements;
57
    public FilteredListModelImpl(ListModel model) {
58
        if( model == null ) {
59
            this.elements = new DefaultListModel();
60
        } else {
61
            this.elements = model;
62
        }
63
        this.filteredElements = new DefaultListModel();
32 64
        this.filter = null;
33
        this.sorting = false;
34 65
        this.th = null;
35 66
    }
36 67

  
37 68
    @Override
69
    public ListModel getModel() {
70
        return this.elements;
71
    }
72
    
73
    @Override
38 74
    public int getSize() {
39
        return this.filteredElements.size();
75
        return this.filteredElements.getSize();
40 76
    }
41 77

  
42 78
    @Override
43 79
    public void clear() {
44
        this.elements = new ArrayList<>();
45
        this.filteredElements = this.elements;
80
        this.elements = new DefaultListModel();
81
        this.filteredElements = new DefaultListModel();
46 82
        this.filter = null;
47 83
        fireContentsChanged();
48 84
    }
49 85
    
50 86
    @Override
51 87
    public LabeledValue getElementAt(int index) {
52
        return this.filteredElements.get(index);
88
        return this.filteredElements.getElementAt(index);
53 89
    }
54 90

  
55 91
    @Override
......
57 93
        if( element==null ) {
58 94
            return;
59 95
        }
60
        this.elements.add(element);
61
        if (this.elements != this.filteredElements) {
62
            this.filteredElements.add(element);
96
        if( !(elements instanceof DefaultListModel) ) {
97
            throw new IllegalStateException("The model is unmodifiable.");
63 98
        }
99
        ((DefaultListModel)this.elements).addElement(element);
100
        if (filter==null || FilenameUtils.wildcardMatch(element.toString().toLowerCase(), filter)) {
101
            this.filteredElements.addElement(element);
102
        }
64 103
        fireContentsChanged();
65 104
    }
66 105

  
67 106
    @Override
68 107
    public void addElement(Object element) {
69
        this.addElement(new LabeledValueImpl<>(Objects.toString(element, ""), element));
108
        if( !(element instanceof LabeledValue) ) {
109
            element = new LabeledValueImpl<>(Objects.toString(element, ""), element);
110
        }
111
        this.addElement((LabeledValue)element);
70 112
    }
71 113

  
72 114
    
......
74 116
    public void setFilter(String filter) {
75 117
        if (StringUtils.isBlank(filter)) {
76 118
            this.filter = null;
77
            this.filteredElements = this.elements;
78 119
        } else {
79 120
            if( StringUtils.containsAny(filter, "*?") ) {
80 121
                this.filter = filter;
81 122
            } else {
82 123
                this.filter = "*" + filter + "*";
83 124
            }
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);
125
        }
126
        this.copy(elements, filteredElements, this.filter);
127
        fireContentsChanged();
128
    }
129
    
130
    private void copy(ListModel source, DefaultListModel target, String filter) {
131
        target.clear();
132
        if( filter!=null ) {
133
            filter = filter.toLowerCase();
134
        }
135
        for (int i = 0; i < source.getSize(); i++) {
136
            Object item = source.getElementAt(i);
137
            if( item == null ) {
138
                continue;
139
            }
140
            if( filter==null ) {
141
                target.addElement(item);
142
            } else {
143
                if (FilenameUtils.wildcardMatch(item.toString().toLowerCase(), filter)) {
144
                    target.addElement(item);
88 145
                }
89 146
            }
147
            
90 148
        }
91
        fireContentsChanged();
92 149
    }
93

  
94 150
    private void fireContentsChanged() {
95 151
        if( !SwingUtilities.isEventDispatchThread() ) {
96 152
            SwingUtilities.invokeLater(() -> {
......
118 174
        this.th = new AbstractCancellableTask("FilteredListModelSorter") {
119 175
            @Override
120 176
            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;
177
                final List items = new ListModelToListAdapter(elements);
178
                items.sort((Object o1, Object o2) -> {
179
                    int r = ObjectUtils.compare(o1.toString(), o2.toString());
180
                    if (ascending) {
181
                        return r;
130 182
                    }
183
                    return -r;
131 184
                });
132 185
                if (this.isCancellationRequested()) {
133 186
                    return;
134 187
                }
135
                elements = items;
136
                filteredElements = elements;
137
                if (filter != null) {
138
                    setFilter(filter);
139
                } else {
140
                    fireContentsChanged();
141
                }
188
                copy(elements, filteredElements, filter);
189
                fireContentsChanged();
142 190
            }
143 191
        };
144 192
        th.start();
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/ToolsSwingDefaultImplLibrary.java
85 85
        
86 86
        JWebBrowserSimpleFactory.selfRegister();
87 87
        
88
        registerDataTypeIcons();
88
        registerIcons();
89 89
    }
90 90

  
91 91
    @Override
......
93 93

  
94 94
    }
95 95

  
96
    private void registerDataTypeIcons() {
96
    private void registerIcons() {
97 97
        String[][] iconNames = new String[][] {
98
            new String[] { "DataTypes", "datatype-any" },
99
            new String[] { "DataTypes", "datatype-binary" },
100
            new String[] { "DataTypes", "datatype-boolean" },
101
            new String[] { "DataTypes", "datatype-byte" },
102
            new String[] { "DataTypes", "datatype-bytearray" },
103
            new String[] { "DataTypes", "datatype-date" },
104
            new String[] { "DataTypes", "datatype-double" },
105
            new String[] { "DataTypes", "datatype-decimal" },
106
            new String[] { "DataTypes", "datatype-float" },
107
            new String[] { "DataTypes", "datatype-image" },
108
            new String[] { "DataTypes", "datatype-integer" },
109
            new String[] { "DataTypes", "datatype-locale" },
110
            new String[] { "DataTypes", "datatype-long" },
111
            new String[] { "DataTypes", "datatype-object" },
112
            new String[] { "DataTypes", "datatype-string" },
113
            new String[] { "DataTypes", "datatype-text" },
114
            new String[] { "DataTypes", "datatype-time" },
115
            new String[] { "DataTypes", "datatype-timestamp" }
98
            new String[] { "datatypes/images/", "DataTypes", "datatype-any" },
99
            new String[] { "datatypes/images/", "DataTypes", "datatype-binary" },
100
            new String[] { "datatypes/images/", "DataTypes", "datatype-boolean" },
101
            new String[] { "datatypes/images/", "DataTypes", "datatype-byte" },
102
            new String[] { "datatypes/images/", "DataTypes", "datatype-bytearray" },
103
            new String[] { "datatypes/images/", "DataTypes", "datatype-date" },
104
            new String[] { "datatypes/images/", "DataTypes", "datatype-double" },
105
            new String[] { "datatypes/images/", "DataTypes", "datatype-decimal" },
106
            new String[] { "datatypes/images/", "DataTypes", "datatype-float" },
107
            new String[] { "datatypes/images/", "DataTypes", "datatype-image" },
108
            new String[] { "datatypes/images/", "DataTypes", "datatype-integer" },
109
            new String[] { "datatypes/images/", "DataTypes", "datatype-locale" },
110
            new String[] { "datatypes/images/", "DataTypes", "datatype-long" },
111
            new String[] { "datatypes/images/", "DataTypes", "datatype-object" },
112
            new String[] { "datatypes/images/", "DataTypes", "datatype-string" },
113
            new String[] { "datatypes/images/", "DataTypes", "datatype-text" },
114
            new String[] { "datatypes/images/", "DataTypes", "datatype-time" },
115
            new String[] { "datatypes/images/", "DataTypes", "datatype-timestamp" },
116
            new String[] { "common/", "Common", "common-applychanges" },
117
            new String[] { "common/", "Common", "common-filter" },
118
            new String[] { "common/", "Common", "common-more" },
119
            new String[] { "common/", "Common", "common-sortdown" },
120
            new String[] { "common/", "Common", "common-sortup" }
116 121
        };
117 122
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
118 123
        for (String[] icon : iconNames) {
119
            URL url = ToolsSwingDefaultImplLibrary.class.getResource("datatypes/images/"+icon[1]+".png");
120
            theme.registerDefault("DataTypes", icon[0], icon[1], null, url);
124
            URL url = ToolsSwingDefaultImplLibrary.class.getResource(icon[0]+icon[2]+".png");
125
            theme.registerDefault("ToolsSwing", icon[1], icon[2], null, url);
121 126
        }
127
        
128
        
122 129
    }
123 130
}
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/FilteredListModel.java
15 15

  
16 16
    public void clear();
17 17
    
18
    public ListModel getModel();
19
    
18 20
    @Override
19 21
    public LabeledValue getElementAt(int index);
20 22

  

Also available in: Unified diff