/** * (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.navbar; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; 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.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.RegistryFactory; import org.jabylon.rest.ui.util.GlobalResources; import org.jabylon.rest.ui.wicket.BasicPanel; import org.jabylon.rest.ui.wicket.PanelFactory; import org.jabylon.rest.ui.wicket.pages.WelcomePage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NavbarPanel<T> extends BasicPanel<T> { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(NavbarPanel.class); @SuppressWarnings("rawtypes") public NavbarPanel(String id, IModel<T> model, PageParameters parameters) { super(id, model, parameters); BookmarkablePageLink<String> homeLink = new BookmarkablePageLink<String>("jabylon",WelcomePage.class); //$NON-NLS-1$ homeLink.add(new Image("logo", GlobalResources.IMG_JABYLON_LOGO)); add(homeLink); Map<PanelFactory, Boolean> data = loadNavBarExtensions(); List<PanelFactory> items = new ArrayList<PanelFactory>(); List<PanelFactory> rightAligned = new ArrayList<PanelFactory>(); for (Entry<PanelFactory, Boolean> entry : data.entrySet()) { if(entry.getValue()) rightAligned.add(entry.getKey()); else items.add(entry.getKey()); } ListView<PanelFactory> listView = new ListView<PanelFactory>("items", items) { //$NON-NLS-1$ private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<PanelFactory> item) { Panel newPanel = item.getModelObject().createPanel(getPageParameters(), NavbarPanel.this.getModel(), "content"); //$NON-NLS-1$ if(newPanel==null) item.add(new Label("content","NONE")); //$NON-NLS-1$ //$NON-NLS-2$ else item.add(newPanel); } }; listView.setRenderBodyOnly(true); add(listView); ListView<PanelFactory> rightListView = new ListView<PanelFactory>("right-items", rightAligned) { //$NON-NLS-1$ private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<PanelFactory> item) { Panel newPanel = item.getModelObject().createPanel(getPageParameters(), NavbarPanel.this.getModel(), "content"); //$NON-NLS-1$ if(newPanel==null) item.add(new Label("content","NONE")); //$NON-NLS-1$ //$NON-NLS-2$ else item.add(newPanel); } }; rightListView.setRenderBodyOnly(true); add(rightListView); } private Map<PanelFactory,Boolean> loadNavBarExtensions() { Map<PanelFactory, Boolean> extensions = new LinkedHashMap<PanelFactory, Boolean>(); IConfigurationElement[] configurationElements = RegistryFactory.getRegistry().getConfigurationElementsFor( "org.jabylon.rest.ui.navbarItem"); //$NON-NLS-1$ for (IConfigurationElement element : configurationElements) { try { PanelFactory extension = (PanelFactory) element.createExecutableExtension("panel"); //$NON-NLS-1$ String pullRight = element.getAttribute("pullRight"); //$NON-NLS-1$ if(pullRight!=null && Boolean.valueOf(pullRight)) extensions.put(extension, true); else extensions.put(extension, false); } catch (CoreException e) { logger.error("Failed to load extension "+element,e); //$NON-NLS-1$ } } return extensions; } }