Fixed: ImageDescriptorRegistry.hookDisplay() can cause SWT Invalid thread access

For details see bug 417765, comment 3.
diff --git a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ImageDescriptorRegistry.java b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ImageDescriptorRegistry.java
index f82f2c2..caecfc2 100644
--- a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ImageDescriptorRegistry.java
+++ b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ImageDescriptorRegistry.java
@@ -11,19 +11,23 @@
 package org.eclipse.ui.externaltools.internal.model;
 
 
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Map;
 
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Display;
 
+import org.eclipse.core.runtime.Assert;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
 /**
  * A registry that maps <code>ImageDescriptors</code> to <code>Image</code>.
  */
 public class ImageDescriptorRegistry {
 
-	private HashMap<ImageDescriptor, Image> fRegistry = new HashMap<ImageDescriptor, Image>(10);
+	private Map<ImageDescriptor, Image> fRegistry = Collections.synchronizedMap(new HashMap<ImageDescriptor, Image>(10));
 	private Display fDisplay;
 
 	/**
@@ -78,10 +82,16 @@
 	}
 
 	private void hookDisplay() {
-		fDisplay.disposeExec(new Runnable() {
+		fDisplay.asyncExec(new Runnable() {
 			@Override
 			public void run() {
-				dispose();
+				fDisplay.disposeExec(new Runnable() {
+
+					@Override
+					public void run() {
+						dispose();
+					}
+				});
 			}
 		});
 	}