package org.tessell.widgets.form;
import org.tessell.util.HTMLPanelBuilder;
import org.tessell.widgets.form.actions.FormAction;
import org.tessell.widgets.form.lines.FormLine;
/**
* Lays out a form with the {@code ol li div} tags.
*
* Based loosely on:
*
* http://articles.sitepoint.com/print/fancy-form-design-css
*/
public class DefaultFormLayout implements FormLayout {
/** An interface for the css classes we use. */
public static interface Style {
String form();
String value();
String label();
String errors();
String action();
String actions();
String lines();
}
/** A static version of {@code Style} that returns non-obfuscated class names. */
public static class StaticStyle implements Style {
@Override
public String form() {
return "form";
}
@Override
public String value() {
return "value";
}
@Override
public String label() {
return "label";
}
@Override
public String errors() {
return "errors";
}
@Override
public String action() {
return "action";
}
@Override
public String actions() {
return "actions";
}
@Override
public String lines() {
return "lines";
}
}
private final Style style;
public DefaultFormLayout() {
this(new StaticStyle());
}
public DefaultFormLayout(Style style) {
this.style = style;
}
@Override
public void render(FormPresenter p, HTMLPanelBuilder hb) {
formBegin(p, hb);
linesBegin(p, hb);
for (FormLine line : p.getFormLines()) {
line.render(p, this, hb);
}
linesEnd(p, hb);
if (p.getFormActions().size() > 0) {
actionsBegin(p, hb);
for (FormAction action : p.getFormActions()) {
actionBegin(p, hb);
action.renderAction(hb);
actionEnd(p, hb);
}
actionsEnd(p, hb);
}
formEnd(p, hb);
}
@Override
public void formBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<div class=\"" + style.form() + "\">");
}
@Override
public void formEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</div>");
}
@Override
public void lineBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<li>");
}
@Override
public void lineDefault(FormPresenter p, FormLine line, HTMLPanelBuilder hb) {
lineBegin(p, hb);
labelBegin(p, hb);
line.renderLabel(hb);
labelEnd(p, hb);
valueBegin(p, hb);
line.renderValue(hb);
errorsBegin(p, hb);
line.renderErrors(hb);
errorsEnd(p, hb);
valueEnd(p, hb);
lineEnd(p, hb);
}
@Override
public void lineEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</li>");
}
@Override
public void linesBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<div class=\"" + style.lines() + "\">");
hb.add("<ol>");
}
@Override
public void linesEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</ol>");
hb.add("</div>");
}
@Override
public void labelBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<div class=\"" + style.label() + "\">");
}
@Override
public void labelEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</div>");
}
@Override
public void valueBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<div class=\"" + style.value() + "\">");
}
@Override
public void valueEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</div>");
}
@Override
public void errorsBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<div class=\"" + style.errors() + "\">");
}
@Override
public void errorsEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</div>");
}
@Override
public void actionsBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<div class=\"" + style.actions() + "\">");
}
@Override
public void actionsEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</div>");
}
@Override
public void actionBegin(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("<span class=\"" + style.action() + "\">");
}
@Override
public void actionEnd(FormPresenter p, HTMLPanelBuilder hb) {
hb.add("</span>");
}
}