package org.activityinfo.ui.client.pageView.formClass;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gwt.user.client.ui.Widget;
import org.activityinfo.core.client.ResourceLocator;
import org.activityinfo.core.client.form.tree.AsyncFormTreeBuilder;
import org.activityinfo.core.shared.criteria.ClassCriteria;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.form.FormInstance;
import org.activityinfo.model.formTree.FormTree;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.promise.Promise;
import org.activityinfo.ui.client.component.table.FieldColumn;
import org.activityinfo.ui.client.component.table.InstanceTableView;
import org.activityinfo.ui.client.widget.DisplayWidget;
import java.util.List;
import java.util.Map;
/**
* Presents the instances of this form class as table
*/
public class TableTab implements DisplayWidget<FormInstance> {
private InstanceTableView tableView;
private FormTree formTree;
private Map<ResourceId, FieldColumn> columnMap;
private List<FieldColumn> columns;
private ResourceLocator resourceLocator;
public TableTab(ResourceLocator resourceLocator) {
this.resourceLocator = resourceLocator;
this.tableView = new InstanceTableView(resourceLocator);
}
@Override
public Promise<Void> show(FormInstance instance) {
return new AsyncFormTreeBuilder(resourceLocator)
.apply(instance.getId())
.join(new Function<FormTree, Promise<Void>>() {
@Override
public Promise<Void> apply(FormTree input) {
formTree = input;
enumerateColumns();
final Map<ResourceId, FormClass> rootFormClasses = formTree.getRootFormClasses();
tableView.setRootFormClasses(rootFormClasses.values());
tableView.setCriteria(ClassCriteria.union(rootFormClasses.keySet()));
tableView.setColumns(columns);
return Promise.done();
}
});
}
@Override
public Widget asWidget() {
return tableView.asWidget();
}
/**
* @return a list of possible FieldColumns to display
*/
private void enumerateColumns() {
columnMap = Maps.newHashMap();
columns = Lists.newArrayList();
enumerateColumns(formTree.getRootFields());
}
private void enumerateColumns(List<FormTree.Node> fields) {
for (FormTree.Node node : fields) {
if (node.isReference()) {
enumerateColumns(node.getChildren());
} else {
if (columnMap.containsKey(node.getFieldId())) {
columnMap.get(node.getFieldId()).addFieldPath(node.getPath());
} else {
FieldColumn col = new FieldColumn(node);
columnMap.put(node.getFieldId(), col);
columns.add(col);
}
}
}
}
}