diff --git a/resources/data/tagging-preset.xsd b/resources/data/tagging-preset.xsd index 097224b111f..e4984676d27 100644 --- a/resources/data/tagging-preset.xsd +++ b/resources/data/tagging-preset.xsd @@ -121,7 +121,7 @@ - Every item is one annotation set to select from. name is required, type and preset_name_label are recommended, icon and name_template are optional attributes. + Every item is one annotation set to select from. name is required, type and preset_name_label are recommended, deprecated, icon, name_template are optional attributes. @@ -171,6 +171,13 @@ + + + + Whether this preset is deprecated (defaults to "false"). + + + diff --git a/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java b/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java index 6ee399c0657..e909f671b70 100644 --- a/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java +++ b/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java @@ -131,6 +131,7 @@ public class TagChecker extends TagTest implements TaggingPresetListener { * The preference key to check presets */ public static final String PREF_CHECK_PRESETS_TYPES = PREFIX + ".checkPresetsTypes"; + public static final String PREF_CHECK_DEPRECATED = PREFIX + ".checkDeprecated"; /** * The preference key for source files @@ -159,6 +160,7 @@ public class TagChecker extends TagTest implements TaggingPresetListener { * The preference key to search for presets - used before upload */ public static final String PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD = PREF_CHECK_PRESETS_TYPES + BEFORE_UPLOAD; + public static final String PREF_CHECK_DEPRECATED_BEFORE_UPLOAD = PREF_CHECK_DEPRECATED + BEFORE_UPLOAD; /** * The preference key for the list of tag keys that are allowed to be the same on a multipolygon and an outer way @@ -175,18 +177,21 @@ public class TagChecker extends TagTest implements TaggingPresetListener { protected boolean checkComplex; protected boolean checkFixmes; protected boolean checkPresetsTypes; + protected boolean checkDeprecated; protected JCheckBox prefCheckKeys; protected JCheckBox prefCheckValues; protected JCheckBox prefCheckComplex; protected JCheckBox prefCheckFixmes; protected JCheckBox prefCheckPresetsTypes; + protected JCheckBox prefCheckDeprecated; protected JCheckBox prefCheckKeysBeforeUpload; protected JCheckBox prefCheckValuesBeforeUpload; protected JCheckBox prefCheckComplexBeforeUpload; protected JCheckBox prefCheckFixmesBeforeUpload; protected JCheckBox prefCheckPresetsTypesBeforeUpload; + protected JCheckBox prefCheckDeprecatedBeforeUpload; // CHECKSTYLE.OFF: SingleSpaceSeparator protected static final int EMPTY_VALUES = 1200; @@ -210,6 +215,7 @@ public class TagChecker extends TagTest implements TaggingPresetListener { protected static final int MULTIPOLYGON_INCOMPLETE = 1219; protected static final int MULTIPOLYGON_MAYBE_NO_AREA = 1220; protected static final int MULTIPOLYGON_SAME_TAG_ON_OUTER = 1221; + protected static final int DEPRECATED_TAG = 1223; // CHECKSTYLE.ON: SingleSpaceSeparator protected EditableList sourcesList; @@ -654,15 +660,22 @@ public void check(OsmPrimitive p) { checkMultipolygonTags(p); } + final Collection matchingPresets; + TagMap tags = p.getKeys(); + if (checkPresetsTypes || checkDeprecated) { + matchingPresets = presetIndex.entrySet().stream() + .filter(e -> TaggingPresetItem.matches(e.getValue(), tags)) + .map(Entry::getKey) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } else { + matchingPresets = null; + } if (checkPresetsTypes) { - TagMap tags = p.getKeys(); + TaggingPresetType presetType = TaggingPresetType.forPrimitive(p); EnumSet presetTypes = EnumSet.of(presetType); - Collection matchingPresets = presetIndex.entrySet().stream() - .filter(e -> TaggingPresetItem.matches(e.getValue(), tags)) - .map(Entry::getKey) - .collect(Collectors.toCollection(LinkedHashSet::new)); + Collection matchingPresetsOK = matchingPresets.stream().filter( tp -> tp.typeMatches(presetTypes)).collect(Collectors.toList()); Collection matchingPresetsKO = matchingPresets.stream().filter( @@ -687,6 +700,18 @@ public void check(OsmPrimitive p) { } } } + if (checkDeprecated) { + for (TaggingPreset preset : matchingPresets) { + if (preset.deprecated()) { + errors.add(TestError.builder(this, Severity.ERROR, DEPRECATED_TAG) + .message(tr("Preset is deprecated"), + marktr("Preset {0} should not be used"), + tr(preset.getName())) + .primitives(p) + .build()); + } + } + } } private static final Collection NO_AREA_KEYS = Arrays.asList("name", "area", "ref", "access", "operator"); @@ -1099,6 +1124,11 @@ public void startTest(ProgressMonitor monitor) { if (isBeforeUpload) { checkPresetsTypes = checkPresetsTypes && Config.getPref().getBoolean(PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD, true); } + + checkDeprecated = includeOtherSeverity && Config.getPref().getBoolean(PREF_CHECK_DEPRECATED, true); + if (isBeforeUpload) { + checkDeprecated = checkDeprecated && Config.getPref().getBoolean(PREF_CHECK_DEPRECATED_BEFORE_UPLOAD, true); + } deprecatedChecker = OsmValidator.getTest(MapCSSTagChecker.class); ignoreForOuterMPSameTagCheck.addAll(Config.getPref().getList(PREF_KEYS_IGNORE_OUTER_MP_SAME_TAG, Collections.emptyList())); } @@ -1111,7 +1141,7 @@ public void endTest() { @Override public void visit(Collection selection) { - if (checkKeys || checkValues || checkComplex || checkFixmes || checkPresetsTypes) { + if (checkKeys || checkValues || checkComplex || checkFixmes || checkPresetsTypes || checkDeprecated) { super.visit(selection); } } @@ -1176,6 +1206,14 @@ public void addGui(JPanel testPanel) { prefCheckPresetsTypesBeforeUpload = new JCheckBox(); prefCheckPresetsTypesBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD, true)); testPanel.add(prefCheckPresetsTypesBeforeUpload, a); + + prefCheckDeprecated = new JCheckBox(tr("Check for deprecated tags"), Config.getPref().getBoolean(PREF_CHECK_DEPRECATED, true)); + prefCheckDeprecated.setToolTipText(tr("Check whether the preset is deprecated")); + testPanel.add(prefCheckDeprecated, GBC.std().insets(20, 0, 0, 0)); + + prefCheckDeprecatedBeforeUpload = new JCheckBox(); + prefCheckDeprecatedBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_DEPRECATED_BEFORE_UPLOAD, true)); + testPanel.add(prefCheckDeprecatedBeforeUpload, a); } /** @@ -1198,11 +1236,13 @@ public boolean ok() { Config.getPref().putBoolean(PREF_CHECK_KEYS, prefCheckKeys.isSelected()); Config.getPref().putBoolean(PREF_CHECK_FIXMES, prefCheckFixmes.isSelected()); Config.getPref().putBoolean(PREF_CHECK_PRESETS_TYPES, prefCheckPresetsTypes.isSelected()); + Config.getPref().putBoolean(PREF_CHECK_DEPRECATED, prefCheckDeprecated.isSelected()); Config.getPref().putBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, prefCheckValuesBeforeUpload.isSelected()); Config.getPref().putBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, prefCheckComplexBeforeUpload.isSelected()); Config.getPref().putBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, prefCheckKeysBeforeUpload.isSelected()); Config.getPref().putBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, prefCheckFixmesBeforeUpload.isSelected()); Config.getPref().putBoolean(PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD, prefCheckPresetsTypesBeforeUpload.isSelected()); + Config.getPref().putBoolean(PREF_CHECK_DEPRECATED_BEFORE_UPLOAD, prefCheckDeprecatedBeforeUpload.isSelected()); return Config.getPref().putList(PREF_SOURCES, sourcesList.getItems()); } diff --git a/src/org/openstreetmap/josm/gui/dialogs/SearchDialog.java b/src/org/openstreetmap/josm/gui/dialogs/SearchDialog.java index 444f4e90d6d..415bde8c4b8 100644 --- a/src/org/openstreetmap/josm/gui/dialogs/SearchDialog.java +++ b/src/org/openstreetmap/josm/gui/dialogs/SearchDialog.java @@ -231,7 +231,7 @@ public boolean isValid() { * selected preset by the user. Every query is of the form ' group/sub-group/.../presetName' * if the corresponding group of the preset exists, otherwise it is simply ' presetName'. */ - selector = new TaggingPresetSelector(false, false); + selector = new TaggingPresetSelector(); selector.setBorder(BorderFactory.createTitledBorder(tr("Search by preset"))); selector.setDblClickListener(ev -> setPresetDblClickListener(selector, editorComponent)); diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/PresetSearchFilter.java b/src/org/openstreetmap/josm/gui/tagging/presets/PresetSearchFilter.java new file mode 100644 index 00000000000..6a548a25758 --- /dev/null +++ b/src/org/openstreetmap/josm/gui/tagging/presets/PresetSearchFilter.java @@ -0,0 +1,37 @@ +// License: GPL. For details, see LICENSE file. +package org.openstreetmap.josm.gui.tagging.presets; + +import static org.openstreetmap.josm.tools.I18n.marktr; + +/** + * This enum defines different filters for searching presets. + */ +public enum PresetSearchFilter { + ONLY_APPLICABLE(marktr("Show only applicable to selection")), + SEARCH_IN_TAGS(marktr("Search in tags")), + DEPRECATED_TAGS(marktr("Show deprecated tags")); + + /** + * The translated text associated with the enum constant. + */ + private final String textToBeTranslated; + + /** + * Constructor for the PresetSearchFilter enum. + * Initializes an enum constant with its corresponding translated text. + * + * @param textToBeTranslated The translated text associated with the enum constant. + */ + PresetSearchFilter(String textToBeTranslated) { + this.textToBeTranslated = textToBeTranslated; + } + + /** + * Returns the text associated with the filter + * @return the text marked for translation + */ + public String getText() { + return textToBeTranslated; + } + +} diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java index d154158093d..5b3d3d69f0f 100644 --- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java +++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java @@ -136,6 +136,10 @@ public class TaggingPreset extends AbstractAction implements ActiveLayerChangeLi * Show the preset name if true */ public boolean preset_name_label; + /** + * True if the preset is deprecated + */ + private boolean deprecated; /** * The types as preparsed collection. @@ -349,6 +353,23 @@ public void setMatch_expression(String filter) throws SAXException { } } + /** + * @return true if the preset is deprecated + * @apiNote this is not {@code isDeprecated} just in case we decide to make {@link TaggingPreset} a record class. + * @since xxx + */ + public final boolean deprecated() { + return this.deprecated; + } + + /** + * Set if the preset is deprecated + * @param deprecated if true the preset is deprecated + */ + public final void setDeprecated(boolean deprecated) { + this.deprecated = deprecated; + } + private static class PresetPanel extends JPanel { private boolean hasElements; diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchDialog.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchDialog.java index 9564f699a5c..c3dd2c81636 100644 --- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchDialog.java +++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchDialog.java @@ -34,7 +34,8 @@ private TaggingPresetSearchDialog() { super(MainApplication.getMainFrame(), tr("Search presets"), tr("Select"), tr("Cancel")); setButtonIcons("dialogs/search", "cancel"); configureContextsensitiveHelp("/Action/TaggingPresetSearch", true /* show help button */); - selector = new TaggingPresetSelector(true, true); + selector = new TaggingPresetSelector(PresetSearchFilter.ONLY_APPLICABLE, PresetSearchFilter.SEARCH_IN_TAGS, + PresetSearchFilter.DEPRECATED_TAGS); setContent(selector, false); SelectionEventManager.getInstance().addSelectionListener(selector); selector.setDblClickListener(e -> buttonAction(0, null)); diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java index 41e7ecde8a9..3f42b9cce1a 100644 --- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java +++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java @@ -67,7 +67,7 @@ public static synchronized TaggingPresetSearchPrimitiveDialog getInstance() { super(MainApplication.getMainFrame(), tr("Search for objects by preset"), tr("Search"), tr("Cancel")); setButtonIcons("dialogs/search", "cancel"); configureContextsensitiveHelp("/Action/TaggingPresetSearchPrimitive", true /* show help button */); - selector = new TaggingPresetSelector(false, false); + selector = new TaggingPresetSelector(); setContent(selector, false); selector.setDblClickListener(e -> buttonAction(0, null)); } diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java index 52df95edfa8..4ec09fa939d 100644 --- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java +++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java @@ -10,11 +10,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.EnumMap; import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.regex.Pattern; @@ -38,7 +40,6 @@ import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.OsmDataManager; import org.openstreetmap.josm.data.osm.OsmPrimitive; -import org.openstreetmap.josm.data.preferences.BooleanProperty; import org.openstreetmap.josm.gui.MainApplication; import org.openstreetmap.josm.gui.tagging.presets.items.ComboMultiSelect; import org.openstreetmap.josm.gui.tagging.presets.items.Key; @@ -51,7 +52,7 @@ import org.openstreetmap.josm.tools.Utils; /** - * GUI component to select tagging preset: the list with filter and two checkboxes + * GUI component to select tagging preset: the list with filter and three checkboxes * @since 6068 */ public class TaggingPresetSelector extends SearchTextResultListPanel @@ -64,11 +65,15 @@ public class TaggingPresetSelector extends SearchTextResultListPanel ckpreferences = new EnumMap<>(PresetSearchFilter.class); + { + //initial value of the checkboxes + ckpreferences.put(PresetSearchFilter.ONLY_APPLICABLE, true); + ckpreferences.put(PresetSearchFilter.SEARCH_IN_TAGS, true); + ckpreferences.put(PresetSearchFilter.DEPRECATED_TAGS, false); + } - private final JCheckBox ckOnlyApplicable; - private final JCheckBox ckSearchInTags; + final Map checkboxes = new EnumMap<>(PresetSearchFilter.class); private final Set typesInSelection = EnumSet.noneOf(TaggingPresetType.class); private boolean typesInSelectionDirty = true; private final transient PresetClassifications classifications = new PresetClassifications(); @@ -201,6 +206,14 @@ public String toString() { * @param displaySearchInTags if {@code true} display "Search in tags" checkbox */ public TaggingPresetSelector(boolean displayOnlyApplicable, boolean displaySearchInTags) { + this(displayOnlyApplicable ? PresetSearchFilter.ONLY_APPLICABLE : null, displaySearchInTags ? PresetSearchFilter.SEARCH_IN_TAGS : null); + } + + /** + * Called from the {@code TaggingPresetConstructor}. + * + */ + public TaggingPresetSelector(PresetSearchFilter... options) { super(); lsResult.setCellRenderer(new ResultListCellRenderer()); classifications.loadPresets(TaggingPresets.getTaggingPresets()); @@ -209,23 +222,28 @@ public TaggingPresetSelector(boolean displayOnlyApplicable, boolean displaySearc JPanel pnChecks = new JPanel(); pnChecks.setLayout(new BoxLayout(pnChecks, BoxLayout.Y_AXIS)); - if (displayOnlyApplicable) { - ckOnlyApplicable = new JCheckBox(); - ckOnlyApplicable.setText(tr("Show only applicable to selection")); - pnChecks.add(ckOnlyApplicable); - ckOnlyApplicable.addItemListener(e -> filterItems()); - } else { - ckOnlyApplicable = null; - } - - if (displaySearchInTags) { - ckSearchInTags = new JCheckBox(); - ckSearchInTags.setText(tr("Search in tags")); - ckSearchInTags.setSelected(SEARCH_IN_TAGS.get()); - ckSearchInTags.addItemListener(e -> filterItems()); - pnChecks.add(ckSearchInTags); - } else { - ckSearchInTags = null; + for (PresetSearchFilter option : options) { + final JCheckBox box = new JCheckBox(); + box.setText(tr(option.getText())); + pnChecks.add(box); + box.addItemListener(e -> filterItems()); + switch(option) { + case ONLY_APPLICABLE: { + box.setSelected(ckpreferences.get(PresetSearchFilter.ONLY_APPLICABLE)); + checkboxes.put(PresetSearchFilter.ONLY_APPLICABLE, box); + break; + } + case SEARCH_IN_TAGS: { + box.setSelected(ckpreferences.get(PresetSearchFilter.SEARCH_IN_TAGS)); + checkboxes.put(PresetSearchFilter.SEARCH_IN_TAGS, box); + break; + } + case DEPRECATED_TAGS: { + box.setSelected((ckpreferences.get(PresetSearchFilter.DEPRECATED_TAGS))); + checkboxes.put(PresetSearchFilter.DEPRECATED_TAGS, box); + break; + } + } } add(pnChecks, BorderLayout.SOUTH); @@ -252,13 +270,17 @@ public void actionPerformed(ActionEvent ae) { protected synchronized void filterItems() { //TODO Save favorites to file String text = edSearchText.getText().toLowerCase(Locale.ENGLISH); - boolean onlyApplicable = ckOnlyApplicable != null && ckOnlyApplicable.isSelected(); - boolean inTags = ckSearchInTags != null && ckSearchInTags.isSelected(); + boolean onlyApplicable = checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE) != null && + checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE).isSelected(); + boolean deprecatedTags = checkboxes.get(PresetSearchFilter.DEPRECATED_TAGS) != null && + checkboxes.get(PresetSearchFilter.DEPRECATED_TAGS).isSelected(); + boolean searchInTags = checkboxes.get(PresetSearchFilter.SEARCH_IN_TAGS) != null && + checkboxes.get(PresetSearchFilter.SEARCH_IN_TAGS).isSelected(); DataSet ds = OsmDataManager.getInstance().getEditDataSet(); Collection selected = (ds == null) ? Collections.emptyList() : ds.getSelected(); final List result = classifications.getMatchingPresets( - text, onlyApplicable, inTags, getTypesInSelection(), selected); + text, onlyApplicable, searchInTags, deprecatedTags, getTypesInSelection(), selected); final TaggingPreset oldPreset = getSelectedPreset(); lsResultModel.setItems(Utils.transform(result, x -> x.preset)); @@ -279,7 +301,7 @@ public static class PresetClassifications implements Iterable classifications = new ArrayList<>(); - public List getMatchingPresets(String searchText, boolean onlyApplicable, boolean inTags, + public List getMatchingPresets(String searchText, boolean onlyApplicable, boolean inTags, boolean isDeprecated, Set presetTypes, final Collection selectedPrimitives) { final String[] groupWords; final String[] nameWords; @@ -292,11 +314,11 @@ public List getMatchingPresets(String searchText, boolean nameWords = searchText.split("\\s", -1); } - return getMatchingPresets(groupWords, nameWords, onlyApplicable, inTags, presetTypes, selectedPrimitives); + return getMatchingPresets(groupWords, nameWords, onlyApplicable, inTags, isDeprecated, presetTypes, selectedPrimitives); } - public List getMatchingPresets(String[] groupWords, String[] nameWords, boolean onlyApplicable, - boolean inTags, Set presetTypes, final Collection selectedPrimitives) { + public List getMatchingPresets(String[] groupWords, String[] nameWords, boolean onlyApplicable, boolean inTags, + boolean isDeprecated, Set presetTypes, final Collection selectedPrimitives) { final List result = new ArrayList<>(); for (PresetClassification presetClassification : classifications) { @@ -317,6 +339,11 @@ public List getMatchingPresets(String[] groupWords, String } } + //do not show the preset in search dialog if isDeprecated is true and preset is deprecated + if (!isDeprecated && preset.deprecated()) { + continue; + } + if (groupWords != null && presetClassification.isMatchingGroup(groupWords) == 0) { continue; } @@ -397,9 +424,10 @@ public void selectionChanged(SelectionChangeEvent event) { @Override public synchronized void init() { - if (ckOnlyApplicable != null) { - ckOnlyApplicable.setEnabled(!getTypesInSelection().isEmpty()); - ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get()); + if (checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE) != null) { + checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE).setEnabled(!getTypesInSelection().isEmpty()); + checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE).setSelected(!getTypesInSelection().isEmpty() && + ckpreferences.get(PresetSearchFilter.ONLY_APPLICABLE)); } super.init(); } @@ -418,11 +446,14 @@ public void init(Collection presets) { * Save checkbox values in preferences for future reuse */ public void savePreferences() { - if (ckSearchInTags != null) { - SEARCH_IN_TAGS.put(ckSearchInTags.isSelected()); + if (checkboxes.get(PresetSearchFilter.SEARCH_IN_TAGS) != null) { + ckpreferences.put(PresetSearchFilter.SEARCH_IN_TAGS, checkboxes.get(PresetSearchFilter.SEARCH_IN_TAGS).isSelected()); + } + if (checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE) != null && checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE).isEnabled()) { + ckpreferences.put(PresetSearchFilter.ONLY_APPLICABLE, checkboxes.get(PresetSearchFilter.ONLY_APPLICABLE).isSelected()); } - if (ckOnlyApplicable != null && ckOnlyApplicable.isEnabled()) { - ONLY_APPLICABLE.put(ckOnlyApplicable.isSelected()); + if (checkboxes.get(PresetSearchFilter.DEPRECATED_TAGS) != null && checkboxes.get(PresetSearchFilter.DEPRECATED_TAGS).isEnabled()) { + ckpreferences.put(PresetSearchFilter.DEPRECATED_TAGS, checkboxes.get(PresetSearchFilter.DEPRECATED_TAGS).isSelected()); } } diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetValidation.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetValidation.java index 1bae43cc854..724eea90ae4 100644 --- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetValidation.java +++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetValidation.java @@ -24,7 +24,9 @@ import org.openstreetmap.josm.data.validation.TestError; import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker; import org.openstreetmap.josm.data.validation.tests.OpeningHourTest; +import org.openstreetmap.josm.data.validation.tests.TagChecker; import org.openstreetmap.josm.gui.MainApplication; +import org.openstreetmap.josm.gui.progress.NullProgressMonitor; import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.tools.Logging; import org.openstreetmap.josm.tools.SubclassFilteredCollection; @@ -55,11 +57,15 @@ static void validate(OsmPrimitive primitive, JLabel validationLabel) { try { MapCSSTagChecker mapCSSTagChecker = OsmValidator.getTest(MapCSSTagChecker.class); OpeningHourTest openingHourTest = OsmValidator.getTest(OpeningHourTest.class); - OsmValidator.initializeTests(Arrays.asList(mapCSSTagChecker, openingHourTest)); + TagChecker tagChecker = OsmValidator.getTest(TagChecker.class); + tagChecker.startTest(NullProgressMonitor.INSTANCE); //since initializeTest works if test is enabled + OsmValidator.initializeTests(Arrays.asList(mapCSSTagChecker, openingHourTest, tagChecker)); List errors = new ArrayList<>(); openingHourTest.addErrorsForPrimitive(primitive, errors); errors.addAll(mapCSSTagChecker.getErrorsForPrimitive(primitive, ValidatorPrefHelper.PREF_OTHER.get())); + tagChecker.check(primitive); + errors.addAll(tagChecker.getErrors()); boolean visible = !errors.isEmpty(); String toolTipText = "" + Utils.joinAsHtmlUnorderedList(Utils.transform(errors, e -> diff --git a/test/unit/org/openstreetmap/josm/gui/tagging/presets/PresetClassificationsTest.java b/test/unit/org/openstreetmap/josm/gui/tagging/presets/PresetClassificationsTest.java index eba467c4f43..9def4aa64d4 100644 --- a/test/unit/org/openstreetmap/josm/gui/tagging/presets/PresetClassificationsTest.java +++ b/test/unit/org/openstreetmap/josm/gui/tagging/presets/PresetClassificationsTest.java @@ -42,7 +42,7 @@ public static void setUp() throws IOException, SAXException { } private List getMatchingPresets(String searchText, OsmPrimitive w) { - return classifications.getMatchingPresets(searchText, true, true, EnumSet.of(TaggingPresetType.forPrimitive(w)), + return classifications.getMatchingPresets(searchText, true, true, true, EnumSet.of(TaggingPresetType.forPrimitive(w)), Collections.singleton(w)); }