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

Last change on this file since 12400 was 12400, checked in by Don-vip, 8 years ago

see #14929 - Automatic filters on numeric tag values (level, layer, maxspeed, voltage)

  • Property svn:eol-style set to native
File size: 8.2 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.Graphics2D;
8import java.util.Collection;
9import java.util.List;
10
11import javax.swing.table.AbstractTableModel;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.data.osm.Filter;
15import org.openstreetmap.josm.data.osm.FilterModel;
16import org.openstreetmap.josm.data.osm.OsmPrimitive;
17import org.openstreetmap.josm.gui.autofilter.AutoFilterManager;
18import org.openstreetmap.josm.gui.widgets.OSDLabel;
19
20/**
21 * The model that is used for the table in the {@link FilterDialog}.
22 *
23 * @author Petr_Dlouhý
24 */
25public class FilterTableModel extends AbstractTableModel {
26
27 /**
28 * The filter enabled column
29 */
30 public static final int COL_ENABLED = 0;
31 /**
32 * The column indicating if the filter is hiding.
33 */
34 public static final int COL_HIDING = 1;
35 /**
36 * The column that displays the filter text
37 */
38 public static final int COL_TEXT = 2;
39 /**
40 * The column to invert the filter
41 */
42 public static final int COL_INVERTED = 3;
43
44 /**
45 * The filter model
46 */
47 final FilterModel model = new FilterModel();
48
49 /**
50 * A helper for {@link #drawOSDText(Graphics2D)}.
51 */
52 private final OSDLabel lblOSD = new OSDLabel("");
53
54 /**
55 * Constructs a new {@code FilterTableModel}.
56 */
57 public FilterTableModel() {
58 loadPrefs();
59 }
60
61 private void updateFilters() {
62 AutoFilterManager.getInstance().setCurrentAutoFilter(null);
63 executeFilters();
64 }
65
66 /**
67 * Runs the filters on the current edit data set.
68 */
69 public void executeFilters() {
70 if (AutoFilterManager.getInstance().getCurrentAutoFilter() == null) {
71 model.executeFilters();
72 updateMap();
73 }
74 }
75
76 /**
77 * Runs the filter on a list of primitives that are part of the edit data set.
78 * @param primitives The primitives
79 */
80 public void executeFilters(Collection<? extends OsmPrimitive> primitives) {
81 if (AutoFilterManager.getInstance().getCurrentAutoFilter() == null) {
82 model.executeFilters(primitives);
83 updateMap();
84 }
85 }
86
87 private void updateMap() {
88 if (Main.map != null && model.isChanged()) {
89 Main.map.filterDialog.updateDialogHeader();
90 }
91 }
92
93 private void loadPrefs() {
94 model.loadPrefs("filters.entries");
95 }
96
97 private void savePrefs() {
98 model.savePrefs("filters.entries");
99 }
100
101 /**
102 * Adds a new filter to the filter list.
103 * @param filter The new filter
104 */
105 public void addFilter(Filter filter) {
106 if (model.addFilter(filter)) {
107 savePrefs();
108 updateFilters();
109 int size = model.getFiltersCount();
110 fireTableRowsInserted(size - 1, size - 1);
111 }
112 }
113
114 /**
115 * Moves down the filter in the given row.
116 * @param rowIndex The filter row
117 */
118 public void moveDownFilter(int rowIndex) {
119 if (model.moveDownFilter(rowIndex)) {
120 savePrefs();
121 updateFilters();
122 fireTableRowsUpdated(rowIndex, rowIndex + 1);
123 }
124 }
125
126 /**
127 * Moves up the filter in the given row
128 * @param rowIndex The filter row
129 */
130 public void moveUpFilter(int rowIndex) {
131 if (model.moveUpFilter(rowIndex)) {
132 savePrefs();
133 updateFilters();
134 fireTableRowsUpdated(rowIndex - 1, rowIndex);
135 }
136 }
137
138 /**
139 * Removes the filter that is displayed in the given row
140 * @param rowIndex The index of the filter to remove
141 */
142 public void removeFilter(int rowIndex) {
143 if (model.removeFilter(rowIndex) != null) {
144 savePrefs();
145 updateFilters();
146 fireTableRowsDeleted(rowIndex, rowIndex);
147 }
148 }
149
150 /**
151 * Sets/replaces the filter for a given row.
152 * @param rowIndex The row index
153 * @param filter The filter that should be placed in that row
154 */
155 public void setFilter(int rowIndex, Filter filter) {
156 model.setFilter(rowIndex, filter);
157 savePrefs();
158 updateFilters();
159 fireTableRowsUpdated(rowIndex, rowIndex);
160 }
161
162 /**
163 * Gets the filter by row index
164 * @param rowIndex The row index
165 * @return The filter in that row
166 */
167 public Filter getFilter(int rowIndex) {
168 return model.getFilter(rowIndex);
169 }
170
171 @Override
172 public int getRowCount() {
173 return model.getFiltersCount();
174 }
175
176 @Override
177 public int getColumnCount() {
178 return 5;
179 }
180
181 @Override
182 public String getColumnName(int column) {
183 String[] names = {/* translators notes must be in front */
184 /* column header: enable filter */trc("filter", "E"),
185 /* column header: hide filter */trc("filter", "H"),
186 /* column header: filter text */trc("filter", "Text"),
187 /* column header: inverted filter */trc("filter", "I"),
188 /* column header: filter mode */trc("filter", "M")};
189 return names[column];
190 }
191
192 @Override
193 public Class<?> getColumnClass(int column) {
194 Class<?>[] classes = {Boolean.class, Boolean.class, String.class, Boolean.class, String.class};
195 return classes[column];
196 }
197
198 /**
199 * Determines if a cell is enabled.
200 * @param row row index
201 * @param column column index
202 * @return {@code true} if the cell at (row, column) is enabled
203 */
204 public boolean isCellEnabled(int row, int column) {
205 return model.getFilter(row).enable || column == 0;
206 }
207
208 @Override
209 public boolean isCellEditable(int row, int column) {
210 return column < 4 && isCellEnabled(row, column);
211 }
212
213 @Override
214 public void setValueAt(Object aValue, int row, int column) {
215 if (row >= model.getFiltersCount()) {
216 return;
217 }
218 Filter f = model.getFilter(row);
219 switch (column) {
220 case COL_ENABLED:
221 f.enable = (Boolean) aValue;
222 setFilter(row, f);
223 break;
224 case COL_HIDING:
225 f.hiding = (Boolean) aValue;
226 setFilter(row, f);
227 break;
228 case COL_TEXT:
229 f.text = (String) aValue;
230 savePrefs();
231 break;
232 case COL_INVERTED:
233 f.inverted = (Boolean) aValue;
234 setFilter(row, f);
235 break;
236 default: // Do nothing
237 }
238 if (column != 0) {
239 fireTableCellUpdated(row, column);
240 }
241 }
242
243 @Override
244 public Object getValueAt(int row, int column) {
245 if (row >= model.getFiltersCount()) {
246 return null;
247 }
248 Filter f = model.getFilter(row);
249 switch (column) {
250 case COL_ENABLED:
251 return f.enable;
252 case COL_HIDING:
253 return f.hiding;
254 case COL_TEXT:
255 return f.text;
256 case COL_INVERTED:
257 return f.inverted;
258 case 4:
259 switch (f.mode) { /* translators notes must be in front */
260 case replace: /* filter mode: replace */
261 return trc("filter", "R");
262 case add: /* filter mode: add */
263 return trc("filter", "A");
264 case remove: /* filter mode: remove */
265 return trc("filter", "D");
266 case in_selection: /* filter mode: in selection */
267 return trc("filter", "F");
268 default:
269 Main.warn("Unknown filter mode: " + f.mode);
270 }
271 break;
272 default: // Do nothing
273 }
274 return null;
275 }
276
277 /**
278 * Draws a text on the map display that indicates that filters are active.
279 * @param g The graphics to draw that text on.
280 */
281 public void drawOSDText(Graphics2D g) {
282 model.drawOSDText(g, lblOSD,
283 tr("<h2>Filter active</h2>"),
284 tr("</p><p>Close the filter dialog to see all objects.<p></html>"));
285 }
286
287 /**
288 * Returns the list of filters.
289 * @return the list of filters
290 */
291 public List<Filter> getFilters() {
292 return model.getFilters();
293 }
294}
Note: See TracBrowser for help on using the repository browser.