Adjust Nebula Grid to the client-side tree event renaming
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 a72a3dc..1c89874 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
@@ -59,8 +59,8 @@
 
   public void readData( Widget widget ) {
     GridColumnGroup group = ( GridColumnGroup )widget;
-    processTreeEvent( group, ClientMessageConst.EVENT_TREE_EXPANDED );
-    processTreeEvent( group, ClientMessageConst.EVENT_TREE_COLLAPSED );
+    processTreeEvent( group, ClientMessageConst.EVENT_EXPAND );
+    processTreeEvent( group, ClientMessageConst.EVENT_COLLAPSE );
   }
 
   @Override
@@ -99,7 +99,7 @@
 
   private static void processTreeEvent( final GridColumnGroup group, String eventName ) {
     if( WidgetLCAUtil.wasEventSent( group, eventName ) ) {
-      final boolean expanded = eventName.equals( ClientMessageConst.EVENT_TREE_EXPANDED );
+      final boolean expanded = eventName.equals( ClientMessageConst.EVENT_EXPAND );
       ProcessActionRunner.add( new Runnable() {
         public void run() {
           group.setExpanded( expanded );
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA.java
index 6264c10..6a9fcf3 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA.java
@@ -22,13 +22,11 @@
 import org.eclipse.nebula.widgets.grid.internal.IGridItemAdapter;
 import org.eclipse.rap.rwt.internal.protocol.ClientObjectFactory;
 import org.eclipse.rap.rwt.internal.protocol.IClientObject;
-import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst;
 import org.eclipse.rap.rwt.internal.protocol.ProtocolUtil;
 import org.eclipse.rap.rwt.lifecycle.AbstractWidgetLCA;
 import org.eclipse.rap.rwt.lifecycle.ProcessActionRunner;
 import org.eclipse.rap.rwt.lifecycle.WidgetLCAUtil;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.Image;
@@ -67,8 +65,7 @@
   public void readData( Widget widget ) {
     GridItem item = ( GridItem )widget;
     readChecked( item );
-    processTreeEvent( item, ClientMessageConst.EVENT_TREE_EXPANDED );
-    processTreeEvent( item, ClientMessageConst.EVENT_TREE_COLLAPSED );
+    readExpanded( item );
   }
 
   @Override
@@ -145,19 +142,15 @@
     }
   }
 
-  private static void processTreeEvent( final GridItem item, String eventName ) {
-    if( WidgetLCAUtil.wasEventSent( item, eventName ) ) {
-      final boolean expanded = eventName.equals( ClientMessageConst.EVENT_TREE_EXPANDED );
+  private static void readExpanded( final GridItem item ) {
+    final String expanded = WidgetLCAUtil.readPropertyValue( item, PROP_EXPANDED );
+    if( expanded != null ) {
       ProcessActionRunner.add( new Runnable() {
         public void run() {
-          item.setExpanded( expanded );
+          item.setExpanded( Boolean.valueOf( expanded ).booleanValue() );
+          preserveProperty( item, PROP_EXPANDED, item.isExpanded() );
         }
       } );
-      if( expanded ) {
-        item.fireEvent( SWT.Expand );
-      } else {
-        item.fireEvent( SWT.Collapse );
-      }
     }
   }
 
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA.java
index 05b2094..fd0413a 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA.java
@@ -43,6 +43,7 @@
 import org.eclipse.swt.internal.widgets.ICellToolTipAdapter;
 import org.eclipse.swt.internal.widgets.ICellToolTipProvider;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.ScrollBar;
 import org.eclipse.swt.widgets.Widget;
 
@@ -82,6 +83,8 @@
   private static final String PROP_SCROLLBARS_SELECTION_LISTENER = "scrollBarsSelection";
   private static final String PROP_SELECTION_LISTENER = "Selection";
   private static final String PROP_DEFAULT_SELECTION_LISTENER = "DefaultSelection";
+  private static final String PROP_EXPAND_LISTENER = "Expand";
+  private static final String PROP_COLLAPSE_LISTENER = "Collapse";
   // TODO: [if] Sync toolTipText in GridItemLCA when it's possible on the client
   private static final String PROP_ENABLE_CELL_TOOLTIP = "enableCellToolTip";
   private static final String PROP_CELL_TOOLTIP_TEXT = "cellToolTipText";
@@ -113,6 +116,8 @@
     readCellToolTipTextRequested( grid );
     processSelectionEvent( grid, ClientMessageConst.EVENT_SELECTION );
     processSelectionEvent( grid, ClientMessageConst.EVENT_DEFAULT_SELECTION );
+    processTreeEvent( grid, SWT.Expand, "Expand" );
+    processTreeEvent( grid, SWT.Collapse, "Collapse" );
     ControlLCAUtil.processEvents( grid );
     ControlLCAUtil.processKeyEvents( grid );
     ControlLCAUtil.processMenuDetect( grid );
@@ -149,6 +154,8 @@
     preserveListener( grid,
                       PROP_DEFAULT_SELECTION_LISTENER,
                       grid.isListening( SWT.DefaultSelection ) );
+    preserveListener( grid, PROP_EXPAND_LISTENER, hasExpandListener( grid ) );
+    preserveListener( grid, PROP_COLLAPSE_LISTENER, hasCollapseListener( grid ) );
     preserveProperty( grid, PROP_ENABLE_CELL_TOOLTIP, CellToolTipUtil.isEnabledFor( grid ) );
     preserveProperty( grid, PROP_CELL_TOOLTIP_TEXT, null );
   }
@@ -187,6 +194,8 @@
                     PROP_DEFAULT_SELECTION_LISTENER,
                     grid.isListening( SWT.DefaultSelection ),
                     false );
+    renderListener( grid, PROP_EXPAND_LISTENER, hasExpandListener( grid ), false );
+    renderListener( grid, PROP_COLLAPSE_LISTENER, hasCollapseListener( grid ), false );
     renderProperty( grid, PROP_ENABLE_CELL_TOOLTIP, CellToolTipUtil.isEnabledFor( grid ), false );
     renderProperty( grid, PROP_CELL_TOOLTIP_TEXT, getCellToolTipText( grid ), null );
   }
@@ -369,6 +378,30 @@
     }
   }
 
+  private static boolean hasExpandListener( Grid grid ) {
+    // Always render listen for Expand and Collapse, currently required for scrollbar
+    // visibility update and setData events.
+    return true;
+  }
+
+  private static boolean hasCollapseListener( Grid grid ) {
+    // Always render listen for Expand and Collapse, currently required for scrollbar
+    // visibility update and setData events.
+    return true;
+  }
+
+  /////////////////////////////////
+  // Process expand/collapse events
+
+  private static void processTreeEvent( Grid grid, int eventType, String eventName ) {
+    if( WidgetLCAUtil.wasEventSent( grid, eventName ) ) {
+      String value = readEventPropertyValue( grid, eventName, ClientMessageConst.EVENT_PARAM_ITEM );
+      Event event = new Event();
+      event.item = getItem( grid, value );
+      grid.notifyListeners( eventType, event );
+    }
+  }
+
   ///////////////
   // Item Metrics
 
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java
index fc79bac..88ccce4 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java
@@ -245,7 +245,7 @@
     group.addListener( SWT.Expand, new LoggingTreeListener( events ) );
     group.setExpanded( false );
 
-    Fixture.fakeNotifyOperation( getId( group ), ClientMessageConst.EVENT_TREE_EXPANDED, null );
+    Fixture.fakeNotifyOperation( getId( group ), ClientMessageConst.EVENT_EXPAND, null );
     Fixture.readDataAndProcessAction( group );
 
     assertEquals( 1, events.size() );
@@ -258,7 +258,7 @@
     List<Event> events = new LinkedList<Event>();
     group.addListener( SWT.Collapse, new LoggingTreeListener( events ) );
 
-    Fixture.fakeNotifyOperation( getId( group ), ClientMessageConst.EVENT_TREE_COLLAPSED, null );
+    Fixture.fakeNotifyOperation( getId( group ), ClientMessageConst.EVENT_COLLAPSE, null );
     Fixture.readDataAndProcessAction( group );
 
     assertEquals( 1, events.size() );
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java
index 67a3dfa..9f19e90 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java
@@ -14,11 +14,12 @@
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.createGridItems;
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.loadImage;
 import static org.eclipse.nebula.widgets.grid.internal.gridkit.GridLCATestUtil.jsonEquals;
-import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_TREE_EXPANDED;
 import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import org.eclipse.nebula.widgets.grid.Grid;
 import org.eclipse.nebula.widgets.grid.GridItem;
@@ -621,8 +622,9 @@
     grid.addListener( SWT.Expand, new LoggingTreeListener( events ) );
     new GridItem( item, SWT.NONE );
 
-    Fixture.fakeNotifyOperation( getId( item ), ClientMessageConst.EVENT_TREE_EXPANDED, null );
-    Fixture.readDataAndProcessAction( item );
+    Fixture.fakeSetParameter( getId( item ), "expanded", Boolean.TRUE );
+    fakeTreeEvent( item, ClientMessageConst.EVENT_EXPAND );
+    Fixture.readDataAndProcessAction( display );
 
     assertEquals( 1, events.size() );
     Event event = events.get( 0 );
@@ -637,8 +639,9 @@
     new GridItem( item, SWT.NONE );
     item.setExpanded( true );
 
-    Fixture.fakeNotifyOperation( getId( item ), ClientMessageConst.EVENT_TREE_COLLAPSED, null );
-    Fixture.readDataAndProcessAction( item );
+    Fixture.fakeSetParameter( getId( item ), "expanded", Boolean.FALSE );
+    fakeTreeEvent( item, ClientMessageConst.EVENT_COLLAPSE );
+    Fixture.readDataAndProcessAction( display );
 
     assertEquals( 1, events.size() );
     Event event = events.get( 0 );
@@ -653,7 +656,7 @@
     GridItem[] items = createGridItems( grid, 5, 10 );
 
     Fixture.markInitialized( grid );
-    Fixture.fakeNotifyOperation( getId( items[ 0 ] ), EVENT_TREE_EXPANDED, null );
+    Fixture.fakeSetParameter( getId( items[ 0 ] ), "expanded", Boolean.TRUE );
     Fixture.executeLifeCycleFromServerThread();
 
     Message message = Fixture.getProtocolMessage();
@@ -661,6 +664,12 @@
     assertTrue( jsonEquals( "[ false, true ]", actual ) );
   }
 
+  private static void fakeTreeEvent( GridItem item, String eventName ) {
+    Map<String, Object> parameters = new HashMap<String, Object>();
+    parameters.put( ClientMessageConst.EVENT_PARAM_ITEM, getId( item ) );
+    Fixture.fakeNotifyOperation( getId( item.getParent() ), eventName, parameters );
+  }
+
   //////////////////
   // Helping classes
 
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA_Test.java
index fb244f9..d862e15 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridLCA_Test.java
@@ -1083,6 +1083,20 @@
     assertEquals( Boolean.TRUE, message.findCreateProperty( grid, "markupEnabled" ) );
   }
 
+  public void testRenderAddExpandListener() throws Exception {
+    lca.renderChanges( grid );
+
+    Message message = Fixture.getProtocolMessage();
+    assertEquals( Boolean.TRUE, message.findListenProperty( grid, "Expand" ) );
+  }
+
+  public void testRenderAddCollapseListener() throws Exception {
+    lca.renderChanges( grid );
+
+    Message message = Fixture.getProtocolMessage();
+    assertEquals( Boolean.TRUE, message.findListenProperty( grid, "Collapse" ) );
+  }
+
   //////////////////
   // Helping methods