blob: af79ca6a91b3ba857c8b6fce693a6603799488ea [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002, 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.gmf.runtime.common.ui.services.action.contributionitem;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.gmf.runtime.common.core.service.ExecutionStrategy;
import org.eclipse.gmf.runtime.common.core.service.IOperation;
import org.eclipse.gmf.runtime.common.core.service.IProvider;
import org.eclipse.gmf.runtime.common.core.service.Service;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.CommonUIServicesActionPlugin;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.ContributeToActionBarsOperation;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.ContributeToPopupMenuOperation;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.DisposeContributionsOperation;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.IContributionDescriptorReader;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.IContributionItemProvider;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.ProviderContributionDescriptor;
import org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.UpdateActionBarsOperation;
import org.eclipse.gmf.runtime.common.ui.services.util.ActivityFilterProviderDescriptor;
import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor;
import org.eclipse.gmf.runtime.common.ui.util.WorkbenchPartDescriptor;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IPluginContribution;
import org.eclipse.ui.IWorkbenchPart;
import org.osgi.framework.Bundle;
/**
* A service for contributing items into different <code>IWorkbenchPart</code>'s
* contribution managers: ActionBars and ContextMenu(s).
*
* @see IContributionItemProvider
* @see AbstractContributionItemProvider
*
* @author melaasar, cmahoney
*/
public class ContributionItemService
extends Service
implements IContributionItemProvider {
/**
* A descriptor for <code>IContributionItemProvider</code> defined
* by a configuration element.
*/
protected static class ProviderDescriptor
extends ActivityFilterProviderDescriptor {
private static final String CHECK_PLUGIN_LOADED = "checkPluginLoaded"; //$NON-NLS-1$
/** the provider contribution descriptor parsed from XML */
private ProviderContributionDescriptor contributionDescriptor;
/** a flag to check if plugin is loaded */
private boolean checkPluginLoaded = true;
/**
* Constructs a <code>IContributionItemProvider</code> descriptor for
* the specified configuration element.
*
* @param element The configuration element describing the provider.
*/
public ProviderDescriptor(IConfigurationElement element) {
super(element);
String s = element.getAttribute(CHECK_PLUGIN_LOADED);
if (s != null)
this.checkPluginLoaded = Boolean.valueOf(s).booleanValue();
this.contributionDescriptor =
ProviderContributionDescriptor.parse(element);
assert null != contributionDescriptor : "contributionDescriptor cannot be null"; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.common.core.service.IProvider#provides(org.eclipse.gmf.runtime.common.core.service.IOperation)
*/
public boolean provides(IOperation operation) {
// If contributions are to be disposed, dispose them regardless whether the plugin is loaded or not
if (operation instanceof DisposeContributionsOperation) {
if (provider != null)
return provider.provides(operation);
}
// filter providers based on disabled capabilities
if (!super.provides(operation)) {
return false;
}
// if asked to check that the plugin is loaded and it is not, ignore
if (checkPluginLoaded && !isPluginLoaded()) {
return false;
}
// if no XML contributions, forward to the provider
if (!contributionDescriptor.hasContributions()) {
if (!policyInitialized){
policyInitialized = true;
policy = getPolicy();
}
if (policy!=null) {
return getPolicy().provides(operation);
}
if (getProvider() != null) {
return getProvider().provides(operation);
}
}
if (operation instanceof ContributeToActionBarsOperation) {
ContributeToActionBarsOperation op =
(ContributeToActionBarsOperation) operation;
return contributionDescriptor.hasContributionsFor(
op.getWorkbenchPartDescriptor().getPartId(),
op.getWorkbenchPartDescriptor().getPartClass());
} else if (operation instanceof ContributeToPopupMenuOperation) {
ContributeToPopupMenuOperation op =
(ContributeToPopupMenuOperation) operation;
ISelection selection =
op
.getWorkbenchPart()
.getSite()
.getSelectionProvider()
.getSelection();
return contributionDescriptor.hasContributionsFor(
op.getPopupMenu(),
selection);
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.common.core.internal.service.Service.ProviderDescriptor#getProvider()
*/
public IProvider getProvider() {
if (provider == null) {
IProvider newProvider = super.getProvider();
if (provider instanceof IContributionDescriptorReader) {
IContributionDescriptorReader reader =
(IContributionDescriptorReader) newProvider;
reader.setContributionDescriptor(contributionDescriptor);
}
if (provider instanceof AbstractContributionItemProvider) {
((AbstractContributionItemProvider) provider)
.setPluginContribution(new IPluginContribution() {
public String getLocalId() {
return getElement().getDeclaringExtension()
.getSimpleIdentifier();
}
public String getPluginId() {
return getElement().getContributor().getName();
}
});
}
return newProvider;
}
return super.getProvider();
}
/**
* Verify if the declaring plugin of the provider is loaded; if it is not loaded, add a listener that.
*
* @return <code>true</code> if the declaring pluging of the propety
* provider is loaded, <code>false</code> otherwise
*/
private boolean isPluginLoaded() {
if (!getElement().isValid())
return false;
String pluginId = getElement().getDeclaringExtension().getContributor().getName();
Bundle bundle = Platform.getBundle(pluginId);
return null != bundle
&& bundle.getState() == org.osgi.framework.Bundle.ACTIVE;
}
}
/**
* The single instance of the contribution item service.
*/
private static final ContributionItemService instance =
new ContributionItemService();
/**
* Returns the single instanceo of the <code>ContributionItemService</code>.
*
* @return The single instance of the <code>ContributionItemService</code>
*/
public static ContributionItemService getInstance() {
return instance;
}
/**
* Creates a new <code>ContributionItemService</code> instance.
*/
private ContributionItemService() {
super();
configureProviders(CommonUIServicesActionPlugin.getPluginId(), "contributionItemProviders"); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.common.core.internal.service.Service#newProviderDescriptor(org.eclipse.core.runtime.IConfigurationElement)
*/
protected Service.ProviderDescriptor newProviderDescriptor(
IConfigurationElement element) {
return new ProviderDescriptor(element);
}
/**
* Makes contributions to the given <code>actionBars</code> that belong to the given part.
* @param actionBars the action bars
* @param workbenchPart the workbench part
* @see #contributeToActionBars(IActionBars, IWorkbenchPartDescriptor)
*/
public void contributeToActionBars(
IActionBars actionBars,
IWorkbenchPart workbenchPart) {
contributeToActionBars(
actionBars,
new WorkbenchPartDescriptor(
workbenchPart.getSite().getId(),
workbenchPart.getClass(),
workbenchPart.getSite().getPage()));
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.IContributionItemProvider#contributeToActionBars(org.eclipse.ui.IActionBars, org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor)
*/
public void contributeToActionBars(
IActionBars actionBars,
IWorkbenchPartDescriptor workbenchPartDescriptor) {
execute(new ContributeToActionBarsOperation(actionBars,
workbenchPartDescriptor));
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.IContributionItemProvider#contributeToPopupMenu(org.eclipse.jface.action.IMenuManager,
* org.eclipse.ui.IWorkbenchPart)
*/
public void contributeToPopupMenu(
IMenuManager popupMenu,
IWorkbenchPart workbenchPart) {
execute(new ContributeToPopupMenuOperation(popupMenu, workbenchPart));
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.IContributionItemProvider#disposeContributions(org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor)
*/
public void disposeContributions(IWorkbenchPartDescriptor workbenchPartDescriptor) {
execute(new DisposeContributionsOperation(workbenchPartDescriptor));
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.common.ui.services.action.internal.contributionitem.IContributionItemProvider#updateActionBars(org.eclipse.ui.IActionBars, org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor)
*/
public void updateActionBars(IActionBars actionBars,
IWorkbenchPartDescriptor workbenchPartDescriptor) {
execute(new UpdateActionBarsOperation(actionBars,
workbenchPartDescriptor));
}
/**
* Disposes of the contributions that have been made to the <code>workbenchPart</code>.
* @param workbenchPart the workbench part
*/
public void disposeContributions(IWorkbenchPart workbenchPart) {
execute(
new DisposeContributionsOperation(
new WorkbenchPartDescriptor(
workbenchPart.getSite().getId(),
workbenchPart.getClass(),
workbenchPart.getSite().getPage())));
}
/**
* Executes the operation with the REVERSE strategy.
*
* @param operation the operation to be executed.
*/
private void execute(IOperation operation) {
execute(ExecutionStrategy.REVERSE, operation);
}
}