source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java@ 12279

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

sonar - squid:S3878 - Arrays should not be created for varargs parameters

  • Property svn:eol-style set to native
File size: 12.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.map;
3
4import static org.openstreetmap.josm.tools.I18n.marktr;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.GridBagLayout;
8import java.io.IOException;
9import java.util.ArrayList;
10import java.util.Collection;
11import java.util.Collections;
12import java.util.HashMap;
13import java.util.List;
14import java.util.Map;
15
16import javax.swing.BorderFactory;
17import javax.swing.JCheckBox;
18import javax.swing.JLabel;
19import javax.swing.JOptionPane;
20import javax.swing.JPanel;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.gui.ExtendedDialog;
24import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
25import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
26import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
27import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane.ValidationListener;
28import org.openstreetmap.josm.gui.preferences.SourceEditor;
29import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
30import org.openstreetmap.josm.gui.preferences.SourceEntry;
31import org.openstreetmap.josm.gui.preferences.SourceProvider;
32import org.openstreetmap.josm.gui.preferences.SourceType;
33import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
34import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
35import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
36import org.openstreetmap.josm.tools.GBC;
37import org.openstreetmap.josm.tools.Utils;
38import org.xml.sax.SAXException;
39import org.xml.sax.SAXParseException;
40
41/**
42 * Preference settings for tagging presets.
43 */
44public final class TaggingPresetPreference implements SubPreferenceSetting {
45
46 private final class TaggingPresetValidationListener implements ValidationListener {
47 @Override
48 public boolean validatePreferences() {
49 if (sources.hasActiveSourcesChanged()) {
50 List<Integer> sourcesToRemove = new ArrayList<>();
51 int i = -1;
52 SOURCES:
53 for (SourceEntry source: sources.getActiveSources()) {
54 i++;
55 boolean canLoad = false;
56 try {
57 TaggingPresetReader.readAll(source.url, false);
58 canLoad = true;
59 } catch (IOException e) {
60 Main.warn(e, tr("Could not read tagging preset source: {0}", source));
61 ExtendedDialog ed = new ExtendedDialog(Main.parent, tr("Error"),
62 tr("Yes"), tr("No"), tr("Cancel"));
63 ed.setContent(tr("Could not read tagging preset source: {0}\nDo you want to keep it?", source));
64 switch (ed.showDialog().getValue()) {
65 case 1:
66 continue SOURCES;
67 case 2:
68 sourcesToRemove.add(i);
69 continue SOURCES;
70 default:
71 return false;
72 }
73 } catch (SAXException e) {
74 // We will handle this in step with validation
75 Main.trace(e);
76 }
77
78 String errorMessage = null;
79
80 try {
81 TaggingPresetReader.readAll(source.url, true);
82 } catch (IOException e) {
83 // Should not happen, but at least show message
84 String msg = tr("Could not read tagging preset source {0}", source);
85 Main.error(e, msg);
86 JOptionPane.showMessageDialog(Main.parent, msg);
87 return false;
88 } catch (SAXParseException e) {
89 if (canLoad) {
90 errorMessage = tr("<html>Tagging preset source {0} can be loaded but it contains errors. " +
91 "Do you really want to use it?<br><br><table width=600>Error is: [{1}:{2}] {3}</table></html>",
92 source, e.getLineNumber(), e.getColumnNumber(), Utils.escapeReservedCharactersHTML(e.getMessage()));
93 } else {
94 errorMessage = tr("<html>Unable to parse tagging preset source: {0}. " +
95 "Do you really want to use it?<br><br><table width=400>Error is: [{1}:{2}] {3}</table></html>",
96 source, e.getLineNumber(), e.getColumnNumber(), Utils.escapeReservedCharactersHTML(e.getMessage()));
97 }
98 Main.warn(e, errorMessage);
99 } catch (SAXException e) {
100 if (canLoad) {
101 errorMessage = tr("<html>Tagging preset source {0} can be loaded but it contains errors. " +
102 "Do you really want to use it?<br><br><table width=600>Error is: {1}</table></html>",
103 source, Utils.escapeReservedCharactersHTML(e.getMessage()));
104 } else {
105 errorMessage = tr("<html>Unable to parse tagging preset source: {0}. " +
106 "Do you really want to use it?<br><br><table width=600>Error is: {1}</table></html>",
107 source, Utils.escapeReservedCharactersHTML(e.getMessage()));
108 }
109 Main.warn(e, errorMessage);
110 }
111
112 if (errorMessage != null) {
113 Main.error(errorMessage);
114 int result = JOptionPane.showConfirmDialog(Main.parent, new JLabel(errorMessage), tr("Error"),
115 JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
116
117 switch (result) {
118 case JOptionPane.YES_OPTION:
119 continue SOURCES;
120 case JOptionPane.NO_OPTION:
121 sourcesToRemove.add(i);
122 continue SOURCES;
123 default:
124 return false;
125 }
126 }
127 }
128 sources.removeSources(sourcesToRemove);
129 return true;
130 } else {
131 return true;
132 }
133 }
134 }
135
136 /**
137 * Factory used to create a new {@code TaggingPresetPreference}.
138 */
139 public static class Factory implements PreferenceSettingFactory {
140 @Override
141 public PreferenceSetting createPreferenceSetting() {
142 return new TaggingPresetPreference();
143 }
144 }
145
146 private TaggingPresetPreference() {
147 super();
148 }
149
150 private static final List<SourceProvider> presetSourceProviders = new ArrayList<>();
151
152 private SourceEditor sources;
153 private JCheckBox sortMenu;
154
155 /**
156 * Registers a new additional preset source provider.
157 * @param provider The preset source provider
158 * @return {@code true}, if the provider has been added, {@code false} otherwise
159 */
160 public static boolean registerSourceProvider(SourceProvider provider) {
161 if (provider != null)
162 return presetSourceProviders.add(provider);
163 return false;
164 }
165
166 private final ValidationListener validationListener = new TaggingPresetValidationListener();
167
168 @Override
169 public void addGui(PreferenceTabbedPane gui) {
170 sortMenu = new JCheckBox(tr("Sort presets menu alphabetically"),
171 Main.pref.getBoolean("taggingpreset.sortmenu", false));
172
173 final JPanel panel = new JPanel(new GridBagLayout());
174 panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
175 panel.add(sortMenu, GBC.eol().insets(5, 5, 5, 0));
176 sources = new TaggingPresetSourceEditor();
177 panel.add(sources, GBC.eol().fill(GBC.BOTH));
178 final MapPreference mapPref = gui.getMapPreference();
179 mapPref.addSubTab(this, tr("Tagging Presets"), panel);
180 sources.deferLoading(mapPref, panel);
181 gui.addValidationListener(validationListener);
182 }
183
184 static class TaggingPresetSourceEditor extends SourceEditor {
185
186 private static final String ICONPREF = "taggingpreset.icon.sources";
187
188 TaggingPresetSourceEditor() {
189 super(SourceType.TAGGING_PRESET, Main.getJOSMWebsite()+"/presets", presetSourceProviders, true);
190 }
191
192 @Override
193 public Collection<? extends SourceEntry> getInitialSourcesList() {
194 return PresetPrefHelper.INSTANCE.get();
195 }
196
197 @Override
198 public boolean finish() {
199 return doFinish(PresetPrefHelper.INSTANCE, ICONPREF);
200 }
201
202 @Override
203 public Collection<ExtendedSourceEntry> getDefault() {
204 return PresetPrefHelper.INSTANCE.getDefault();
205 }
206
207 @Override
208 public Collection<String> getInitialIconPathsList() {
209 return Main.pref.getCollection(ICONPREF, null);
210 }
211
212 @Override
213 public String getStr(I18nString ident) {
214 switch (ident) {
215 case AVAILABLE_SOURCES:
216 return tr("Available presets:");
217 case ACTIVE_SOURCES:
218 return tr("Active presets:");
219 case NEW_SOURCE_ENTRY_TOOLTIP:
220 return tr("Add a new preset by entering filename or URL");
221 case NEW_SOURCE_ENTRY:
222 return tr("New preset entry:");
223 case REMOVE_SOURCE_TOOLTIP:
224 return tr("Remove the selected presets from the list of active presets");
225 case EDIT_SOURCE_TOOLTIP:
226 return tr("Edit the filename or URL for the selected active preset");
227 case ACTIVATE_TOOLTIP:
228 return tr("Add the selected available presets to the list of active presets");
229 case RELOAD_ALL_AVAILABLE:
230 return marktr("Reloads the list of available presets from ''{0}''");
231 case LOADING_SOURCES_FROM:
232 return marktr("Loading preset sources from ''{0}''");
233 case FAILED_TO_LOAD_SOURCES_FROM:
234 return marktr("<html>Failed to load the list of preset sources from<br>"
235 + "''{0}''.<br>"
236 + "<br>"
237 + "Details (untranslated):<br>{1}</html>");
238 case FAILED_TO_LOAD_SOURCES_FROM_HELP_TOPIC:
239 return "/Preferences/Presets#FailedToLoadPresetSources";
240 case ILLEGAL_FORMAT_OF_ENTRY:
241 return marktr("Warning: illegal format of entry in preset list ''{0}''. Got ''{1}''");
242 default: throw new AssertionError();
243 }
244 }
245 }
246
247 @Override
248 public boolean ok() {
249 boolean restart = Main.pref.put("taggingpreset.sortmenu", sortMenu.getSelectedObjects() != null);
250 restart |= sources.finish();
251
252 return restart;
253 }
254
255 /**
256 * Helper class for tagging presets preferences.
257 */
258 public static class PresetPrefHelper extends SourceEditor.SourcePrefHelper {
259
260 /**
261 * The unique instance.
262 */
263 public static final PresetPrefHelper INSTANCE = new PresetPrefHelper();
264
265 /**
266 * Constructs a new {@code PresetPrefHelper}.
267 */
268 public PresetPrefHelper() {
269 super("taggingpreset.entries");
270 }
271
272 @Override
273 public Collection<ExtendedSourceEntry> getDefault() {
274 ExtendedSourceEntry i = new ExtendedSourceEntry("defaultpresets.xml", "resource://data/defaultpresets.xml");
275 i.title = tr("Internal Preset");
276 i.description = tr("The default preset for JOSM");
277 return Collections.singletonList(i);
278 }
279
280 @Override
281 public Map<String, String> serialize(SourceEntry entry) {
282 Map<String, String> res = new HashMap<>();
283 res.put("url", entry.url);
284 res.put("title", entry.title == null ? "" : entry.title);
285 return res;
286 }
287
288 @Override
289 public SourceEntry deserialize(Map<String, String> s) {
290 return new SourceEntry(s.get("url"), null, s.get("title"), true);
291 }
292 }
293
294 @Override
295 public boolean isExpert() {
296 return false;
297 }
298
299 @Override
300 public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
301 return gui.getMapPreference();
302 }
303}
Note: See TracBrowser for help on using the repository browser.