/******************************************************************************* * Copyright (c) 2012 BMW Car IT and others. * 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 *******************************************************************************/ package org.jnario.suite.ui.quickfix; import static org.eclipse.xtext.ui.util.DisplayRunHelper.runAsyncInDisplayThread; import org.eclipse.core.runtime.Path; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.eclipse.xtext.common.types.access.jdt.IJavaProjectProvider; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.model.IXtextDocument; import org.eclipse.xtext.ui.editor.model.edit.IModification; import org.eclipse.xtext.ui.editor.model.edit.IModificationContext; import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor; import org.eclipse.xtext.util.concurrent.IUnitOfWork; import org.eclipse.xtext.validation.Issue; import org.jnario.feature.ui.wizards.NewFeatureWizard; import org.jnario.spec.ui.wizards.NewSpecWizard; import org.jnario.suite.suite.SuitePackage; import org.jnario.suite.ui.wizards.NewSuiteWizard; import org.jnario.ui.quickfix.JnarioQuickFixProvider; import org.jnario.ui.wizards.NewJnarioFileWizard; import org.jnario.ui.wizards.NewJnarioFileWizardPageOne; import org.jnario.util.Strings; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @SuppressWarnings("restriction") @Singleton public class SuiteQuickfixProvider extends JnarioQuickFixProvider { @Inject Provider<NewSpecWizard> newSpecWizardProvider; @Inject Provider<NewFeatureWizard> newFeatureWizardProvider; @Inject Provider<NewSuiteWizard> newSuiteWizardProvider; @Inject private IJavaProjectProvider projectProvider; @Override public void createLinkingIssueResolutions(final Issue issue, final IssueResolutionAcceptor issueResolutionAcceptor) { final IModificationContext modificationContext = getModificationContextFactory().createModificationContext( issue); final IXtextDocument xtextDocument = modificationContext.getXtextDocument(); if (xtextDocument != null) { xtextDocument.readOnly(new IUnitOfWork.Void<XtextResource>() { @Override public void process(XtextResource state) throws Exception { EObject target = state.getEObject(issue.getUriToProblem().fragment()); EReference reference = getUnresolvedEReference(issue, target); if (reference == null) return; if(reference == SuitePackage.Literals.SPEC_REFERENCE__SPEC){ String issueString = xtextDocument.get(issue.getOffset(), issue.getLength()); IJavaProject javaProject = projectProvider.getJavaProject(target.eResource().getResourceSet()); String path = target.eResource().getURI().trimSegments(1).toPlatformString(true); IPackageFragment packageFragmentRoot = javaProject.findPackageFragment(new Path(path)); IPackageFragmentRoot root = (IPackageFragmentRoot) packageFragmentRoot.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); issueString = issueString.substring(1, issueString.length()-1); issueResolutionAcceptor.accept( issue, "New Spec", "Create a new Jnario Specification '" + issueString + "'", "spec_file.png", doFixMissingSpecification(root, packageFragmentRoot, issueString, newSpecWizardProvider)); issueResolutionAcceptor.accept( issue, "New Feature", "Create a new Jnario Feature '" + issueString + "'", "feature_file.png", doFixMissingSpecification(root, packageFragmentRoot, issueString, newFeatureWizardProvider)); issueResolutionAcceptor.accept( issue, "New Suite", "Create a new Jnario Suite '" + issueString + "'", "suite_file.png", doFixMissingSpecification(root, packageFragmentRoot, issueString, newSuiteWizardProvider)); } } }); super.createLinkingIssueResolutions(issue, issueResolutionAcceptor); } } private IModification doFixMissingSpecification( final IPackageFragmentRoot root, final IPackageFragment packageFragment, final String issueString, final Provider<? extends NewJnarioFileWizard> wizardProvider) { return new IModification() { public void apply(IModificationContext context) throws Exception { runAsyncInDisplayThread(new Runnable(){ public void run() { IWorkbench workbench = PlatformUI.getWorkbench(); Shell shell = workbench.getActiveWorkbenchWindow().getShell(); NewJnarioFileWizard wizard = wizardProvider.get(); wizard.init(workbench, new StructuredSelection()); WizardDialog dialog = new WizardDialog(shell, wizard); dialog.create(); NewJnarioFileWizardPageOne page = wizard.getFirstPage(); page.setPackageFragment(packageFragment, true); page.setPackageFragmentRoot(root, true); page.setTypeName(Strings.toClassName(issueString), true); page.setSpecDescription(issueString); dialog.open(); } }); } }; } }