|
| 1 | +package org.gemoc.execution.sequential.javaxdsml.ide.ui.editor; |
| 2 | + |
| 3 | +import java.util.Set; |
| 4 | + |
| 5 | +import org.eclipse.core.resources.IFile; |
| 6 | +import org.eclipse.core.resources.IProject; |
| 7 | +import org.eclipse.core.resources.ResourcesPlugin; |
| 8 | +import org.eclipse.core.runtime.CoreException; |
| 9 | +import org.eclipse.core.runtime.OperationCanceledException; |
| 10 | +import org.eclipse.core.runtime.jobs.Job; |
| 11 | +import org.eclipse.emf.ecore.EObject; |
| 12 | +import org.eclipse.jface.wizard.IWizard; |
| 13 | +import org.eclipse.jface.wizard.WizardDialog; |
| 14 | +import org.eclipse.ui.PlatformUI; |
| 15 | +import org.eclipse.ui.wizards.IWizardDescriptor; |
| 16 | +import org.gemoc.commons.eclipse.core.resources.NewProjectWorkspaceListener; |
| 17 | +import org.gemoc.commons.eclipse.ui.WizardFinder; |
| 18 | +import org.gemoc.execution.sequential.javaxdsml.ide.ui.Activator; |
| 19 | +import org.gemoc.execution.sequential.javaxdsml.ide.ui.templates.SequentialTemplate; |
| 20 | +import org.gemoc.xdsmlframework.ide.ui.xdsml.wizards.MelangeXDSMLProjectHelper; |
| 21 | + |
| 22 | +import fr.inria.diverse.commons.eclipse.pde.manifest.ManifestChanger; |
| 23 | +import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.TemplateListSelectionPage; |
| 24 | +import fr.inria.diverse.k3.ui.wizards.NewK3ProjectWizard; |
| 25 | +import fr.inria.diverse.k3.ui.wizards.pages.NewK3ProjectWizardFields.KindsOfProject; |
| 26 | +import fr.inria.diverse.melange.metamodel.melange.Language; |
| 27 | +import fr.inria.diverse.melange.metamodel.melange.ModelTypingSpace; |
| 28 | +import fr.inria.diverse.melange.ui.contentassist.IProposal; |
| 29 | + |
| 30 | +public class CreateDSAProposal implements IProposal{ |
| 31 | + |
| 32 | + private IProject dsaProject; |
| 33 | + private String packageName = "packageName"; |
| 34 | + private String languageName = "languageName"; |
| 35 | + private IFile ecoreFile; |
| 36 | + |
| 37 | + @Override |
| 38 | + public String getDisplayText() { |
| 39 | + return "-- Create a DSA Project --"; |
| 40 | + } |
| 41 | + |
| 42 | + @Override |
| 43 | + public String getReplacementText() { |
| 44 | + |
| 45 | + IWizardDescriptor descriptor = WizardFinder.findNewWizardDescriptor("fr.inria.diverse.k3.ui.wizards.WizardNewProjectK3Plugin"); |
| 46 | + |
| 47 | + if (descriptor != null) { |
| 48 | + // add a listener to capture the creation of the resulting project |
| 49 | + NewProjectWorkspaceListener workspaceListener = new NewProjectWorkspaceListener(); |
| 50 | + ResourcesPlugin.getWorkspace().addResourceChangeListener(workspaceListener); |
| 51 | + try { |
| 52 | + IWizard wizard; |
| 53 | + wizard = descriptor.createWizard(); |
| 54 | + // this wizard need some dedicated initialization |
| 55 | + NewK3ProjectWizard k3Wizard = (NewK3ProjectWizard)wizard; |
| 56 | + |
| 57 | + k3Wizard.getContext().ecoreIFile = ecoreFile; |
| 58 | + |
| 59 | + WizardDialog wd = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard); |
| 60 | + |
| 61 | + wd.create(); |
| 62 | + |
| 63 | + k3Wizard.getPageProject().setProjectName(packageName+"."+languageName+".k3dsa"); |
| 64 | + k3Wizard.getPageProject().setProjectKind(KindsOfProject.PLUGIN); |
| 65 | + // set field as much as possible |
| 66 | + |
| 67 | + if (ecoreFile != null) { |
| 68 | + TemplateListSelectionPage templatePage = k3Wizard.getTemplateListSelectionPage(k3Wizard.getContext()); |
| 69 | + templatePage.setUseTemplate(true); |
| 70 | + templatePage.setInitialTemplateId("fr.inria.diverse.k3.ui.templates.projectContent.UserEcoreBasicAspect"); |
| 71 | + templatePage.selectTemplate("fr.inria.diverse.k3.ui.templates.projectContent.UserEcoreBasicAspect"); |
| 72 | + //((NewK3ProjectWizard)wizard).getPageProject().setEcoreLoaded(ecoreFile); |
| 73 | + |
| 74 | + } |
| 75 | + wd.setTitle("New Kermeta 3 project"); |
| 76 | + |
| 77 | + |
| 78 | + int res = wd.open(); |
| 79 | + if(res == WizardDialog.OK){ |
| 80 | + //((KermetaProjectNewWizard )wizard).performFinish(); |
| 81 | + ResourcesPlugin.getWorkspace().removeResourceChangeListener(workspaceListener); |
| 82 | + dsaProject = workspaceListener.getLastCreatedProject(); |
| 83 | + waitForAutoBuild(); |
| 84 | + Set<String> aspects = SequentialTemplate.getAspectClassesList(dsaProject); |
| 85 | + final StringBuilder insertion = new StringBuilder(); |
| 86 | + for (String asp : aspects) { |
| 87 | + insertion.append("\twith " + asp + "\n"); |
| 88 | + } |
| 89 | + return insertion.toString(); |
| 90 | + } |
| 91 | + } catch (CoreException e) { |
| 92 | + Activator.error(e.getMessage(), e); |
| 93 | + } |
| 94 | + finally{ |
| 95 | + // make sure to remove listener in all situations |
| 96 | + ResourcesPlugin.getWorkspace().removeResourceChangeListener(workspaceListener); |
| 97 | + } |
| 98 | + } |
| 99 | + return "with qualified.class.name"; |
| 100 | + } |
| 101 | + |
| 102 | + @Override |
| 103 | + public void configureProject(IProject project) { |
| 104 | + ManifestChanger manifestChanger = new ManifestChanger(project); |
| 105 | + try { |
| 106 | + manifestChanger.addPluginDependency(dsaProject.getName()); |
| 107 | + manifestChanger.commit(); |
| 108 | + } catch (Exception e) { |
| 109 | + e.printStackTrace(); |
| 110 | + } |
| 111 | + } |
| 112 | + |
| 113 | + @Override |
| 114 | + public void configureProposal(EObject context) { |
| 115 | + if(context instanceof Language){ |
| 116 | + Language lang = (Language) context; |
| 117 | + this.packageName = ((ModelTypingSpace)lang.eContainer()).getName(); |
| 118 | + this.languageName = lang.getName(); |
| 119 | + this.ecoreFile = MelangeXDSMLProjectHelper.getFirstEcore(lang); |
| 120 | + } |
| 121 | + } |
| 122 | + |
| 123 | + private void waitForAutoBuild() { |
| 124 | + boolean wasInterrupted = false; |
| 125 | + do { |
| 126 | + try { |
| 127 | + Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null); |
| 128 | + wasInterrupted = false; |
| 129 | + } catch (OperationCanceledException e) { |
| 130 | + e.printStackTrace(); |
| 131 | + } catch (InterruptedException e) { |
| 132 | + wasInterrupted = true; |
| 133 | + } |
| 134 | + } while (wasInterrupted); |
| 135 | + } |
| 136 | +} |
0 commit comments