/*******************************************************************************
* Copyright (c) 2007, 2008 Symbian Software Limited 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:
* Bala Torati (Symbian) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.templateengine;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
import org.eclipse.cdt.core.templateengine.TemplateInfo;
import org.eclipse.cdt.core.templateengine.process.ProcessFailureException;
import org.eclipse.cdt.ui.CUIPlugin;
/**
* A wizard intending to show a choice of templates (@see org.eclipse.cdt.core.templateenginee.Template)
* before switching to the pages driven by the chosen template should extend from TemplatesChoiceWizard.
* Alternatively, when a choice of templates needn't be shown, TemplateDrivenWizard is a better fit.
* (@see org.eclipse.cdt.ui.templateengine.TemplateDrivenWizard)
*
*/
public abstract class TemplatesChoiceWizard extends Wizard implements ITemplatesListProvider, IWorkbenchWizard {
private static final boolean DEBUG = false;
private TemplateListSelectionPage templateListSelectionPage;
protected IWorkbench workbench;
protected IStructuredSelection selection;
@Override
public final void addPages() {
IWizardPage[] pages = getPagesBeforeTemplatePages();
for (IWizardPage page : pages) {
addPage(page);
}
templateListSelectionPage = new TemplateListSelectionPage(this);
addPage(templateListSelectionPage);
pages = getPagesAfterTemplatePages();
for (IWizardPage page : pages) {
addPage(page);
}
}
public String getListSelectionTitle()
{
return Messages.getString("TemplatesChoiceWizard.0"); //$NON-NLS-1$
}
public String getListSelectionDescription()
{
return Messages.getString("TemplatesChoiceWizard.1"); //$NON-NLS-1$
}
public String getListSelectionLabel()
{
return Messages.getString("TemplatesChoiceWizard.2"); //$NON-NLS-1$
}
protected abstract IWizardDataPage[] getPagesBeforeTemplatePages();
protected abstract IWizardDataPage[] getPagesAfterTemplatePages();
protected abstract IWizardDataPage[] getPagesAfterTemplateSelection();
IWizardDataPage[] getPagesAfterTemplateSelectionWithExtraPages(Template template) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
IWizardDataPage[] pages = getPagesAfterTemplateSelection();
TemplateInfo templateInfo = template.getTemplateInfo();
IPagesAfterTemplateSelectionProvider extraPagesProvider = (IPagesAfterTemplateSelectionProvider) templateInfo.getExtraPagesProvider();
if (extraPagesProvider != null) {
List<IWizardDataPage> pageList = new ArrayList<IWizardDataPage>(Arrays.asList(pages));
IWizardDataPage[] extraPages = extraPagesProvider.createAdditionalPages(this, workbench, selection);
pageList.addAll(Arrays.asList(extraPages));
pages = pageList.toArray(new IWizardDataPage[pageList.size()]);
}
return pages;
}
IWizardDataPage[] getExtraCreatedPages(Template template) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
TemplateInfo templateInfo = template.getTemplateInfo();
IPagesAfterTemplateSelectionProvider extraPagesProvider = (IPagesAfterTemplateSelectionProvider) templateInfo.getExtraPagesProvider();
if (extraPagesProvider != null) {
List<IWizardDataPage> pageList = new ArrayList<IWizardDataPage>();
IWizardDataPage[] extraPages = extraPagesProvider.getCreatedPages(this);
pageList.addAll(Arrays.asList(extraPages));
return pageList.toArray(new IWizardDataPage[pageList.size()]);
}
return new IWizardDataPage[0];
}
@Override
public boolean performFinish() {
IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
finishPage(monitor);
}
});
try {
getContainer().run(true, false, op);
} catch (InvocationTargetException e) {
return false;
} catch (InterruptedException e) {
return false;
}
return true;
}
private boolean finishPage(IProgressMonitor monitor) {
IStatus[] statuses = templateListSelectionPage.getTemplate().executeTemplateProcesses(monitor, false);
if (statuses.length == 1 && statuses[0].getException() instanceof ProcessFailureException) {
TemplateEngineUIUtil.showError(statuses[0].getMessage(), statuses[0].getException());
return false;
}
if (DEBUG) {
String msg = Messages.getString("TemplatesChoiceWizard.3"); //$NON-NLS-1$
TemplateEngineUIUtil.showStatusDialog(msg, new MultiStatus(CUIPlugin.getPluginId(), IStatus.OK, statuses, msg, null));
}
return true;
}
/**
* Returns the Data in Non-Template Pages.
* @return Map,
*/
public Map<String, String> getAllDataInNonTemplatePages() {
Map<String, String> map = new HashMap<String, String>();
IWizardDataPage[] pages = getPagesBeforeTemplatePages();
for (IWizardDataPage page : pages) {
map.putAll(page.getPageData());
}
pages = getPagesAfterTemplateSelection();
for (IWizardDataPage page : pages) {
map.putAll(page.getPageData());
}
try {
pages = getExtraCreatedPages(getSelectedTemplate());
} catch (Exception e) {
e.printStackTrace();
}
for (IWizardDataPage page : pages) {
map.putAll(page.getPageData());
}
pages = getPagesAfterTemplatePages();
for (IWizardDataPage page : pages) {
map.putAll(page.getPageData());
}
return map;
}
/**
* initializes the workbench
*/
public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
this.workbench = workbench;
this.selection = currentSelection;
initializeDefaultPageImageDescriptor();
}
protected void initializeDefaultPageImageDescriptor() {
// setDefaultPageImageDescriptor(descriptor);
}
public Template getSelectedTemplate() {
return templateListSelectionPage.getTemplate();
}
public void adjustTemplateValues(Template template) {
// Give the wizard a chance to adjust template values before they go into the page controls.
}
}