Add a support for header builder to return row index for multi-row
header/footer.

Review at http://gwt-code-reviews.appspot.com/1555803

Review by: jlabanca@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10662 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
index 3aaffe8..4804345 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
@@ -1745,7 +1745,9 @@
             isHeader ? headerBuilder.getHeader(headerParent) : footerBuilder
                 .getHeader(footerParent);
         if (header != null && cellConsumesEventType(header.getCell(), eventType)) {
-          Context context = new Context(0, col, header.getKey());
+          int headerIndex = isHeader ? headerBuilder.getRowIndex(targetTableRow) :
+              footerBuilder.getRowIndex(targetTableRow);
+          Context context = new Context(headerIndex, col, header.getKey());
           header.onBrowserEvent(context, headerParent, event);
         }
       }
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractHeaderOrFooterBuilder.java b/user/src/com/google/gwt/user/cellview/client/AbstractHeaderOrFooterBuilder.java
index fdec154..c29f8b2 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractHeaderOrFooterBuilder.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractHeaderOrFooterBuilder.java
@@ -27,6 +27,7 @@
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.dom.client.TableRowElement;
 import com.google.gwt.i18n.client.LocaleInfo;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.safehtml.shared.SafeHtml;
@@ -81,6 +82,11 @@
    * The attribute used to indicate that an element contains a header.
    */
   private static final String HEADER_ATTRIBUTE = "__gwt_header";
+  
+  /**
+   * The attribute used to specify the row index of a TR element in the header.
+   */
+  private static final String ROW_ATTRIBUTE = "__gwt_header_row";
 
   private static final int ICON_PADDING = 6;
 
@@ -93,6 +99,7 @@
   private SafeHtml sortDescIconHtml;
   private final int sortDescIconWidth;
   private final AbstractCellTable<T> table;
+  private int rowIndex;
 
   // The following fields are reset on every build.
   private HtmlTableSectionBuilder section;
@@ -163,6 +170,11 @@
     return (headerId == null) ? null : idToHeaderMap.getValue(headerId);
   }
 
+  @Override
+  public int getRowIndex(TableRowElement row) {
+    return Integer.parseInt(row.getAttribute(ROW_ATTRIBUTE));
+  }
+  
   /**
    * Check if this builder is building a header or footer table.
    * 
@@ -348,6 +360,8 @@
 
     // Start the next row.
     TableRowBuilder row = section.startTR();
+    row.attribute(ROW_ATTRIBUTE, rowIndex);
+    rowIndex++;
     return row;
   }
 
@@ -358,6 +372,7 @@
             .createTHeadBuilder();
     idToHeaderMap.clear();
     idToColumnMap.clear();
+    rowIndex = 0;
 
     // Build the header.
     if (!buildHeaderOrFooterImpl()) {
diff --git a/user/src/com/google/gwt/user/cellview/client/FooterBuilder.java b/user/src/com/google/gwt/user/cellview/client/FooterBuilder.java
index cef7c20..4eca4a3 100644
--- a/user/src/com/google/gwt/user/cellview/client/FooterBuilder.java
+++ b/user/src/com/google/gwt/user/cellview/client/FooterBuilder.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.dom.builder.shared.TableSectionBuilder;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.TableRowElement;
 
 /**
  * Builds the DOM elements for the footer section of a CellTable. It also
@@ -79,6 +80,15 @@
   Header<?> getHeader(Element elem);
 
   /**
+   * Get the row index from the associated
+   * {@link TableRowElement} (an TR element).
+   * 
+   * @param row the row element
+   * @return the row value index
+   */
+  int getRowIndex(TableRowElement row);
+  
+  /**
    * Check if an element contains a {@link Column}. This method should return
    * false if and only if {@link #getColumn(Element)} would return null.
    * 
diff --git a/user/src/com/google/gwt/user/cellview/client/HeaderBuilder.java b/user/src/com/google/gwt/user/cellview/client/HeaderBuilder.java
index f13c011..5f7bd7a 100644
--- a/user/src/com/google/gwt/user/cellview/client/HeaderBuilder.java
+++ b/user/src/com/google/gwt/user/cellview/client/HeaderBuilder.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.dom.builder.shared.TableSectionBuilder;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.TableRowElement;
 
 /**
  * Builds the DOM elements for the header section of a CellTable. It also
@@ -79,6 +80,15 @@
   Header<?> getHeader(Element elem);
 
   /**
+   * Get the row index from the associated
+   * {@link TableRowElement} (an TR element).
+   * 
+   * @param row the row element
+   * @return the row value index
+   */
+  int getRowIndex(TableRowElement row);
+  
+  /**
    * Check if an element contains a {@link Column}. This method should return
    * false if and only if {@link #getColumn(Element)} would return null.
    *