// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.tagging.presets; import java.util.Collection; import java.util.EnumSet; import java.util.LinkedList; import java.util.List; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.OsmPrimitive; /** * List of tagging presets with name templates, allows to find appropriate template based on existing primitive */ public final class TaggingPresetNameTemplateList implements TaggingPresetListener { private static TaggingPresetNameTemplateList instance; private final List<TaggingPreset> presetsWithPattern = new LinkedList<>(); /** * Replies the unique instance. * @return the unique instance */ public static synchronized TaggingPresetNameTemplateList getInstance() { if (instance == null) { instance = new TaggingPresetNameTemplateList(); TaggingPresets.addListener(instance); } return instance; } private TaggingPresetNameTemplateList() { buildPresetsWithPattern(); } private void buildPresetsWithPattern() { synchronized (this) { Main.debug("Building list of presets with name template"); presetsWithPattern.clear(); for (TaggingPreset tp : TaggingPresets.getTaggingPresets()) { if (tp.nameTemplate != null) { presetsWithPattern.add(tp); } } } } /** * Finds and returns the first occurence of preset with template name matching the given primitive * @param primitive The primitive to match * @return the first occurence of preset with template name matching the primitive */ public TaggingPreset findPresetTemplate(OsmPrimitive primitive) { synchronized (this) { for (TaggingPreset t : presetsWithPattern) { Collection<TaggingPresetType> type = EnumSet.of(TaggingPresetType.forPrimitive(primitive)); if (t.typeMatches(type)) { if (t.nameTemplateFilter != null) { if (t.nameTemplateFilter.match(primitive)) return t; else { continue; } } else if (t.matches(type, primitive.getKeys(), false)) { return t; } } } } return null; } @Override public void taggingPresetsModified() { buildPresetsWithPattern(); } }