// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.tageditor.tagspec;
import java.util.ArrayList;
import java.util.List;
import org.openstreetmap.josm.plugins.tageditor.ac.AutoCompletionContext;
/**
* A TagSpecifications specifies a tag. The specifications consists of the following
* elements:
* <ul>
* <li>the <strong>key</strong> the of the tag</li>
* <li>the <strong>type</strong> of the tag</li>
* <li>whether the tag is applicable to a node, a way or a relation</li>
* </ul>
* @author Gubaer
*
*/
public class TagSpecification {
/** the key of the tag */
private String key;
/** the type of the tag */
private String type;
/** the type of the tag */
private boolean applicableToNode = true;
private boolean applicableToWay = true;
private boolean applicableToRelation = true;
private ArrayList<LabelSpecification> lables = null;
/**
* constructor
*/
public TagSpecification() {
lables = new ArrayList<>();
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("<TagSpecification ");
builder.append("key=\"").append(key).append("\"").append(", ");
builder.append("type=\"").append(type).append("\"").append(", ");
builder.append("applicable-to-node=\"").append(applicableToNode).append("\"").append(", ");
builder.append("applicable-to-way=\"").append(applicableToWay).append("\"").append(", ");
builder.append("applicable-to-relation=\"").append(applicableToRelation).append("\"");
builder.append(" />");
return builder.toString();
}
/**
* @return th e list of predefined labels for this tag; an empty list if no
* labels are defined
*/
public List<LabelSpecification> getLables() {
return lables;
}
/**
* sets the list of lables for this tag specification
*
* @param lables the list of lables; must not be null
* @exception IllegalArgumentException thrown, if lables is null
*/
public void setLables(List<LabelSpecification> lables) throws IllegalArgumentException {
if (lables == null)
throw new IllegalArgumentException("argument 'lables' must not be null");
this.lables.clear();
for (LabelSpecification l : lables) {
this.lables.add(l);
}
}
/**
* Adds a label to the list of label for this tag specification. The label
* is only added if i
*
* @param lable the lalbe to add; must not be null
* @exception IllegalArgumentException thrown, if lable is null
*/
public void addLable(LabelSpecification lable) throws IllegalArgumentException {
if (lable == null)
throw new IllegalArgumentException("argument 'lable' must not be null");
if (!this.lables.contains(lable)) {
this.lables.add(lable);
}
}
public boolean isApplicable(AutoCompletionContext context) {
boolean ret = false;
if (context.isSelectionEmpty()) {
ret = true;
} else {
ret = ret || (applicableToNode && context.isSelectionIncludesNodes());
ret = ret || (applicableToWay && context.isSelectionIncludesWays());
ret = ret || (applicableToRelation && context.isSelectionIncludesRelations());
}
return ret;
}
/* --------------------------------------------------------------------------- */
/* setters/getters */
/* --------------------------------------------------------------------------- */
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isApplicableToNode() {
return applicableToNode;
}
public void setApplicableToNode(boolean applicableToNode) {
this.applicableToNode = applicableToNode;
}
public boolean isApplicableToWay() {
return applicableToWay;
}
public void setApplicableToWay(boolean applicableToWay) {
this.applicableToWay = applicableToWay;
}
public boolean isApplicableToRelation() {
return applicableToRelation;
}
public void setApplicableToRelation(boolean applicableToRelation) {
this.applicableToRelation = applicableToRelation;
}
}