| /******************************************************************************* |
| * Copyright (c) 2004, 2006 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.wizards; |
| |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker; |
| import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler; |
| import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.internal.dialogs.WizardCollectionElement; |
| import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement; |
| import org.eclipse.ui.internal.registry.WizardsRegistryReader; |
| import org.eclipse.ui.internal.util.Util; |
| import org.eclipse.ui.wizards.IWizardDescriptor; |
| |
| /** |
| * Abstract baseclass for wizard registries that listen to extension changes. |
| * |
| * @since 3.1 |
| */ |
| public abstract class AbstractExtensionWizardRegistry extends |
| AbstractWizardRegistry implements IExtensionChangeHandler{ |
| |
| /** |
| * Create a new instance of this class. |
| */ |
| public AbstractExtensionWizardRegistry() { |
| super(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker, org.eclipse.core.runtime.IExtension) |
| */ |
| public void addExtension(IExtensionTracker tracker, IExtension extension) { |
| WizardsRegistryReader reader = new WizardsRegistryReader(getPlugin(), |
| getExtensionPoint()); |
| reader.setInitialCollection(getWizardElements()); |
| IConfigurationElement[] configurationElements = extension |
| .getConfigurationElements(); |
| for (int i = 0; i < configurationElements.length; i++) { |
| reader.readElement(configurationElements[i]); |
| } |
| // no need to reset the wizard elements - getWizardElements will parse |
| // the |
| // results of the registry reading |
| setWizardElements(reader.getWizardElements()); |
| // reregister all object handles - it'd be better to process the deltas |
| // in this case |
| registerWizards(getWizardElements()); |
| |
| // handle the primary wizards |
| WorkbenchWizardElement[] additionalPrimary = reader.getPrimaryWizards(); |
| if (additionalPrimary.length == 0) { |
| return; |
| } |
| IWizardDescriptor[] localPrimaryWizards = getPrimaryWizards(); |
| WorkbenchWizardElement[] newPrimary = new WorkbenchWizardElement[additionalPrimary.length |
| + localPrimaryWizards.length]; |
| System.arraycopy(localPrimaryWizards, 0, newPrimary, 0, |
| localPrimaryWizards.length); |
| System.arraycopy(additionalPrimary, 0, newPrimary, |
| localPrimaryWizards.length, additionalPrimary.length); |
| setPrimaryWizards(newPrimary); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.wizards.AbstractWizardRegistry#dispose() |
| */ |
| public void dispose() { |
| super.dispose(); |
| PlatformUI.getWorkbench().getExtensionTracker() |
| .unregisterHandler(this); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.internal.wizards.AbstractWizardRegistry#doInitialize() |
| */ |
| protected void doInitialize() { |
| |
| PlatformUI.getWorkbench().getExtensionTracker().registerHandler(this, ExtensionTracker.createExtensionPointFilter(getExtensionPointFilter())); |
| |
| WizardsRegistryReader reader = new WizardsRegistryReader(getPlugin(), |
| getExtensionPoint()); |
| setWizardElements(reader.getWizardElements()); |
| setPrimaryWizards(reader.getPrimaryWizards()); |
| registerWizards(getWizardElements()); |
| } |
| |
| /** |
| * Return the extension point id that should be used for extension registry |
| * queries. |
| * |
| * @return the extension point id |
| */ |
| protected abstract String getExtensionPoint(); |
| |
| private IExtensionPoint getExtensionPointFilter() { |
| return Platform.getExtensionRegistry().getExtensionPoint(getPlugin(), |
| getExtensionPoint()); |
| } |
| |
| /** |
| * Return the plugin id that should be used for extension registry queries. |
| * |
| * @return the plugin id |
| */ |
| protected abstract String getPlugin(); |
| |
| /** |
| * Register the object with the workbench tracker. |
| * |
| * @param extension |
| * the originating extension |
| * @param object |
| * the object to track |
| */ |
| private void register(IExtension extension, Object object) { |
| PlatformUI.getWorkbench().getExtensionTracker().registerObject( |
| extension, object, IExtensionTracker.REF_WEAK); |
| } |
| |
| /** |
| * Register all wizards in the given collection with the extension tracker. |
| * |
| * @param collection |
| * the collection to register |
| */ |
| private void registerWizards(WizardCollectionElement collection) { |
| registerWizards(collection.getWorkbenchWizardElements()); |
| |
| WizardCollectionElement[] collections = collection |
| .getCollectionElements(); |
| for (int i = 0; i < collections.length; i++) { |
| IConfigurationElement configurationElement = collections[i] |
| .getConfigurationElement(); |
| if (configurationElement != null) { |
| register(configurationElement.getDeclaringExtension(), |
| collections[i]); |
| } |
| registerWizards(collections[i]); |
| } |
| } |
| |
| /** |
| * Register all wizards in the given array. |
| * |
| * @param wizards |
| * the wizards to register |
| */ |
| private void registerWizards(WorkbenchWizardElement[] wizards) { |
| for (int i = 0; i < wizards.length; i++) { |
| register(wizards[i].getConfigurationElement() |
| .getDeclaringExtension(), wizards[i]); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension, java.lang.Object[]) |
| */ |
| public void removeExtension(IExtension extension, Object[] objects) { |
| if (!extension.getExtensionPointUniqueIdentifier().equals( |
| getExtensionPointFilter().getUniqueIdentifier())) { |
| return; |
| } |
| for (int i = 0; i < objects.length; i++) { |
| Object object = objects[i]; |
| if (object instanceof WizardCollectionElement) { |
| // TODO: should we move child wizards to the "other" node? |
| WizardCollectionElement collection = (WizardCollectionElement) object; |
| collection.getParentCollection().remove(collection); |
| } else if (object instanceof WorkbenchWizardElement) { |
| WorkbenchWizardElement wizard = (WorkbenchWizardElement) object; |
| WizardCollectionElement parent = wizard.getCollectionElement(); |
| if (parent != null) { |
| parent.remove(wizard); |
| } |
| IWizardDescriptor[] primaryWizards = getPrimaryWizards(); |
| for (int j = 0; j < primaryWizards.length; j++) { |
| if (primaryWizards[j] == wizard) { |
| WorkbenchWizardElement[] newPrimary = new WorkbenchWizardElement[primaryWizards.length - 1]; |
| Util |
| .arrayCopyWithRemoval(primaryWizards, |
| newPrimary, j); |
| primaryWizards = newPrimary; |
| break; |
| } |
| } |
| setPrimaryWizards((WorkbenchWizardElement[]) primaryWizards); |
| } |
| } |
| } |
| } |