/**
* Copyright (c) 2013-2016 Angelo ZERR.
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.ide.tools.internal.ui.wizards;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
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;
public abstract class TernWizard<T> extends Wizard {
private T model;
private IStructuredSelection selection;
private final List<IOperation> operations;
private int total;
public TernWizard() {
this.operations = new ArrayList<IOperation>();
this.total = 0;
}
public void addOperation(IOperation operation) {
operations.add(operation);
total += operation.getTotal();
}
@Override
public void addPage(IWizardPage page) {
if (page instanceof ITernWizardPage) {
if (model == null) {
model = createModel();
}
((ITernWizardPage) page).setModel(model);
((ITernWizardPage) page).setSelection(selection);
}
super.addPage(page);
}
@Override
public boolean performFinish() {
for (IOperation operation : operations) {
operation.init();
}
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException {
monitor.beginTask(getTaskLabel(), total);
try {
for (IOperation operation : operations) {
operation.run(monitor, model);
}
} catch (Throwable e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
}
}
};
try {
getContainer().run(true, false, op);
} catch (InterruptedException e) {
return false;
} catch (InvocationTargetException e) {
Throwable realException = e.getTargetException();
MessageDialog.openError(getShell(), "Error",
realException.getMessage());
return false;
}
return true;
}
/**
* We will accept the selection in the workbench to see if we can initialize
* from it.
*
* @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
*/
public void init(IWorkbench workbench, IStructuredSelection selection) {
this.selection = selection;
}
public T getModel() {
return model;
}
public IStructuredSelection getSelection() {
return selection;
}
protected abstract T createModel();
protected abstract String getTaskLabel();
}