package fr.openwide.core.showcase.web.application.util.template;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.google.common.collect.ImmutableList;
import fr.openwide.core.showcase.core.business.user.model.User;
import fr.openwide.core.showcase.web.application.ShowcaseApplication;
import fr.openwide.core.showcase.web.application.ShowcaseSession;
import fr.openwide.core.showcase.web.application.links.page.LinksPage1;
import fr.openwide.core.showcase.web.application.links.page.LinksPage2;
import fr.openwide.core.showcase.web.application.links.page.LinksPage3;
import fr.openwide.core.showcase.web.application.others.page.ButtonsPage;
import fr.openwide.core.showcase.web.application.others.page.HideableComponentsPage;
import fr.openwide.core.showcase.web.application.others.page.TitlesPage;
import fr.openwide.core.showcase.web.application.portfolio.page.PortfolioMainPage;
import fr.openwide.core.showcase.web.application.task.page.TaskMainPage;
import fr.openwide.core.showcase.web.application.util.template.styles.StylesLessCssResourceReference;
import fr.openwide.core.showcase.web.application.widgets.page.AutocompletePage;
import fr.openwide.core.showcase.web.application.widgets.page.AutosizePage;
import fr.openwide.core.showcase.web.application.widgets.page.BootstrapJsPage;
import fr.openwide.core.showcase.web.application.widgets.page.CalendarPage;
import fr.openwide.core.showcase.web.application.widgets.page.CarouselPage;
import fr.openwide.core.showcase.web.application.widgets.page.FileDownloadPage;
import fr.openwide.core.showcase.web.application.widgets.page.FileUploadPage;
import fr.openwide.core.showcase.web.application.widgets.page.ListFilterPage;
import fr.openwide.core.showcase.web.application.widgets.page.ModalPage;
import fr.openwide.core.showcase.web.application.widgets.page.SelectBoxPage;
import fr.openwide.core.showcase.web.application.widgets.page.SortableListPage;
import fr.openwide.core.showcase.web.application.widgets.page.StatisticsPage;
import fr.openwide.core.showcase.web.application.widgets.page.WidgetsMainPage;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.markup.html.basic.CoreLabel;
import fr.openwide.core.wicket.markup.html.panel.InvisiblePanel;
import fr.openwide.core.wicket.more.condition.Condition;
import fr.openwide.core.wicket.more.console.template.ConsoleConfiguration;
import fr.openwide.core.wicket.more.markup.html.basic.EnclosureContainer;
import fr.openwide.core.wicket.more.markup.html.feedback.AnimatedGlobalFeedbackPanel;
import fr.openwide.core.wicket.more.markup.html.template.AbstractWebPageTemplate;
import fr.openwide.core.wicket.more.markup.html.template.component.BodyBreadCrumbPanel;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.collapse.BootstrapCollapseJavaScriptResourceReference;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.dropdown.BootstrapDropdownBehavior;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.tooltip.BootstrapTooltip;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.tooltip.BootstrapTooltipDocumentBehavior;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstraphoverdropdown.BootstrapHoverDropdownBehavior;
import fr.openwide.core.wicket.more.markup.html.template.model.BreadCrumbElement;
import fr.openwide.core.wicket.more.markup.html.template.model.NavigationMenuItem;
import fr.openwide.core.wicket.more.security.page.LogoutPage;
public abstract class MainTemplate extends AbstractWebPageTemplate {
private static final long serialVersionUID = -2487769225221281241L;
public MainTemplate(PageParameters parameters) {
super(parameters);
// Feedback
add(new AnimatedGlobalFeedbackPanel("animatedGlobalFeedbackPanel"));
// Page title
addHeadPageTitlePrependedElement(new BreadCrumbElement(new ResourceModel("common.rootPageTitle")));
add(createHeadPageTitle("headPageTitle"));
// Back to home
// add(new BookmarkablePageLink<Void>("backToHomeLink", getApplication().getHomePage()));
// Main navigation bar
add(new ListView<NavigationMenuItem>("mainNav", getMainNav()) {
private static final long serialVersionUID = -2257358650754295013L;
@Override
protected void populateItem(ListItem<NavigationMenuItem> item) {
NavigationMenuItem navItem = item.getModelObject();
AbstractLink navLink = navItem.linkHidingIfInvalid("navLink");
navLink.add(new ClassAttributeAppender(navItem.getCssClassesModel()));
navLink.add(
new Label("label", navItem.getLabelModel()),
new EnclosureContainer("icon").condition(Condition.modelNotNull(navItem.getIconClassesModel()))
.add(new ClassAttributeAppender(navItem.getIconClassesModel()))
);
if (navItem.isActive(MainTemplate.this.getFirstMenuPage())) {
item.add(new ClassAttributeAppender("active"));
}
item.add(navLink);
List<NavigationMenuItem> subMenuItems = navItem.getSubMenuItems();
if (!subMenuItems.isEmpty()) {
item.add(new ClassAttributeAppender("dropdown"));
navLink.add(new ClassAttributeAppender("dropdown-toggle"));
navLink.add(new AttributeModifier("data-toggle", "dropdown"));
navLink.add(new AttributeModifier("data-hover", "dropdown"));
}
item.add(new ListView<NavigationMenuItem>("subNav", subMenuItems) {
private static final long serialVersionUID = -2257358650754295013L;
@Override
protected void populateItem(ListItem<NavigationMenuItem> item) {
NavigationMenuItem navItem = item.getModelObject();
AbstractLink navLink = navItem.linkHidingIfInvalid("navLink");
navLink.add(new ClassAttributeAppender(navItem.getCssClassesModel()));
navLink.add(
new Label("label", navItem.getLabelModel()),
new EnclosureContainer("icon").condition(Condition.modelNotNull(navItem.getIconClassesModel()))
.add(new ClassAttributeAppender(navItem.getIconClassesModel()))
);
if (navItem.isActive(MainTemplate.this.getSecondMenuPage())) {
item.add(new ClassAttributeAppender("active"));
}
item.add(navLink);
}
@Override
protected void onDetach() {
super.onDetach();
for (NavigationMenuItem item : getModelObject()) {
item.detach();
}
}
});
}
@Override
protected void onDetach() {
super.onDetach();
for (NavigationMenuItem item : getModelObject()) {
item.detach();
}
}
});
// User menu
add(new CoreLabel("userFullName", new LoadableDetachableModel<String>() {
private static final long serialVersionUID = 1L;
@Override
protected String load() {
String userFullName = null;
User user = ShowcaseSession.get().getUser();
if (user != null) {
userFullName = user.getFullName();
}
return userFullName;
}
}).hideIfEmpty());
add(new BookmarkablePageLink<Void>("logoutLink", LogoutPage.class));
// Bread crumb
Component breadCrumb;
if (isBreadCrumbDisplayed()) {
breadCrumb = createBodyBreadCrumb("breadCrumb");
} else {
breadCrumb = new InvisiblePanel("breadCrumb");
}
add(breadCrumb);
// Console
add(ConsoleConfiguration.get().getConsoleLink("consoleLink"));
// Tooltip
add(new BootstrapTooltipDocumentBehavior(getBootstrapTooltip()));
// Dropdown
add(new BootstrapDropdownBehavior());
add(new BootstrapHoverDropdownBehavior());
}
protected BootstrapTooltip getBootstrapTooltip() {
BootstrapTooltip bootstrapTooltip = new BootstrapTooltip();
bootstrapTooltip.setSelector("[title],[data-original-title]");
bootstrapTooltip.setAnimation(true);
bootstrapTooltip.setContainer("body");
return bootstrapTooltip;
}
protected IModel<String> getApplicationNameModel() {
return new ResourceModel("common.rootPageTitle");
}
protected List<NavigationMenuItem> getMainNav() {
return ImmutableList.of(
ShowcaseApplication.get().getHomePageLinkDescriptor().navigationMenuItem(new ResourceModel("navigation.home")),
PortfolioMainPage.linkDescriptor().navigationMenuItem(new ResourceModel("navigation.portfolio")),
WidgetsMainPage.linkDescriptor().navigationMenuItem(new ResourceModel("navigation.widgets"))
.setSubMenuItems(ImmutableList.of(
CalendarPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.calendar")),
AutocompletePage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.autocomplete")),
ModalPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.modal")),
ListFilterPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.listFilter")),
BootstrapJsPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.bootstrapJs")),
CarouselPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.carousel")),
StatisticsPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.statistics")),
AutosizePage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.autosize")),
SortableListPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.sortable")),
SelectBoxPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.selectbox")),
FileUploadPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.fileupload")),
FileDownloadPage.linkDescriptor().navigationMenuItem(new ResourceModel("widgets.menu.filedownload"))
)),
TitlesPage.linkDescriptor().navigationMenuItem(new ResourceModel("navigation.titles")),
ButtonsPage.linkDescriptor().navigationMenuItem(new ResourceModel("navigation.buttons")),
HideableComponentsPage.linkDescriptor().navigationMenuItem(new ResourceModel("navigation.hideableComponents")),
LinksPage1.linkDescriptor().navigationMenuItem(new ResourceModel("navigation.links"))
.setSubMenuItems(ImmutableList.of(
LinksPage1.linkDescriptor().navigationMenuItem(new ResourceModel("links.menu.page1")),
LinksPage2.linkDescriptor().navigationMenuItem(new ResourceModel("links.menu.page2")),
LinksPage3.linkDescriptor().navigationMenuItem(new ResourceModel("links.menu.page3"))
)),
TaskMainPage.linkDescriptor().navigationMenuItem(new ResourceModel("navigation.tasks"))
);
}
@Override
protected Component createBodyBreadCrumb(String wicketId) {
return new BodyBreadCrumbPanel(wicketId, bodyBreadCrumbPrependedElementsModel, breadCrumbElementsModel, 1)
.setDividerModel(Model.of(""))
.setTrailingSeparator(true);
}
protected boolean isBreadCrumbDisplayed() {
return true;
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(CssHeaderItem.forReference(StylesLessCssResourceReference.get()));
response.render(JavaScriptHeaderItem.forReference(BootstrapCollapseJavaScriptResourceReference.get()));
}
@Override
public String getVariation() {
return BOOTSTRAP3_VARIATION;
}
}