package org.activityinfo.ui.client.component.table;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.user.cellview.client.Column;
import org.activityinfo.core.shared.Projection;
import org.activityinfo.core.shared.criteria.Criteria;
import org.activityinfo.model.formTree.FieldPath;
import org.activityinfo.model.formTree.FormTree;
import org.activityinfo.model.type.FieldValue;
import org.activityinfo.model.type.enumerated.EnumItem;
import org.activityinfo.model.type.enumerated.EnumType;
import org.activityinfo.model.type.enumerated.EnumValue;
import org.activityinfo.model.type.number.Quantity;
import java.util.List;
import java.util.Set;
/**
* Column that displays the value of a given field
*/
public class FieldColumn extends Column<Projection, String> {
public static final String NON_BREAKING_SPACE = "\u00A0";
private FormTree.Node node;
private List<FieldPath> fieldPaths;
private String header;
private Criteria criteria;
public FieldColumn(FormTree.Node node) {
super(new TextCell());
this.node = node;
this.header = composeHeader(node);
this.fieldPaths = Lists.newArrayList(node.getPath());
}
public FieldColumn(FieldPath fieldPath, String header) {
super(new TextCell());
this.header = header;
this.fieldPaths = Lists.newArrayList(fieldPath);
}
public FieldValue getFieldValue(Projection projection) {
for (FieldPath path : fieldPaths) {
final FieldValue value = projection.getValue(path);
if (value != null) {
return value;
}
}
return null;
}
@Override
public String getValue(Projection projection) {
final FieldValue fieldValue = getFieldValue(projection);
if (fieldValue instanceof Quantity) {
Double value = ((Quantity) fieldValue).getValue();
return value.toString();
} else if (fieldValue instanceof EnumValue) {
EnumValue enumValue = (EnumValue) fieldValue;
Set<EnumItem> items = enumValue.getValuesAsItems((EnumType) node.getField().getType());
final List<String> values = Lists.newArrayList();
for (final EnumItem item : items) {
values.add(item.getLabel());
}
return Joiner.on(", ").join(values);
} else if (fieldValue != null) {
return fieldValue.toString();
}
return NON_BREAKING_SPACE;
}
public void addFieldPath(FieldPath path) {
fieldPaths.add(path);
}
public FormTree.Node getNode() {
return node;
}
public List<FieldPath> getFieldPaths() {
return fieldPaths;
}
public String getHeader() {
return header;
}
private String composeHeader(FormTree.Node node) {
if (node.getPath().isNested()) {
return node.getDefiningFormClass().getLabel() + " " + node.getField().getLabel();
} else {
return node.getField().getLabel();
}
}
public Criteria getCriteria() {
return criteria;
}
public void setCriteria(Criteria criteria) {
this.criteria = criteria;
}
@Override
public String toString() {
return "FieldColumn{" +
"header='" + header + '\'' +
", criteria=" + criteria +
'}';
}
}