/* * Copyright (c) 2012 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * HUMBOLDT EU Integrated Project #030962 * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.server.webapp.components; import java.util.Vector; 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.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import eu.esdihumboldt.hale.server.webapp.util.PageDescription; /** * A panel which displays simple breadcrumbs * * @author Michel Kraemer */ public class SimpleBreadcrumbPanel extends Panel { /** * The serial version UID */ private static final long serialVersionUID = 27264261659073154L; /** * Constructs a new breadcrumb panel. If a link to a root website should be * part of the breadcrumbs, then <code>rootLinkName</code> and * <code>rootLinkTarget</code> must both be set. * * @param id the component's id * @param currentPage the class of the current page * @param rootLinkName the title of the link to the root website (can be * null) * @param rootLinkTarget the href target of the link to the root website * (can be null) */ public SimpleBreadcrumbPanel(String id, Class<? extends Page> currentPage, final String rootLinkName, final String rootLinkTarget) { super(id); String title = ""; PageDescription anno = currentPage.getAnnotation(PageDescription.class); if (anno != null) { if (anno.title() == null) { throw new RuntimeException(currentPage + " has no annotated title"); } title = anno.title(); } add(new Label("breadcrumb-current", title)); // add bread crumbs Vector<Class<? extends Page>> links = new Vector<Class<? extends Page>>(); while (anno != null && anno.parent() != null) { Class<? extends WebPage> par = anno.parent(); if (!par.isAnnotationPresent(PageDescription.class)) { break; } links.insertElementAt(anno.parent(), 0); anno = anno.parent().getAnnotation(PageDescription.class); } // add a dummy element for the root web page (but don't do this if the // current page *is* the root page) if (rootLinkName != null && rootLinkTarget != null) { boolean root = false; if (currentPage.isAnnotationPresent(PageDescription.class)) { root = currentPage.getAnnotation(PageDescription.class).root(); } if (!root) { links.insertElementAt(null, 0); } } // fill list view with bread crumbs add(new ListView<Class<? extends Page>>("breadcrumb-panel", links) { private static final long serialVersionUID = 1221964671030364825L; @Override public void populateItem(final ListItem<Class<? extends Page>> item) { Class<? extends Page> p = item.getModelObject(); WebMarkupContainer link; if (p != null) { link = new BookmarkablePageLink<Void>("breadcrumb-link", p); PageDescription anno = p.getAnnotation(PageDescription.class); link.add(new Label("breadcrumb-link-text", anno.title())); } else { link = new ExternalLink("breadcrumb-link", rootLinkTarget); link.add(new Label("breadcrumb-link-text", rootLinkName)); } item.add(link); } }); } }