Revision 2260
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