Bug 375741 - intermittent problems with context menu visibility etc.
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java
index 7d60aa4..6dac921 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java
@@ -28,6 +28,11 @@
 import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
 import org.eclipse.e4.ui.workbench.IPresentationEngine;
 import org.eclipse.e4.ui.workbench.UIEvents;
+import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
@@ -53,7 +58,7 @@
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventHandler;
 
-public abstract class CompatibilityPart {
+public abstract class CompatibilityPart implements ISelectionChangedListener {
 
 	public static final String COMPATIBILITY_EDITOR_URI = "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor"; //$NON-NLS-1$
 
@@ -151,6 +156,19 @@
 				WorkbenchPlugin.log("Unable to initialize error part", ex.getStatus()); //$NON-NLS-1$
 			}
 		}
+
+		IWorkbenchPartSite site = legacyPart.getSite();
+		if (site != null) {
+			ISelectionProvider selectionProvider = site.getSelectionProvider();
+			if (selectionProvider != null) {
+				selectionProvider.addSelectionChangedListener(this);
+
+				if (selectionProvider instanceof IPostSelectionProvider) {
+					((IPostSelectionProvider) selectionProvider)
+							.addPostSelectionChangedListener(this);
+				}
+			}
+		}
 		return true;
 	}
 
@@ -168,6 +186,21 @@
 	}
 
 	private void invalidate() {
+		if (wrapped != null) {
+			IWorkbenchPartSite site = wrapped.getSite();
+			if (site != null) {
+				ISelectionProvider selectionProvider = site.getSelectionProvider();
+				if (selectionProvider != null) {
+					selectionProvider.removeSelectionChangedListener(this);
+
+					if (selectionProvider instanceof IPostSelectionProvider) {
+						((IPostSelectionProvider) selectionProvider)
+								.removePostSelectionChangedListener(this);
+					}
+				}
+			}
+		}
+
 		WorkbenchPartReference reference = getReference();
 		reference.invalidate();
 
@@ -380,4 +413,10 @@
 	public MPart getModel() {
 		return part;
 	}
+	
+	public void selectionChanged(SelectionChangedEvent e) {
+		ESelectionService selectionService = (ESelectionService) part.getContext().get(
+				ESelectionService.class.getName());
+		selectionService.setSelection(e.getSelection());
+	}
 }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/SelectionService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/SelectionService.java
index 58f7dd1..f433fd8 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/SelectionService.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/SelectionService.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
+ * Copyright (c) 2010, 2012 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,7 +24,6 @@
 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.services.IServiceConstants;
 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.ISelectionProvider;
@@ -113,35 +112,11 @@
 
 	@Inject
 	void setPart(@Optional @Named(IServiceConstants.ACTIVE_PART) final MPart part) {
-		if (activePart != null) {
-			ISelectionProvider selectionProvider = activePart.getSite().getSelectionProvider();
-			if (selectionProvider != null) {
-				selectionProvider.removeSelectionChangedListener(this);
-
-				if (selectionProvider instanceof IPostSelectionProvider) {
-					((IPostSelectionProvider) selectionProvider)
-							.removePostSelectionChangedListener(this);
-				}
-			}
-			activePart = null;
-		}
-
+		activePart = null;
 		if (part != null) {
 			Object client = part.getObject();
 			if (client instanceof CompatibilityPart) {
 				IWorkbenchPart workbenchPart = ((CompatibilityPart) client).getPart();
-
-				ISelectionProvider selectionProvider = workbenchPart.getSite()
-						.getSelectionProvider();
-				if (selectionProvider != null) {
-					selectionProvider.addSelectionChangedListener(this);
-
-					if (selectionProvider instanceof IPostSelectionProvider) {
-						((IPostSelectionProvider) selectionProvider)
-								.addPostSelectionChangedListener(this);
-					}
-				}
-
 				activePart = workbenchPart;
 			}
 		}