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}