/**
* Copyright (C) 2011 BonitaSoft S.A.
* BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.bonitasoft.web.toolkit.client.ui.component.form.entry;
import java.util.List;
import org.bonitasoft.web.toolkit.client.common.json.JSonSerializer;
import org.bonitasoft.web.toolkit.client.common.json.JsonSerializable;
import org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList;
import org.bonitasoft.web.toolkit.client.data.item.attribute.ValidatorsList;
import org.bonitasoft.web.toolkit.client.data.item.attribute.modifier.AbstractStringModifier;
import org.bonitasoft.web.toolkit.client.data.item.attribute.modifier.Modifier;
import org.bonitasoft.web.toolkit.client.data.item.attribute.validator.MandatoryValidator;
import org.bonitasoft.web.toolkit.client.data.item.attribute.validator.Validator;
import org.bonitasoft.web.toolkit.client.ui.Alert;
import org.bonitasoft.web.toolkit.client.ui.JsId;
import org.bonitasoft.web.toolkit.client.ui.component.containers.Container;
import org.bonitasoft.web.toolkit.client.ui.component.core.Component;
import org.bonitasoft.web.toolkit.client.ui.component.core.Node;
import org.bonitasoft.web.toolkit.client.ui.component.form.FormNode;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
/**
* @author Séverin Moussel
*
*/
abstract public class FormEntry extends Component implements FormNode, JsonSerializable, ValuedFormEntry {
protected String label = null;
protected String tooltip = null;
protected String description = null;
protected String example = null;
protected Element inputElement = null;
protected Element labelElement = null;
protected String defaultValue = null;
protected String uid = null;
protected Element getInputElement() {
return this.inputElement;
}
protected void setInputElement(final Element inputElement) {
this.inputElement = inputElement;
}
@Override
public String getValue() {
String realValue = _getValue();
for (final Modifier modifier : getInputModifiers()) {
if (modifier instanceof AbstractStringModifier) {
realValue = ((AbstractStringModifier) modifier).clean(realValue);
}
}
return realValue;
}
public abstract String _getValue();
@Override
public void setValue(final String value) {
String realValue = value;
for (final Modifier modifier : getOutputModifiers()) {
if (modifier instanceof AbstractStringModifier) {
realValue = ((AbstractStringModifier) modifier).clean(realValue);
}
}
_setValue(realValue);
}
public abstract void _setValue(String value);
public FormEntry(final JsId jsid, final String label, final String tooltip) {
this(jsid, label, tooltip, null, null, null);
}
public FormEntry(final JsId jsid, final String label, final String tooltip, final String defaultValue) {
this(jsid, label, tooltip, defaultValue, null, null);
}
public FormEntry(final JsId jsid, final String label, final String tooltip, final String defaultValue, final String description) {
this(jsid, label, tooltip, defaultValue, description, null);
}
public FormEntry(final JsId jsid, final String label, final String tooltip, final String defaultValue, final String description, final String example) {
super(jsid);
this.label = label;
this.tooltip = tooltip;
this.description = description;
this.example = example;
this.defaultValue = defaultValue;
this.uid = DOM.createUniqueId();
}
protected abstract Element makeInput(String uid2);
public void setLabel(final String label) {
this.label = label;
}
/**
* @return the label
*/
public String getLabel() {
return this.label;
}
public void setDescription(final String description) {
this.description = description;
}
public void setExample(final String example) {
this.example = example;
}
@Override
protected Element makeElement() {
Boolean isMandatory = false;
final Element entry = DOM.createDiv();
entry.addClassName("formentry");
entry.addClassName(getJsId().toString("formentry").toLowerCase());
this.labelElement = DOM.createDiv();
this.labelElement.addClassName("label");
for (final Validator validator : getValidators()) {
if (validator instanceof MandatoryValidator) {
isMandatory = true;
entry.addClassName("mandatory");
break;
}
}
final Element label = DOM.createLabel();
label.setInnerText(this.label);
label.setTitle(this.tooltip);
label.setAttribute("for", this.uid.toLowerCase());
if (isMandatory) {
final Element mandatorySpan = DOM.createSpan();
mandatorySpan.addClassName("mandatoryflag");
mandatorySpan.setInnerText("*");
label.appendChild(mandatorySpan);
}
this.labelElement.appendChild(label);
if (this.description != null) {
final Element description = DOM.createDiv();
description.addClassName("description");
description.setInnerText(this.description);
this.labelElement.appendChild(description);
}
entry.appendChild(this.labelElement);
final Element body = DOM.createDiv();
body.addClassName("input");
final Element input = makeInput(this.uid);
if (this.inputElement == null) {
this.inputElement = input;
}
body.appendChild(input);
if (this.example != null) {
final Element example = DOM.createDiv();
example.addClassName("example");
example.setInnerText(this.example);
body.appendChild(example);
}
entry.appendChild(body);
return entry;
}
@Override
protected void postProcessHtml() {
super.postProcessHtml();
if (this.defaultValue != null) {
setValue(this.defaultValue);
}
}
@Override
public String toJson() {
return JSonSerializer.serialize(getJsId().toString(), getValue());
}
private Container<FormNode> container = null;
@SuppressWarnings("unchecked")
@Override
public void setContainer(final Container<? extends Node> container) {
this.container = (Container<FormNode>) container;
}
@Override
public Container<FormNode> getContainer() {
return this.container;
}
@Override
public void addError(final String message) {
Alert.addError(getInputElement(), message);
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// VALIDATORS AND MODIFIERS
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private final ModifiersList inputModifiers = new ModifiersList();
private final ModifiersList outputModifiers = new ModifiersList();
private final ValidatorsList Validators = new ValidatorsList();
/**
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#getModifiers()
*/
@Override
public List<Modifier> getInputModifiers() {
return this.inputModifiers.getModifiers();
}
/**
* @param modifier
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#addModifier(org.bonitasoft.web.toolkit.client.data.item.attribute.modifier.Modifier)
*/
@Override
public FormEntry addInputModifier(final Modifier modifier) {
this.inputModifiers.addModifier(modifier);
return this;
}
/**
* @param modifiers
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#addModifiers(java.util.List)
*/
@Override
public FormEntry addInputModifiers(final List<Modifier> modifiers) {
this.inputModifiers.addModifiers(modifiers);
return this;
}
/**
* @param modifierClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#removeModifier(java.lang.String)
*/
@Override
public FormEntry removeInputModifier(final String modifierClassName) {
this.inputModifiers.removeModifier(modifierClassName);
return this;
}
/**
* @param modifierClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#hasModifier(java.lang.String)
*/
@Override
public boolean hasInputModifier(final String modifierClassName) {
return this.inputModifiers.hasModifier(modifierClassName);
}
/**
* @param modifierClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#getModifier(java.lang.String)
*/
@Override
public Modifier getInputModifier(final String modifierClassName) {
return this.inputModifiers.getModifier(modifierClassName);
}
/**
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#getModifiers()
*/
@Override
public List<Modifier> getOutputModifiers() {
return this.outputModifiers.getModifiers();
}
/**
* @param modifier
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#addModifier(org.bonitasoft.web.toolkit.client.data.item.attribute.modifier.Modifier)
*/
@Override
public FormEntry addOutputModifier(final Modifier modifier) {
this.outputModifiers.addModifier(modifier);
return this;
}
/**
* @param modifiers
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#addModifiers(java.util.List)
*/
@Override
public FormEntry addOutputModifiers(final List<Modifier> modifiers) {
this.outputModifiers.addModifiers(modifiers);
return this;
}
/**
* @param modifierClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#removeModifier(java.lang.String)
*/
@Override
public FormEntry removeOutputModifier(final String modifierClassName) {
this.outputModifiers.removeModifier(modifierClassName);
return this;
}
/**
* @param modifierClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#hasModifier(java.lang.String)
*/
@Override
public boolean hasOutputModifier(final String modifierClassName) {
return this.outputModifiers.hasModifier(modifierClassName);
}
/**
* @param modifierClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ModifiersList#getModifier(java.lang.String)
*/
@Override
public Modifier getOutputModifier(final String modifierClassName) {
return this.outputModifiers.getModifier(modifierClassName);
}
/**
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ValidatorsList#getValidators()
*/
@Override
public List<Validator> getValidators() {
return this.Validators.getValidators();
}
/**
* @param validator
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ValidatorsList#addValidator(org.bonitasoft.web.toolkit.client.data.item.attribute.validator.Validator)
*/
@Override
public FormEntry addValidator(final Validator validator) {
validator.setAttributeName(getJsId().toString());
this.Validators.addValidator(validator);
return this;
}
/**
* @param validators
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ValidatorsList#addValidators(java.util.List)
*/
@Override
public FormEntry addValidators(final List<Validator> validators) {
this.Validators.addValidators(validators);
return this;
}
/**
* @param validatorClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ValidatorsList#removeValidator(java.lang.String)
*/
@Override
public FormEntry removeValidator(final String validatorClassName) {
this.Validators.removeValidator(validatorClassName);
return this;
}
/**
* @param validatorClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ValidatorsList#hasValidator(java.lang.String)
*/
@Override
public boolean hasValidator(final String validatorClassName) {
return this.Validators.hasValidator(validatorClassName);
}
/**
* @param validatorClassName
* @see org.bonitasoft.web.toolkit.client.data.item.attribute.ValidatorsList#getValidator(java.lang.String)
*/
@Override
public Validator getValidator(final String validatorClassName) {
return this.Validators.getValidator(validatorClassName);
}
}