/******************************************************************************* * Copyright (c) 2000, 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.ecf.internal.ui.wizards; import org.eclipse.core.runtime.*; import org.eclipse.ecf.internal.ui.Activator; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.wizard.*; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.graphics.Point; import org.eclipse.ui.IPluginContribution; import org.eclipse.ui.IWorkbench; /** * A wizard node represents a "potential" wizard. Wizard nodes are used by * wizard selection pages to allow the user to pick from several available * nested wizards. * <p> * <b>Subclasses</b> simply need to override method <code>createWizard()</code>, * which is responsible for creating an instance of the wizard it represents AND * ensuring that this wizard is the "right" type of wizard (e.g.- New, Import, * etc.). * </p> */ public abstract class WizardNode implements IWizardNode, IPluginContribution { protected IWizard wizard; protected IWorkbench workbench; protected WorkbenchWizardElement wizardElement; protected WizardPage parentWizardPage; public WizardNode(IWorkbench workbench, WizardPage wizardPage, WorkbenchWizardElement wizardElement) { super(); this.workbench = workbench; this.parentWizardPage = wizardPage; this.wizardElement = wizardElement; } protected IWorkbench getWorkbench() { return this.workbench; } protected WorkbenchWizardElement getWizardElement() { return wizardElement; } /* * (non-Javadoc) * * @see org.eclipse.jface.wizard.IWizardNode#dispose() */ public void dispose() { // Do nothing since the wizard wasn't created via reflection. } /* * (non-Javadoc) * * @see org.eclipse.jface.wizard.IWizardNode#getExtent() */ public Point getExtent() { return new Point(-1, -1); } /* * (non-Javadoc) * * @see org.eclipse.ui.IPluginContribution#getLocalId() */ public String getLocalId() { IPluginContribution contribution = (IPluginContribution) wizardElement.getAdapter(IPluginContribution.class); if (contribution != null) return contribution.getLocalId(); return wizardElement.getId(); } /* * (non-Javadoc) * * @see org.eclipse.ui.IPluginContribution#getPluginId() */ public String getPluginId() { IPluginContribution contribution = (IPluginContribution) wizardElement.getAdapter(IPluginContribution.class); if (contribution != null) return contribution.getLocalId(); return null; } public abstract IWizard createWizard() throws CoreException; /* * (non-Javadoc) * * @see org.eclipse.jface.wizard.IWizardNode#getWizard() */ public IWizard getWizard() { if (wizard != null) return wizard; // we've already created it final IWizard[] newWizard = new IWizard[1]; final IStatus statuses[] = new IStatus[1]; // Start busy indicator. BusyIndicator.showWhile(parentWizardPage.getShell().getDisplay(), new Runnable() { public void run() { SafeRunner.run(new SafeRunnable() { /** * Add the exception details to status is one * happens. */ public void handleException(Throwable e) { IPluginContribution contribution = (IPluginContribution) wizardElement.getAdapter(IPluginContribution.class); statuses[0] = new Status(IStatus.ERROR, contribution != null ? contribution.getPluginId() : Activator.PLUGIN_ID, IStatus.OK, e.getMessage() == null ? "" : e.getMessage(), //$NON-NLS-1$, e); } public void run() { try { newWizard[0] = createWizard(); // create instance of target wizard } catch (CoreException e) { statuses[0] = e.getStatus(); } } }); } }); if (statuses[0] != null) { parentWizardPage.setErrorMessage("The selected wizard could not be started."); //$NON-NLS-1$ ErrorDialog.openError(parentWizardPage.getShell(), "Problem Opening Wizard", //$NON-NLS-1$ "The selected wizard could not be started.", statuses[0]); //$NON-NLS-1$ return null; } wizard = newWizard[0]; return wizard; } /* * (non-Javadoc) * * @see org.eclipse.jface.wizard.IWizardNode#isContentCreated() */ public boolean isContentCreated() { return wizard != null; } }