package fr.openwide.core.wicket.more.markup.html.template.component;
import java.util.List;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import com.google.common.collect.ImmutableList;
import fr.openwide.core.wicket.more.condition.Condition;
import fr.openwide.core.wicket.more.markup.html.template.model.BreadCrumbElement;
import fr.openwide.core.wicket.more.markup.html.template.model.BreadCrumbMarkupTagRenderingBehavior;
public class HeadPageTitleBreadCrumbPanel extends GenericPanel<List<BreadCrumbElement>> {
private static final long serialVersionUID = 3662301038397441921L;
public HeadPageTitleBreadCrumbPanel(
String id,
IModel<List<BreadCrumbElement>> prependedElementsModel,
IModel<List<BreadCrumbElement>> headPageTitleElementsModel, IModel<List<BreadCrumbElement>> breadCrumbElementsModel,
IModel<String> dividerModel, IModel<String> dividerReversedModel,
IModel<Boolean> reverseModel
) {
super(
id,
new HtmlHeadPageTitleElementsModel(prependedElementsModel, headPageTitleElementsModel, breadCrumbElementsModel, reverseModel)
);
add(
new BreadCrumbListView(
"breadCrumbElementListView", getModel(),
BreadCrumbMarkupTagRenderingBehavior.HTML_HEAD,
new DividerReversedIfNecessaryModel(dividerModel, dividerReversedModel, reverseModel)
)
);
add(
Condition.collectionModelNotEmpty(getModel()).thenShowInternal()
);
}
private static class DividerReversedIfNecessaryModel extends AbstractReadOnlyModel<String> {
private static final long serialVersionUID = 4497702163006031509L;
private final IModel<String> dividerModel;
private final IModel<String> dividerReversedModel;
private final IModel<Boolean> reverseModel;
public DividerReversedIfNecessaryModel(IModel<String> dividerModel, IModel<String> dividerReversedModel, IModel<Boolean> reverseModel) {
this.dividerModel = dividerModel;
this.dividerReversedModel = dividerReversedModel;
this.reverseModel = reverseModel;
}
@Override
public String getObject() {
return reverseModel.getObject()
? dividerReversedModel.getObject()
: dividerModel.getObject();
}
@Override
public void detach() {
super.detach();
reverseModel.detach();
dividerModel.detach();
dividerReversedModel.detach();
}
}
private static class HtmlHeadPageTitleElementsModel extends AbstractReadOnlyModel<List<BreadCrumbElement>> {
private static final long serialVersionUID = -1809848796763995233L;
private final IModel<List<BreadCrumbElement>> prependedElementsModel;
private final IModel<List<BreadCrumbElement>> headPageTitleElementsModel;
private final IModel<List<BreadCrumbElement>> breadCrumbElementsModel;
private final IModel<Boolean> reverseModel;
public HtmlHeadPageTitleElementsModel(
IModel<List<BreadCrumbElement>> prependedElementsModel,
IModel<List<BreadCrumbElement>> headPageTitleElementsModel,
IModel<List<BreadCrumbElement>> breadCrumbElementsModel,
IModel<Boolean> reverseModel) {
this.prependedElementsModel = prependedElementsModel;
this.headPageTitleElementsModel = headPageTitleElementsModel;
this.breadCrumbElementsModel = breadCrumbElementsModel;
this.reverseModel = reverseModel;
}
@Override
public List<BreadCrumbElement> getObject() {
List<BreadCrumbElement> elements = headPageTitleElementsModel.getObject();
if (elements == null || elements.isEmpty()) {
elements = breadCrumbElementsModel.getObject();
}
ImmutableList<BreadCrumbElement> list = ImmutableList.<BreadCrumbElement>builder()
.addAll(prependedElementsModel.getObject())
.addAll(elements)
.build();
return reverseModel.getObject() ? list.reverse() : list;
}
@Override
public void detach() {
super.detach();
prependedElementsModel.detach();
headPageTitleElementsModel.detach();
breadCrumbElementsModel.detach();
reverseModel.detach();
}
}
}