source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java@ 6084

Last change on this file since 6084 was 6084, checked in by bastiK, 11 years ago

see #8902 - add missing @Override annotations (patch by shinigami)

  • Property svn:eol-style set to native
File size: 11.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5import static org.openstreetmap.josm.tools.I18n.trc;
6
7import java.awt.Color;
8import java.awt.Font;
9import java.awt.Graphics;
10import java.awt.Graphics2D;
11import java.util.ArrayList;
12import java.util.Collection;
13import java.util.HashSet;
14import java.util.LinkedList;
15import java.util.List;
16
17import javax.swing.BorderFactory;
18import javax.swing.JLabel;
19import javax.swing.JOptionPane;
20import javax.swing.table.AbstractTableModel;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
24import org.openstreetmap.josm.data.osm.DataSet;
25import org.openstreetmap.josm.data.osm.Filter;
26import org.openstreetmap.josm.data.osm.Filter.FilterPreferenceEntry;
27import org.openstreetmap.josm.data.osm.FilterMatcher;
28import org.openstreetmap.josm.data.osm.FilterWorker;
29import org.openstreetmap.josm.data.osm.Node;
30import org.openstreetmap.josm.data.osm.OsmPrimitive;
31
32/**
33 *
34 * @author Petr_Dlouhý
35 */
36public class FilterTableModel extends AbstractTableModel {
37
38 public static final int COL_ENABLED = 0;
39 public static final int COL_HIDING = 1;
40 public static final int COL_TEXT = 2;
41 public static final int COL_INVERTED = 3;
42
43 // number of primitives that are disabled but not hidden
44 public int disabledCount;
45 // number of primitives that are disabled and hidden
46 public int disabledAndHiddenCount;
47
48 public FilterTableModel() {
49 loadPrefs();
50 }
51
52 private final List<Filter> filters = new LinkedList<Filter>();
53 private final FilterMatcher filterMatcher = new FilterMatcher();
54
55 private void updateFilters() {
56 try {
57 filterMatcher.update(filters);
58 executeFilters();
59 } catch (ParseError e) {
60 JOptionPane.showMessageDialog(
61 Main.parent,
62 e.getMessage(),
63 tr("Error in filter"),
64 JOptionPane.ERROR_MESSAGE);
65 }
66 }
67
68 public void executeFilters() {
69 DataSet ds = Main.main.getCurrentDataSet();
70 boolean changed = false;
71 if (ds == null) {
72 disabledAndHiddenCount = 0;
73 disabledCount = 0;
74 changed = true;
75 } else {
76 final Collection<OsmPrimitive> deselect = new HashSet<OsmPrimitive>();
77
78 ds.beginUpdate();
79 try {
80
81 final Collection<OsmPrimitive> all = ds.allNonDeletedCompletePrimitives();
82
83 changed = FilterWorker.executeFilters(all, filterMatcher);
84
85 disabledCount = 0;
86 disabledAndHiddenCount = 0;
87 // collect disabled and selected the primitives
88 for (OsmPrimitive osm : all) {
89 if (osm.isDisabled()) {
90 disabledCount++;
91 if (osm.isSelected()) {
92 deselect.add(osm);
93 }
94 if (osm.isDisabledAndHidden()) {
95 disabledAndHiddenCount++;
96 }
97 }
98 }
99 disabledCount -= disabledAndHiddenCount;
100 } finally {
101 ds.endUpdate();
102 }
103
104 if (!deselect.isEmpty()) {
105 ds.clearSelection(deselect);
106 }
107 }
108
109 if (Main.isDisplayingMapView() && changed) {
110 Main.map.mapView.repaint();
111 Main.map.filterDialog.updateDialogHeader();
112 }
113 }
114
115 public void executeFilters(Collection<? extends OsmPrimitive> primitives) {
116 DataSet ds = Main.main.getCurrentDataSet();
117 if (ds == null)
118 return;
119
120 boolean changed = false;
121 List<OsmPrimitive> deselect = new ArrayList<OsmPrimitive>();
122
123 ds.beginUpdate();
124 try {
125 for (int i=0; i<2; i++) {
126 for (OsmPrimitive primitive: primitives) {
127
128 if (i == 0 && primitive instanceof Node) {
129 continue;
130 }
131
132 if (i == 1 && !(primitive instanceof Node)) {
133 continue;
134 }
135
136 if (primitive.isDisabled()) {
137 disabledCount--;
138 }
139 if (primitive.isDisabledAndHidden()) {
140 disabledAndHiddenCount--;
141 }
142 changed = changed | FilterWorker.executeFilters(primitive, filterMatcher);
143 if (primitive.isDisabled()) {
144 disabledCount++;
145 }
146 if (primitive.isDisabledAndHidden()) {
147 disabledAndHiddenCount++;
148 }
149
150 if (primitive.isSelected() && primitive.isDisabled()) {
151 deselect.add(primitive);
152 }
153
154 }
155 }
156 } finally {
157 ds.endUpdate();
158 }
159
160 if (changed) {
161 Main.map.mapView.repaint();
162 Main.map.filterDialog.updateDialogHeader();
163 ds.clearSelection(deselect);
164 }
165
166 }
167
168 public void clearFilterFlags() {
169 DataSet ds = Main.main.getCurrentDataSet();
170 if (ds != null) {
171 FilterWorker.clearFilterFlags(ds.allPrimitives());
172 }
173 disabledCount = 0;
174 disabledAndHiddenCount = 0;
175 }
176
177 private void loadPrefs() {
178 List<FilterPreferenceEntry> entries = Main.pref.getListOfStructs("filters.entries", null, FilterPreferenceEntry.class);
179 if (entries != null) {
180 for (FilterPreferenceEntry e : entries) {
181 filters.add(new Filter(e));
182 }
183 updateFilters();
184 }
185 }
186
187 private void savePrefs() {
188 Collection<FilterPreferenceEntry> entries = new ArrayList<FilterPreferenceEntry>();
189 for (Filter flt : filters) {
190 entries.add(flt.getPreferenceEntry());
191 }
192 Main.pref.putListOfStructs("filters.entries", entries, FilterPreferenceEntry.class);
193 }
194
195 public void addFilter(Filter f) {
196 filters.add(f);
197 savePrefs();
198 updateFilters();
199 fireTableRowsInserted(filters.size() - 1, filters.size() - 1);
200 }
201
202 public void moveDownFilter(int i) {
203 if (i >= filters.size() - 1)
204 return;
205 filters.add(i + 1, filters.remove(i));
206 savePrefs();
207 updateFilters();
208 fireTableRowsUpdated(i, i + 1);
209 }
210
211 public void moveUpFilter(int i) {
212 if (i == 0)
213 return;
214 filters.add(i - 1, filters.remove(i));
215 savePrefs();
216 updateFilters();
217 fireTableRowsUpdated(i - 1, i);
218 }
219
220 public void removeFilter(int i) {
221 filters.remove(i);
222 savePrefs();
223 updateFilters();
224 fireTableRowsDeleted(i, i);
225 }
226
227 public void setFilter(int i, Filter f) {
228 filters.set(i, f);
229 savePrefs();
230 updateFilters();
231 fireTableRowsUpdated(i, i);
232 }
233
234 public Filter getFilter(int i) {
235 return filters.get(i);
236 }
237
238 @Override
239 public int getRowCount() {
240 return filters.size();
241 }
242
243 @Override
244 public int getColumnCount() {
245 return 5;
246 }
247
248 @Override
249 public String getColumnName(int column) {
250 String[] names = { /* translators notes must be in front */
251 /* column header: enable filter */trc("filter", "E"),
252 /* column header: hide filter */trc("filter", "H"),
253 /* column header: filter text */trc("filter", "Text"),
254 /* column header: inverted filter */trc("filter", "I"),
255 /* column header: filter mode */trc("filter", "M") };
256 return names[column];
257 }
258
259 @Override
260 public Class<?> getColumnClass(int column) {
261 Class<?>[] classes = { Boolean.class, Boolean.class, String.class, Boolean.class, String.class };
262 return classes[column];
263 }
264
265 public boolean isCellEnabled(int row, int column) {
266 if (!filters.get(row).enable && column != 0)
267 return false;
268 return true;
269 }
270
271 @Override
272 public boolean isCellEditable(int row, int column) {
273 if (!filters.get(row).enable && column != 0)
274 return false;
275 if (column < 4)
276 return true;
277 return false;
278 }
279
280 @Override
281 public void setValueAt(Object aValue, int row, int column) {
282 Filter f = filters.get(row);
283 switch (column) {
284 case COL_ENABLED:
285 f.enable = (Boolean) aValue;
286 savePrefs();
287 updateFilters();
288 fireTableRowsUpdated(row, row);
289 break;
290 case COL_HIDING:
291 f.hiding = (Boolean) aValue;
292 savePrefs();
293 updateFilters();
294 break;
295 case COL_TEXT:
296 f.text = (String) aValue;
297 savePrefs();
298 break;
299 case COL_INVERTED:
300 f.inverted = (Boolean) aValue;
301 savePrefs();
302 updateFilters();
303 break;
304 }
305 if (column != 0) {
306 fireTableCellUpdated(row, column);
307 }
308 }
309
310 @Override
311 public Object getValueAt(int row, int column) {
312 Filter f = filters.get(row);
313 switch (column) {
314 case COL_ENABLED:
315 return f.enable;
316 case COL_HIDING:
317 return f.hiding;
318 case COL_TEXT:
319 return f.text;
320 case COL_INVERTED:
321 return f.inverted;
322 case 4:
323 switch (f.mode) { /* translators notes must be in front */
324 case replace: /* filter mode: replace */
325 return trc("filter", "R");
326 case add: /* filter mode: add */
327 return trc("filter", "A");
328 case remove: /* filter mode: remove */
329 return trc("filter", "D");
330 case in_selection: /* filter mode: in selection */
331 return trc("filter", "F");
332 }
333 }
334 return null;
335 }
336
337 /**
338 * On screen display label
339 */
340 private static class OSDLabel extends JLabel {
341 public OSDLabel(String text) {
342 super(text);
343 setOpaque(true);
344 setForeground(Color.black);
345 setBackground(new Color(0, 0, 0, 0));
346 setFont(getFont().deriveFont(Font.PLAIN));
347 setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
348 }
349
350 @Override
351 public void paintComponent(Graphics g) {
352 g.setColor(new Color(255, 255, 255, 140));
353 g.fillRoundRect(getX(), getY(), getWidth(), getHeight(), 10, 10);
354 super.paintComponent(g);
355 }
356 }
357
358 private OSDLabel lblOSD = new OSDLabel("");
359
360 public void drawOSDText(Graphics2D g) {
361 String message = "<html>" + tr("<h2>Filter active</h2>");
362
363 if (disabledCount == 0 && disabledAndHiddenCount == 0)
364 return;
365
366 if (disabledAndHiddenCount != 0) {
367 message += tr("<p><b>{0}</b> objects hidden", disabledAndHiddenCount);
368 }
369
370 if (disabledAndHiddenCount != 0 && disabledCount != 0) {
371 message += "<br>";
372 }
373
374 if (disabledCount != 0) {
375 message += tr("<b>{0}</b> objects disabled", disabledCount);
376 }
377
378 message += tr("</p><p>Close the filter dialog to see all objects.<p></html>");
379
380 lblOSD.setText(message);
381 lblOSD.setSize(lblOSD.getPreferredSize());
382
383 int dx = Main.map.mapView.getWidth() - lblOSD.getPreferredSize().width - 15;
384 int dy = 15;
385 g.translate(dx, dy);
386 lblOSD.paintComponent(g);
387 g.translate(-dx, -dy);
388 }
389
390 public List<Filter> getFilters() {
391 return filters;
392 }
393}
Note: See TracBrowser for help on using the repository browser.