Skip to content

Commit 290680b

Browse files
committed
Add content assist proposal to create DSA project
1 parent 529bd17 commit 290680b

File tree

2 files changed

+139
-0
lines changed
  • java_execution/java_xdsml/plugins/org.gemoc.execution.sequential.javaxdsml.ide.ui

2 files changed

+139
-0
lines changed

java_execution/java_xdsml/plugins/org.gemoc.execution.sequential.javaxdsml.ide.ui/plugin.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,9 @@
316316
<proposal
317317
class="org.gemoc.execution.sequential.javaxdsml.ide.ui.editor.CreateEcoreProposal">
318318
</proposal>
319+
<proposal
320+
class="org.gemoc.execution.sequential.javaxdsml.ide.ui.editor.CreateDSAProposal">
321+
</proposal>
319322
</extension>
320323
<extension
321324
point="fr.inria.diverse.melange.ui.contentassist_syntax">
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
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

Comments
 (0)