/* * Created on 6 Feb 2007 * Created by Allan Crooks * Copyright (C) 2007 Aelitis, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. */ package org.gudy.azureus2.ui.common.util; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import org.gudy.azureus2.core3.util.AEMonitor; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.plugins.ui.menus.MenuItem; /** * Similar to TableContextMenuManager - this keeps references to created menu * items by plugins to be used by external code. * * @author amc1 */ public class MenuItemManager { private static MenuItemManager instance; private static AEMonitor class_mon = new AEMonitor("MenuManager"); /* * Holds all the MenuItem objects. * key = MENU_* type (see MenuManager in the plugin API) * value = Map: key = menu key value = MenuItem object */ private Map<String, Map<String, MenuItem>> items; private AEMonitor items_mon = new AEMonitor("MenuManager:items"); private ArrayList<MenuItemManagerListener> listeners = new ArrayList<MenuItemManagerListener>(0); private MenuItemManager() { this.items = new HashMap<String, Map<String, MenuItem>>(); } /** * Return the static MenuManager instance */ public static MenuItemManager getInstance() { try { class_mon.enter(); if (instance == null) instance = new MenuItemManager(); return instance; } finally { class_mon.exit(); } } public void addMenuItem(MenuItem item) { try { String name = item.getResourceKey(); String sMenuID = item.getMenuID(); try { this.items_mon.enter(); Map<String, MenuItem> mTypes = this.items.get(sMenuID); if (mTypes == null) { // LinkedHashMap to preserve order mTypes = new LinkedHashMap<String, MenuItem>(); this.items.put(sMenuID, mTypes); } mTypes.put(name, item); } finally { this.items_mon.exit(); } } catch (Exception e) { System.out.println("Error while adding Menu Item"); Debug.printStackTrace(e); } } public void removeAllMenuItems(String sMenuID) { this.items.remove(sMenuID); } public void removeMenuItem(MenuItem item) { Map<String, MenuItem> menu_item_map = this.items.get(item.getMenuID()); if (menu_item_map != null) {menu_item_map.remove(item.getResourceKey());} } public MenuItem[] getAllAsArray(String sMenuID) { if (sMenuID != null) { triggerMenuItemQuery(sMenuID); } Map<String, MenuItem> local_menu_item_map = this.items.get(sMenuID); Map<String, MenuItem> global_menu_item_map = this.items.get(null); if (local_menu_item_map == null && global_menu_item_map == null) { return new MenuItem[0]; } if (sMenuID == null) {local_menu_item_map = null;} ArrayList<MenuItem> l = new ArrayList<MenuItem>(); if (local_menu_item_map != null) {l.addAll(local_menu_item_map.values());} if (global_menu_item_map != null) {l.addAll(global_menu_item_map.values());} return l.toArray(new MenuItem[l.size()]); } public MenuItem[] getAllAsArray(String[] menu_ids) { ArrayList<MenuItem> l = new ArrayList<MenuItem>(); for (int i=0; i<menu_ids.length; i++) { if (menu_ids[i] != null) { triggerMenuItemQuery(menu_ids[i]); } addMenuItems(menu_ids[i], l); } addMenuItems(null, l); return l.toArray(new MenuItem[l.size()]); } private void addMenuItems(String menu_id, ArrayList<MenuItem> l) { Map<String, MenuItem> menu_map = this.items.get(menu_id); if (menu_map != null) {l.addAll(menu_map.values());} } public void addListener(MenuItemManagerListener l) { synchronized (listeners) { if (!listeners.contains(l)) { listeners.add(l); } } } public void removeListener(MenuItemManagerListener l) { synchronized (listeners) { listeners.remove(l); } } private void triggerMenuItemQuery(String id) { MenuItemManagerListener[] listenersArray; synchronized (listeners) { listenersArray = listeners.toArray(new MenuItemManagerListener[0]); } for (MenuItemManagerListener l : listenersArray) { try { l.queryForMenuItem(id); } catch (Exception e) { Debug.out(e); } } } public void triggerMenuItemCleanup(String id) { MenuItemManagerListener[] listenersArray; synchronized (listeners) { listenersArray = listeners.toArray(new MenuItemManagerListener[0]); } for (MenuItemManagerListener l : listenersArray) { try { l.cleanupMenuItem(id); } catch (Exception e) { Debug.out(e); } } } }