blob: 375daaa8c5584a040c3b6eee0c70e8b033502f9a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.ide.registry;
import java.util.ArrayList;
import org.eclipse.core.resources.IProjectNatureDescriptor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.ICapabilityInstallWizard;
import org.eclipse.ui.ICapabilityUninstallWizard;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.model.WorkbenchAdapter;
import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
* A capability is the user interface aspect of a project's nature. There is
* a 1-1 relationship between a capability and a nature. It is possible for
* a nature to not have a capability, but the opposite is not true - that is,
* a capability must represent a nature.
* <p>
* A capability can take control of the user interface of other capabilities. It
* is then responsible for collecting the necessary information and adding the
* natures represented by these capabilites.
* </p>
*/
public class Capability extends WorkbenchAdapter implements IAdaptable {
private static final String ATT_ID = "id"; //$NON-NLS-1$
private static final String ATT_ICON = "icon"; //$NON-NLS-1$
private static final String ATT_NATURE_ID = "natureId"; //$NON-NLS-1$
private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
private static final String ATT_DESCRIPTION = "description"; //$NON-NLS-1$
private static final String ATT_INSTALL_WIZARD = "installWizard"; //$NON-NLS-1$
private static final String ATT_INSTALL_DETAILS = "installDetails"; //$NON-NLS-1$
private static final String ATT_UNINSTALL_WIZARD = "uninstallWizard"; //$NON-NLS-1$
private static final String ATT_UNINSTALL_DETAILS = "uninstallDetails"; //$NON-NLS-1$
private String id;
private String natureId;
private IProjectNatureDescriptor natureDescriptor;
private ImageDescriptor icon;
private IConfigurationElement element;
private ArrayList handleUIs;
private ArrayList perspectiveChoices;
/**
* Creates an instance of <code>Capability</code> using the
* information provided by the configuration element.
*
* @param configElement the <code>IConfigurationElement<code> containing
* the attributes
* @param reader the <code>CapabilityRegistryReader<code> used to log missing attributes
* @throws WorkbenchException if the ID, nature, or wizard is <code>null</code>
*/
public Capability(IConfigurationElement configElement,
CapabilityRegistryReader reader) throws WorkbenchException {
super();
boolean missingAttribute = false;
String attr_id = configElement.getAttribute(ATT_ID);
String attr_nature = configElement.getAttribute(ATT_NATURE_ID);
if (attr_id == null) {
reader.logMissingAttribute(configElement, ATT_ID);
missingAttribute = true;
}
if (attr_nature == null) {
reader.logMissingAttribute(configElement, ATT_NATURE_ID);
missingAttribute = true;
}
if (configElement.getAttribute(ATT_INSTALL_WIZARD) == null) {
reader.logMissingAttribute(configElement, ATT_INSTALL_WIZARD);
missingAttribute = true;
}
if (missingAttribute)
throw new WorkbenchException(
"Capability missing required attributes."); //$NON-NLS-1$
id = attr_id;
natureId = attr_nature;
element = configElement;
natureDescriptor = ResourcesPlugin.getWorkspace().getNatureDescriptor(
natureId);
}
/**
* Creates an instance of <code>Capability</code> as an unknown one
* for a given nature id.
*
* @param natureId the nature id for the unknown capbility
*/
public Capability(String natureId) {
super();
this.id = natureId;
this.natureId = natureId;
}
/**
* Adds the id of a capability for which this capability handles
* the user interface.
*/
public void addHandleUI(String capabilityId) {
if (handleUIs == null)
handleUIs = new ArrayList(4);
handleUIs.add(capabilityId);
}
/**
* Adds the id of a perspective for which this capability
* wants to present as a choice in the user interface.
*/
public void addPerspectiveChoice(String perspId) {
if (perspectiveChoices == null)
perspectiveChoices = new ArrayList(4);
perspectiveChoices.add(perspId);
}
public String getId() {
return id;
}
/* (non-Javadoc)
* Method declared on IWorkbenchAdapter.
*/
public ImageDescriptor getImageDescriptor(Object object) {
return getIconDescriptor();
}
/* (non-Javadoc)
* Method declared on IWorkbenchAdapter.
*/
public String getLabel(Object o) {
return getName();
}
public String getName() {
if (isValid())
return natureDescriptor.getLabel();
else
return NLS.bind(IDEWorkbenchMessages.Capability_nameMissing, id);
}
public ImageDescriptor getIconDescriptor() {
if (icon == null && isValid()) {
String extendingPluginId = element.getNamespace();
String location = element.getAttribute(ATT_ICON);
if (location != null && location.length() > 0)
icon = AbstractUIPlugin.imageDescriptorFromPlugin(
extendingPluginId, location);
}
return icon;
}
/**
* Returns the nature descriptor or <code>null</code> if
* none exist.
*/
public IProjectNatureDescriptor getNatureDescriptor() {
return natureDescriptor;
}
public String getNatureId() {
return natureId;
}
/* (non-Javadoc)
* Method declared on IAdaptable.
*/
public Object getAdapter(Class adapter) {
if (adapter == IWorkbenchAdapter.class)
return this;
else
return null;
}
public String getCategoryPath() {
if (element == null)
return ""; //$NON-NLS-1$;
else
return element.getAttribute(ATT_CATEGORY);
}
/**
* Returns a new instance of the capability install
* wizard. Caller is responsible for calling the init
* method. If the wizard cannot be created, <code>null</code>
* is returned.
*
* @return the non-initialized capability wizard or
* <code>null</code> if the wizard cannot be created.
*/
public ICapabilityInstallWizard getInstallWizard() {
if (!isValid())
return null;
try {
return (ICapabilityInstallWizard) element
.createExecutableExtension(ATT_INSTALL_WIZARD);
} catch (CoreException e) {
IDEWorkbenchPlugin
.log(
"Could not create capability install wizard.", e.getStatus()); //$NON-NLS-1$
return null;
}
}
/**
* Returns the description for the install wizard
* or <code>null</code> if none supplied.
*/
public String getInstallDetails() {
if (!isValid())
return null;
return element.getAttribute(ATT_INSTALL_DETAILS);
}
/**
* Returns a new instance of the capability uninstall
* wizard. Caller is responsible for calling the init
* method. If the wizard cannot be created, <code>null</code>
* is returned.
*
* @return the non-initialized capability wizard or
* <code>null</code> if the wizard cannot be created.
*/
public ICapabilityUninstallWizard getUninstallWizard() {
if (!isValid())
return null;
try {
return (ICapabilityUninstallWizard) element
.createExecutableExtension(ATT_UNINSTALL_WIZARD);
} catch (CoreException e) {
IDEWorkbenchPlugin
.log(
"Could not create capability uninstall wizard.", e.getStatus()); //$NON-NLS-1$
return null;
}
}
/**
* Returns the description for the uninstall wizard
* or <code>null</code> if none supplied.
*/
public String getUninstallDetails() {
if (!isValid())
return null;
return element.getAttribute(ATT_UNINSTALL_DETAILS);
}
public String getDescription() {
if (!isValid())
return ""; //$NON-NLS-1$;
String description = element.getAttribute(ATT_DESCRIPTION);
if (description == null)
description = ""; //$NON-NLS-1$
return description;
}
/**
* Returns a list of ids of other capabilities for which this
* capability handles the user interface, or <code>null</code>
* if not applicable.
*/
public ArrayList getHandleUIs() {
return handleUIs;
}
/**
* Returns a list of ids of perspectives for which this
* capability wants to present as choices, or <code>null</code>
* if not applicable.
*/
public ArrayList getPerspectiveChoices() {
return perspectiveChoices;
}
/**
* Returns whether this capability is valid
*/
public boolean isValid() {
return natureDescriptor != null;
}
}