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    }