472281: All saveable views should set the viewer as a selection provider

Change-Id: I2b0ecd358d7bd8b51fc501b968707441c9f0cd96
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=472281
diff --git a/examples/org.eclipse.emf.parsley.examples.mail.unifiedfoldersview/src/org/eclipse/emf/parsley/examples/mail/unifiedfoldersview/UnifiedFoldersView.java b/examples/org.eclipse.emf.parsley.examples.mail.unifiedfoldersview/src/org/eclipse/emf/parsley/examples/mail/unifiedfoldersview/UnifiedFoldersView.java
index 019d9e8..5b64c11 100644
--- a/examples/org.eclipse.emf.parsley.examples.mail.unifiedfoldersview/src/org/eclipse/emf/parsley/examples/mail/unifiedfoldersview/UnifiedFoldersView.java
+++ b/examples/org.eclipse.emf.parsley.examples.mail.unifiedfoldersview/src/org/eclipse/emf/parsley/examples/mail/unifiedfoldersview/UnifiedFoldersView.java
@@ -21,7 +21,7 @@
 	protected void mostRecentCommandAffectsResource(Command mostRecentCommand) {
 		super.mostRecentCommandAffectsResource(mostRecentCommand);
 		// if a child changes the parent is not refreshed by default
-		getTreeViewer().refresh();
-		getTreeViewer().expandAll();
+		getViewer().refresh();
+		getViewer().expandAll();
 	}
 }
diff --git a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/composite/StructuredViewerAwareComposite.java b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/composite/StructuredViewerAwareComposite.java
deleted file mode 100644
index 699e3ff..0000000
--- a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/composite/StructuredViewerAwareComposite.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 RCP Vision (http://www.rcp-vision.com) 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * Lorenzo Bettini - initial API and implementation
- *******************************************************************************/
-package org.eclipse.emf.parsley.composite;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Composite;
-
-public class StructuredViewerAwareComposite extends Composite implements IStructuredViewerAware {
-
-    private StructuredViewer viewer;
-
-    public StructuredViewerAwareComposite(Composite parent, int style) {
-        super(parent, style);
-    }
-
-    @Override
-	public void setViewer(StructuredViewer viewer) {
-        this.viewer = viewer;
-    }
-
-    @Override
-	public StructuredViewer getViewer() {
-        return viewer;
-    }
-
-}
diff --git a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/menus/ViewerContextMenuHelper.java b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/menus/ViewerContextMenuHelper.java
index 8214297..0b08462 100644
--- a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/menus/ViewerContextMenuHelper.java
+++ b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/menus/ViewerContextMenuHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013 RCP Vision (http://www.rcp-vision.com) and others.
+ * Copyright (c) 2015 RCP Vision (http://www.rcp-vision.com) 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
@@ -20,6 +20,7 @@
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.ui.IWorkbenchPart;
 
@@ -27,6 +28,8 @@
 import com.google.inject.Provider;
 
 /**
+ * Provides utility methods for adding context menu to a viewer.
+ * 
  * @author Lorenzo Bettini - Initial contribution and API
  * @author Francesco Guidieri - refactoring for
  *         https://bugs.eclipse.org/bugs/show_bug.cgi?id=455727
@@ -50,7 +53,7 @@
 	}
 
 	/**
-	 * Adds a context menu to the passed {@link StructuredViewer}.
+	 * Adds a context menu to the passed {@link Viewer}.
 	 * 
 	 * The passed {@link IMenuListener} should implement a method like
 	 * 
@@ -69,7 +72,7 @@
 	 * @param actionBarContributor
 	 *            should be created by injection
 	 */
-	public void addViewerContextMenu(StructuredViewer viewer,
+	public void addViewerContextMenu(Viewer viewer,
 			AdapterFactoryEditingDomain editingDomain,
 			IWorkbenchPart activePart,
 			IMenuListener menuListener,
@@ -123,20 +126,20 @@
 	 * @param editingDomain
 	 *            should be created by injection
 	 */
-	public void addViewerContextMenu(StructuredViewer viewer, AdapterFactoryEditingDomain editingDomain) {
+	public void addViewerContextMenu(Viewer viewer, AdapterFactoryEditingDomain editingDomain) {
 		createContextMenu(viewer, editingDomain, treeActionBarContributor);
 		viewer.addSelectionChangedListener(treeActionBarContributor);
 		treeActionBarContributor.initialize(editingDomain);
 	}
 
-	private MenuManager createContextMenu(StructuredViewer viewer, AdapterFactoryEditingDomain editingDomain) {
+	private MenuManager createContextMenu(Viewer viewer, AdapterFactoryEditingDomain editingDomain) {
 		MenuManager menuManager = createMenuManager();
 		Menu menu = menuManager.createContextMenu(viewer.getControl());
 		viewer.getControl().setMenu(menu);
 		return menuManager;
 	}
 
-	private MenuManager createContextMenu(StructuredViewer viewer, AdapterFactoryEditingDomain editingDomain, final IMenuListener menuListener) {
+	private MenuManager createContextMenu(Viewer viewer, AdapterFactoryEditingDomain editingDomain, final IMenuListener menuListener) {
 		MenuManager menuManager = createContextMenu(viewer, editingDomain);
 		menuManager.addMenuListener(new IMenuListener() {
 			@Override
@@ -147,7 +150,7 @@
 		return menuManager;
 	}
 
-	private void bridgeSelectionProviderAndActionBarContributor(StructuredViewer viewer,
+	private void bridgeSelectionProviderAndActionBarContributor(Viewer viewer,
 			WorkbenchActionBarContributor actionBarContributor) {
 		ViewerSelectionProvider viewerSelectionProvider = new ViewerSelectionProvider(viewer);
 		actionBarContributor.setExplicitSelectionProvider(viewerSelectionProvider);
diff --git a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/composite/IStructuredViewerAware.java b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/viewers/IStructuredViewerProvider.java
similarity index 62%
rename from plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/composite/IStructuredViewerAware.java
rename to plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/viewers/IStructuredViewerProvider.java
index 847ae5b..c8d5c2e 100644
--- a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/composite/IStructuredViewerAware.java
+++ b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/viewers/IStructuredViewerProvider.java
@@ -8,14 +8,20 @@
  * Contributors:
  * Lorenzo Bettini - initial API and implementation
  *******************************************************************************/
-package org.eclipse.emf.parsley.composite;
+package org.eclipse.emf.parsley.viewers;
 
+import org.eclipse.emf.common.ui.viewer.IViewerProvider;
 import org.eclipse.jface.viewers.StructuredViewer;
 
-public interface IStructuredViewerAware {
+/**
+ * Common interfaces for objects that provide a {@link StructuredViewer}
+ * 
+ * @author Lorenzo Bettini - Initial contribution and API
+ *
+ */
+public interface IStructuredViewerProvider extends IViewerProvider {
 
-    void setViewer(StructuredViewer viewer);
-    
-    StructuredViewer getViewer();
+	@Override
+	StructuredViewer getViewer();
 
 }
diff --git a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableFormView.java b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableFormView.java
index f751f0e..2f21e85 100644
--- a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableFormView.java
+++ b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableFormView.java
@@ -41,7 +41,7 @@
 			.createTableFormMasterDetailComposite(parent, SWT.BORDER, getEClass());
 		tableFormComposite.update(getResource());
 
-		addContextMenuAndDragAndDrop(tableFormComposite.getViewer());
+		afterCreateViewer();
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableView.java b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableView.java
index 261d709..23aacaa 100644
--- a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableView.java
+++ b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTableView.java
@@ -38,9 +38,8 @@
 		tableViewer = viewerFactory.
 				createTableViewer(parent, createTableStyles(), getEClass());
 		tableViewer.setInput(getResource());
-		addContextMenuAndDragAndDrop(tableViewer);
 
-		getSite().setSelectionProvider(tableViewer);
+		afterCreateViewer();
 	}
 
 	protected int createTableStyles() {
diff --git a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeFormView.java b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeFormView.java
index a92e686..891a532 100644
--- a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeFormView.java
+++ b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeFormView.java
@@ -23,9 +23,9 @@
 public abstract class AbstractSaveableTreeFormView extends AbstractSaveableViewerView{
 
 	@Inject
-	protected TreeFormFactory treeFormFactory;
+	private TreeFormFactory treeFormFactory;
 
-	protected TreeFormComposite treeFormComposite;
+	private TreeFormComposite treeFormComposite;
 
 	protected Object getContents(Resource resource) {
 		return resource;
@@ -40,13 +40,11 @@
 
 		treeFormComposite.update(getContents(getResource()));
 
-		addContextMenuAndDragAndDrop(treeFormComposite.getViewer());
-		addMouseListener(treeFormComposite.getViewer());
+		afterCreateViewer();
 	}
 
 	public void forceReloadResource(){
 		treeFormComposite.update(getContents(getResource()));
-
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeView.java b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeView.java
index d31861b..2831bcf 100644
--- a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeView.java
+++ b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableTreeView.java
@@ -10,15 +10,17 @@
  *******************************************************************************/
 package org.eclipse.emf.parsley.views;
 
-
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.parsley.viewers.ViewerFactory;
-import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.widgets.Composite;
 
 import com.google.inject.Inject;
 
+/**
+ * @author Lorenzo Bettini - Initial contribution and API
+ *
+ */
 public abstract class AbstractSaveableTreeView extends AbstractSaveableViewerView {
 
 	@Inject
@@ -37,10 +39,7 @@
 		treeViewer = new TreeViewer(parent);
 		viewerFactory.initialize(treeViewer, getContents(getResource()));
 
-		addContextMenuAndDragAndDrop(treeViewer);
-		addMouseListener(treeViewer);
-
-		getSite().setSelectionProvider(treeViewer);
+		afterCreateViewer();
 	}
 
 	@Override
@@ -49,11 +48,7 @@
 	}
 
 	@Override
-	public StructuredViewer getViewer() {
-		return treeViewer;
-	}
-
-	public TreeViewer getTreeViewer() {
+	public TreeViewer getViewer() {
 		return treeViewer;
 	}
 
diff --git a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableViewerView.java b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableViewerView.java
index e4fb834..711ee41 100644
--- a/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableViewerView.java
+++ b/plugins/org.eclipse.emf.parsley.views.common/src/org/eclipse/emf/parsley/views/AbstractSaveableViewerView.java
@@ -14,19 +14,24 @@
 import java.util.Collection;
 
 import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
 import org.eclipse.emf.edit.command.AddCommand;
 import org.eclipse.emf.edit.command.CreateChildCommand;
 import org.eclipse.emf.parsley.edit.ui.dnd.ViewerDragAndDropHelper;
 import org.eclipse.emf.parsley.menus.ViewerContextMenuHelper;
+import org.eclipse.emf.parsley.viewers.IStructuredViewerProvider;
 import org.eclipse.emf.parsley.viewers.IViewerMouseListener;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
-public abstract class AbstractSaveableViewerView extends AbstractSaveableView implements IViewerProvider {
+/**
+ * A common saveable view based on a viewer.
+ * 
+ * @author Francesco Guidieri - Initial contribution and API
+ * @author Lorenzo Bettini - some refactoring
+ */
+public abstract class AbstractSaveableViewerView extends AbstractSaveableView implements IStructuredViewerProvider {
 
 	@Inject
 	private ViewerContextMenuHelper contextMenuHelper;
@@ -35,7 +40,22 @@
 	private ViewerDragAndDropHelper dragAndDropHelper;
 
 	@Inject
-	protected Provider<IViewerMouseListener> viewerMouseListenerProvider;
+	private Provider<IViewerMouseListener> viewerMouseListenerProvider;
+
+	/**
+	 * This assumes that the viewer has already been created, that is,
+	 * {@link #getViewer()} must not return null.
+	 */
+	protected void afterCreateViewer() {
+		addContextMenuToViewer();
+		addDragAndDropToViewer();
+		addMouseListenerToViewer();
+		setViewerAsSelectionProvider();
+	}
+
+	protected void setViewerAsSelectionProvider() {
+		getSite().setSelectionProvider(getViewer());
+	}
 
 	@Override
 	protected void postCommandStackChanged(Command mostRecentCommand) {
@@ -66,9 +86,12 @@
 		}
 	}
 
-	protected void addContextMenuAndDragAndDrop(StructuredViewer viewer) {
-		contextMenuHelper.addViewerContextMenu(viewer, editingDomain, this);
-		dragAndDropHelper.addDragAndDrop(viewer, editingDomain);
+	protected void addContextMenuToViewer() {
+		contextMenuHelper.addViewerContextMenu(getViewer(), editingDomain, this);
+	}
+
+	protected void addDragAndDropToViewer() {
+		dragAndDropHelper.addDragAndDrop(getViewer(), editingDomain);
 	}
 
 	/**
@@ -76,8 +99,8 @@
 	 * 
 	 * @param viewer
 	 */
-	public void addMouseListener(StructuredViewer viewer) {
-		viewer.getControl().addMouseListener(viewerMouseListenerProvider.get());
+	public void addMouseListenerToViewer() {
+		getViewer().getControl().addMouseListener(viewerMouseListenerProvider.get());
 	}
 
 }