Bug 295007 [services] selection service implementation discussion
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/SelectionServiceImpl.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/SelectionServiceImpl.java
index f39cdfd..cd6e3d4 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/SelectionServiceImpl.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/SelectionServiceImpl.java
@@ -208,7 +208,12 @@
 	 * @see org.eclipse.e4.ui.selection.ESelectionService#getSelection()
 	 */
 	public Object getSelection() {
-		return activePart.getContext().get(ESelectionService.SELECTION);
+		if (activePart == null) {
+			return null;
+		}
+
+		IEclipseContext partContext = activePart.getContext();
+		return partContext == null ? null : partContext.get(ESelectionService.SELECTION);
 	}
 
 	/*
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 0dbc3ab..cc18645 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
@@ -141,8 +141,8 @@
 	 * .ui.ISelectionListener)
 	 */
 	public void addPostSelectionListener(ISelectionListener listener) {
-		// TODO Auto-generated method stub
-
+		// TODO compat addPostSelectionListener
+		E4Util.unsupported("addPostSelectionListener"); //$NON-NLS-1$
 	}
 
 	/*
@@ -153,8 +153,8 @@
 	 * , org.eclipse.ui.ISelectionListener)
 	 */
 	public void addPostSelectionListener(String partId, ISelectionListener listener) {
-		// TODO Auto-generated method stub
-
+		// TODO compat addPostSelectionListener
+		E4Util.unsupported("addPostSelectionListener"); //$NON-NLS-1$
 	}
 
 	/*
@@ -216,8 +216,8 @@
 	 * .ui.ISelectionListener)
 	 */
 	public void removePostSelectionListener(ISelectionListener listener) {
-		// TODO Auto-generated method stub
-
+		// TODO compat removePostSelectionListener
+		E4Util.unsupported("removePostSelectionListener"); //$NON-NLS-1$
 	}
 
 	/*
@@ -228,8 +228,8 @@
 	 * .String, org.eclipse.ui.ISelectionListener)
 	 */
 	public void removePostSelectionListener(String partId, ISelectionListener listener) {
-		// TODO Auto-generated method stub
-
+		// TODO compat removePostSelectionListener
+		E4Util.unsupported("removePostSelectionListener"); //$NON-NLS-1$
 	}
 
 	/*
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/WorkbenchPage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/WorkbenchPage.java
index a17f5cd..fedc947 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/WorkbenchPage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/WorkbenchPage.java
@@ -11,6 +11,7 @@
 
 package org.eclipse.ui.internal.e4.compatibility;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -24,6 +25,7 @@
 import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
 import org.eclipse.e4.core.services.annotations.PostConstruct;
 import org.eclipse.e4.core.services.context.IEclipseContext;
+import org.eclipse.e4.core.services.context.spi.ContextInjectionFactory;
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.MApplicationFactory;
 import org.eclipse.e4.ui.model.application.MElementContainer;
@@ -58,6 +60,7 @@
 import org.eclipse.ui.IReusableEditor;
 import org.eclipse.ui.ISaveablePart;
 import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.ISelectionService;
 import org.eclipse.ui.IShowEditorInput;
 import org.eclipse.ui.IViewPart;
 import org.eclipse.ui.IViewReference;
@@ -102,6 +105,8 @@
 	@Inject
 	private EModelService modelService;
 
+	private ISelectionService selectionService;
+
 	private List<IViewReference> viewReferences = new ArrayList<IViewReference>();
 	private List<IEditorReference> editorReferences = new ArrayList<IEditorReference>();
 
@@ -121,9 +126,11 @@
 	}
 
 	@PostConstruct
-	void postConstruct() {
+	void postConstruct() throws InvocationTargetException, InstantiationException {
 		partService.addPartListener(e4PartListener);
 		window.getContext().set(IPartService.class.getName(), this);
+		selectionService = (ISelectionService) ContextInjectionFactory
+				.make(SelectionService.class, window.getContext());
 
 		Collection<MPart> parts = partService.getParts();
 		for (MPart part : parts) {
@@ -1357,90 +1364,70 @@
 	 * @see org.eclipse.ui.ISelectionService#addSelectionListener(org.eclipse.ui.ISelectionListener)
 	 */
 	public void addSelectionListener(ISelectionListener listener) {
-		// FIXME compat addSelectionListener
-		E4Util.unsupported("addSelectionListener"); //$NON-NLS-1$
-
+		selectionService.addSelectionListener(listener);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#addSelectionListener(java.lang.String, org.eclipse.ui.ISelectionListener)
 	 */
 	public void addSelectionListener(String partId, ISelectionListener listener) {
-		// FIXME compat addSelectionListener
-		E4Util.unsupported("addSelectionListener(partId)"); //$NON-NLS-1$
-
+		selectionService.addSelectionListener(partId, listener);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#addPostSelectionListener(org.eclipse.ui.ISelectionListener)
 	 */
 	public void addPostSelectionListener(ISelectionListener listener) {
-		// FIXME compat addPostSelectionListener
-		E4Util.unsupported("addPostSelectionListener"); //$NON-NLS-1$
-
+		selectionService.addPostSelectionListener(listener);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#addPostSelectionListener(java.lang.String, org.eclipse.ui.ISelectionListener)
 	 */
 	public void addPostSelectionListener(String partId, ISelectionListener listener) {
-		// FIXME compat addPostSelectionListener
-		E4Util.unsupported("addPostSelectionListener(partId)"); //$NON-NLS-1$
-
+		selectionService.addPostSelectionListener(partId, listener);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#getSelection()
 	 */
 	public ISelection getSelection() {
-		// FIXME compat addPostSelectionListener
-		E4Util.unsupported("getSelection"); //$NON-NLS-1$
-		return null;
+		return selectionService.getSelection();
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#getSelection(java.lang.String)
 	 */
 	public ISelection getSelection(String partId) {
-		// FIXME compat getSelection
-		E4Util.unsupported("getSelection(partId)"); //$NON-NLS-1$
-		return null;
+		return selectionService.getSelection(partId);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#removeSelectionListener(org.eclipse.ui.ISelectionListener)
 	 */
 	public void removeSelectionListener(ISelectionListener listener) {
-		// FIXME compat getSelection
-		E4Util.unsupported("removeSelectionListener"); //$NON-NLS-1$
-
+		selectionService.removeSelectionListener(listener);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#removeSelectionListener(java.lang.String, org.eclipse.ui.ISelectionListener)
 	 */
 	public void removeSelectionListener(String partId, ISelectionListener listener) {
-		// FIXME compat getSelection
-		E4Util.unsupported("removeSelectionListener(partId)"); //$NON-NLS-1$
-
+		selectionService.removeSelectionListener(partId, listener);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#removePostSelectionListener(org.eclipse.ui.ISelectionListener)
 	 */
 	public void removePostSelectionListener(ISelectionListener listener) {
-		// FIXME compat getSelection
-		E4Util.unsupported("removePostSelectionListener"); //$NON-NLS-1$
-
+		selectionService.removePostSelectionListener(listener);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISelectionService#removePostSelectionListener(java.lang.String, org.eclipse.ui.ISelectionListener)
 	 */
 	public void removePostSelectionListener(String partId, ISelectionListener listener) {
-		// FIXME compat getSelection
-		E4Util.unsupported("removePostSelectionListener(partId)"); //$NON-NLS-1$
-
+		selectionService.removePostSelectionListener(partId, listener);
 	}
 
 	ArrayList<MPart> activationList = new ArrayList<MPart>();