001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.tagging.presets; 003 004import java.util.Collection; 005import java.util.EnumSet; 006import java.util.LinkedList; 007import java.util.List; 008 009import org.openstreetmap.josm.data.osm.IPrimitive; 010import org.openstreetmap.josm.tools.Logging; 011 012/** 013 * List of tagging presets with name templates, allows to find appropriate template based on existing primitive 014 */ 015public final class TaggingPresetNameTemplateList implements TaggingPresetListener { 016 017 private static TaggingPresetNameTemplateList instance; 018 019 private final List<TaggingPreset> presetsWithPattern = new LinkedList<>(); 020 021 /** 022 * Replies the unique instance. 023 * @return the unique instance 024 */ 025 public static synchronized TaggingPresetNameTemplateList getInstance() { 026 if (instance == null) { 027 instance = new TaggingPresetNameTemplateList(); 028 TaggingPresets.addListener(instance); 029 } 030 return instance; 031 } 032 033 private TaggingPresetNameTemplateList() { 034 buildPresetsWithPattern(); 035 } 036 037 private void buildPresetsWithPattern() { 038 synchronized (this) { 039 Logging.debug("Building list of presets with name template"); 040 presetsWithPattern.clear(); 041 for (TaggingPreset tp : TaggingPresets.getTaggingPresets()) { 042 if (tp.nameTemplate != null) { 043 presetsWithPattern.add(tp); 044 } 045 } 046 } 047 } 048 049 /** 050 * Finds and returns the first occurence of preset with template name matching the given primitive 051 * @param primitive The primitive to match 052 * @return the first occurence of preset with template name matching the primitive 053 */ 054 public TaggingPreset findPresetTemplate(IPrimitive primitive) { 055 synchronized (this) { 056 for (TaggingPreset t : presetsWithPattern) { 057 Collection<TaggingPresetType> type = EnumSet.of(TaggingPresetType.forPrimitive(primitive)); 058 if (t.typeMatches(type)) { 059 if (t.nameTemplateFilter != null) { 060 if (t.nameTemplateFilter.match(primitive)) 061 return t; 062 } else if (t.matches(type, primitive.getKeys(), false)) { 063 return t; 064 } 065 } 066 } 067 } 068 return null; 069 } 070 071 @Override 072 public void taggingPresetsModified() { 073 buildPresetsWithPattern(); 074 } 075}