| /******************************************************************************* |
| * Copyright (c) 2005, 2006 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.xsd.ui.internal.search.actions; |
| |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.action.IMenuCreator; |
| import org.eclipse.jface.text.ITextSelection; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| 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.IEditorActionDelegate; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IObjectActionDelegate; |
| import org.eclipse.ui.IWorkbenchPart; |
| |
| //TODO (trung) should be in common.ui this one ?? |
| public abstract class BaseGroupActionDelegate implements IObjectActionDelegate, IEditorActionDelegate, IMenuCreator |
| { |
| protected ISelection fSelection; |
| private IAction fDelegateAction; |
| // whether to re-fill the menu (reset on selection change) |
| private boolean fFillMenu = true; |
| protected IWorkbenchPart workbenchPart; |
| |
| |
| public BaseGroupActionDelegate() |
| { |
| |
| } |
| |
| /* |
| * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart) |
| */ |
| public void setActivePart(IAction action, IWorkbenchPart targetPart) { |
| workbenchPart = targetPart; |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.action.IMenuCreator#dispose() |
| */ |
| public void dispose() { |
| // nothing to do |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control) |
| */ |
| public Menu getMenu(Control parent) { |
| // never called |
| return null; |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu) |
| */ |
| public Menu getMenu(Menu parent) { |
| //Create the new menu. The menu will get filled when it is about to be shown. see fillMenu(Menu). |
| Menu menu = new Menu(parent); |
| /** |
| * Add listener to repopulate the menu each time |
| * it is shown because MenuManager.update(boolean, boolean) |
| * doesn't dispose pulldown ActionContribution items for each popup menu. |
| */ |
| menu.addMenuListener(new MenuAdapter() { |
| public void menuShown(MenuEvent e) { |
| if (fFillMenu) { |
| Menu m = (Menu)e.widget; |
| MenuItem[] items = m.getItems(); |
| for (int i=0; i < items.length; i++) { |
| items[i].dispose(); |
| } |
| fillMenu(m); |
| fFillMenu = false; |
| } |
| } |
| }); |
| return menu; |
| } |
| |
| /* |
| * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) |
| */ |
| public void run(IAction action) { |
| // Never called because we become a menu. |
| } |
| |
| /* |
| * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) |
| */ |
| public void selectionChanged(IAction action, ISelection selection) { |
| fDelegateAction = action; |
| updateWith(selection); |
| |
| } |
| |
| public void setActiveEditor(IAction action, IEditorPart targetEditor) { |
| workbenchPart = targetEditor; |
| fDelegateAction = action; |
| if (targetEditor != null && targetEditor.getEditorSite() != null && targetEditor.getEditorSite().getSelectionProvider() != null) { |
| updateWith(targetEditor.getEditorSite().getSelectionProvider().getSelection()); |
| } |
| |
| } |
| |
| public void updateWith(ISelection selection) { |
| fSelection = selection; |
| if (fDelegateAction != null) { |
| boolean enable = false; |
| if (selection != null) { |
| if (selection instanceof ITextSelection) { |
| //if (((ITextSelection) selection).getLength() > 0) { |
| enable = true; |
| //} |
| } |
| else if(selection instanceof IStructuredSelection ){ |
| enable = !selection.isEmpty(); |
| } |
| } |
| // enable action |
| fDelegateAction.setEnabled(enable); |
| |
| // fill submenu |
| fFillMenu = true; |
| fDelegateAction.setMenuCreator(this); |
| |
| |
| } |
| |
| } |
| |
| |
| protected abstract void fillMenu(Menu menu); |
| |
| |
| |
| } |