package org.nocket.component.form.behaviors;
import org.apache.wicket.Component;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.transformer.AbstractTransformerBehavior;
import org.apache.wicket.util.iterator.ComponentHierarchyIterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.nocket.component.form.ComponentGroup;
import org.nocket.component.select.DMDRadioChoice;
// TODO: Auto-generated Javadoc
/**
* This behavior adds to a group of the components a paragraph with error
* messages coming from these components.
*
* @author blaz02
*
*/
public class ValidationStyleGroupBehavior extends AbstractTransformerBehavior {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The Constant BR. */
private final static String BR = "<br/>";
/** The Constant BEFORE_MESSAGE. */
private final static String BEFORE_MESSAGE = "<p class=\"error\">";
/** The Constant BEFORE_CS. */
private final static String BEFORE_CS = "<div class=\"control-group error\">";
/** The Constant AFTER_MESSAGE. */
private final static String AFTER_MESSAGE = "</p>";
/** The Constant AFTER_CS. */
private final static String AFTER_CS = "</div>";
/* (non-Javadoc)
* @see org.apache.wicket.markup.transformer.AbstractTransformerBehavior#transform(org.apache.wicket.Component, java.lang.CharSequence)
*/
@Override
public CharSequence transform(Component component, CharSequence cs) {
boolean added = false;
StringBuffer messageBuffer = new StringBuffer(BEFORE_MESSAGE);
boolean isRadioOrCheckbox = false;
ComponentHierarchyIterator it = ((ComponentGroup) component).visitChildren(FormComponent.class);
for (Component n : it) {
FormComponent<?> fc = (FormComponent<?>) n;
if (!fc.isValid()) {
if (fc instanceof DMDRadioChoice<?>) {
isRadioOrCheckbox = true;
}
for (FeedbackMessage message : fc.getFeedbackMessages()) {
message.markRendered();
if (added) {
messageBuffer.append(BR);
}
messageBuffer.append(message.getMessage());
added = true;
}
}
}
if (!added) {
return cs;
}
messageBuffer.append(AFTER_MESSAGE);
StringBuffer b;
if (isRadioOrCheckbox) {
b = buildOutputForRadioOrCheckbox(cs, messageBuffer);
} else {
b = buildOutput(cs, messageBuffer);
}
return b.toString();
}
/**
* Wenn Radios und Checkboxen mit Wicket und Bootstrap verwendet werden,
* darf der Fehlertext nicht wie bei den einzelnen Inputfeldern hinten
* angefÃŒgt werden, sondern er muss in das Controls-Div hinein operiert.
* werden
*
* <pre>
* <div class="control-group error">
* <div wicket:id="genderGroup" class="radio-checkbox-group"><wicket:border>
* <wicket:body>
* <div class="controls">
* <label class="radio" wicket:id="gender" id="gender">
* <input name="memberpanel:personDataPanel:genderGroup:genderGroup_body:gender" type="radio" value="HERR" id="gender-HERR"/>
* <label for="gender-HERR">Man</label>
* <input name="memberpanel:personDataPanel:genderGroup:genderGroup_body:gender" type="radio" value="FRAU" id="gender-FRAU"/>
* <label for="gender-FRAU">Woman</label>
* </label>
* HIER MUSS ES HIN
* </div>
* </wicket:body>
* </wicket:border>
* </div>
*
* </pre>
*
* @param cs vorhandener HTML-Code
* @param messageBuffer Fehlertexte
* @return the string buffer
*/
private StringBuffer buildOutputForRadioOrCheckbox(CharSequence cs, StringBuffer messageBuffer) {
StringBuffer b = new StringBuffer(BEFORE_CS);
Document document = Jsoup.parse(cs.toString());
Elements divControls = document.select("div[class*=controls]");
if (divControls == null) {
return buildOutput(cs, messageBuffer);
}
divControls.first().append(messageBuffer.toString());
b.append(document.html());
b.append(AFTER_CS);
return b;
}
/**
* Builds the output.
*
* @param cs the cs
* @param messageBuffer the message buffer
* @return the string buffer
*/
private StringBuffer buildOutput(CharSequence cs, StringBuffer messageBuffer) {
StringBuffer b = new StringBuffer(BEFORE_CS).append(cs);
b.append(messageBuffer);
b.append(AFTER_CS);
return b;
}
}