Bug 534059 - GridViewerColumnBuilder should support tooltips on column
headers

* binding the grid tooltip property to the column tooltip
* added custom WidgetValueProperty as there is no fitting for GridColumn

Change-Id: I4e8162734ed68022b08b81d48e05c519c8a1832d
Signed-off-by: Eugen Neufeld <eneufeld@eclipsesource.com>
diff --git a/bundles/org.eclipse.emf.ecp.view.table.ui.nebula.grid/src/org/eclipse/emf/ecp/view/spi/table/nebula/grid/GridViewerColumnBuilder.java b/bundles/org.eclipse.emf.ecp.view.table.ui.nebula.grid/src/org/eclipse/emf/ecp/view/spi/table/nebula/grid/GridViewerColumnBuilder.java
index 89d00cb..9a91191 100644
--- a/bundles/org.eclipse.emf.ecp.view.table.ui.nebula.grid/src/org/eclipse/emf/ecp/view/spi/table/nebula/grid/GridViewerColumnBuilder.java
+++ b/bundles/org.eclipse.emf.ecp.view.table.ui.nebula.grid/src/org/eclipse/emf/ecp/view/spi/table/nebula/grid/GridViewerColumnBuilder.java
@@ -16,6 +16,7 @@
 import org.eclipse.emfforms.common.Property.ChangeListener;
 import org.eclipse.emfforms.spi.swt.table.AbstractTableViewerColumnBuilder;
 import org.eclipse.emfforms.spi.swt.table.ColumnConfiguration;
+import org.eclipse.jface.databinding.swt.WidgetValueProperty;
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.layout.GridLayoutFactory;
 import org.eclipse.jface.viewers.EditingSupport;
@@ -36,6 +37,7 @@
 import org.eclipse.swt.widgets.Item;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
 
 /**
  * Nebula Grid viewer configuration helper class.
@@ -70,6 +72,12 @@
 	}
 
 	@Override
+	protected void configureDatabinding(Widget column) {
+		super.configureDatabinding(column);
+		bindValue(column, new GridColumnTooltipTextProperty(), getConfig().getColumnTooltip());
+	}
+
+	@Override
 	protected Item getTableColumn(GridViewerColumn viewerColumn) {
 		return viewerColumn.getColumn();
 	}
@@ -226,4 +234,32 @@
 		return filterComposite;
 	}
 
+	/**
+	 * Internal class to bind the GridColumn's TooltipText using JFace Databinding.
+	 *
+	 * @author Eugen Neufeld
+	 *
+	 */
+	class GridColumnTooltipTextProperty extends WidgetValueProperty {
+
+		@Override
+		public String toString() {
+			return "GridColumn.toolTipText <String>"; //$NON-NLS-1$
+		}
+
+		@Override
+		public Object getValueType() {
+			return String.class;
+		}
+
+		@Override
+		protected Object doGetValue(Object source) {
+			return ((GridColumn) source).getHeaderTooltip();
+		}
+
+		@Override
+		protected void doSetValue(Object source, Object value) {
+			((GridColumn) source).setHeaderTooltip((String) value);
+		}
+	}
 }
diff --git a/tests/org.eclipse.emf.ecp.view.table.ui.nebula.grid.test/META-INF/MANIFEST.MF b/tests/org.eclipse.emf.ecp.view.table.ui.nebula.grid.test/META-INF/MANIFEST.MF
index 23b2b64..49205b2 100644
--- a/tests/org.eclipse.emf.ecp.view.table.ui.nebula.grid.test/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.emf.ecp.view.table.ui.nebula.grid.test/META-INF/MANIFEST.MF
@@ -8,6 +8,7 @@
 Bundle-Localization: plugin
 Fragment-Host: org.eclipse.emf.ecp.view.table.ui.nebula.grid;bundle-version="[1.17.0,1.18.0]"
 Export-Package: org.eclipse.emf.ecp.view.internal.table.nebula.grid;version="1.17.0";x-internal:=true,
+ org.eclipse.emf.ecp.view.spi.table.nebula.grid;version="1.17.0",
  org.eclipse.emf.ecp.view.table.ui.nebula.grid.test.model.audit;version="1.17.0";x-internal:=true,
  org.eclipse.emf.ecp.view.table.ui.nebula.grid.test.model.audit.impl;version="1.17.0";x-internal:=true,
  org.eclipse.emf.ecp.view.table.ui.nebula.grid.test.model.audit.util;version="1.17.0";x-internal:=true
@@ -27,7 +28,8 @@
  org.eclipse.emfforms.swt.core.di.extension;bundle-version="[1.17.0,1.18.0]",
  org.eclipse.emf.ecp.view.table.test.common;bundle-version="[1.17.0,1.18.0]",
  org.eclipse.core.runtime;bundle-version="[3.13.0,4.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.13.0,3.0.0)";visibility:=reexport
+ org.eclipse.emf.ecore;bundle-version="[2.13.0,3.0.0)";visibility:=reexport,
+ org.objenesis;bundle-version="[1.0.0,2.0.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Automatic-Module-Name: org.eclipse.emf.ecp.view.table.ui.nebula.grid.test
diff --git a/tests/org.eclipse.emf.ecp.view.table.ui.nebula.grid.test/src/org/eclipse/emf/ecp/view/spi/table/nebula/grid/GridViewerColumnBuilder_ITest.java b/tests/org.eclipse.emf.ecp.view.table.ui.nebula.grid.test/src/org/eclipse/emf/ecp/view/spi/table/nebula/grid/GridViewerColumnBuilder_ITest.java
new file mode 100644
index 0000000..cbdaa5f
--- /dev/null
+++ b/tests/org.eclipse.emf.ecp.view.table.ui.nebula.grid.test/src/org/eclipse/emf/ecp/view/spi/table/nebula/grid/GridViewerColumnBuilder_ITest.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2018 EclipseSource Muenchen GmbH 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:
+ * Eugen Neufeld - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.emf.ecp.view.spi.table.nebula.grid;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.emf.databinding.EMFDataBindingContext;
+import org.eclipse.emf.ecp.view.test.common.swt.spi.DatabindingClassRunner;
+import org.eclipse.emfforms.common.Optional;
+import org.eclipse.emfforms.common.Property;
+import org.eclipse.emfforms.spi.swt.table.ColumnConfiguration;
+import org.eclipse.jface.viewers.CellLabelProvider;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.nebula.jface.gridviewer.GridTableViewer;
+import org.eclipse.nebula.jface.gridviewer.GridViewerColumn;
+import org.eclipse.swt.widgets.Shell;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(DatabindingClassRunner.class)
+public class GridViewerColumnBuilder_ITest {
+
+	private EMFDataBindingContext dataBindingContext;
+	private GridTableViewer tableViewer;
+	private Shell shell;
+	private ColumnConfiguration config;
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	@Before
+	public void setUp() throws Exception {
+		dataBindingContext = new EMFDataBindingContext();
+		shell = new Shell();
+		tableViewer = new GridTableViewer(shell);
+
+		config = mock(ColumnConfiguration.class);
+		final CellLabelProvider labelProvider = mock(CellLabelProvider.class);
+		when(config.createLabelProvider(tableViewer)).thenReturn(labelProvider);
+		final Optional<EditingSupport> editingSupport = Optional.empty();
+		when(config.createEditingSupport(tableViewer)).thenReturn(editingSupport);
+		final Property visibleProperty = mock(Property.class);
+		when(visibleProperty.getValue()).thenReturn(Boolean.TRUE);
+		when(config.visible()).thenReturn(visibleProperty);
+		final Property showFilterProperty = mock(Property.class);
+		when(showFilterProperty.getValue()).thenReturn(Boolean.FALSE);
+		when(config.showFilterControl()).thenReturn(showFilterProperty);
+		final Property matchFilterProperty = mock(Property.class);
+		when(matchFilterProperty.getValue()).thenReturn(Boolean.FALSE);
+		when(config.matchFilter()).thenReturn(matchFilterProperty);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		shell.dispose();
+	}
+
+	@SuppressWarnings("rawtypes")
+	@Test
+	public void testConfigureDatabinding() {
+
+		final IObservableValue tooltipObservable = mock(IObservableValue.class);
+		final String tooltip = "Foo";
+		when(tooltipObservable.getValue()).thenReturn(tooltip);
+		when(tooltipObservable.getRealm()).thenReturn(dataBindingContext.getValidationRealm());
+		when(config.getColumnTooltip()).thenReturn(tooltipObservable);
+
+		final IObservableValue textObservable = mock(IObservableValue.class);
+		when(textObservable.getValue()).thenReturn("Bar");
+		when(textObservable.getValueType()).thenReturn(String.class);
+		when(textObservable.getRealm()).thenReturn(dataBindingContext.getValidationRealm());
+		when(config.getColumnText()).thenReturn(textObservable);
+
+		final GridViewerColumnBuilder builder = new GridViewerColumnBuilder(config);
+		builder.withDatabinding(dataBindingContext);
+		final GridViewerColumn column = builder.build(tableViewer);
+		assertEquals(tooltip, column.getColumn().getHeaderTooltip());
+	}
+
+}