/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.ui.wizard;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IOperationHistory;
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectTemplate;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.ui.SeamGuiPlugin;
/**
* @author eskimo
*
*/
public abstract class SeamBaseWizard extends Wizard {
private IUndoableOperation operation;
private IWorkbench workbench;
private IStructuredSelection selection;
/**
*
* @param operation
*/
public SeamBaseWizard(IUndoableOperation operation) {
this.operation = operation;
}
/**
*
*/
@Override
public boolean performFinish() {
// TODO lock only current project, not entire workspace
try {
getContainer().run(false,false, new WorkspaceModifyOperation(){
@Override
protected void execute(IProgressMonitor monitor)
throws CoreException, InvocationTargetException,
InterruptedException {
IStatus result;
IUndoableOperation operation = getOperation();
IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
operation.addContext(undoContext);
try {
result = operationHistory.execute(operation, monitor, (IAdaptable)getPages()[0]);
if(operation instanceof SeamBaseOperation) {
SeamBaseOperation seamOperation = (SeamBaseOperation)operation;
seamOperation.openResultInEditor((IAdaptable)getPages()[0]);
}
} catch (ExecutionException e) {
result = new Status(IStatus.ERROR,SeamGuiPlugin.PLUGIN_ID,e.getMessage(),e);
SeamCorePlugin.getPluginLog().logError(e);
}
if(result.getSeverity()==IStatus.ERROR) {
ErrorDialog.openError(Display.getCurrent().getActiveShell(), "Error", MessageFormat.format("Error occur during creating {0}. Please, check Error Log View for details." , SeamBaseWizard.this.getWindowTitle()),result);
}
}
});
} catch (InvocationTargetException e) {
SeamCorePlugin.getPluginLog().logError(e);
} catch (InterruptedException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
return true;
}
/**
*
* @return
*/
public IUndoableOperation getOperation() {
if(operation!=null) return operation;
throw new IllegalStateException(SeamCoreMessages.SEAM_BASE_WIZARD_OPERATION_IS_NOT_DEFINED_FOR_WIZARD);
}
/**
*
* @param workbench
* @param selection
*/
public void init(IWorkbench workbench, IStructuredSelection selection) {
this.workbench = workbench;
this.setSelection(selection);
}
protected IFacetedProjectTemplate getTemplate() {
return ProjectFacetsManager.getTemplate("template.jst.seam"); //$NON-NLS-1$
}
public void setSelection(IStructuredSelection selection) {
this.selection = selection;
}
protected IStructuredSelection getInitialSelection() {
return selection;
}
}