/******************************************************************************* * Copyright (c) 2006, 2009 Klaus Wenger, Wind River Systems, 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: * Klaus Wenger - initial API and implementation * Markus Schorn - cleanup and conversion to inner part of the search plugin. *******************************************************************************/ package org.eclipse.search.internal.ui; import java.util.Iterator; import java.util.List; 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.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2; import org.eclipse.ui.activities.WorkbenchActivityHelper; public class OpenSearchDialogPageAction implements IWorkbenchWindowPulldownDelegate2 { private IWorkbenchWindow fWorkbenchWindow; private OpenSearchDialogAction fOpenSearchDialogAction; @Override public Menu getMenu(Menu parent) { Menu menu= new Menu(parent); fillMenu(menu); return menu; } @Override public Menu getMenu(Control parent) { Menu menu= new Menu(parent); fillMenu(menu); return menu; } @Override public void dispose() { if (fOpenSearchDialogAction != null) { fOpenSearchDialogAction.dispose(); } } @Override public void init(IWorkbenchWindow window) { fWorkbenchWindow= window; } @Override public void run(IAction action) { if (fOpenSearchDialogAction == null) { fOpenSearchDialogAction= new OpenSearchDialogAction(); } fOpenSearchDialogAction.run(action); } @Override public void selectionChanged(IAction action, ISelection sel) { // Empty } private void fillMenu(final Menu localMenu) { List<SearchPageDescriptor> pageDescriptors= SearchPlugin.getDefault().getSearchPageDescriptors(); int accelerator= 1; for (Iterator<SearchPageDescriptor> iter= pageDescriptors.iterator(); iter.hasNext();) { SearchPageDescriptor desc= iter.next(); if (!WorkbenchActivityHelper.filterItem(desc) && desc.isEnabled()) { SearchPageAction action= new SearchPageAction(fWorkbenchWindow, desc); addToMenu(localMenu, action, accelerator++); } } localMenu.addMenuListener(new MenuAdapter() { @Override public void menuHidden(MenuEvent e) { e.display.asyncExec(new Runnable() { @Override public void run() { localMenu.dispose(); } }); } }); } private void addToMenu(Menu localMenu, 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(localMenu, -1); } private static final class SearchPageAction extends Action { private final OpenSearchDialogAction fOpenSearchDialogAction; public SearchPageAction(IWorkbenchWindow workbenchWindow, SearchPageDescriptor pageDescriptor) { super(); fOpenSearchDialogAction= new OpenSearchDialogAction(workbenchWindow, pageDescriptor.getId()); init(pageDescriptor); } private void init(SearchPageDescriptor pageDesc) { setText(pageDesc.getLabel()); setToolTipText(pageDesc.getLabel()); ImageDescriptor imageDescriptor= pageDesc.getImage(); if (imageDescriptor != null) { setImageDescriptor(imageDescriptor); } } @Override public void run() { fOpenSearchDialogAction.run(this); } } }