package com.robotoworks.mechanoid.ui.wizard; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; import com.robotoworks.mechanoid.ui.Messages; public abstract class NewMechanoidElementWizard extends MechanoidWizard { private IResource mNewResource; @Override public boolean performFinish() { final IPath newFilePath = createNewResourceFilePath(); onBeforeCreateElementResource(); WorkspaceModifyDelegatingOperation op = new WorkspaceModifyDelegatingOperation(new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException { try { mNewResource = createElementResource(monitor, newFilePath); } catch (Exception e) { throw new InvocationTargetException(e); } finally { monitor.done(); } } }); try { getContainer().run(true, true, op); selectAndReveal(mNewResource); openResource(mNewResource); } catch (InvocationTargetException e) { Throwable realException = e.getTargetException(); MessageDialog.openError(getShell(), Messages.NewMechanoidElementWizard_Dialog_CreateResourceError_Title, realException.getMessage()); return false; } catch (InterruptedException e) { return false; } return true; } /** * Implementations should return the desired resource file path that should be created, this value * is ultimately given to {@link #createElementResource(IProgressMonitor, IPath)} as the path argument. * @return */ protected abstract IPath createNewResourceFilePath(); /** * Occurs before the element resource is created (before {@link #createElementResource(IProgressMonitor, IPath)} is invoked. * Implementations can initialize any required fields that might be needed. */ protected void onBeforeCreateElementResource() { } protected abstract IResource createElementResource(IProgressMonitor monitor, IPath newFilePath); protected void selectAndReveal(IResource newResource) { BasicNewResourceWizard.selectAndReveal(newResource, getWorkbench().getActiveWorkbenchWindow()); } protected void openResource(final IResource resource) { final IWorkbenchPage activePage = getWorkbench().getActiveWorkbenchWindow().getActivePage(); if(activePage == null) { return; } final Display display = getShell().getDisplay(); if (display == null) { return; } display.asyncExec(new Runnable() { public void run() { try { if(activePage != null) { IEditorPart editor = IDE.openEditor(activePage, (IFile) resource, true); onNewResourceEditorOpened(editor); } } catch (PartInitException e) { e.printStackTrace(); } } }); } protected void onNewResourceEditorOpened(IEditorPart editor) { } }