/*******************************************************************************
* 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.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.Status;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.w3c.dom.Element;
import org.eclipse.cdt.core.templateengine.TemplateCore;
import org.eclipse.cdt.core.templateengine.TemplateDescriptor;
import org.eclipse.cdt.core.templateengine.TemplateEngine;
import org.eclipse.cdt.core.templateengine.TemplateInfo;
import org.eclipse.cdt.core.templateengine.TemplateInitializationException;
import org.eclipse.cdt.core.templateengine.process.ProcessFailureException;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.templateengine.pages.UIPagesProvider;
import org.eclipse.cdt.ui.templateengine.pages.UIWizardPage;
import org.eclipse.cdt.ui.templateengine.uitree.UIElementTreeBuilderHelper;
import org.eclipse.cdt.ui.templateengine.uitree.UIElementTreeBuilderManager;
/**
* Template class is responsible for initiating GUI construction. Collecting data from GUI and
* initiating process part of Template Engine. This is created per TemplateDescriptor basis.
* Once The Template is created it creates a TemplateDescriptor for the XML file name given.
*
* @since 4.0
*/
public class Template extends TemplateCore {
private TemplateDescriptor templateDescriptor;
private UIElementTreeBuilderManager uiElementTreeBuilderManager;
private UIPagesProvider uiPagesProvider;
private Map<String, UIWizardPage> pageMap;
public Template(TemplateInfo templateInfo) throws TemplateInitializationException {
super(templateInfo);
templateDescriptor = getTemplateDescriptor();
uiElementTreeBuilderManager = new UIElementTreeBuilderManager(new UIElementTreeBuilderHelper(templateDescriptor, templateInfo));
uiPagesProvider = new UIPagesProvider();
}
/**
* 1. get PropertyGroupList.
* 2. clear UIPage's display order Vector.
* 3. for each PropertyGroup create the UIElementTree.
* 4. Request the UIPagesProvider to generate UIPages for the Tree.
* 5. return the HashMap of UIPages.
*/
public Map<String, UIWizardPage> getUIPages() {
if (pageMap == null) {
pageMap = new HashMap<String, UIWizardPage>();
List<Element> rootPropertyGrouplist = templateDescriptor.getPropertyGroupList();
uiPagesProvider.clearOrderVector();
for (int i = 0; i < rootPropertyGrouplist.size(); i++) {
// since the tree is constructed for a list of PropertyGroup's tree
// root is set to null
// before invoking createUIElementTree(...).
uiElementTreeBuilderManager.setUIElementTreeRootNull();
uiElementTreeBuilderManager.createUIElementTree(null, rootPropertyGrouplist.get(i));
pageMap.putAll(uiPagesProvider.getWizardUIPages(uiElementTreeBuilderManager.getUIElementTreeRoot(), getValueStore()));
}
}
return pageMap;
}
public IWizardPage[] getTemplateWizardPages(IWizardPage predatingPage, IWizardPage followingPage, IWizard wizard) {
List<IWizardDataPage> pages= new ArrayList<IWizardDataPage>();
// if (predatingPage != null) {
// pages.add(predatingPage);
// }
Map<String, UIWizardPage> templatePages = getUIPages();
List<String> templatePagesOrderVector = getPagesOrderVector();
if (templatePagesOrderVector.size() != 0) {
IWizardPage prevPage = predatingPage;
for (int i=0; i < templatePagesOrderVector.size(); i++) {
UIWizardPage page = templatePages.get(templatePagesOrderVector.get(i));
pages.add(page);
page.setPreviousPage(prevPage);
if (i+1 < templatePagesOrderVector.size()) {
page.setNextPage(templatePages.get(templatePagesOrderVector.get(i+1)));
} else {
page.setNextPage(followingPage);
}
page.setWizard(wizard);
prevPage = page;
}
predatingPage= prevPage;
}
try {
IWizardPage prevPage = predatingPage;
IWizardDataPage[] extraPages = getExtraCreatedPages((IWorkbenchWizard)wizard, PlatformUI.getWorkbench(), null);
for (IWizardDataPage page : extraPages) {
pages.add(page);
page.setPreviousPage(prevPage);
if(prevPage instanceof IWizardDataPage) {
((IWizardDataPage)prevPage).setNextPage(page);
}
page.setWizard(wizard);
prevPage = page;
}
if(prevPage instanceof IWizardDataPage) {
((IWizardDataPage)prevPage).setNextPage(followingPage);
}
} catch (Exception e) {
e.printStackTrace();
}
followingPage.setPreviousPage(predatingPage);
return pages.toArray(new IWizardPage[pages.size()]);
}
IWizardDataPage[] getExtraCreatedPages(IWorkbenchWizard wizard, IWorkbench workbench, IStructuredSelection selection) {
TemplateInfo templateInfo = getTemplateInfo();
IPagesAfterTemplateSelectionProvider extraPagesProvider = (IPagesAfterTemplateSelectionProvider) templateInfo.getExtraPagesProvider();
if (extraPagesProvider != null) {
return extraPagesProvider.createAdditionalPages(wizard, null, null);
}
return new IWizardDataPage[0];
}
/**
*
* @return List,which contains Page display order
*/
public List<String> getPagesOrderVector() {
return uiPagesProvider.getOrderVector();
}
/**
* this method is for JUnit Test case excecution. return the
* UIElementTreeBuilderManager instance used by this Template.
*
* @return UIElementTreeBuilderManager
*/
public UIElementTreeBuilderManager getUIElementTreeBuilderManager() {
return uiElementTreeBuilderManager;
}
/**
* initializeProcessBlockList() will create the ProcessBlockList,
* processPorcessBlockList() will invoke each process execution by assigning
* resources to each process (Ref. ProcessResourceManager).
* @param monitor
*/
@Override
public IStatus[] executeTemplateProcesses(IProgressMonitor monitor, final boolean showError) {
setDirty();
TemplateEngine.getDefault().updateSharedDefaults(this);
final IStatus[][] result = new IStatus[1][];
WorkspaceModifyOperation wmo = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor) throws org.eclipse.core.runtime.CoreException ,java.lang.reflect.InvocationTargetException ,InterruptedException {
try {
result[0] = getProcessHandler().processAll(monitor);
} catch (ProcessFailureException e) {
if (showError) {
TemplateEngineUIUtil.showError(e.getMessage(), e.getCause());
}
result[0] = new IStatus[] {new Status(IStatus.ERROR, CUIPlugin.getPluginId(), IStatus.ERROR, e.getMessage(), e)};
}
}
};
try {
wmo.run(monitor);
} catch(InterruptedException ie) {
throw new RuntimeException(ie);
} catch(InvocationTargetException ite) {
throw new RuntimeException(ite.getTargetException());
}
return result[0];
}
}