/******************************************************************************* * Copyright (c) 2000, 2007 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.ui.internal; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.IActionDelegate; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartReference; /** * An object action extension in a popup menu. * <p> * For backward compatibility, the delegate object can implement either * <code>IActionDelegate</code> or <code>IObjectActionDelegate</code>. * </p> */ public class ObjectPluginAction extends PluginAction implements IPartListener2 { /** * The configuration element attribute for the identifier of the action * which this action is intended to override (i.e., replace). */ public static final String ATT_OVERRIDE_ACTION_ID = "overrideActionId";//$NON-NLS-1$ private String overrideActionId; private IWorkbenchPart activePart; public void partActivated(IWorkbenchPartReference partRef) { } public void partBroughtToTop(IWorkbenchPartReference partRef) { } public void partClosed(IWorkbenchPartReference partRef) { if (activePart != null && partRef.getPart(false) == activePart) { selectionChanged(StructuredSelection.EMPTY); disposeDelegate(); activePart = null; } } public void partDeactivated(IWorkbenchPartReference partRef) { } public void partHidden(IWorkbenchPartReference partRef) { } public void partInputChanged(IWorkbenchPartReference partRef) { } public void partOpened(IWorkbenchPartReference partRef) { } public void partVisible(IWorkbenchPartReference partRef) { } /** * Constructs a new ObjectPluginAction. * * @param actionElement * The configuration element used to construct this action; must * not be <code>null</code>. * @param id * The identifier for this action; must not be <code>null</code>. * @param style * The style bits */ public ObjectPluginAction(IConfigurationElement actionElement, String id, int style) { super(actionElement, id, style); overrideActionId = actionElement.getAttribute(ATT_OVERRIDE_ACTION_ID); } /* (non-Javadoc) * Method declared on PluginAction. */ protected void initDelegate() { super.initDelegate(); final IActionDelegate actionDelegate = getDelegate(); if (actionDelegate instanceof IObjectActionDelegate && activePart != null) { final IObjectActionDelegate objectActionDelegate = (IObjectActionDelegate) actionDelegate; final ISafeRunnable runnable = new ISafeRunnable() { public void run() throws Exception { objectActionDelegate.setActivePart(ObjectPluginAction.this, activePart); } public void handleException(Throwable exception) { // Do nothing. } }; Platform.run(runnable); } } /** * Sets the active part for the delegate. * <p> * This method will be called every time the action appears in a popup menu. * The targetPart may change with each invocation. * </p> * * @param targetPart * the new part target */ public void setActivePart(IWorkbenchPart targetPart) { if (activePart != targetPart) { if (activePart != null) { activePart.getSite().getPage().removePartListener(this); } if (targetPart != null) { targetPart.getSite().getPage().addPartListener(this); } } activePart = targetPart; IActionDelegate delegate = getDelegate(); if (delegate instanceof IObjectActionDelegate && activePart != null) { final IObjectActionDelegate objectActionDelegate = (IObjectActionDelegate) delegate; final ISafeRunnable runnable = new ISafeRunnable() { public void run() throws Exception { objectActionDelegate.setActivePart(ObjectPluginAction.this, activePart); } public void handleException(Throwable exception) { // Do nothing. } }; Platform.run(runnable); } } /** * Returns the action identifier this action overrides. * * @return the action identifier to override or <code>null</code> */ public String getOverrideActionId() { return overrideActionId; } /* (non-Javadoc) * @see org.eclipse.ui.internal.PluginAction#dispose() */ public void dispose() { if (activePart!=null) { activePart.getSite().getPage().removePartListener(this); activePart = null; } super.dispose(); } }