Bug 572601 - [Robotics, Designer] Loading a resource from a worker thread causes an exception and in turn eventually blocks UI
- Execute dialogs in UI thread.
Change-Id: If9bc28dac1ece1af38e56d22d05a133a442c06af
Signed-off-by: Ansgar Radermacher <ansgar.radermacher@cea.fr>
diff --git a/plugins/languages/common/org.eclipse.papyrus.designer.languages.common.codegen.ui/src/org/eclipse/papyrus/designer/languages/common/codegen/ui/ChooseGenerator.java b/plugins/languages/common/org.eclipse.papyrus.designer.languages.common.codegen.ui/src/org/eclipse/papyrus/designer/languages/common/codegen/ui/ChooseGenerator.java
index fd0fa39..aeb97f9 100644
--- a/plugins/languages/common/org.eclipse.papyrus.designer.languages.common.codegen.ui/src/org/eclipse/papyrus/designer/languages/common/codegen/ui/ChooseGenerator.java
+++ b/plugins/languages/common/org.eclipse.papyrus.designer.languages.common.codegen.ui/src/org/eclipse/papyrus/designer/languages/common/codegen/ui/ChooseGenerator.java
@@ -29,6 +29,8 @@
// name of package in which languages are stored
public static final String LANGUAGES_PKG = "languages"; //$NON-NLS-1$
+ protected static ILangCodegen codeGen;
+
/**
* Interactively choose a generator for a given set of languages (pattern).
* If only one generator is available, it returns this generator
@@ -40,35 +42,47 @@
* @return a list of code generators
*/
public static ILangCodegen choose(Pattern languagePattern, PackageableElement pe) {
- List<ILangCodegen> eligibleGenerators = LanguageCodegen.getEligibleGeneratorList(languagePattern, pe);
+ final List<ILangCodegen> eligibleGenerators = LanguageCodegen.getEligibleGeneratorList(languagePattern, pe);
if (eligibleGenerators.size() == 0) {
// retry with all generators (eligibility is currently based on the application of language-specific
// profiles which might not be applied by users)
- eligibleGenerators = LanguageCodegen.getCodegenList(languagePattern);
+ eligibleGenerators.addAll(LanguageCodegen.getCodegenList(languagePattern));
}
-
+
if (eligibleGenerators.size() == 1) {
return eligibleGenerators.get(0);
}
- Shell shell = Display.getCurrent().getActiveShell();
if (eligibleGenerators.size() > 1) {
- GeneratorSelectionDialog dialog = new GeneratorSelectionDialog(shell, eligibleGenerators);
- if (dialog.open() == IDialogConstants.OK_ID) {
+ codeGen = null;
+ Display.getDefault().syncExec(new Runnable() {
- ILangCodegen codeGen = (ILangCodegen) dialog.getResult()[0];
- Boolean storeResult = (Boolean) dialog.getResult()[1];
- if (storeResult) {
- storeGeneratorID(pe, LanguageCodegen.getLanguage(codeGen), LanguageCodegen.getID(codeGen));
+ @Override
+ public void run() {
+ Shell shell = Display.getCurrent().getActiveShell();
+ GeneratorSelectionDialog dialog = new GeneratorSelectionDialog(shell, eligibleGenerators);
+ if (dialog.open() == IDialogConstants.OK_ID) {
+
+ codeGen = (ILangCodegen) dialog.getResult()[0];
+ Boolean storeResult = (Boolean) dialog.getResult()[1];
+ if (storeResult) {
+ storeGeneratorID(pe, LanguageCodegen.getLanguage(codeGen), LanguageCodegen.getID(codeGen));
+ }
+ }
}
- return codeGen;
- }
- }
- else {
+ });
+ return codeGen;
+ } else {
// echo language pattern in a more readible way: without escape characters that are used for
// the "+" in C++
- String pattern = languagePattern.pattern().replace("\\", ""); //$NON-NLS-1$ //$NON-NLS-2$
- MessageDialog.openError(shell, Messages.LanguageCodegen_NoGeneratorsFound,
- String.format(Messages.LanguageCodegen_NoGeneratorsFoundLong, pattern));
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ Shell shell = Display.getCurrent().getActiveShell();
+ String pattern = languagePattern.pattern().replace("\\", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ MessageDialog.openError(shell, Messages.LanguageCodegen_NoGeneratorsFound,
+ String.format(Messages.LanguageCodegen_NoGeneratorsFoundLong, pattern));
+ }
+ });
}
return null;
@@ -77,17 +91,15 @@
public static void storeGeneratorID(PackageableElement pe, String languageName, final String generatorID) {
final Package root = PackageUtil.getRootPackage(pe);
CommandSupport.exec(TransactionUtil.getEditingDomain(pe), new ApplyProfile(root, CommonProfileResource.PROFILE_PATH_URI));
-
+
NamedElement languageNE = ElementUtils.getQualifiedElementFromRS(pe, LANGUAGES_PKG + NamedElement.SEPARATOR + languageName);
if (languageNE == null) {
PackageUtil.loadPackage(CommonProfileResource.LANGUAGES_PATH_URI, pe.eResource().getResourceSet());
languageNE = ElementUtils.getQualifiedElementFromRS(pe, LANGUAGES_PKG + NamedElement.SEPARATOR + languageName);
}
- final Language language = (languageNE != null) ?
- UMLUtil.getStereotypeApplication(languageNE, Language.class) :
- null;
+ final Language language = (languageNE != null) ? UMLUtil.getStereotypeApplication(languageNE, Language.class) : null;
CommandSupport.exec(pe, Messages.ChooseGenerator_CHOOSE_GENERATOR, new Runnable() {
-
+
@Override
public void run() {
GeneratorHint hint = StereotypeUtil.applyApp(root, GeneratorHint.class);