Add support for GridColumnGroup header word wrap (server-side only)

- add GridColumnGroup#get/setHeaderWordWrap
- render "headerWordWrap" property in GridColumnGroupLCA

Change-Id: I35be18b331dc15b099628e143158c991e53f1853
Signed-off-by: Ivan Furnadjiev <ivan@eclipsesource.com>
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
index 4f14a6d..865777b 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
@@ -912,6 +912,8 @@
   public void setHeaderWordWrap( boolean wordWrap ) {
     checkWidget();
     this.headerWordWrap = wordWrap;
+    parent.layoutCache.invalidateHeaderHeight();
+    parent.scheduleRedraw();
   }
 
   /**
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumnGroup.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumnGroup.java
index a32eec6..43f29d4 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumnGroup.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumnGroup.java
@@ -47,6 +47,7 @@
   private List<GridColumn> columns = new ArrayList<GridColumn>();
   private boolean expanded = true;
   private Font headerFont;
+  private boolean headerWordWrap;
 
   /**
    * Constructs a new instance of this class given its parent (which must be a Grid) and a style
@@ -268,6 +269,30 @@
     parent.scheduleRedraw();
   }
 
+  /**
+   * Sets whether or not text is word-wrapped in the header for this column group.
+   * If Grid.setAutoHeight(true) is set, the row height is adjusted to accommodate
+   * word-wrapped text.
+   * @param wordWrap Set to true to wrap the text, false otherwise
+   * @see #getHeaderWordWrap()
+   */
+  public void setHeaderWordWrap( boolean wordWrap ) {
+    checkWidget();
+    headerWordWrap = wordWrap;
+    parent.layoutCache.invalidateHeaderHeight();
+    parent.scheduleRedraw();
+  }
+
+  /**
+   * Returns whether or not text is word-wrapped in the header for this column group.
+   * @return true if the header wraps its text.
+   * @see GridColumn#setHeaderWordWrap(boolean)
+   */
+  public boolean getHeaderWordWrap() {
+    checkWidget();
+    return headerWordWrap;
+  }
+
   void newColumn( GridColumn column ) {
     columns.add( column );
   }
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA.java
index 9681cac..963854d 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA.java
@@ -47,6 +47,7 @@
   private static final String PROP_VISIBLE = "visibility";
   private static final String PROP_FONT = "font";
   private static final String PROP_EXPANDED = "expanded";
+  private static final String PROP_HEADER_WORD_WRAP = "headerWordWrap";
   private static final String PROP_EXPAND_LISTENER = "Expand";
   private static final String PROP_COLLAPSE_LISTENER = "Collapse";
 
@@ -72,6 +73,7 @@
     preserveProperty( group, PROP_VISIBLE, isVisible( group ) );
     preserveProperty( group, PROP_FONT, group.getHeaderFont() );
     preserveProperty( group, PROP_EXPANDED, group.getExpanded() );
+    preserveProperty( group, PROP_HEADER_WORD_WRAP, group.getHeaderWordWrap() );
     preserveListener( group, PROP_EXPAND_LISTENER, hasExpandListener( group ) );
     preserveListener( group, PROP_COLLAPSE_LISTENER, hasCollapseListener( group ) );
   }
@@ -87,6 +89,7 @@
     renderProperty( group, PROP_VISIBLE, isVisible( group ), true );
     renderFont( group, PROP_FONT, group.getHeaderFont() );
     renderProperty( group, PROP_EXPANDED, group.getExpanded(), true );
+    renderProperty( group, PROP_HEADER_WORD_WRAP, group.getHeaderWordWrap(), false );
     renderListener( group, PROP_EXPAND_LISTENER, hasExpandListener( group ), false );
     renderListener( group, PROP_COLLAPSE_LISTENER, hasCollapseListener( group ), false );
   }
diff --git a/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java b/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java
index 8c49f31..1451773 100644
--- a/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java
+++ b/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java
@@ -408,6 +408,9 @@
         for( GridColumn column : grid.getColumns() ) {
           column.setHeaderWordWrap( button.getSelection() );
         }
+        for( GridColumnGroup group : grid.getColumnGroups() ) {
+          group.setHeaderWordWrap( button.getSelection() );
+        }
       }
     } );
   }
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumnGroup_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumnGroup_Test.java
index e6fa3ca..e332043 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumnGroup_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumnGroup_Test.java
@@ -168,4 +168,25 @@
     group.setHeaderFont( font );
   }
 
+  @Test
+  public void testGetHeaderWordWrap_Initial() {
+    assertFalse( group.getHeaderWordWrap() );
+  }
+
+  @Test
+  public void testGetHeaderWordWrap() {
+    group.setHeaderWordWrap( true );
+
+    assertTrue( group.getHeaderWordWrap() );
+  }
+
+  @Test
+  public void testGetHeaderWordWrap_invalidatesCachedHeaderHeight() {
+    grid.getHeaderHeight();
+
+    group.setHeaderWordWrap( true );
+
+    assertFalse( grid.layoutCache.hasHeaderHeight() );
+  }
+
 }
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
index eab0f5b..e514d27 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
@@ -771,6 +771,15 @@
   }
 
   @Test
+  public void testGetHeaderWordWrap_invalidatesCachedHeaderHeight() {
+    grid.getHeaderHeight();
+
+    column.setHeaderWordWrap( true );
+
+    assertFalse( grid.layoutCache.hasHeaderHeight() );
+  }
+
+  @Test
   public void testGetWordWrap_Initial() {
     assertFalse( column.getWordWrap() );
   }
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA_Test.java
index 66f4501..47e753e 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkit/GridColumnGroupLCA_Test.java
@@ -436,4 +436,35 @@
     assertNull( message.findSetOperation( group, "customVariant" ) );
   }
 
+  @Test
+  public void testRenderInitialHeaderWordWrap() throws IOException {
+    lca.render( group );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    CreateOperation operation = message.findCreateOperation( group );
+    assertTrue( operation.getProperties().names().indexOf( "headerWordWrap" ) == -1 );
+  }
+
+  @Test
+  public void testRenderHeaderWordWrap() throws IOException {
+    group.setHeaderWordWrap( true );
+    lca.renderChanges( group );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    assertEquals( JsonValue.TRUE, message.findSetProperty( group, "headerWordWrap" ) );
+  }
+
+  @Test
+  public void testRenderHeaderWordWrapUnchanged() throws IOException {
+    Fixture.markInitialized( display );
+    Fixture.markInitialized( group );
+
+    group.setHeaderWordWrap( true );
+    Fixture.preserveWidgets();
+    lca.renderChanges( group );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    assertNull( message.findSetOperation( group, "headerWordWrap" ) );
+  }
+
 }