001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.tools; 003 004import java.util.Collection; 005import java.util.Collections; 006import java.util.LinkedList; 007import java.util.List; 008 009import org.openstreetmap.josm.data.osm.OsmPrimitive; 010import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference; 011import org.openstreetmap.josm.gui.tagging.TaggingPreset; 012import org.openstreetmap.josm.gui.tagging.TaggingPresetType; 013 014/** 015 * List of tagging presets with name templates, allows to find appropriate template based on existing primitive 016 */ 017public final 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<TaggingPresetType> type = Collections.singleton(TaggingPresetType.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}