Fixing a bug in HTMLTable where cols are removed when a lower indexed col is accessed.
http://gwt-code-reviews.appspot.com/314803/show

Review by: spoon@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7903 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/Grid.java b/user/src/com/google/gwt/user/client/ui/Grid.java
index 8bd0884..7f9e513 100644
--- a/user/src/com/google/gwt/user/client/ui/Grid.java
+++ b/user/src/com/google/gwt/user/client/ui/Grid.java
@@ -200,7 +200,7 @@
     numColumns = columns;
 
     // Update the size of the colgroup.
-    getColumnFormatter().resizeColumnGroup(columns);
+    getColumnFormatter().resizeColumnGroup(columns, false);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/HTMLTable.java b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
index 8278ca0..0199cff 100644
--- a/user/src/com/google/gwt/user/client/ui/HTMLTable.java
+++ b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
@@ -482,8 +482,9 @@
      * Resize the column group element.
      * 
      * @param columns the number of columns
+     * @param growOnly true to only grow, false to shrink if needed
      */
-    void resizeColumnGroup(int columns) {
+    void resizeColumnGroup(int columns, boolean growOnly) {
       // The colgroup should always have at least one element.  See
       // prepareColumnGroup() for more details.
       columns = Math.max(columns, 1);
@@ -493,7 +494,7 @@
         for (int i = num; i < columns; i++) {
           columnGroup.appendChild(Document.get().createColElement());
         }
-      } else if (num > columns) {
+      } else if (!growOnly && num > columns) {
         for (int i = num; i > columns; i--) {
           columnGroup.removeChild(columnGroup.getLastChild());
         }
@@ -503,7 +504,7 @@
     private Element ensureColumn(int col) {
       prepareColumn(col);
       prepareColumnGroup();
-      resizeColumnGroup(col + 1);
+      resizeColumnGroup(col + 1, true);
       return columnGroup.getChild(col).cast();
     }
 
diff --git a/user/test/com/google/gwt/user/client/ui/GridTest.java b/user/test/com/google/gwt/user/client/ui/GridTest.java
index 0112482..c1e3553 100644
--- a/user/test/com/google/gwt/user/client/ui/GridTest.java
+++ b/user/test/com/google/gwt/user/client/ui/GridTest.java
@@ -89,14 +89,18 @@
     columns.removeStyleName(0, "c");
     assertEquals("base b", columns.getStyleName(0));
 
-    // Only one column should be created.
+    // All five cols should be created.
     Element e = DOM.getChild(r.getElement(), 0);
-    assertEquals(1, DOM.getChildCount(e));
+    assertEquals(5, DOM.getChildCount(e));
 
     columns.addStyleName(3, "a");
-    // Now there shoud be three such columns .
+    // There should still be five columns.
     e = DOM.getChild(r.getElement(), 0);
-    assertEquals(4, DOM.getChildCount(e));
+    assertEquals(5, DOM.getChildCount(e));
+
+    // Querying column 0 should not invalidate column 3.
+    assertEquals("base b", columns.getStyleName(0));
+    assertEquals("a", columns.getStyleName(3));
   }
 
   public void testColumnMessage() {