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/wizard/Wizard.java
* no image of its own; the image will be computed once and cached.
     * </p>
     * 
     * @param imageDescriptor
     *            the default page image descriptor
     */
    public void setDefaultPageImageDescriptor(ImageDescriptor imageDescriptor) {
        defaultImageDescriptor = imageDescriptor;
    }
    /**
     * Sets the dialog settings for this wizard.
     * <p>
     * The dialog settings is used to record state between wizard invocations
     * (for example, radio button selection, last import directory, etc.)
     * </p>
     * 
     * @param settings
     *            the dialog settings, or <code>null</code> if none
     * @see #getDialogSettings
     *  
     */
    public void setDialogSettings(IDialogSettings settings) {
        dialogSettings = settings;
    }
    /**
     * Controls whether the wizard needs Previous and Next buttons even if it
     * currently contains only one page.
     * <p>
     * This flag should be set on wizards where the first wizard page adds
     * follow-on wizard pages based on user input.