blob: 75bdf249655a95f4d3c06b55803f58d4131ed8cb [file] [log] [blame]
package org.eclipse.egf.emf.pattern.codegen.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.egf.common.ui.helper.ThrowableHandler;
import org.eclipse.egf.core.pde.tools.ConvertProjectOperation;
import org.eclipse.egf.emf.pattern.codegen.CodegenFcoreUtil;
import org.eclipse.egf.emf.pattern.codegen.ui.Activator;
import org.eclipse.egf.emf.pattern.codegen.ui.Messages;
import org.eclipse.egf.model.fcore.presentation.FcoreModelWizard;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ISetSelectionTarget;
public class ReverseCodegenWizard extends FcoreModelWizard {
public ReverseCodegenWizard() {
}
@Override
public void addPage(IWizardPage page) {
if (page == newFileCreationPage) {
super.addPage(page);
((FcoreModelWizardNewFileCreationPage)page).setAllowExistingResources(true);
}
}
@Override
public void addPages() {
super.addPages();
newFileCreationPage.setFileName(getFileName());
}
@Override
public boolean canFinish() {
if (getFcore().exists()) {
newFileCreationPage.setMessage(Messages.ReverseCodegenWizard_1, IMessageProvider.WARNING);
}
return super.canFinish();
}
@Override
public boolean performFinish() {
final Throwable[] throwable = new Throwable[1];
final IFile fcore = getFcore();
// Convert and Process current Project
WorkspaceModifyOperation convertOperation = new ConvertProjectOperation(getFcore().getProject(), true, true) {
@Override
public List<String> addDependencies() {
List<String> dependencies = new ArrayList<String>(1);
dependencies.add("org.eclipse.egf.model.ftask"); //$NON-NLS-1$
dependencies.add("org.eclipse.egf.emf.pattern.base"); //$NON-NLS-1$
return dependencies;
}
@Override
public List<String> addSourceFolders() {
List<String> sourceFolders = new ArrayList<String>(1);
sourceFolders.add("generated"); //$NON-NLS-1$
return sourceFolders;
}
};
try {
getContainer().run(false, false, convertOperation);
} catch (Throwable t) {
throwable[0] = t;
}
// Save resource
if (throwable[0] == null) {
WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor) {
try {
SubMonitor.convert(monitor, Messages.ReverseCodegenWizard_0, 1000);
try {
new CodegenFcoreUtil().createFcoreFile(fcore, monitor);
} catch (Exception ioe) {
throwable[0] = ioe;
}
} finally {
monitor.done();
}
}
};
try {
getContainer().run(false, true, operation);
} catch (Throwable t) {
throwable[0] = t;
}
}
// Select the new file resource in the current view.
if (throwable[0] == null) {
IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
IWorkbenchPage page = workbenchWindow.getActivePage();
final IWorkbenchPart activePart = page.getActivePart();
if (activePart instanceof ISetSelectionTarget) {
final ISelection targetSelection = new StructuredSelection(fcore);
getShell().getDisplay().asyncExec(new Runnable() {
public void run() {
((ISetSelectionTarget) activePart).selectReveal(targetSelection);
}
});
}
// Open an editor on the new file.
try {
page.openEditor(new FileEditorInput(fcore), workbench.getEditorRegistry().getDefaultEditor(fcore.getFullPath().toString()).getId());
} catch (Throwable t) {
throwable[0] = t;
}
}
// Display errors if any
if (throwable[0] != null && throwable[0] instanceof InterruptedException == false) {
ThrowableHandler.handleThrowable(Activator.getDefault().getPluginID(), throwable[0]);
return false;
}
return true;
}
private String getFileName() {
return "EMF_Pattern.fcore"; //$NON-NLS-1$
}
private IFile getFcore() {
return newFileCreationPage.getModelFile();
}
}