package org.gwtoolbox.widget.client.form.renderer.simple;
import com.google.gwt.dom.client.Style;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import org.gwtoolbox.widget.client.form.field.FormField;
import org.gwtoolbox.widget.client.form.field.HasFields;
import org.gwtoolbox.widget.client.form.renderer.FieldsRenderer;
import org.gwtoolbox.widget.client.form.renderer.simple.hint.*;
import org.gwtoolbox.widget.client.panel.LayoutUtils;
import org.gwtoolbox.widget.client.panel.fieldset.FieldSet;
import org.gwtoolbox.widget.client.support.CssFloat;
import java.util.ArrayList;
import java.util.List;
import static org.gwtoolbox.widget.client.form.renderer.simple.hint.Hints.labelGap;
import static org.gwtoolbox.widget.client.form.renderer.simple.hint.Hints.labelOnTop;
import static org.gwtoolbox.widget.client.form.renderer.simple.hint.Hints.labelVisible;
/**
* @author Uri Boness
*/
public class SimpleFieldsRenderer implements FieldsRenderer {
private int lineGap = 15;
private int groupGap = 15;
private List<FieldGroup> fieldGroups = new ArrayList<FieldGroup>();
private Hints hints = new Hints().set(labelVisible(true), labelGap(10), labelOnTop(false));
public Widget render(HasFields fields) {
FlowPanel panel = new FlowPanel();
panel.getElement().getStyle().setPosition(Style.Position.RELATIVE);
boolean first = true;
for (FieldGroup group : fieldGroups) {
Widget groupWidget = renderFieldGroup(fields, group);
if (!first) {
groupWidget.getElement().getStyle().setMarginTop(groupGap, Style.Unit.PX);
}
panel.add(groupWidget);
first = false;
}
return panel;
}
public void addFieldGroup(FieldGroup group) {
fieldGroups.add(group);
}
//============================================ Setter/Getter Methods ===============================================
public int getLineGap() {
return lineGap;
}
public void setLineGap(int lineGap) {
this.lineGap = lineGap;
}
public void setHints(Hint... hints) {
if (this.hints == null) {
this.hints = new Hints();
}
for (Hint hint : hints) {
this.hints.set(hint);
}
}
//================================================ Helper Methods ==================================================
private Widget renderFieldGroup(HasFields fields, FieldGroup group) {
FlowPanel panel = new FlowPanel();
boolean first = true;
for (String fieldKey : group.getFields()) {
Hints hints = resolveLayoutHints(group, fieldKey);
Widget fieldRow = renderField(fields.getField(fieldKey), hints);
if (!first) {
fieldRow.getElement().getStyle().setMarginTop(lineGap, Style.Unit.PX);
}
panel.add(fieldRow);
first = false;
}
String groupName = group.getName();
return groupName == null ? panel : new FieldSet(groupName, panel);
}
private Widget renderField(FormField field, Hints hints) {
FlowPanel panel = new FlowPanel();
panel.getElement().getStyle().setProperty("clear", "both");
Widget editor = field.getEditor().getWidget();
Label label = new Label(field.getLabel());
if (!hints.getValue(LabelVisibleHint.class)) {
label.setText("");
}
panel.add(label);
panel.add(editor);
if (hints.getValue(LabelPositionHint.class) == LabelPositionHint.Value.SIDE) {
boolean rtl = LocaleInfo.getCurrentLocale().isRTL();
LayoutUtils.setCssFloat(label.getElement(), rtl ? CssFloat.RIGHT : CssFloat.LEFT);
label.getElement().getStyle().setProperty("clear", "both");
if (rtl) {
label.getElement().getStyle().setMarginLeft(hints.getValue(LabelGapHint.class), Style.Unit.PX);
} else {
label.getElement().getStyle().setMarginRight(hints.getValue(LabelGapHint.class), Style.Unit.PX);
}
LayoutUtils.setCssFloat(editor.getElement(), rtl ? CssFloat.RIGHT : CssFloat.LEFT);
}
if (hints.hasHint(LabelWidthHint.class)) {
label.setWidth(hints.getValue(LabelWidthHint.class));
}
if (field.getEditor().isHorizontallySizable() && hints.hasHint(EditorWidthHint.class)) {
editor.setWidth(hints.getValue(EditorWidthHint.class));
}
if (field.getEditor().isVerticallySizable() && hints.hasHint(EditorHeightHint.class)) {
editor.setHeight(hints.getValue(EditorHeightHint.class));
}
return panel;
}
private Hints resolveLayoutHints(FieldGroup group, String fieldKey) {
Hints hints = new Hints();
if (this.hints != null) {
hints.setAll(this.hints);
}
hints.setAll(group.getHints(fieldKey));
return hints;
}
}