/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
/**
*
*/
package org.jabylon.rest.ui.wicket.panels;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Page;
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.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.jabylon.rest.ui.wicket.BasicPanel;
/**
* @author Johannes Utzig (jutzig.dev@googlemail.com)
*
*/
public class BreadcrumbPanel<T> extends BasicPanel<T> {
private static final long serialVersionUID = 1L;
private IModel<String> rootLabel = Model.of("Home");
private final Class<? extends Page> pageClass;
public BreadcrumbPanel(String id, IModel<T> object, PageParameters parameters) {
super(id, object, parameters);
pageClass = null;
}
/**
* Allow the base {@link Page} {@link Class} (and hence link root) to be overridden.<br>
*/
public BreadcrumbPanel(String id, IModel<T> object, PageParameters parameters, Class<? extends Page> pageClass) {
super(id, object, parameters);
this.pageClass = pageClass;
}
@Override
protected void onBeforeRenderPanel() {
populateBreadcrumbs();
}
private void populateBreadcrumbs() {
final List<String> segments = computeSegments(getPageParameters());
final PageParameters crumbParams = new PageParameters();
ListView<String> listView = new ListView<String>("crumbs",segments) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<String> item) {
BookmarkablePageLink<String> link;
if(item.getModelObject()==null || item.getModelObject().isEmpty()) {
link = new BookmarkablePageLink<String>("link", getPageClass());
link.setBody(rootLabel);
}
else
{
crumbParams.set(item.getIndex()-1, item.getModelObject());
link = new BookmarkablePageLink<String>("link", getPageClass(), new PageParameters(crumbParams));
link.setBody(item.getModel());
}
if(item.getIndex()==segments.size()-1)
link.add(new AttributeModifier("class", "active"));
item.add(link);
}
};
addOrReplace(listView);
}
private Class<? extends Page> getPageClass() {
return pageClass != null ? pageClass : getPage().getClass();
}
private List<String> computeSegments(PageParameters pageParameters) {
if (pageParameters == null)
return Collections.emptyList();
int size = pageParameters.getIndexedCount();
List<String> segments = new ArrayList<String>(size+1);
//add a null to go to the root
segments.add("");
for(int i=0;i<size;i++) {
segments.add(pageParameters.get(i).toString());
}
return segments;
}
public void setRootLabel(IModel<String> rootLabel) {
this.rootLabel = rootLabel;
}
public void setRootLabel(String rootLabel) {
setRootLabel(Model.of(rootLabel));
}
}