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

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

see #15182 - deprecate all Main logging methods and introduce suitable replacements in Logging for most of them

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