Bug 142299 [JFace] Class Dialog cannot be loaded in non-UI thread
The static initializer of org.eclipse.jface.dialogs.Dialog cannot be executed in a non-UI thread. The problematic call-chain is: JFaceResources.getImageRegistry() -> Display.getCurrent(). In a non-UI thread this returns null, causing an NPE in the static initializer. As the result, this class fails to load. I stumbled over this because I wanted to perform aspect weaving (using the new hooks in the OSGI) on a subclass of Dialog. For that purpose I had to force loading these classes from infrastructure code, perhaps even before the UI was up and running. Another (hypothetical) scenario where this will cause problems would be a configurable factory, which could be programmed like this: Class myDialogClass; void init() { myDialogClass = Class.forName(readDialogClassName()); } Dialog createDialog() { return (Dialog)myDialogClass.newInstance(); } Also in this case method init() would crash if invoked within a non-UI thread. IMHO, a static initializer should never make any assumptions about the context it is being executed in. The code in question seems to exist for backward compatibility only. (Typo in javadoc: @see Display#getSystemIcon(int ID), should read: getSystemImage, the same typo in ImageRegistry.get()). In fact ImageRegistry.get(String) re-maps the deprecated keys from Dialog to the new ones in SWT, so I believe the code in the static initializer has not even any effect, the entries entered into the image registry will never be retrieved by that name. Correct me if I'm wrong.
bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/Dialog.java
* of a dialog.  
	 * 
	 * @since 3.2
	 */
	private MouseListener restoreSizeMouseListener = new MouseAdapter() {
		public void mouseDoubleClick(MouseEvent event) {
			restoreDialogToComputedSize();
		}
	};
	/**
	 * Collection of buttons created by the <code>createButton</code> method.
	 */
	private HashMap buttons = new HashMap();
	/**
	 * Font metrics to use for determining pixel sizes.
	 */
	private FontMetrics fontMetrics;
	
	/**
	 * Point used for storing initial computed size of the dialog so
	 * that it may be restored.
	 */
	private Point computedSize;
	/**
	 * Number of horizontal dialog units per character, value <code>4</code>.
	 */
	private static final int HORIZONTAL_DIALOG_UNIT_PER_CHAR = 4;
	/**
	 * Number of vertical dialog units per character, value <code>8</code>.
	 */