001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.tagging;
003
004import java.util.ArrayList;
005import java.util.List;
006
007public class TagModel {
008
009    /** the name of the tag */
010    private String name;
011
012    /** the list of values */
013    private List<String> values;
014
015    /**
016     * constructor
017     */
018    public TagModel() {
019        values = new ArrayList<>();
020        setName("");
021        setValue("");
022    }
023
024    /**
025     * constructor
026     * @param name the tag name
027     */
028    public TagModel(String name) {
029        this();
030        setName(name);
031    }
032
033    /**
034     * constructor
035     *
036     * @param name the tag name
037     * @param value the tag value
038     */
039    public TagModel(String name, String value) {
040        this();
041        setName(name);
042        setValue(value);
043    }
044
045    /**
046     * sets the name. Converts name to "" if null.
047     * @param name the tag name
048     */
049    public final void setName(String name) {
050        name = (name == null) ? "" : name;
051        this.name = name;
052    }
053
054    /**
055     * @return the tag name
056     */
057    public String getName() {
058        return name;
059    }
060
061    /**
062     * removes all values from the list of values
063     */
064    public void clearValues() {
065        this.values.clear();
066    }
067
068    /**
069     * sets a unique value for this tag. Converts value to "", if null.
070     * @param value the value.
071     */
072    public final void setValue(String value) {
073        value = (value == null) ? "" : value;
074        clearValues();
075        this.values.add(value);
076    }
077
078    /**
079     *
080     * @param value the value to be checked; converted to "" if null
081     * @return true, if the values of this tag include <code>value</code>; false otherwise
082     */
083    public boolean hasValue(String value) {
084        value = (value == null) ? "" : value;
085        return values.contains(value);
086    }
087
088    public void addValue(String value) {
089        value = (value == null) ? "" : value;
090        if (hasValue(value)) {
091            return;
092        }
093        values.add(value);
094    }
095
096    /**
097     * removes a value from the list of values. Converts value to "" if null
098     * @param value the value
099     */
100    public void removeValue(String value) {
101        value = (value == null) ? "" : value;
102        values.remove(value);
103    }
104
105    public List<String> getValues() {
106        return values;
107    }
108
109    public String getValue() {
110        if (getValueCount() == 0) {
111            return "";
112        } else if (getValueCount() == 1) {
113            return values.get(0);
114        } else {
115            StringBuilder sb = new StringBuilder();
116            for (int i = 0; i < values.size(); i++) {
117                sb.append(values.get(i));
118                if (i + 1 < values.size()) {
119                    sb.append(';');
120                }
121            }
122            return sb.toString();
123        }
124    }
125
126    public int getValueCount() {
127        return values.size();
128    }
129}