/******************************************************************************* * Copyright 2015 xWic group (http://www.xwic.de) * * Licensed 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 de.jwic.controls.menu; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import de.jwic.base.Control; import de.jwic.base.IControlContainer; import de.jwic.base.ImageRef; import de.jwic.base.JavaScriptSupport; import de.jwic.controls.actions.IAction; /** * Definition of a menu that can be used stand alone or in combination with many controls. * * @author lippisch */ @JavaScriptSupport public class Menu extends Control { private List<MenuSelectionListener> menuSelectionListeners = new ArrayList<MenuSelectionListener>(); private int nextId = 0; private boolean hidden = true; private int width; private Map<Integer, MenuItem> allItems = new HashMap<Integer, MenuItem>(); private List<MenuItem> menuItems = new ArrayList<MenuItem>(); /** * Constructor. */ public Menu(IControlContainer container) { super (container, null); } /** * Constructor. */ public Menu(IControlContainer container, String name) { super (container, name); } /** * Add a MenuSelectionListener. * @param listener */ public void addMenuSelectionListener(MenuSelectionListener listener) { menuSelectionListeners.add(listener); } /** * Remove the MenuSelectionListener. * @param listener */ public void removeMenuSelectionListener(MenuSelectionListener listener) { menuSelectionListeners.remove(listener); } /** * Handle click action. * @param menuId */ public void actionClick(String menuId) { if (menuId != null && !menuId.isEmpty()) { Integer id = Integer.parseInt(menuId); MenuItem item = allItems.get(id); if (item != null) { MenuEvent event = new MenuEvent(item); // first notify the Menu attached listener(s) MenuSelectionListener[] l = new MenuSelectionListener[menuSelectionListeners.size()]; l = menuSelectionListeners.toArray(l); for (MenuSelectionListener listener : l) { listener.menuItemSelected(event); } // then notify the MenuItem registered events item.clicked(); // first notify the item } } } /** * Create a new MenuItem and register it in the all-items table. * @return */ protected MenuItem createMenuItem() { MenuItem itm = new MenuItem(this, nextId++); allItems.put(itm.getId(), itm); return itm; } /** * Add a MenuItem to the menu. * @return */ public MenuItem addMenuItem() { MenuItem item = createMenuItem(); menuItems.add(item); return item; } /** * Add an item with the title as specified. * @param title * @return */ public MenuItem addMenuItem(IAction action) { MenuItem item = addMenuItem(); item.setAction(action); return item; } /** * Add an item with the title as specified. * @param title * @return */ public MenuItem addMenuItem(String title) { MenuItem item = addMenuItem(); item.setTitle(title); return item; } /** * Add an item which will open an URL using target='_blank'. * <br/> * Note: if the urlToOpen is provided, no action event will be fired when the item is clicked. * * @param title * @param icon * @param urlToOpen * @return */ public MenuItem addMenuItem(String title, ImageRef icon, String urlToOpen) { MenuItem item = addMenuItem(title, icon); item.setUrlToOpen(urlToOpen); return item; } /** * Add an item with the title as specified. * @param title * @return */ public MenuItem addMenuItem(String title, ImageRef icon) { MenuItem item = addMenuItem(); item.setTitle(title); item.setIconEnabled(icon); return item; } /** * Returns true if at least one MenuItem has icons. This is used * during rendering to identify if a spacer has to be put in front of the * menu items that do not have an icon. * @return */ public boolean hasIcons() { if (menuItems != null) { for (MenuItem item : menuItems) { if (item.getIconEnabled() != null) { return true; } } } return false; } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((menuItems == null) ? 0 : menuItems.hashCode()); result = prime * result + nextId; return result; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Menu other = (Menu) obj; if (menuItems == null) { if (other.menuItems != null) return false; } else if (!menuItems.equals(other.menuItems)) return false; if (nextId != other.nextId) return false; return true; } /** * @return the hidden */ public boolean isHidden() { return hidden; } /** * @param hidden the hidden to set */ public void setHidden(boolean hidden) { this.hidden = hidden; } /** * @return the menuItems */ public List<MenuItem> getMenuItems() { return menuItems; } /** * @return the width */ public int getWidth() { return width; } /** * Set the width of the menu displaying the child items. * @param width the width to set */ public void setWidth(int width) { this.width = width; } }