package fr.openwide.core.wicket.more.markup.html.template.model;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.model.IDetachable;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import fr.openwide.core.wicket.more.link.descriptor.generator.IPageLinkGenerator;
import fr.openwide.core.wicket.more.markup.html.link.BlankLink;
public class NavigationMenuItem implements IDetachable {
private static final long serialVersionUID = -833923931725195545L;
private IModel<String> labelModel;
private IModel<String> cssClassesModel = Model.of("");
private IModel<String> iconClassesModel = Model.of("");
private IPageLinkGenerator pageLinkGenerator;
private final List<NavigationMenuItem> subMenuItems = Lists.newArrayList();
protected NavigationMenuItem(NavigationMenuItem wrapped) {
setLabelModel(wrapped.getLabelModel());
setPageLinkGenerator(wrapped.getPageLinkGenerator());
setSubMenuItems(wrapped.getSubMenuItems());
}
public NavigationMenuItem(IModel<String> labelModel) {
this.labelModel = labelModel;
}
public NavigationMenuItem(IModel<String> labelModel, IPageLinkGenerator pageLinkGenerator,
Collection<NavigationMenuItem> subMenuItems) {
this.labelModel = labelModel;
this.pageLinkGenerator = pageLinkGenerator;
this.subMenuItems.addAll(subMenuItems);
}
public NavigationMenuItem(IModel<String> labelModel, IPageLinkGenerator pageLinkGenerator) {
this(labelModel, pageLinkGenerator, ImmutableList.<NavigationMenuItem>of());
}
@Override
public void detach() {
if (labelModel != null) {
labelModel.detach();
}
if (cssClassesModel != null) {
cssClassesModel.detach();
}
if (iconClassesModel != null) {
iconClassesModel.detach();
}
if (pageLinkGenerator != null) {
pageLinkGenerator.detach();
}
for (NavigationMenuItem subMenuItem : subMenuItems) {
subMenuItem.detach();
}
}
public AbstractLink link(String wicketId) {
if (pageLinkGenerator != null) {
return pageLinkGenerator.link(wicketId);
} else {
return new BlankLink(wicketId);
}
}
public AbstractLink linkHidingIfInvalid(String wicketId) {
if (pageLinkGenerator != null) {
return pageLinkGenerator.link(wicketId).hideIfInvalid();
} else {
return new BlankLink(wicketId);
}
}
public boolean isActive(Class<? extends Page> selectedPage) {
if (pageLinkGenerator != null) {
return pageLinkGenerator.isActive(selectedPage);
} else {
return false;
}
}
/**
* @deprecated Use the {@link #linkHidingIfInvalid(String)} to create a link that will be hidden when it is invalid,
* or a {@link BlankLink} when this {@link NavigationMenuItem} does not have any LinkGenerator.
*/
@Deprecated
public boolean isAccessible() {
if (pageLinkGenerator != null) {
return pageLinkGenerator.isAccessible();
} else {
return true;
}
}
public IModel<String> getLabelModel() {
return labelModel;
}
public NavigationMenuItem setLabelModel(IModel<String> labelModel) {
this.labelModel = labelModel;
return this;
}
protected IPageLinkGenerator getPageLinkGenerator() {
return pageLinkGenerator;
}
protected NavigationMenuItem setPageLinkGenerator(IPageLinkGenerator pageLinkGenerator) {
this.pageLinkGenerator = pageLinkGenerator;
return this;
}
public List<NavigationMenuItem> getSubMenuItems() {
return Collections.unmodifiableList(subMenuItems);
}
public NavigationMenuItem addSubMenuItem(NavigationMenuItem subMenuItem) {
this.subMenuItems.add(subMenuItem);
return this;
}
public NavigationMenuItem setSubMenuItems(Collection<NavigationMenuItem> subMenuItems) {
Collection<NavigationMenuItem> menuItems = ImmutableList.copyOf(subMenuItems); // Handle collection views
this.subMenuItems.clear();
this.subMenuItems.addAll(menuItems);
return this;
}
public IModel<String> getCssClassesModel() {
return cssClassesModel;
}
public NavigationMenuItem setCssClassesModel(IModel<String> cssClassesModel) {
this.cssClassesModel = cssClassesModel;
return this;
}
public IModel<String> getIconClassesModel() {
return iconClassesModel;
}
public NavigationMenuItem setIconClassesModel(IModel<String> iconClassesModel) {
this.iconClassesModel = iconClassesModel;
return this;
}
}