Don't fire tree expand/collapse event with null item

Item could be disposed, when expand/collapse notify operation is
processed in GridOperationHandler.

Drop expand/collapse event if item is null (already disposed).
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler.java
index 70b7aa5..ed20655 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler.java
@@ -24,8 +24,8 @@
 import org.eclipse.rap.json.JsonArray;
 import org.eclipse.rap.json.JsonObject;
 import org.eclipse.rap.json.JsonValue;
-import org.eclipse.rap.rwt.internal.protocol.ControlOperationHandler;
 import org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil;
+import org.eclipse.rap.rwt.internal.protocol.ControlOperationHandler;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.internal.widgets.CellToolTipUtil;
 import org.eclipse.swt.internal.widgets.ICellToolTipAdapter;
@@ -196,7 +196,7 @@
   public void handleNotifyDefaultSelection( Grid grid, JsonObject properties ) {
     GridItem item = getItem( grid, properties.get( EVENT_PARAM_ITEM ).asString() );
     if( item != null ) {
-      Event event = createSelectionEvent( SWT.Selection, properties );
+      Event event = createSelectionEvent( SWT.DefaultSelection, properties );
       event.item = item;
       grid.notifyListeners( SWT.DefaultSelection, event );
     }
@@ -208,9 +208,12 @@
    * @param item (string) id of expanded item
    */
   public void handleNotifyExpand( Grid grid, JsonObject properties ) {
-    Event event = new Event();
-    event.item = getItem( grid, properties.get( EVENT_PARAM_ITEM ).asString() );
-    grid.notifyListeners( SWT.Expand, event );
+    GridItem item = getItem( grid, properties.get( EVENT_PARAM_ITEM ).asString() );
+    if( item != null ) {
+      Event event = new Event();
+      event.item = item;
+      grid.notifyListeners( SWT.Expand, event );
+    }
   }
 
   /*
@@ -219,9 +222,12 @@
    * @param item (string) id of collapsed item
    */
   public void handleNotifyCollapse( Grid grid, JsonObject properties ) {
-    Event event = new Event();
-    event.item = getItem( grid, properties.get( EVENT_PARAM_ITEM ).asString() );
-    grid.notifyListeners( SWT.Collapse, event );
+    GridItem item = getItem( grid, properties.get( EVENT_PARAM_ITEM ).asString() );
+    if( item != null ) {
+      Event event = new Event();
+      event.item = item;
+      grid.notifyListeners( SWT.Collapse, event );
+    }
   }
 
   /*
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler_Test.java
index ee31cf7..bf07661 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridkit/GridOperationHandler_Test.java
@@ -11,12 +11,12 @@
 package org.eclipse.nebula.widgets.grid.internal.gridkit;
 
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.createGridItems;
+import static org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil.getId;
 import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_COLLAPSE;
 import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_DEFAULT_SELECTION;
 import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_EXPAND;
 import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_SELECTION;
 import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_SET_DATA;
-import static org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil.getId;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
 import static org.mockito.Matchers.any;
@@ -255,6 +255,19 @@
   }
 
   @Test
+  public void testHandleNotifyExpand_withDisposedItem() {
+    Grid spyGrid = spy( grid );
+    handler = new GridOperationHandler( spyGrid );
+    GridItem item = new GridItem( spyGrid, SWT.NONE );
+    item.dispose();
+
+    JsonObject properties = new JsonObject().add( "item", getId( item ) );
+    handler.handleNotify( EVENT_EXPAND, properties );
+
+    verify( spyGrid, never() ).notifyListeners( eq( SWT.Expand ), any( Event.class ) );
+  }
+
+  @Test
   public void testHandleNotifyCollapse() {
     Grid spyGrid = spy( grid );
     handler = new GridOperationHandler( spyGrid );
@@ -269,6 +282,19 @@
   }
 
   @Test
+  public void testHandleNotifyCollapse_withDisposedItem() {
+    Grid spyGrid = spy( grid );
+    handler = new GridOperationHandler( spyGrid );
+    GridItem item = new GridItem( spyGrid, SWT.NONE );
+    item.dispose();
+
+    JsonObject properties = new JsonObject().add( "item", getId( item ) );
+    handler.handleNotify( EVENT_COLLAPSE, properties );
+
+    verify( spyGrid, never() ).notifyListeners( eq( SWT.Collapse ), any( Event.class ) );
+  }
+
+  @Test
   public void testHandleNotifySetData() {
     Grid spyGrid = spy( grid );
     handler = new GridOperationHandler( spyGrid );