package org.activityinfo.ui.client.component.form.field.hierarchy;
import com.google.common.base.Function;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import org.activityinfo.core.client.ResourceLocator;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.model.type.FieldType;
import org.activityinfo.model.type.ReferenceType;
import org.activityinfo.model.type.ReferenceValue;
import org.activityinfo.promise.Promise;
import org.activityinfo.ui.client.component.form.field.ReferenceFieldWidget;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Widget for Reference fields which presents multi-level combo boxes
*
*/
public class HierarchyFieldWidget implements ReferenceFieldWidget {
private final FlowPanel panel;
private final Map<ResourceId, LevelView> widgets = new HashMap<>();
private final Presenter presenter;
public HierarchyFieldWidget(ResourceLocator locator, Hierarchy tree,
ValueUpdater valueUpdater) {
this.panel = new FlowPanel();
for(Level level : tree.getLevels()) {
LevelWidget widget = new LevelWidget(level.getLabel());
widgets.put(level.getClassId(), widget);
this.panel.add(widget);
}
this.presenter = new Presenter(locator, tree, widgets, valueUpdater);
}
@Override
public void setReadOnly(boolean readOnly) {
for(LevelView widget : widgets.values()) {
widget.setReadOnly(readOnly);
}
}
@Override
public Promise<Void> setValue(ReferenceValue value) {
return presenter.setInitialSelection(value);
}
@Override
public void clearValue() {
presenter.setInitialSelection(ReferenceValue.EMPTY);
}
@Override
public void setType(FieldType type) {
}
@Override
public Widget asWidget() {
return panel;
}
public static Promise<HierarchyFieldWidget> create(final ResourceLocator locator,
final ReferenceType type,
final ValueUpdater valueUpdater) {
return Promise.map(type.getRange(), new Function<ResourceId, Promise<FormClass>>() {
@Nullable
@Override
public Promise<FormClass> apply(@Nullable ResourceId input) {
return locator.getFormClass(input);
}
}).then(new Function<List<FormClass>, HierarchyFieldWidget>() {
@Nullable
@Override
public HierarchyFieldWidget apply(@Nullable List<FormClass> input) {
return new HierarchyFieldWidget(locator, new Hierarchy(input), valueUpdater);
}
});
}
}