package org.marketcetera.photon.internal.strategy.ui; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard; import org.marketcetera.photon.commons.ui.JFaceUtils; import org.marketcetera.photon.strategy.StrategyUI; import org.marketcetera.util.except.ExceptUtils; import org.marketcetera.util.log.I18NBoundMessage2P; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * Wizard to create a new strategy script from a template. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: AbstractNewStrategyWizard.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.0.0 */ @ClassVersion("$Id: AbstractNewStrategyWizard.java 16154 2012-07-14 16:34:05Z colin $") public abstract class AbstractNewStrategyWizard extends Wizard implements INewWizard { private NewStrategyWizardPage mPage; private ISelection mSelection; /** * Constructor. */ public AbstractNewStrategyWizard() { setNeedsProgressMonitor(true); } @Override public void addPages() { mPage = createPage(mSelection); setWindowTitle(mPage.getTitle()); addPage(mPage); } /** * Hook for subclasses to create the single wizard page. * * @return the wizard page */ protected abstract NewStrategyWizardPage createPage(ISelection selection); @Override public boolean performFinish() { final String containerName = mPage.getContainerName(); final String className = mPage.getClassName(); IRunnableWithProgress op = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException { try { doFinish(containerName, className, monitor); } catch (CoreException e) { throw new InvocationTargetException(e); } finally { monitor.done(); } } }; return JFaceUtils.runModalWithErrorDialog(getContainer(), op, false, new I18NBoundMessage2P( Messages.ABSTRACT_NEW_STRATEGY_WIZARD_CREATION_FAILED, className, containerName)); } /** * The worker method. It will find the container, create the file if missing * or just replace its contents, and open the editor on the newly created * file. */ private void doFinish(final String containerName, final String className, final IProgressMonitor monitor) throws CoreException { final SubMonitor progress = SubMonitor.convert(monitor); final String fileName = getScriptName(className); progress.beginTask( Messages.ABSTRACT_NEW_STRATEGY_WIZARD_CREATING_FILE__TASK_NAME .getText(fileName), 100); final IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot root = workspace.getRoot(); IResource resource = root.findMember(containerName); if (resource == null || !(resource instanceof IContainer)) { throwCoreException(Messages.ABSTRACT_NEW_STRATEGY_WIZARD_MISSING_CONTAINER .getText(containerName)); } IContainer container = (IContainer) resource; final IFile file = container.getFile(new Path(fileName)); workspace.run( new IWorkspaceRunnable() { @Override public void run(IProgressMonitor monitor) throws CoreException { InputStream stream = openContentStream(className); try { if (file.exists()) { throwCoreException(Messages.ABSTRACT_NEW_STRATEGY_WIZARD_FILE_EXISTS .getText(fileName)); } else { file.create(stream, true, monitor); } } finally { try { stream.close(); } catch (IOException e) { ExceptUtils.swallow(e); } } } }, workspace.getRuleFactory().createRule(file), IWorkspace.AVOID_UPDATE, progress.newChild(50)); progress .setTaskName(Messages.ABSTRACT_NEW_STRATEGY_WIZARD_OPENING_FILE__TASK_NAME .getText()); getShell().getDisplay().asyncExec(new Runnable() { public void run() { final IWorkbenchPage window = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage(); IWorkbenchPage page = window; try { IDE.openEditor(page, file, true); BasicNewFileResourceWizard.selectAndReveal(file, PlatformUI .getWorkbench().getActiveWorkbenchWindow()); } catch (PartInitException e) { ExceptUtils.swallow(e); } } }); progress.worked(50); } protected abstract String getScriptName(String typeName); protected abstract InputStream openContentStream(String className); private void throwCoreException(String message) throws CoreException { IStatus status = new Status(IStatus.ERROR, StrategyUI.PLUGIN_ID, IStatus.OK, message, null); throw new CoreException(status); } @Override public void init(IWorkbench workbench, IStructuredSelection selection) { this.mSelection = selection; } }