/* * $Id$ * * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.javatest.exec; import java.awt.event.ActionEvent; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.SwingUtilities; import com.sun.javatest.tool.UIFactory; /** * The "Tool Bar Manager" tool, which allows a user to add, remove, * and get custom toolbars. */ public class ToolBarManager { public ToolBarManager() { } /** * Adds specified toolbar. * @param theBar the tool bar which should be added to the TestManager, * can't be null * @param toolBarID unique string ID of theBar, can't be null or empty * @return true if the bar was successfully added **/ public boolean addToolBar(final JavaTestToolBar theBar, String toolBarID) { if (!store.containsKey(toolBarID)) { store.put(toolBarID, theBar); if (panel != null) { SwingUtilities.invokeLater(new Runnable() { public void run() { panel.add(theBar); mmanager.addToolbar(theBar); } }); } else { // will occur in setPanel() } return true; } return false; } /** * Finds toolbar by ID and returns it. * @param toolBarID unique string ID of theBar, can't be null or empty * @return the toolbar object, or null if the manager contains * no tool bar for this key. **/ public JavaTestToolBar getToolBar(String toolBarID) { return (JavaTestToolBar) store.get(toolBarID); } /** * Returns an array of currently registered toolbars. * @return array of currently registered toolbars **/ public JavaTestToolBar[] getToolBars() { JavaTestToolBar[] ret = new JavaTestToolBar[0]; ret = (JavaTestToolBar[]) store.values().toArray(ret); return ret; } /** * Removes the toolbar by ID. * @param toolBarID unique string ID of theBar, can't be null or empty * @return true if the bar was successfully removed and false * if the specified ID was not be found. **/ boolean removeToolBar(String toolBarID) { if (store.containsKey(toolBarID)) { final JavaTestToolBar tb = (JavaTestToolBar) store.get(toolBarID); if (panel != null) SwingUtilities.invokeLater(new Runnable() { public void run() { panel.remove(tb); mmanager.removeToolbar(tb); } }); else { mmanager.removeToolbar(tb); } store.remove(toolBarID); return true; } return false; } /** * Accessor for the toolbar submenu in View menu **/ JMenu getToolbarMenu() { if (toolBarMenu == null) { toolBarMenu = uif.createMenu("tbmanager.viewmenu"); toolBarMenu.setVisible(false); } return toolBarMenu; } /** * Saves visible state. * Invoked from ExecTool's save **/ void save(Map m) { if (m != null) { for (JavaTestToolBar tb : store.values()) { tb.save(m); } } } void load(Map m) { if (m != null) { for (JavaTestToolBar tb : store.values()) { tb.load(m); } } } void setUIFactory(UIFactory u) { uif = u; } void setPanel(ToolBarPanel p) { if (p == null) throw new NullPointerException(); panel = p; if (store.size() > 0) { JavaTestToolBar[] tbs = getToolBars(); for (int i = 0; i < tbs.length; i++) { panel.add(tbs[i]); mmanager.addToolbar(tbs[i]); } // for } } void setVisibleFromPrefs(boolean visible) { int count = toolBarMenu.getItemCount(); for (int i = 0; i < count; i++) { JCheckBoxMenuItem mi = (JCheckBoxMenuItem)toolBarMenu.getItem(i); if (mi != null) { ToolbarMenuAction a = (ToolbarMenuAction)mi.getAction(); JavaTestToolBar bar = a.getBar(); if (!visible) { bar.setVisibleNoStateAffect(visible); } else { bar.setVisibleNoStateAffect(bar.readVisibleState()); } mi.setState(bar.isVisible()); } } } /** * TBMenuManager manages toolbar menu and processes adding/removing toolbars **/ class TBMenuManager { /** * Process adding toolbar to the panel. **/ public void addToolbar(JavaTestToolBar t) { if (t.isMenuControlled()) { JMenuItem m = getToolbarMenu(); ToolbarMenuAction ac = new ToolbarMenuAction(t); JCheckBoxMenuItem mi = new JCheckBoxMenuItem(ac); mi.setState(t.isVisible()); m.add(mi); toolBarMenu.setVisible(true); } } /** * Process removing toolbar from the panel. **/ public void removeToolbar(JavaTestToolBar t) { if (t.isMenuControlled()) { JMenu m = getToolbarMenu(); for (int i = 0; i < m.getItemCount() ; i++) { JMenuItem it = m.getItem(i); Action act = it.getAction(); if (act instanceof ToolbarMenuAction) { if (((ToolbarMenuAction) act).getBar() == t) { m.remove(i); break; } } } if (m.getItemCount() == 0) { m.setVisible(false); } } } } /** *ToolbarMenuAction reflects changing of visible state to the menu **/ class ToolbarMenuAction extends AbstractAction { public JavaTestToolBar getBar() { return theBar; } public ToolbarMenuAction(JavaTestToolBar bar) { super(bar.getName()); theBar = bar; } public void actionPerformed(ActionEvent evt) { theBar.setVisible(!theBar.isVisible()); } private JavaTestToolBar theBar; } private UIFactory uif; private JMenu toolBarMenu; private TBMenuManager mmanager = new TBMenuManager(); private Map store = Collections.synchronizedMap(new LinkedHashMap()); private ToolBarPanel panel; }