// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.tageditor.preset;
import static org.openstreetmap.josm.tools.I18n.tr;
import static org.openstreetmap.josm.tools.I18n.trc;
import java.util.ArrayList;
import java.util.Collection;
import org.openstreetmap.josm.data.osm.Tag;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
import org.openstreetmap.josm.gui.tagging.presets.items.Optional;
public class AdvancedTag extends Tag {
private String displayName;
private boolean optional = false;
public AdvancedTag() {
}
public AdvancedTag(String key, String value) {
super(key, value);
}
public AdvancedTag(String key) {
super(key);
}
public AdvancedTag(Tag tag) {
super(tag);
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public boolean isOptional() {
return optional;
}
public void setOptional(boolean optional) {
this.optional = optional;
}
public static Collection<AdvancedTag> forTaggingPreset(TaggingPreset preset) {
Collection<AdvancedTag> result = new ArrayList<>();
boolean isOptional = false;
for (TaggingPresetItem item : preset.data) {
if (item instanceof KeyedItem) {
KeyedItem ki = (KeyedItem) item;
for (String value : ki.getValues()) {
AdvancedTag tag = new AdvancedTag(ki.key, value);
tag.setOptional(isOptional);
if (ki.text != null) {
if (ki.text_context != null) {
tag.setDisplayName(trc(ki.text_context, ki.text));
} else {
tag.setDisplayName(tr(ki.text));
}
}
result.add(tag);
}
} else if (item instanceof Optional) {
isOptional = true;
}
// TODO optional stuff is not perfect: all items found after an optional item will be considered as optional
// even if they are outside the <optional> element.
// We can't easily access this information. The plugin previously reimplemented a lot of JOSM code to determine that.
// This duplicated code has been stripped off. It's not really important as optional items are almost always
// located at the end of an item.
}
return result;
}
}