--- /dev/null
+/*******************************************************************************
+ * 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.
+ *
+ * <p>
+ * This class may be instantiated; it is not intended to be subclassed.
+ * </p>
+ *
+ * @since 2.0
+ */
+public class OpenEditorActionGroup extends ActionGroup {
+
+ private IWorkbenchSite fSite;
+ private boolean fIsEditorOwner;
+ private PHPOpenDeclarationAction fOpen;
+
+ /**
+ * Creates a new <code>OpenActionGroup</code>. The group requires
+ * that the selection provided by the part's selection provider is of type <code>
+ * org.eclipse.jface.viewers.IStructuredSelection</code>.
+ *
+ * @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 <code>null</code> 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);
+ }
+}