Package org.gwtoolbox.widget.client.form.renderer.simple

Source Code of org.gwtoolbox.widget.client.form.renderer.simple.SimpleFieldsRenderer

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;
    }
}
TOP

Related Classes of org.gwtoolbox.widget.client.form.renderer.simple.SimpleFieldsRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.