/******************************************************************************* * Copyright (c) 2003, 2005 IBM Corporation 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 * * Contributors: * IBM Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.wst.server.ui.internal.webbrowser; import java.util.Iterator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.swt.events.MenuAdapter; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.*; import org.eclipse.ui.internal.browser.BrowserManager; import org.eclipse.ui.internal.browser.IBrowserDescriptor; import org.eclipse.ui.internal.browser.WebBrowserPreference; import org.eclipse.ui.internal.browser.WebBrowserUtil; /** * Action to open the Web broswer. */ public class SwitchBrowserWorkbenchAction implements IWorkbenchWindowPulldownDelegate2 { /** * The menu created by this action */ private Menu fMenu; protected boolean recreateMenu = false; /** * SwitchBrowserWorkbenchAction constructor comment. */ public SwitchBrowserWorkbenchAction() { super(); } public void dispose() { setMenu(null); } /** * Sets this action's drop-down menu, disposing the previous menu. * * @param menu the new menu */ private void setMenu(Menu menu) { if (fMenu != null) { fMenu.dispose(); } fMenu = menu; } public void init(IWorkbenchWindow window) { // do nothing } /** * Adds the given action to the specified menu with an accelerator specified * by the given number. * * @param menu the menu to add the action to * @param action the action to add * @param accelerator the number that should appear as an accelerator */ protected void addToMenu(Menu menu, IAction action, int accelerator) { StringBuffer label= new StringBuffer(); if (accelerator >= 0 && accelerator < 10) { //add the numerical accelerator label.append('&'); label.append(accelerator); label.append(' '); } label.append(action.getText()); action.setText(label.toString()); ActionContributionItem item= new ActionContributionItem(action); item.fill(menu, -1); } /** * Fills the drop-down menu with favorites and launch history, * launch shortcuts, and an action to open the launch configuration dialog. * * @param menu the menu to fill */ protected void fillMenu(Menu menu) { int i = 0; if (WebBrowserUtil.canUseInternalWebBrowser()) { addToMenu(menu, new SwitchDefaultBrowserAction(null, WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.INTERNAL, null), i++); } IBrowserDescriptor current = BrowserManager.getInstance().getCurrentWebBrowser(); BrowserManager browserManager = BrowserManager.getInstance(); Iterator iterator = browserManager.getWebBrowsers().iterator(); while (iterator.hasNext()) { IBrowserDescriptor browser = (IBrowserDescriptor) iterator.next(); addToMenu(menu, new SwitchDefaultBrowserAction(browser, WebBrowserPreference.getBrowserChoice() != WebBrowserPreference.INTERNAL && browser.equals(current), browserManager), i++); } } /** * Creates the menu for the action */ private void initMenu() { // Add listener to repopulate the menu each time // it is shown because of dynamic history list fMenu.addMenuListener(new MenuAdapter() { public void menuShown(MenuEvent e) { //if (recreateMenu) { Menu m = (Menu) e.widget; MenuItem[] items = m.getItems(); for (int i = 0; i < items.length; i++) { items[i].dispose(); } fillMenu(m); recreateMenu = false; //} } }); } public void selectionChanged(IAction action, ISelection selection) { // do nothing } public void run(IAction action) { // do nothing } public Menu getMenu(Menu parent) { setMenu(new Menu(parent)); //fillMenu(fMenu); initMenu(); return fMenu; } public Menu getMenu(Control parent) { setMenu(new Menu(parent)); //fillMenu(fMenu); initMenu(); return fMenu; } }