/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.server.web.common.menu; import org.apache.wicket.AttributeModifier; import org.apache.wicket.markup.html.TransparentWebMarkupContainer; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.html.panel.GenericPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import ro.nextreports.server.web.common.behavior.SimpleTooltipBehavior; import java.util.ArrayList; import java.util.List; /** * @author Decebal Suiu */ public class MenuPanel extends GenericPanel<List<MenuItem>> { private static final long serialVersionUID = 1L; public static final String LINK_ID = "linkId"; public static final String LINK_IMAGE_ID = "linkImage"; public static final String LINK_TEXT_ID = "linkText"; /** * This appender is used to add a down or right arrow icon if there are * children */ /* private static final AttributeAppender MENU_HAS_SUBMENU_APPENDER = new AttributeAppender( "class", new Model("menu-has-submenu"), " "); */ private List<MenuItem> topMenuItems = new ArrayList<>(); public MenuPanel(String id) { super(id); setModel(new PropertyModel<List<MenuItem>>(this, "topMenuItems")); add(new SubMenuListView("topMenuItems", getModel())); } public MenuPanel(String id, IModel<List<MenuItem>> model) { super(id, model); add(new SubMenuListView("topMenuItems", model)); } public void addMenuItem(MenuItem menu) { topMenuItems.add(menu); } public void setMenuItems(List<MenuItem> menuItems) { clear(); topMenuItems.addAll(menuItems); } public void clear() { topMenuItems.clear(); } private class SubMenuListView extends ListView<MenuItem> { private static final long serialVersionUID = 1L; private SubMenuListView(String id, IModel<List<MenuItem>> model) { super(id, model); } private SubMenuListView(String id, List<MenuItem> list) { super(id, list); } @Override protected void populateItem(ListItem<MenuItem> item) { MenuItem menuItem = item.getModelObject(); item.add(new MenuItemFragment(menuItem)); } } private class MenuItemFragment extends Fragment { private static final long serialVersionUID = 1L; public MenuItemFragment(MenuItem menuItem) { super("menuItemFragment", "MENU_ITEM_FRAGMENT", MenuPanel.this); setRenderBodyOnly(true); // add the menu's label (hyperlinked if a link is provided) if (menuItem.getLink() != null) { if (menuItem.getImage() != null) { if (menuItem.getLabel() != null) { add(new LinkImageTextFragment(menuItem.getLink(), menuItem.getImage(), menuItem.getLabel())); } else { add(new LinkImageFragment(menuItem.getLink(), menuItem.getImage())); } } else { add(new LinkFragment(menuItem.getLink(), menuItem.getLabel())); } } else { if (menuItem.getImage() != null) { if (menuItem.getLabel() == null) { add(new ImageFragment(menuItem.getImage())); } } else { add(new TextFragment(menuItem.getLabel())); } } WebMarkupContainer menuItemList = new WebMarkupContainer("menuItemList"); add(menuItemList); // hide the <ul> tag if there are no submenus menuItemList.setVisible(menuItem.getChildren().size() > 0); /* // add a down or right arrow icon if there are children if (menuItem.getChildren().size() > 0) { menuItem.getLabel().add(MENU_HAS_SUBMENU_APPENDER); } */ // add the submenus menuItemList.add(new SubMenuListView("menuItemLinks", menuItem.getChildren())); } } private class LinkFragment extends Fragment { private static final long serialVersionUID = 1L; public LinkFragment(AbstractLink link, String label) { super("linkFragment", "LINK_FRAGMENT", MenuPanel.this); setRenderBodyOnly(true); link.add(new Label(LINK_TEXT_ID, label)); add(link); } } private class LinkImageTextFragment extends Fragment { private static final long serialVersionUID = 1L; public LinkImageTextFragment(AbstractLink link, String image, String label) { super("linkFragment", decorateMarkupId("LINK_IMAGE_TEXT_FRAGMENT", image), MenuPanel.this); setRenderBodyOnly(true); if (isFontawesome(image)) { link.add(new TransparentWebMarkupContainer(LINK_IMAGE_ID).add(AttributeModifier.append("class", "fa-" + image))); } else { link.add(new ContextImage(LINK_IMAGE_ID, image)); } link.add(new SimpleTooltipBehavior(label)); link.add(new Label(LINK_TEXT_ID, label)); add(link); } } private class LinkImageFragment extends Fragment { private static final long serialVersionUID = 1L; public LinkImageFragment(AbstractLink link, String image) { super("linkFragment", decorateMarkupId("LINK_IMAGE_FRAGMENT", image), MenuPanel.this); setRenderBodyOnly(true); if (isFontawesome(image)) { link.add(new TransparentWebMarkupContainer(LINK_IMAGE_ID).add(AttributeModifier.append("class", "fa-" + image))); } else { link.add(new ContextImage(LINK_IMAGE_ID, image)); } add(link); } } private class ImageFragment extends Fragment { private static final long serialVersionUID = 1L; public ImageFragment(String image) { super("linkFragment", decorateMarkupId("IMAGE_FRAGMENT", image), MenuPanel.this); setRenderBodyOnly(true); if (isFontawesome(image)) { add(new TransparentWebMarkupContainer(LINK_IMAGE_ID).add(AttributeModifier.append("class", "fa-" + image))); } else { add(new ContextImage(LINK_IMAGE_ID, image)); } } } private class TextFragment extends Fragment { private static final long serialVersionUID = 1L; public TextFragment(String label) { super("linkFragment", "TEXT_FRAGMENT", MenuPanel.this); setRenderBodyOnly(true); add(new Label(LINK_TEXT_ID, label)); } } private static String decorateMarkupId(String markupId, String image) { return isFontawesome(image) ? markupId + "_2" : markupId; } private static boolean isFontawesome(String image) { return !image.startsWith("images/"); } }