package fr.openwide.core.wicket.more.markup.html.template;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.more.markup.html.CoreWebPage;
import fr.openwide.core.wicket.more.markup.html.template.component.BodyBreadCrumbPanel;
import fr.openwide.core.wicket.more.markup.html.template.component.HeadPageTitleBreadCrumbPanel;
import fr.openwide.core.wicket.more.markup.html.template.model.BreadCrumbElement;
public abstract class AbstractWebPageTemplate extends CoreWebPage {
private static final long serialVersionUID = -5598937641577320345L;
public static final String BOOTSTRAP3_VARIATION = "bs3";
protected static final String DEFAULT_HEAD_PAGE_TITLE_SEPARATOR = " › ";
protected static final String DEFAULT_HEAD_PAGE_TITLE_SEPARATOR_REVERSE = " ‹ ";
protected final IModel<List<BreadCrumbElement>> headPageTitlePrependedElementsModel = newBreadCrumbListModel();
protected final IModel<List<BreadCrumbElement>> headPageTitleElementsModel = newBreadCrumbListModel();
protected final IModel<Boolean> headPageTitleReversedModel = Model.of(false);
protected final IModel<String> headPageTitleSeparatorModel = Model.of(DEFAULT_HEAD_PAGE_TITLE_SEPARATOR);
protected final IModel<String> headPageTitleSeparatorReverseModel = Model.of(DEFAULT_HEAD_PAGE_TITLE_SEPARATOR_REVERSE);
protected final IModel<List<BreadCrumbElement>> bodyBreadCrumbPrependedElementsModel = newBreadCrumbListModel();
protected final IModel<List<BreadCrumbElement>> breadCrumbElementsModel = newBreadCrumbListModel();
public AbstractWebPageTemplate(PageParameters parameters) {
super(parameters);
}
protected void addMenuElement(Class<? extends Page> selectedPageClass, String name, Class<? extends Page> pageClass) {
addMenuElement(this, selectedPageClass, name, pageClass, null, true);
}
protected void addMenuElement(Class<? extends Page> selectedPageClass, String name, Class<? extends Page> pageClass,
boolean isVisible) {
addMenuElement(this, selectedPageClass, name, pageClass, null, isVisible);
}
protected void addMenuElement(Class<? extends Page> selectedPageClass, String name, Class<? extends Page> pageClass,
PageParameters parameters) {
addMenuElement(this, selectedPageClass, name, pageClass, parameters, true);
}
protected void addMenuElement(Class<? extends Page> selectedPageClass, String name, Class<? extends Page> pageClass,
PageParameters parameters, boolean isVisible) {
addMenuElement(this, selectedPageClass, name, pageClass, parameters, isVisible);
}
protected void addMenuElement(MarkupContainer menuContainer,
Class<? extends Page> selectedPageClass,
String name,
Class<? extends Page> pageClass,
PageParameters parameters,
boolean isVisible) {
BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>(name + "MenuLink", pageClass, parameters);
link.setVisible(isVisible && isPageAccessible(pageClass));
MarkupContainer container = new WebMarkupContainer(name + "MenuLinkContainer");
if (pageClass.equals(selectedPageClass)) {
container.add(new ClassAttributeAppender("active"));
}
container.add(link);
menuContainer.add(container);
}
protected abstract Class<? extends WebPage> getFirstMenuPage();
protected abstract Class<? extends WebPage> getSecondMenuPage();
private static IModel<List<BreadCrumbElement>> newBreadCrumbListModel() {
return new ListModel<BreadCrumbElement>(new ArrayList<BreadCrumbElement>());
}
/** Add a breadcrumb element to be preprended to HTML head title only (not to HTML body breadcrumb)
*/
protected final void addHeadPageTitlePrependedElement(BreadCrumbElement breadCrumbElement) {
headPageTitlePrependedElementsModel.getObject().add(breadCrumbElement);
}
/** Add a breadcrumb element to be preprended to HTML body breadcrumb only (not to HTML head title)
*/
protected final void addBodyBreadCrumbPrependedElement(BreadCrumbElement breadCrumbElement) {
bodyBreadCrumbPrependedElementsModel.getObject().add(breadCrumbElement);
}
/** Add a breadcrumb element that will be shown in the page title. If none is added, the {@link #breadCrumbElementsModel} will be used.
*/
protected final void addHeadPageTitleElement(BreadCrumbElement breadCrumbElement) {
this.headPageTitleElementsModel.getObject().add(breadCrumbElement);
}
protected final void addBreadCrumbElement(BreadCrumbElement breadCrumbElement) {
breadCrumbElementsModel.getObject().add(breadCrumbElement);
}
protected final void setHeadPageTitleReversed(boolean headPageTitleReversed) {
this.headPageTitleReversedModel.setObject(headPageTitleReversed);
}
protected Component createHeadPageTitle(String wicketId) {
return new HeadPageTitleBreadCrumbPanel(
wicketId,
headPageTitlePrependedElementsModel,
headPageTitleElementsModel, breadCrumbElementsModel,
headPageTitleSeparatorModel,
headPageTitleSeparatorReverseModel,
headPageTitleReversedModel
);
}
protected Component createBodyBreadCrumb(String wicketId) {
return new BodyBreadCrumbPanel(wicketId, bodyBreadCrumbPrependedElementsModel, breadCrumbElementsModel);
}
@Override
protected void onDetach() {
super.onDetach();
headPageTitlePrependedElementsModel.detach();
headPageTitleElementsModel.detach();
headPageTitleReversedModel.detach();
headPageTitleSeparatorModel.detach();
headPageTitleSeparatorReverseModel.detach();
bodyBreadCrumbPrependedElementsModel.detach();
breadCrumbElementsModel.detach();
}
}