[20541]. Changes released by Dirk Baeumer
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java
index 3727425..399cf07 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java
@@ -314,6 +314,10 @@
 	 * Progress should be reported to the given progress monitor.

 	 * A request to cancel the operation should be honored and acknowledged 

 	 * by throwing <code>InterruptedException</code>.

+	 * <p>

+	 * Note: this method is typically called in a modal context thread which doesn't have a Display assigned.

+	 * Implementors of this method shouldn't therefore allocated any SWT resources in this method.

+	 * </p>

 	 *

 	 * @param monitor the progress monitor to use to display progress and receive

 	 *   requests for cancelation

diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java
index 4daf9e5..9db2091 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java
@@ -18,6 +18,7 @@
 

 	public void run(IAction action) {

 		if (fInput != null) {

+			fInput.initializeCompareConfiguration();

 			CompareUI.openCompareEditor(fInput);

 			fInput= null;	// don't reuse this input!

 		}

diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java
index 02a07d3..a76a400 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java
@@ -125,6 +125,25 @@
 	}

 	

 	/**

+	 * Initializes the images in the compare configuration.

+	 */

+	void initializeCompareConfiguration() {

+		CompareConfiguration cc= getCompareConfiguration();

+		if (fLeftResource != null) {

+			cc.setLeftLabel(buildLabel(fLeftResource));

+			cc.setLeftImage(CompareUIPlugin.getImage(fLeftResource));

+		}

+		if (fRightResource != null) {

+			cc.setRightLabel(buildLabel(fRightResource));

+			cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

+		}

+		if (fThreeWay && fAncestorResource != null) {			

+			cc.setAncestorLabel(buildLabel(fAncestorResource));

+			cc.setAncestorImage(CompareUIPlugin.getImage(fAncestorResource));

+		}

+	}

+	

+	/**

 	 * Returns true if the given arguments cannot be compared.

 	 */

 	private boolean incomparable(IStructureComparator c1, IStructureComparator c2) {

@@ -170,8 +189,6 @@
 	 */

 	public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException {

 				

-		CompareConfiguration cc= (CompareConfiguration) getCompareConfiguration();

-	

 		try {

 			// fix for PR 1GFMLFB: ITPUI:WIN2000 - files that are out of sync with the file system appear as empty							

 			fLeftResource.refreshLocal(IResource.DEPTH_INFINITE, pm);

@@ -182,19 +199,11 @@
 				

 			pm.beginTask(Utilities.getString("ResourceCompare.taskName"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$

 

-			cc.setLeftLabel(buildLabel(fLeftResource));

-			cc.setLeftImage(CompareUIPlugin.getImage(fLeftResource));

-			

-			cc.setRightLabel(buildLabel(fRightResource));

-			cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

-

 			String leftLabel= fLeftResource.getName();

 			String rightLabel= fRightResource.getName();

 			

 			String title;

 			if (fThreeWay) {			

-				cc.setAncestorLabel(buildLabel(fAncestorResource));

-				cc.setAncestorImage(CompareUIPlugin.getImage(fAncestorResource));

 				String format= Utilities.getString("ResourceCompare.threeWay.title"); //$NON-NLS-1$

 				String ancestorLabel= fAncestorResource.getName();

 				title= MessageFormat.format(format, new String[] {ancestorLabel, leftLabel, rightLabel} );

diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
index d99a4f8..3571ee9 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
@@ -62,7 +62,20 @@
 		fPatcher= patcher;

 		IResource[] s= Utilities.getResources(selection);

 		if (s.length == 1)

-			fTarget= s[0];	

+			fTarget= s[0];

+		

+		if (fPatcher != null) {

+			String rformat= PatchMessages.getString("PatchCompareInput.RightTitle.format");	//$NON-NLS-1$

+			String rightLabel= MessageFormat.format(rformat, new String[] { fPatcher.getName() } );

+			config.setRightLabel(rightLabel);

+			//cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

+		}

+		

+		if (fTarget != null) {

+			String leftLabel= fTarget.getName();

+			config.setLeftLabel(leftLabel);

+			config.setLeftImage(CompareUIPlugin.getImage(fTarget));

+		}	

 	}

 	

 	/**

@@ -70,8 +83,6 @@
 	 */

 	public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException {

 						

-		CompareConfiguration cc= (CompareConfiguration) getCompareConfiguration();

-		

 		try {				

 			Diff[] diffs= fPatcher.getDiffs();

 			

@@ -101,13 +112,9 @@
 			fTarget.refreshLocal(IResource.DEPTH_INFINITE, pm);

 			

 			String leftLabel= fTarget.getName();

-			cc.setLeftLabel(leftLabel);

-			cc.setLeftImage(CompareUIPlugin.getImage(fTarget));

 			

 			String rformat= PatchMessages.getString("PatchCompareInput.RightTitle.format");	//$NON-NLS-1$

 			String rightLabel= MessageFormat.format(rformat, new String[] { fPatcher.getName() } );

-			cc.setRightLabel(rightLabel);

-			//cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

 			

 			String format= Utilities.getString("ResourceCompare.twoWay.title"); //$NON-NLS-1$

 			String title= MessageFormat.format(format, new String[] {leftLabel, rightLabel} );

diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java
index 3727425..399cf07 100644
--- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java
+++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java
@@ -314,6 +314,10 @@
 	 * Progress should be reported to the given progress monitor.

 	 * A request to cancel the operation should be honored and acknowledged 

 	 * by throwing <code>InterruptedException</code>.

+	 * <p>

+	 * Note: this method is typically called in a modal context thread which doesn't have a Display assigned.

+	 * Implementors of this method shouldn't therefore allocated any SWT resources in this method.

+	 * </p>

 	 *

 	 * @param monitor the progress monitor to use to display progress and receive

 	 *   requests for cancelation

diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java
index 4daf9e5..9db2091 100644
--- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java
+++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java
@@ -18,6 +18,7 @@
 

 	public void run(IAction action) {

 		if (fInput != null) {

+			fInput.initializeCompareConfiguration();

 			CompareUI.openCompareEditor(fInput);

 			fInput= null;	// don't reuse this input!

 		}

diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java
index 02a07d3..a76a400 100644
--- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java
+++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java
@@ -125,6 +125,25 @@
 	}

 	

 	/**

+	 * Initializes the images in the compare configuration.

+	 */

+	void initializeCompareConfiguration() {

+		CompareConfiguration cc= getCompareConfiguration();

+		if (fLeftResource != null) {

+			cc.setLeftLabel(buildLabel(fLeftResource));

+			cc.setLeftImage(CompareUIPlugin.getImage(fLeftResource));

+		}

+		if (fRightResource != null) {

+			cc.setRightLabel(buildLabel(fRightResource));

+			cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

+		}

+		if (fThreeWay && fAncestorResource != null) {			

+			cc.setAncestorLabel(buildLabel(fAncestorResource));

+			cc.setAncestorImage(CompareUIPlugin.getImage(fAncestorResource));

+		}

+	}

+	

+	/**

 	 * Returns true if the given arguments cannot be compared.

 	 */

 	private boolean incomparable(IStructureComparator c1, IStructureComparator c2) {

@@ -170,8 +189,6 @@
 	 */

 	public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException {

 				

-		CompareConfiguration cc= (CompareConfiguration) getCompareConfiguration();

-	

 		try {

 			// fix for PR 1GFMLFB: ITPUI:WIN2000 - files that are out of sync with the file system appear as empty							

 			fLeftResource.refreshLocal(IResource.DEPTH_INFINITE, pm);

@@ -182,19 +199,11 @@
 				

 			pm.beginTask(Utilities.getString("ResourceCompare.taskName"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$

 

-			cc.setLeftLabel(buildLabel(fLeftResource));

-			cc.setLeftImage(CompareUIPlugin.getImage(fLeftResource));

-			

-			cc.setRightLabel(buildLabel(fRightResource));

-			cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

-

 			String leftLabel= fLeftResource.getName();

 			String rightLabel= fRightResource.getName();

 			

 			String title;

 			if (fThreeWay) {			

-				cc.setAncestorLabel(buildLabel(fAncestorResource));

-				cc.setAncestorImage(CompareUIPlugin.getImage(fAncestorResource));

 				String format= Utilities.getString("ResourceCompare.threeWay.title"); //$NON-NLS-1$

 				String ancestorLabel= fAncestorResource.getName();

 				title= MessageFormat.format(format, new String[] {ancestorLabel, leftLabel, rightLabel} );

diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
index d99a4f8..3571ee9 100644
--- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
+++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
@@ -62,7 +62,20 @@
 		fPatcher= patcher;

 		IResource[] s= Utilities.getResources(selection);

 		if (s.length == 1)

-			fTarget= s[0];	

+			fTarget= s[0];

+		

+		if (fPatcher != null) {

+			String rformat= PatchMessages.getString("PatchCompareInput.RightTitle.format");	//$NON-NLS-1$

+			String rightLabel= MessageFormat.format(rformat, new String[] { fPatcher.getName() } );

+			config.setRightLabel(rightLabel);

+			//cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

+		}

+		

+		if (fTarget != null) {

+			String leftLabel= fTarget.getName();

+			config.setLeftLabel(leftLabel);

+			config.setLeftImage(CompareUIPlugin.getImage(fTarget));

+		}	

 	}

 	

 	/**

@@ -70,8 +83,6 @@
 	 */

 	public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException {

 						

-		CompareConfiguration cc= (CompareConfiguration) getCompareConfiguration();

-		

 		try {				

 			Diff[] diffs= fPatcher.getDiffs();

 			

@@ -101,13 +112,9 @@
 			fTarget.refreshLocal(IResource.DEPTH_INFINITE, pm);

 			

 			String leftLabel= fTarget.getName();

-			cc.setLeftLabel(leftLabel);

-			cc.setLeftImage(CompareUIPlugin.getImage(fTarget));

 			

 			String rformat= PatchMessages.getString("PatchCompareInput.RightTitle.format");	//$NON-NLS-1$

 			String rightLabel= MessageFormat.format(rformat, new String[] { fPatcher.getName() } );

-			cc.setRightLabel(rightLabel);

-			//cc.setRightImage(CompareUIPlugin.getImage(fRightResource));

 			

 			String format= Utilities.getString("ResourceCompare.twoWay.title"); //$NON-NLS-1$

 			String title= MessageFormat.format(format, new String[] {leftLabel, rightLabel} );