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.Main; 010import org.openstreetmap.josm.data.osm.OsmPrimitive; 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 Main.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(OsmPrimitive 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 { 063 continue; 064 } 065 } else if (t.matches(type, primitive.getKeys(), false)) { 066 return t; 067 } 068 } 069 } 070 } 071 return null; 072 } 073 074 @Override 075 public void taggingPresetsModified() { 076 buildPresetsWithPattern(); 077 } 078}