Bug 125560 [Viewers] Invalid thread access on tree viewer results in NPE
I peformed an update to a tree viewer from a non-UI thread which resulted in an Invalid Thread Access error as one would expect. However, the viewer tried to prompt for the error which resulted in an NPE since the prompt was being attempted from a non-UI thread (or, at least, I assume that's why the display variable was null). Hre's the trace: java.lang.NullPointerException at org.eclipse.jface.dialogs.IconAndMessageDialog.getSWTImage(IconAndMessageDialog.java:265) at org.eclipse.jface.dialogs.IconAndMessageDialog.getErrorImage(IconAndMessageDialog.java:212) at org.eclipse.jface.dialogs.MessageDialog.<init>(MessageDialog.java:141) at org.eclipse.jface.dialogs.MessageDialog.openError(MessageDialog.java:310) at org.eclipse.jface.util.SafeRunnable.handleException(SafeRunnable.java:59) at org.eclipse.core.runtime.SafeRunner.handleException(SafeRunner.java:65) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:39) at org.eclipse.core.runtime.Platform.run(Platform.java:785) at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:44) at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:148) at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:1859) at org.eclipse.jface.viewers.StructuredViewer.internalUpdate(StructuredViewer.java:1842) at org.eclipse.jface.viewers.StructuredViewer.update(StructuredViewer.java:1792) at org.eclipse.jface.viewers.StructuredViewer.update(StructuredViewer.java:1747) at org.eclipse.team.internal.ui.mapping.ResourceTeamAwareContentProvider.propertyChanged(ResourceTeamAwareContentProvider.java:233) at org.eclipse.team.core.diff.provider.DiffTree$1.run(DiffTree.java:254) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) at org.eclipse.core.runtime.Platform.run(Platform.java:785) at org.eclipse.team.core.diff.provider.DiffTree.fireChanges(DiffTree.java:242) at org.eclipse.team.core.diff.provider.DiffTree.endInput(DiffTree.java:220) at org.eclipse.team.internal.core.subscribers.SubscriberDiffTreeEventHandler.dispatchEvents(SubscriberDiffTreeEventHandler.java:162) at org.eclipse.team.internal.core.subscribers.SubscriberEventHandler.doDispatchEvents(SubscriberEventHandler.java:390) at org.eclipse.team.internal.core.BackgroundEventHandler.dispatchEvents(BackgroundEventHandler.java:354) at org.eclipse.team.internal.core.BackgroundEventHandler.processEvents(BackgroundEventHandler.java:334) at org.eclipse.team.internal.core.BackgroundEventHandler$1.run(BackgroundEventHandler.java:173) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:58)
bundles/org.eclipse.jface/src/org/eclipse/jface/util/SafeRunnable.java
}
				code.handleException(e);
			}
		};
	}
	/**
	 * Sets the safe runnable runner.
	 * 
	 * @param runner
	 *            the runner to set, or <code>null</code> to reset to the
	 *            default runner
	 * @since 3.1
	 */
	public static void setRunner(ISafeRunnableRunner runner) {
		SafeRunnable.runner = runner;
	}
	/**
	 * Runs the given safe runnable using the safe runnable runner. This is a
	 * convenience method, equivalent to:
	 * <code>SafeRunnable.getRunner().run(runnable)</code>.
	 * 
	 * @param runnable
	 *            the runnable to run
	 * @since 3.1
	 */
	public static void run(ISafeRunnable runnable) {
		getRunner().run(runnable);
	}
}