package org.mdl4ui.gwt.model.client.ui;
import static org.mdl4ui.base.model.UIElementImpl.containsRec;
import java.util.List;
import org.mdl4ui.base.model.ElementType;
import org.mdl4ui.base.model.UIElementImpl;
import org.mdl4ui.fields.model.Field;
import com.github.gwtbootstrap.client.ui.ControlGroup;
import com.github.gwtbootstrap.client.ui.ControlLabel;
import com.github.gwtbootstrap.client.ui.Controls;
import com.github.gwtbootstrap.client.ui.HelpInline;
import com.github.gwtbootstrap.client.ui.Tooltip;
import com.github.gwtbootstrap.client.ui.base.ValueBoxBase;
import com.github.gwtbootstrap.client.ui.constants.ControlGroupType;
import com.github.gwtbootstrap.client.ui.constants.Trigger;
import com.google.gwt.user.client.ui.Widget;
public class FieldView implements ElementView {
private final Field field;
private final ControlGroup controlGroup;
private final HelpInline validation;
public FieldView(Field field) {
this.field = field;
Widget component = (Widget) field.getComponent();
component.getElement().setId(field.getFieldID().toString());
controlGroup = new ControlGroup();
if (!field.isLabelInline()) {
ControlLabel label = new ControlLabel(field.getLabel());
controlGroup.add(label);
}
Controls controls = new Controls();
if (field.getHelp() != null) {
Tooltip tooltip = new Tooltip(field.getHelp());
tooltip.setTrigger(Trigger.HOVER);
tooltip.add(component);
controls.add(tooltip);
} else {
controls.add(component);
}
validation = new HelpInline();
controls.add(validation);
if (field.getPlaceholder() != null && component instanceof ValueBoxBase) {
((ValueBoxBase<?>) component).setPlaceholder(field.getPlaceholder());
}
controlGroup.add(controls);
}
public Field getField() {
return field;
}
@Override
public Widget asWidget() {
return controlGroup;
}
public void updateField() {
switch (field.getState()) {
case DEFAULT:
controlGroup.setVisible(true);
controlGroup.setType(ControlGroupType.NONE);
validation.setVisible(false);
validation.setText(null);
break;
case ERROR:
controlGroup.setVisible(true);
controlGroup.setType(ControlGroupType.ERROR);
validation.setVisible(true);
validation.setText(field.getValidation().getMessage());
break;
case HIDDEN:
controlGroup.setVisible(false);
validation.setText(null);
break;
case SET:
controlGroup.setVisible(true);
controlGroup.setType(ControlGroupType.SUCCESS);
validation.setVisible(false);
validation.setText(null);
break;
}
}
@Override
public List<ElementView> childs() {
return null;
}
@Override
public ElementType elementType() {
return ElementType.FIELD;
}
@Override
public boolean contains(ElementView child) {
return containsRec(this, child);
}
@Override
public List<FieldView> fields() {
return UIElementImpl.<FieldView, ElementView> collectFields(this);
}
@Override
public List<BlockView> blocks() {
return UIElementImpl.<BlockView, ElementView> collectBlocks(this);
}
@Override
public List<GroupView> groups() {
return UIElementImpl.<GroupView, ElementView> collectGroups(this);
}
}