X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/actions/OpenEditorActionGroup.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/actions/OpenEditorActionGroup.java new file mode 100644 index 0000000..067a9f1 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/actions/OpenEditorActionGroup.java @@ -0,0 +1,155 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.ui.actions; + +import net.sourceforge.phpdt.internal.ui.actions.ActionMessages; +import net.sourceforge.phpdt.ui.IContextMenuConstants; +import net.sourceforge.phpeclipse.actions.PHPOpenDeclarationAction; +import net.sourceforge.phpeclipse.actions.PHPOpenDeclarationEditorAction; +import net.sourceforge.phpeclipse.phpeditor.PHPEditor; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchSite; +import org.eclipse.ui.actions.ActionGroup; +import org.eclipse.ui.actions.OpenWithMenu; + +/** + * Action group that adds the actions opening a new editor to the + * context menu and the action bar's navigate menu. + * + *

+ * This class may be instantiated; it is not intended to be subclassed. + *

+ * + * @since 2.0 + */ +public class OpenEditorActionGroup extends ActionGroup { + + private IWorkbenchSite fSite; + private boolean fIsEditorOwner; + private PHPOpenDeclarationAction fOpen; + + /** + * Creates a new OpenActionGroup. The group requires + * that the selection provided by the part's selection provider is of type + * org.eclipse.jface.viewers.IStructuredSelection. + * + * @param part the view part that owns this action group + */ + public OpenEditorActionGroup(IViewPart part) { + fSite= part.getSite(); + fOpen= new PHPOpenDeclarationAction(fSite); + fOpen.setActionDefinitionId(PHPEditorActionDefinitionIds.OPEN_EDITOR); + initialize(fSite.getSelectionProvider()); + } + + /** + * Note: This constructor is for internal use only. Clients should not call this constructor. + */ + public OpenEditorActionGroup(PHPEditor part) { + fIsEditorOwner= true; + fOpen= new PHPOpenDeclarationAction(part); + fOpen.setActionDefinitionId(PHPEditorActionDefinitionIds.OPEN_EDITOR); + part.setAction("OpenEditor", fOpen); //$NON-NLS-1$ + fSite= part.getEditorSite(); + initialize(fSite.getSelectionProvider()); + } + + /** + * Returns the open action managed by this action group. + * + * @return the open action. Returns null if the group + * doesn't provide any open action + */ + public IAction getOpenAction() { + return fOpen; + } + + private void initialize(ISelectionProvider provider) { + ISelection selection= provider.getSelection(); + fOpen.update(selection); + if (!fIsEditorOwner) { + provider.addSelectionChangedListener(fOpen); + } + } + + /* (non-Javadoc) + * Method declared in ActionGroup + */ + public void fillActionBars(IActionBars actionBar) { + super.fillActionBars(actionBar); + setGlobalActionHandlers(actionBar); + } + + /* (non-Javadoc) + * Method declared in ActionGroup + */ + public void fillContextMenu(IMenuManager menu) { + super.fillContextMenu(menu); + appendToGroup(menu, fOpen); + if (!fIsEditorOwner) { + addOpenWithMenu(menu); + } + } + + /* + * @see ActionGroup#dispose() + */ + public void dispose() { + ISelectionProvider provider= fSite.getSelectionProvider(); + provider.removeSelectionChangedListener(fOpen); + super.dispose(); + } + + private void setGlobalActionHandlers(IActionBars actionBars) { + actionBars.setGlobalActionHandler(PHPdtActionConstants.OPEN, fOpen); + } + + private void appendToGroup(IMenuManager menu, IAction action) { + if (action.isEnabled()) + menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, action); + } + + private void addOpenWithMenu(IMenuManager menu) { + ISelection selection= getContext().getSelection(); + if (selection.isEmpty() || !(selection instanceof IStructuredSelection)) + return; + IStructuredSelection ss= (IStructuredSelection)selection; + if (ss.size() != 1) + return; + + Object o= ss.getFirstElement(); + if (!(o instanceof IAdaptable)) + return; + + IAdaptable element= (IAdaptable)o; + Object resource= element.getAdapter(IResource.class); + if (!(resource instanceof IFile)) + return; + + // Create a menu flyout. + IMenuManager submenu= new MenuManager(ActionMessages.getString("OpenWithMenu.label")); //$NON-NLS-1$ + submenu.add(new OpenWithMenu(fSite.getPage(), (IFile) resource)); + + // Add the submenu. + menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, submenu); + } +}