001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.tools;
003
004 import java.util.Collection;
005 import java.util.Collections;
006 import java.util.LinkedList;
007 import java.util.List;
008
009 import org.openstreetmap.josm.data.osm.OsmPrimitive;
010 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
011 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
012 import org.openstreetmap.josm.gui.tagging.TaggingPreset.PresetType;
013
014 /**
015 * List of tagging presets with name templates, allows to find appropriate template based on existing primitive
016 */
017 public class TaggingPresetNameTemplateList {
018
019 private static TaggingPresetNameTemplateList instance;
020
021 public static TaggingPresetNameTemplateList getInstance() {
022 if (instance == null) {
023 instance = new TaggingPresetNameTemplateList();
024 }
025 return instance;
026 }
027 private final List<TaggingPreset> presetsWithPattern = new LinkedList<TaggingPreset>();
028
029 private TaggingPresetNameTemplateList() {
030 if (TaggingPresetPreference.taggingPresets != null) {
031 for (TaggingPreset tp : TaggingPresetPreference.taggingPresets) {
032 if (tp.nameTemplate != null) {
033 presetsWithPattern.add(tp);
034 }
035 }
036 }
037 }
038
039 public TaggingPreset findPresetTemplate(OsmPrimitive primitive) {
040
041 for (TaggingPreset t : presetsWithPattern) {
042 Collection<PresetType> type = Collections.singleton(PresetType.forPrimitive(primitive));
043 if (t.typeMatches(type)) {
044 if (t.nameTemplateFilter != null) {
045 if (t.nameTemplateFilter.match(primitive))
046 return t;
047 else {
048 continue;
049 }
050 } else if (t.matches(type, primitive.getKeys(), false)) {
051 return t;
052 }
053 }
054 }
055 return null;
056 }
057 }