package lt.inventi.wicket.component.bootstrap;
import java.io.Serializable;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.border.Border;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import lt.inventi.wicket.resource.ResourceSettings;
/**
* Groups used inside of bootstrap accordion (Collapse).
*
* @author vplatonov
* @see Accordion
*
*/
public class AccordionGroup extends Border {
public static class Options implements Serializable {
private boolean collapsed = true;
private boolean hasParent = true;
public static Options collapsed() {
return new Options().setCollapsed(true);
}
public static Options unCollapsed() {
return new Options().setCollapsed(false);
}
public Options withoutParent() {
return setHasParent(false);
}
public Options setHasParent(boolean hasParent) {
this.hasParent = hasParent;
return this;
}
public Options setCollapsed(boolean collapsed) {
this.collapsed = collapsed;
return this;
}
}
private final Label label;
private final Options options;
public AccordionGroup(String id, IModel<String> labelModel) {
this(id, labelModel, new Options());
}
public AccordionGroup(String id, IModel<String> labelModel, Options options) {
super(id);
setRenderBodyOnly(true);
label = new Label("label", wrap(labelModel));
this.options = options;
}
@Override
protected void onInitialize() {
super.onInitialize();
WebMarkupContainer body = new WebMarkupContainer("body");
body.setOutputMarkupId(true);
if (options.collapsed) {
body.add(new AttributeAppender("class", " collapse"));
} else {
body.add(new AttributeAppender("class", " in"));
}
if (options.hasParent) {
label.add(new AttributeModifier("data-parent", idModel(getAccordionParent())));
}
label.add(new AttributeModifier("href", idModel(body)));
addToBorder(label, body);
}
private Component getAccordionParent() {
Component parent = getParent();
while (!(parent instanceof Accordion)) {
parent = parent.getParent();
if (parent == null) {
throw new IllegalStateException("No Accordion parent found for group: " + this);
}
}
return parent;
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(JavaScriptHeaderItem.forReference(ResourceSettings.get().js().bootstrapJs.bsCollapse));
}
private static IModel<String> idModel(final Component cmp) {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
return "#" + cmp.getMarkupId();
}
};
}
}