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

Last change on this file since 13285 was 12630, checked in by Don-vip, 7 years ago

see #15182 - deprecate Main.map and Main.isDisplayingMapView(). Replacements: gui.MainApplication.getMap() / gui.MainApplication.isDisplayingMapView()

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