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);