GWT Java

/*
 * SortableTable Widget for GWT library of Google, Inc.
 * 
 * Copyright (c) 2006 Parvinder Thapar
 * http://psthapar.googlepages.com/
 * 
 * This library is free software; you can redistribute 
 * it and/or modify it under the terms of the GNU Lesser 
 * General Public License as published by the Free Software 
 * Foundation; either version 2.1 of the License, or 
 * (at your option) any later version. This library is 
 * distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY  or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNULesser General Public License for more details. 
 * You should have received a copy of the GNU Lesser General 
 * PublicLicense along with this library; if not, write to the 
 * Free Software Foundation, Inc.,  
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA  
 */
package com.rntsoft.gwt.client;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Iterator;
import java.util.Date;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.HTMLTable.RowFormatter;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
public class GWTClient implements EntryPoint{
    /**
     * This is the entry point method.
     */
    public void onModuleLoad() {
      
        final SortableTable sortableTable = new SortableTable();
        
        sortableTable.setWidth(500 + "px");
        sortableTable.setStyleName("sortableTable");
        sortableTable.setBorderWidth(1);
        sortableTable.setCellPadding(4);
        sortableTable.setCellSpacing(1);
        sortableTable.addColumnHeader("Employee",  0);
        sortableTable.addColumnHeader("Days", 1);
        sortableTable.addColumnHeader("Hire Date", 2);
        sortableTable.addColumnHeader("Bonus", 3);
        
      // The rowIndex should begin with 1 as rowIndex 0 is for the Header
      // Any row with index == 0 will not be displayed.
        sortableTable.setValue(1, 0, "Parvinder Thapar");
        sortableTable.setValue(1, 1, new Integer(28));
        sortableTable.setValue(1, 2, new SimpleDate(2005, 10, 25));
        sortableTable.setValue(1, 3, new Float("125.27"));
        sortableTable.setValue(2, 0, "David Brooks");
        sortableTable.setValue(2, 1, new Integer(32));
        sortableTable.setValue(2, 2, new SimpleDate(2000, 4, 1));
        sortableTable.setValue(2, 3, new Float("105.78"));
        sortableTable.setValue(3, 0, "Raj Rajendran");
        sortableTable.setValue(3, 1, new Integer(30));
        sortableTable.setValue(3, 2, new SimpleDate(2001, 12, 9));
        sortableTable.setValue(3, 3, new Float("236.82"));
        sortableTable.setValue(4, 0, "Brian Foley");
        sortableTable.setValue(4, 1, new Integer(38));
        sortableTable.setValue(4, 2, new SimpleDate(2003, 2, 24));
        sortableTable.setValue(4, 3, new Float("489.29"));
        sortableTable.setValue(5, 0, "Visala Dhara");
        sortableTable.setValue(5, 1, new Integer(30));
        sortableTable.setValue(5, 2, new SimpleDate(2001, 4, 23));
        sortableTable.setValue(5, 3, new Float("892.72"));
        sortableTable.setValue(6, 0, "Wasim Khan");
        sortableTable.setValue(6, 1, new Integer(35));
        sortableTable.setValue(6, 2, new SimpleDate(1999, 7, 10));
        sortableTable.setValue(6, 3, new Float("1242.89"));
        sortableTable.setValue(7, 0, "Bob Hammel");
        sortableTable.setValue(7, 1, new Integer(56));
        sortableTable.setValue(7, 2, new SimpleDate(1995, 2, 14));
        sortableTable.setValue(7, 3, new Float("107.21"));
        sortableTable.setValue(8, 0, "Jeanie Sa-ville");
        sortableTable.setValue(8, 1, new Integer(58));
        sortableTable.setValue(8, 2, new SimpleDate(1989, 6, 1));
        sortableTable.setValue(8, 3, new Float("2372.42"));
        sortableTable.setValue(9, 0, "Scott Loyet");
        sortableTable.setValue(9, 1, new Integer(42));
        sortableTable.setValue(9, 2, new SimpleDate(1992, 2, 29));
        sortableTable.setValue(9, 3, new Float("896.74"));
        sortableTable.setValue(10, 0, "Dennis Twiss");
        sortableTable.setValue(10, 1, new Integer(59));
        sortableTable.setValue(10, 2, new SimpleDate(1990, 4, 15));
        sortableTable.setValue(10, 3, new Float("1896.74"));
        
        sortableTable.setValue(11, 0, "Mike McIntosh");
        sortableTable.setValue(11, 1, new Integer(76));
        sortableTable.setValue(11, 2, new SimpleDate(1982, 5, 25));
        sortableTable.setValue(11, 3, new Float("689.77"));
        
        sortableTable.setValue(12, 0, "Andrews Andy");
        sortableTable.setValue(12, 1, new Integer(62));
        sortableTable.setValue(12, 2, new SimpleDate(1994, 1, 15));
        sortableTable.setValue(12, 3, new Float("829.24"));
        sortableTable.setValue(13, 0, "Bob Regent");
        sortableTable.setValue(13, 1, new Integer(29));
        sortableTable.setValue(13, 2, new SimpleDate(1996, 3, 12));
        sortableTable.setValue(13, 3, new Float("621.52"));
        
        sortableTable.setValue(14, 0, "Chris Chalmers");
        sortableTable.setValue(14, 1, new Integer(32));
        sortableTable.setValue(14, 2, new SimpleDate(1997, 4, 1));
        sortableTable.setValue(14, 3, new Float("804.26"));
        
        sortableTable.setValue(15, 0, "Christopher Mathrusse");
        sortableTable.setValue(15, 1, new Integer(64));
        sortableTable.setValue(15, 2, new SimpleDate(2005, 9, 10));
        sortableTable.setValue(15, 3, new Float("761.25"));
        
        sortableTable.setValue(16, 0, "John Smith");
        sortableTable.setValue(16, 1, new Integer(56));
        sortableTable.setValue(16, 2, new SimpleDate(1992, 3, 16));
        sortableTable.setValue(16, 3, new Float("789.29"));
        
        sortableTable.setValue(17, 0, "Jane Smith");
        sortableTable.setValue(17, 1, new Integer(45));
        sortableTable.setValue(17, 2, new SimpleDate(1989, 7, 25));
        sortableTable.setValue(17, 3, new Float("2254.87"));
        
        sortableTable.setValue(18, 0, "Jason Chen");
        sortableTable.setValue(18, 1, new Integer(37));
        sortableTable.setValue(18, 2, new SimpleDate(1995, 8, 24));
        sortableTable.setValue(18, 3, new Float("978.32"));
        
        sortableTable.setValue(19, 0, "Tina Matt");
        sortableTable.setValue(19, 1, new Integer(49));
        sortableTable.setValue(19, 2, new SimpleDate(1998, 9, 15));
        sortableTable.setValue(19, 3, new Float("189.64"));
        
        sortableTable.setValue(20, 0, "Roxanne Rocks");
        sortableTable.setValue(20, 1, new Integer(43));
        sortableTable.setValue(20, 2, new SimpleDate(1992, 11, 12));
        sortableTable.setValue(20, 3, new Float("1209.73"));
        
      // In your application code, the following should be part 
        // of the looop that adds the data to the Table.
        // Since we have some hard-coded data here, this is done 
        // separately down here....
        // Please note that this is totally optional. This has nothing
        // to do with the Sorting capabilities of the widget.
        // This is just the cosmetics injection to the table.
        
        // Set Style Name for the header
      RowFormatter rowFormatter = sortableTable.getRowFormatter();
      rowFormatter.setStyleName(0, "tableHeader");
      
      // Set the Styles for the Data Rows and Columns
      CellFormatter cellFormatter = sortableTable.getCellFormatter();
      // Set the styles for the headers
      for (int colIndex=0; colIndex<4; colIndex++){
        cellFormatter.setStyleName(0, colIndex, "headerStyle");
        cellFormatter.setAlignment(0, colIndex, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
      }
      for(int rowIndex=1; rowIndex<21; rowIndex++){
        if(rowIndex%2 == 0){
          rowFormatter.setStyleName(rowIndex, "customRowStyle");
        }else{
          rowFormatter.setStyleName(rowIndex, "tableRow");
        }
        for (int colIndex=0; colIndex<4; colIndex++){
          cellFormatter.setStyleName(rowIndex, colIndex, "customFont");
          if(colIndex == 1 || colIndex == 3){
            cellFormatter.setAlignment(rowIndex, colIndex, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
          }else if(colIndex == 0){
            cellFormatter.setAlignment(rowIndex, colIndex, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);
          }if(colIndex == 2){
            cellFormatter.setAlignment(rowIndex, colIndex, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
          }
        }
      }
        
        // Add the table to the doc
      RootPanel.get("slot1").add(sortableTable);
    }
}
 class SimpleDate extends Date {
  public SimpleDate(){
    super();
  }
  
  public SimpleDate(int year, int month, int date){
    super(year-1900, month-1, date);
  }
  
  public int compareTo(Object other) {
    Date otherDate = (Date)other;
    return super.compareTo(otherDate);
  }
  
  public String toString(){
    return this.formatDate_DDMONYYYY(this);
  }
  /*
   * formatDate_DDMONYYYY
   * 
   * Formats the date in DDMONYYYY format
   * 
   * @param (Date to be formatted)
   * @return String
   */
  private String formatDate_DDMONYYYY(Date date){
    String[] MONTHS = {
      "Jan",
      "Feb",
      "Mar",
      "Apr",
      "May",
      "Jun",
      "Jul",
      "Aug",
      "Sep",
      "Oct",
      "Nov",
      "Dec"
    };    
    StringBuffer dateStr = new StringBuffer();
    if(date.getDate() < 10){
      dateStr.append("0");
    }
    dateStr.append(date.getDate());
    dateStr.append(" ");
    
    dateStr.append(MONTHS[date.getMonth()]);
    dateStr.append(" ");
    
    dateStr.append((date.getYear()+1900));
    return dateStr.toString();
  }      
  
  /*
   * formatDate_MMDDYYYY
   * 
   * Formats the date in MMDDYYYY format
   * 
   * @param (Date to be formatted)
   * @return String
   */
  private String formatDate_MMDDYYYY (Date date){
    StringBuffer strDate = new StringBuffer();
    if(this.getMonth() < 9){
      strDate.append("0");
    }
    strDate.append(this.getMonth()+1);
    strDate.append("/");
    if(this.getDate() < 10){
      strDate.append("0");
    }
    strDate.append(this.getDate());
    strDate.append("/");
    strDate.append((this.getYear()+1900));
    
    return strDate.toString();
  }
}
/*
 * SortableTable Widget for GWT library of Google, Inc.
 * 
 * Copyright (c) 2006 Parvinder Thapar
 * http://psthapar.googlepages.com/
 * 
 * This library is free software; you can redistribute 
 * it and/or modify it under the terms of the GNU Lesser 
 * General Public License as published by the Free Software 
 * Foundation; either version 2.1 of the License, or 
 * (at your option) any later version. This library is 
 * distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY  or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNULesser General Public License for more details. 
 * You should have received a copy of the GNU Lesser General 
 * PublicLicense along with this library; if not, write to the 
 * Free Software Foundation, Inc.,  
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA  
 */
/*
 * RowData defines one row in a Sortable Table
 */
 class RowData implements Comparable {
  
  // Maintains the list of the columns in the table
  List columnValues = new ArrayList();
  
  // Keeps the current column index being sorted
  int sortColIndex = 0;
  /*
   * addColumnValue
   * 
   * Adds the Comparable Value in the List of columns
   * 
   * @param Comparable
   */
  public void addColumnValue(Comparable value){
    this.columnValues.add(value);
  }
  
  /*
   * addColumnValue
   * 
   * Adds the Comparable Value in the specific index in the
   * List of columns
   * 
   * @param colIndex (int)
   * @param Comparable
   */
  public void addColumnValue(int index, Comparable value){
    if(index >= this.columnValues.size()){
      addNullColumns(index);
    }
    this.columnValues.set(index, value);
  }  
  /*
   * getColumnValue
   * 
   * Retrieves the Comparable Object from the List of columns
   * 
   * @param colIndex (int)
   * @return Object
   */
  public Object getColumnValue(int index){
    return this.columnValues.get(index);
  }  
  
  /*
   * addColumnValues
   * 
   * Retrieves the list of column values
   * 
   * @return List
   */
  public List getColumnValues() {
    return columnValues;
  }
  /*
   * setColumnValues
   * 
   * Sets the List to the List of column values
   * 
   * @param List
   */
  public void setColumnValues(List columnValues) {
    this.columnValues = columnValues;
  }
  /*
   * getSortColIndex
   * 
   * Returns the current column index being sorted
   * 
   * @return colIndex (int)
   */
  public int getSortColIndex() {
    return sortColIndex;
  }
  /*
   * setSortColIndex
   * 
   * Sets the current column index being sorted
   * 
   * @param colIndex (int)
   */
  public void setSortColIndex(int sortColIndex) {
    this.sortColIndex = sortColIndex;
  }
  /*
   * compareTo
   * 
   * Implementation of Interface Comparable 
   * Returns the compare result to another RowData object
   * 
   * @param colIndex (int)
   */
  public int compareTo(Object other) {
    if(null == other){
      return -1;
    }
    RowData otherRow = (RowData)other;
    Comparable obj1 = (Comparable)this.getColumnValue(this.sortColIndex);
    Comparable obj2 = (Comparable)otherRow.getColumnValue(this.sortColIndex);
    return obj1.compareTo(obj2);
  }
  
  /*
   * addNullColumns
   * 
   * Adds the Null columns in the table row
   *  
   * @param colIndex (int)
   * @deprecated
   */
  private void addNullColumns(int index){
    for(int nullIndex=this.columnValues.size(); nullIndex<=index; nullIndex++){
      columnValues.add(null);
    }
  }
}
/*
 * SortableTable Widget for GWT library of Google, Inc.
 * 
 * Copyright (c) 2006 Parvinder Thapar
 * http://psthapar.googlepages.com/
 * 
 * This library is free software; you can redistribute 
 * it and/or modify it under the terms of the GNU Lesser 
 * General Public License as published by the Free Software 
 * Foundation; either version 2.1 of the License, or 
 * (at your option) any later version. This library is 
 * distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY  or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNULesser General Public License for more details. 
 * You should have received a copy of the GNU Lesser General 
 * PublicLicense along with this library; if not, write to the 
 * Free Software Foundation, Inc.,  
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA  
 */
/*
 * Sortable Interface defines the signatures and the 
 * constants for the sortable table
 */
interface Sortable {
  // Constants defining the current direction of the 
  // sort on a column
  public static int SORT_ASC = 0;
  public static int SORT_DESC = 1;
  
  /*
   * sort
   * 
   * Defines what happens when the column is sorted
   * 
   * @param columnIndex to be sorted (int)
   */
  public void sort(int columnIndex);
}
/*
 * SortableTable Widget for GWT library of Google, Inc.
 * 
 * Copyright (c) 2006 Parvinder Thapar
 * http://psthapar.googlepages.com/
 * 
 * This library is free software; you can redistribute 
 * it and/or modify it under the terms of the GNU Lesser 
 * General Public License as published by the Free Software 
 * Foundation; either version 2.1 of the License, or 
 * (at your option) any later version. This library is 
 * distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY  or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNULesser General Public License for more details. 
 * You should have received a copy of the GNU Lesser General 
 * PublicLicense along with this library; if not, write to the 
 * Free Software Foundation, Inc.,  
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA  
 */
/*
 * SortableTable is a type of FlexTable which allows Sorting
 * on its column. Sorting is done totally on the client side.
 * No server side call is made in this table.
 * 
 * Current implementation of Sortable Table needs Comparable
 * Object in its column values to be able to sort them correctly
 * 
 * The objects being set in the column values must implement the interface
 * Comparable and implement methods: compareTo() and 
 * toString()
 *  
 * {@link com.google.gwt.user.client.ui.FlexTable}
 * {@link java.lang.Comparable}
 */
class SortableTable extends FlexTable implements Sortable, TableListener {
  
  // Holds the current column being sorted
  private int sortColIndex    =  -1;
  
  // Holds the current direction of sort: Asc/ Desc
  private int sortDirection    =  -1;
  
  // The default image to show acending order arrow
  private String sortAscImage   = "images/asc.gif";
  
  //The default image to show descending order arrow
  private String sortDescImage  = "images/desc.gif";
  
  // The default image to show the blank image
  // This is needed to paint the columns other than
  // the one which is being sorted.
  // Should be same length and width as the asc/ desc
  // images.
  private String blankImage    = "images/blank.gif";
  // Holds the data rows of the table
  // This is a list of RowData Object
  private List tableRows       = new ArrayList();
  
  // Holds the data for the column headers
  private List tableHeader     = new ArrayList();
  
  /*
   * Default Constructor
   * 
   * Calls the super class constructor
   * and adds a TableListener object
   */
  public SortableTable(){
    super();
    this.addTableListener(this);
  }
  /*
   * addColumnHeader
   * 
   * Adds the Column Header to the table
   * Uses the rowIndex 0 to add the header names.
   * Renders the name and the asc/desc/blank gif 
   * to the column
   * 
   * @param columnName (String)
   * @param columnIndex (int)
   */
  public void addColumnHeader(String name, int index){
    tableHeader.add(index, name);
    this.renderTableHeader(name, index);
  }
  
  /*
   * setValue
   * 
   * Sets the values in specifed row/column
   * Expects a Comparable Object for sorting
   *  
   * @param rowIndex (int)
   * @param columnIndex (int)
   * @param Value (Comparable)
   */
  public void setValue(int rowIndex, int colIndex, Comparable value){
    // The rowIndex should begin with 1 as rowIndex 0 is for the Header
    // Any row with index == 0 will not be displayed.
    if(rowIndex == 0){
      return;
    }
    
    if((rowIndex-1) >= this.tableRows.size() || null == tableRows.get(rowIndex-1)){
      tableRows.add(rowIndex-1, new RowData());
    }
    
    RowData rowData = (RowData)this.tableRows.get(rowIndex-1); 
    rowData.addColumnValue(colIndex, value);
    this.setHTML(rowIndex, colIndex, "" + value.toString()+ "");
  }
  
  /*
   * sort
   * 
   * Implementation of Sortable Interface, this
   * method decribes how to sort the specified
   * column. It checks the current sort direction
   * and flips it
   *  
   * @param columnIndex (int)
   */
  public void sort(int columnIndex){
    Collections.sort(this.tableRows);
    if(this.sortColIndex != columnIndex){
      // New Column Header clicked
      // Reset the sortDirection to ASC
      this.sortDirection = SORT_ASC;
    }else{
      // Same Column Header clicked
      // Reverse the sortDirection
      this.sortDirection = (this.sortDirection == SORT_ASC)? SORT_DESC:SORT_ASC; 
    }
    this.sortColIndex = columnIndex;
  }
  
  /*
   * onCellClicked
   * 
   * Implementation of Table Listener Interface, this
   * method decribes what to do when a cell is clicked
   * It checks for the header row and calls the sort 
   * method to sort the table
   *  
   * @param sender (SourcesTableEvents)
   * @param rowIndex (int)
   * @param colIndex (int)
   */
  public void onCellClicked(SourcesTableEvents sender, int row, int col) {
    if(row != 0){
      return;
    }
    this.setSortColIndex(col);
    this.sort(col);
    this.drawTable();
  }  
  /*
   * getSortAscImage
   * 
   * Getter for Sort Ascending Image
   * 
   * @return String
   */
  public String getSortAscImage() {
    return sortAscImage;
  }
  /*
   * setSortAscImage
   * 
   * Setter for Sort Ascending Image
   * 
   * @param relative path + image name (String)
   * e.g. images/asc.gif
   */
  public void setSortAscImage(String sortAscImage) {
    this.sortAscImage = sortAscImage;
  }
  /*
   * getSortDescImage
   * 
   * Getter for Sort Descending Image
   * 
   * @return String
   */
  public String getSortDescImage() {
    return sortDescImage;
  }
  /*
   * setSortDescImgage
   * 
   * Setter for Sort Descending Image
   * 
   * @param relative path + image name (String)
   * e.g. images/desc.gif
   */
  public void setSortDescImgage(String sortDescImgage) {
    this.sortDescImage = sortDescImgage;
  }
  
  /*
   * getBlankImage
   * 
   * Getter for blank Image
   * 
   * @return String
   */
  public String getBlankImage() {
    return blankImage;
  }
  /*
   * setBlankImage
   * 
   * Setter for the blank Image
   * 
   * @param relative path + image name (String)
   * e.g. images/blank.gif
   */
  public void setBlankImage(String blankImage) {
    this.blankImage = blankImage;
  }
  
  /*
   * drawTable
   * 
   * Renders the header as well as the body 
   * of the table
   */
  protected void drawTable(){
    this.displayTableHeader();
    this.displayTableBody();
  }
  
  /*
   * displayTableHeader
   * 
   * Renders only the table header
   */
  private void displayTableHeader(){
    int colIndex=0;
    for(Iterator colHeaderIter = this.tableHeader.iterator(); colHeaderIter.hasNext();){
      String colHeader = (String)colHeaderIter.next();
      this.renderTableHeader(colHeader, colIndex++);
    }
  }
  
  /*
   * displayTableBody
   * 
   * Renders the body or the remaining rows of the table
   * except the header.
   * It checks the sort direction and displays the rows 
   * accordingly
   */
  private void displayTableBody(){
    if(this.sortDirection == SORT_ASC || this.sortDirection == -1){
      // Ascending order and Default Display
      for(int rowIndex=0; rowIndex        RowData columns = (RowData)tableRows.get(rowIndex);
        for(int colIndex=0; colIndex          Object value = columns.getColumnValue(colIndex);
          if(null != value){
            this.setHTML(rowIndex+1, colIndex, value.toString());
          }
        }
      }
    }else{
      // Descending Order Display
      for(int rowIndex=tableRows.size()-1, rowNum = 1; rowIndex>=0; rowIndex--, rowNum++){
        RowData columns = (RowData)tableRows.get(rowIndex);
        for(int colIndex=0; colIndex          Object value = columns.getColumnValue(colIndex);
          if(null != value){
            this.setHTML(rowNum, colIndex, value.toString());
          }
        }
      }
    }
  }
  
  /*
   * setSortColIndex
   * 
   * Sets the current column index being sorted
   * 
   * @param column index being sorted (int)
   */
  private void setSortColIndex(int sortIndex){
    for(int rowIndex=0; rowIndex      RowData row = (RowData)tableRows.get(rowIndex);
      row.setSortColIndex(sortIndex);
    }
  }
  
  /*
   * renderTableHeader
   * Renders a particular column in the Table Header
   * 
   * @param Column Name (String)
   * @param Column Index (int) 
   */
  private void renderTableHeader(String name, int index){
    StringBuffer headerText = new StringBuffer();
    headerText.append(name);
    headerText.append("     if(this.sortColIndex == index){
      if(this.sortDirection == SORT_ASC){
        headerText.append("'" + this.sortAscImage + "' alt='Ascending' ");  
      }else{
        headerText.append("'" + this.sortDescImage + "' alt='Descending' ");
      }
    }else{
      headerText.append("'" + this.blankImage + "'");
    }
    headerText.append("/>");
    this.setHTML(0, index, headerText.toString());
  }
}
           
         
    
  
GWT-SortableTable.zip( 9 k)