source: josm/trunk/src/org/openstreetmap/josm/data/osm/Filters.java@ 3199

Last change on this file since 3199 was 3199, checked in by bastiK, 14 years ago

see #4929 - filtered objects can be selected: fixed the first and the third issue from my reply (select something, then change the filter to include these objects; undo, such that the properties of a selected change and a filter applies)

  • Property svn:eol-style set to native
File size: 8.7 KB
Line 
1package org.openstreetmap.josm.data.osm;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4import static org.openstreetmap.josm.tools.I18n.trc;
5
6import java.awt.Color;
7import java.awt.Font;
8import java.awt.Graphics;
9import java.awt.Graphics2D;
10
11import java.util.Collection;
12import java.util.LinkedList;
13import java.util.List;
14import java.util.Map;
15
16import javax.swing.BorderFactory;
17import javax.swing.JLabel;
18import javax.swing.table.AbstractTableModel;
19
20import org.openstreetmap.josm.Main;
21import org.openstreetmap.josm.actions.search.SearchAction;
22import org.openstreetmap.josm.actions.search.SearchAction.Function;
23
24/**
25 *
26 * @author Petr_Dlouhý
27 */
28public class Filters extends AbstractTableModel{
29
30 public int disabledCount, hiddenCount;
31
32 public Filters(){
33 loadPrefs();
34 }
35
36 private List<Filter> filters = new LinkedList<Filter>();
37
38 public void executeFilters(){
39 Collection<OsmPrimitive> seld = new LinkedList<OsmPrimitive> ();
40 Collection<OsmPrimitive> self = new LinkedList<OsmPrimitive> ();
41 DataSet ds = Main.main.getCurrentDataSet();
42 if(ds == null)return;
43 ds.setFiltered();
44 ds.setDisabled();
45 for (Filter flt : filters){
46 if(flt.enable){
47 SearchAction.getSelection(flt, seld, new Function(){
48 public Boolean isSomething(OsmPrimitive o){
49 return o.isDisabled();
50 }
51 });
52 if(flt.hide) {
53 SearchAction.getSelection(flt, self, new Function(){
54 public Boolean isSomething(OsmPrimitive o){
55 return o.isFiltered();
56 }
57 });
58 }
59 }
60 }
61 disabledCount = seld.size() - self.size();
62 hiddenCount = self.size();
63 ds.setFiltered(self);
64 ds.setDisabled(seld);
65
66 ds.clearSelection(seld);
67
68 Main.map.mapView.repaint();
69 }
70
71 public void clearFilterFlags() {
72 DataSet ds = Main.main.getCurrentDataSet();
73 if (ds != null) {
74 ds.setFiltered();
75 ds.setDisabled();
76 }
77 disabledCount = 0;
78 hiddenCount = 0;
79 Main.map.mapView.repaint();
80 }
81
82
83 private void loadPrefs() {
84 Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
85 for (String value : prefs.values()) {
86 filters.add(new Filter(value));
87 }
88 }
89
90 private void savePrefs(){
91 Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
92 for (String key : prefs.keySet()) {
93 String[] sts = key.split("\\.");
94 if (sts.length != 3)throw new Error("Incompatible filter preferences");
95 Main.pref.put("filters.filter." + sts[2], null);
96 }
97
98 int i = 0;
99 for (Filter flt : filters){
100 Main.pref.put("filters.filter." + i++, flt.getPrefString());
101 }
102 }
103
104 private void savePref(int i){
105 if(i >= filters.size()) {
106 Main.pref.put("filters.filter." + i, null);
107 } else {
108 Main.pref.put("filters.filter." + i, filters.get(i).getPrefString());
109 }
110 }
111
112 public void addFilter(Filter f){
113 filters.add(f);
114 savePref(filters.size()-1);
115 executeFilters();
116 fireTableRowsInserted(filters.size()-1, filters.size()-1);
117 }
118
119 public void moveDownFilter(int i){
120 if(i >= filters.size()-1) return;
121 filters.add(i+1, filters.remove(i));
122 savePref(i);
123 savePref(i+1);
124 executeFilters();
125 fireTableRowsUpdated(i, i+1);
126 }
127
128 public void moveUpFilter(int i){
129 if(i == 0) return;
130 filters.add(i-1, filters.remove(i));
131 savePref(i);
132 savePref(i-1);
133 executeFilters();
134 fireTableRowsUpdated(i-1, i);
135 }
136
137 public void removeFilter(int i){
138 filters.remove(i);
139 savePrefs();
140 executeFilters();
141 fireTableRowsDeleted(i, i);
142 }
143
144 public void setFilter(int i, Filter f){
145 filters.set(i, f);
146 savePref(i);
147 executeFilters();
148 fireTableRowsUpdated(i, i);
149 }
150
151 public Filter getFilter(int i){
152 return filters.get(i);
153 }
154
155 public int getRowCount(){
156 return filters.size();
157 }
158
159 public int getColumnCount(){
160 return 6;
161 }
162
163 @Override
164 public String getColumnName(int column){
165 String[] names = { /* translators notes must be in front */
166 /* column header: enable filter */ trc("filter","E"),
167 /* column header: hide filter */ trc("filter", "H"),
168 /* column header: filter text */ trc("filter", "Text"),
169 /* column header: apply filter for children */ trc("filter", "C"),
170 /* column header: inverted filter */ trc("filter", "I"),
171 /* column header: filter mode */ trc("filter", "M")
172 };
173 return names[column];
174 }
175
176 @Override
177 public Class<?> getColumnClass(int column){
178 Class<?>[] classes = { Boolean.class, Boolean.class, String.class, Boolean.class, Boolean.class, String.class };
179 return classes[column];
180 }
181
182 public boolean isCellEnabled(int row, int column){
183 if(!filters.get(row).enable && column!=0) return false;
184 return true;
185 }
186
187 @Override
188 public boolean isCellEditable(int row, int column){
189 if(!filters.get(row).enable && column!=0) return false;
190 if(column < 5)return true;
191 return false;
192 }
193
194 @Override
195 public void setValueAt(Object aValue, int row, int column){
196 Filter f = filters.get(row);
197 switch(column){
198 case 0:
199 f.enable = (Boolean)aValue;
200 savePref(row);
201 executeFilters();
202 fireTableRowsUpdated(row, row);
203 break;
204 case 1:
205 f.hide = (Boolean)aValue;
206 savePref(row);
207 executeFilters();
208 break;
209 case 2:
210 f.text = (String)aValue;
211 savePref(row);
212 break;
213 case 3:
214 f.applyForChildren = (Boolean)aValue;
215 savePref(row);
216 executeFilters();
217 break;
218 case 4:
219 f.inverted = (Boolean)aValue;
220 savePref(row);
221 executeFilters();
222 break;
223 }
224 if(column!=0) {
225 fireTableCellUpdated(row, column);
226 }
227 }
228
229 public Object getValueAt(int row, int column){
230 Filter f = filters.get(row);
231 switch(column){
232 case 0: return f.enable;
233 case 1: return f.hide;
234 case 2: return f.text;
235 case 3: return f.applyForChildren;
236 case 4: return f.inverted;
237 case 5:
238 switch(f.mode){ /* translators notes must be in front */
239 case replace: /* filter mode: replace */ return trc("filter", "R");
240 case add: /* filter mode: add */ return trc("filter", "A");
241 case remove: /* filter mode: remove */ return trc("filter", "D");
242 case in_selection: /* filter mode: in selection */ return trc("filter", "F");
243 }
244 }
245 return null;
246 }
247
248 private static class OSDLabel extends JLabel {
249 public OSDLabel(String text) {
250 super(text);
251 setOpaque(true);
252 setForeground(Color.black);
253 setBackground(new Color(0,0,0,0));
254 setFont(getFont().deriveFont(Font.PLAIN));
255 setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
256 }
257
258 @Override
259 public void paintComponent(Graphics g) {
260 g.setColor(new Color(255, 255, 255, 140));
261 g.fillRoundRect(getX(), getY(), getWidth(), getHeight(), 10, 10);
262 super.paintComponent(g);
263 }
264 }
265
266 private OSDLabel lblOSD = new OSDLabel("");
267
268 public void drawOSDText(Graphics2D g) {
269 String message = "<html>"+tr("<h2>Filter active</h2>");
270
271 if (disabledCount == 0 && hiddenCount == 0)
272 return;
273
274 if (hiddenCount != 0) {
275 message += tr("<p><b>{0}</b> objects hidden", hiddenCount);
276 }
277
278 if (hiddenCount != 0 && disabledCount != 0) {
279 message += "<br>";
280 }
281
282 if (disabledCount != 0) {
283 message += tr("<b>{0}</b> objects disabled", disabledCount);
284 }
285
286 message += tr("</p><p>Close the filter dialog to see all objects.<p></html>");
287
288 lblOSD.setText(message);
289 lblOSD.setSize(lblOSD.getPreferredSize());
290
291 int dx = Main.map.mapView.getWidth() - lblOSD.getPreferredSize().width - 15;
292 int dy = 15;
293 g.translate(dx, dy);
294 lblOSD.paintComponent(g);
295 g.translate(-dx, -dy);
296 }
297}
Note: See TracBrowser for help on using the repository browser.