Java/GWT/Table

Материал из Java эксперт
Перейти к: навигация, поиск

Absolute Table

   <source lang="java">

/*

* Copyright 2007 Sfeir, www.sfeir.ru
* 
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* 
* http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/

package com.jexp.gwt.client; import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant; import java.util.*; import com.google.gwt.user.client.*; import com.google.gwt.user.client.ui.*; import com.google.gwt.core.client.*; public class GWTClient implements EntryPoint{

 private RootPanel rootPanel = RootPanel.get();
 
 private SimpleTable table;
 private ArrayList arrayRows;
 private Column firstNameColumn;
 private Column lastNameColumn;
 private Column nameColumn;
 private Column birthdayColumn;
 private Column phoneNumberColumn;
 private Column emailColumn;
 
 public ArrayList generateArrayRows(int nbOfRows) {
   ArrayList arrayRows = new ArrayList();
   
   for (int i = 0; i < nbOfRows; i++) {
     PersonRow person = new PersonRow();
     person.setFirstName("first name " + i);
     person.setLastName("last name " + i);
     person.setBirthday(new Date(12345678l + i));
     person.setPhoneNumber("012 345 67" + i);
     person.setEmail("firstname" + i + ".lastname" + i + "@gmail.ru");
     arrayRows.add(person);
   }
   
   System.out.println("row generation finished");
   return arrayRows;
 }
 
 public void initialiseColumns() {
   System.out.println("beginning column initialisation");
   firstNameColumn = new Column();
   firstNameColumn.setAlignment(HasHorizontalAlignment.ALIGN_LEFT);
   firstNameColumn.setProperty(PersonRow.FIRSTNAME_PROPERTY);
   firstNameColumn.setSortable(false);
   firstNameColumn.setText("First Name");
   firstNameColumn.setVisible(false);
   firstNameColumn.setWidth(100);
   
   lastNameColumn = new Column();
   lastNameColumn.setAlignment(HasHorizontalAlignment.ALIGN_LEFT);
   lastNameColumn.setProperty(PersonRow.LASTNAME_PROPERTY);
   lastNameColumn.setSortable(false);
   lastNameColumn.setText("Last Name");
   lastNameColumn.setVisible(false);
   lastNameColumn.setWidth(100);
   
   nameColumn = new Column();
   nameColumn.setAlignment(HasHorizontalAlignment.ALIGN_LEFT);
   nameColumn.setProperty(PersonRow.NAME_PROPERTY);
   nameColumn.setSortable(false);
   nameColumn.setText("Name");
   nameColumn.setVisible(true);
   nameColumn.setWidth(100);
   
   birthdayColumn = new Column();
   birthdayColumn.setAlignment(HasHorizontalAlignment.ALIGN_CENTER);
   birthdayColumn.setProperty(PersonRow.BIRTHDAY_PROPERTY);
   birthdayColumn.setSortable(false);
   birthdayColumn.setText("Birthday");
   birthdayColumn.setVisible(true);
   birthdayColumn.setWidth(100);
   
   phoneNumberColumn = new Column();
   phoneNumberColumn.setAlignment(HasHorizontalAlignment.ALIGN_CENTER);
   phoneNumberColumn.setProperty(PersonRow.PHONENUMBER_PROPERTY);
   phoneNumberColumn.setSortable(false);
   phoneNumberColumn.setText("Phone");
   phoneNumberColumn.setVisible(true);
   phoneNumberColumn.setWidth(100);
   
   emailColumn = new Column();
   emailColumn.setAlignment(HasHorizontalAlignment.ALIGN_LEFT);
   emailColumn.setProperty(PersonRow.EMAIL_PROPERTY);
   emailColumn.setSortable(false);
   emailColumn.setText("E-mail");
   emailColumn.setVisible(true);
   emailColumn.setWidth(100);
   System.out.println("column initialisation finished");
 }
 
 public void initialiseTable() {
   table = new SimpleTable();
   Table.setCHARACTER_SIZE(8);
   Table.setROWS_HEIGHT(20);
   initialiseColumns();
   table.add(firstNameColumn);
   table.add(lastNameColumn);
   table.add(nameColumn);
   table.add(birthdayColumn);
   table.add(phoneNumberColumn);
   table.add(emailColumn);
   arrayRows = generateArrayRows(10);
   table.setArrayRows(arrayRows);
   rootPanel.add(table);
 }
 
 public void onModuleLoad() {
   initialiseTable();
   System.out.println("beginning table drawing");
   table.draw();
   System.out.println("table drawing finished");
 }

}

class PersonRow implements Row {

 public static final String FIRSTNAME_PROPERTY = "first name";
 public static final String LASTNAME_PROPERTY = "last name";
 public static final String NAME_PROPERTY = "name";
 public static final String BIRTHDAY_PROPERTY = "birthday";
 public static final String PHONENUMBER_PROPERTY = "phone number";
 public static final String EMAIL_PROPERTY = "e-mail";
 
 private String firstName;
 private String lastName;
 private Date birthday;
 private String phoneNumber;
 private String email;
 
 public PersonRow() {
 }
 
 public Object getProperty(String property) {
   Object result = null;
   if (FIRSTNAME_PROPERTY.equals(property)) {
     result = firstName;
   }
   else if (LASTNAME_PROPERTY.equals(property)) {
     result = lastName;
   }
   else if (NAME_PROPERTY.equals(property)) {
     result = firstName + " " + lastName;
   }
   else if (BIRTHDAY_PROPERTY.equals(property)) {
     result = birthday.toString();
   }
   else if (PHONENUMBER_PROPERTY.equals(property)) {
     result = phoneNumber;
   }
   else if (EMAIL_PROPERTY.equals(property)) {
     result = email;
   }
   return result;
 }
 
 public Date getBirthday() {
   return birthday;
 }
 public String getEmail() {
   return email;
 }
 public String getFirstName() {
   return firstName;
 }
 public String getLastName() {
   return lastName;
 }
 public String getPhoneNumber() {
   return phoneNumber;
 }
 public void setBirthday(Date birthday) {
   this.birthday = birthday;
 }
 public void setEmail(String email) {
   this.email = email;
 }
 public void setFirstName(String firstName) {
   this.firstName = firstName;
 }
 public void setLastName(String lastName) {
   this.lastName = lastName;
 }
 public void setPhoneNumber(String phoneNumber) {
   this.phoneNumber = phoneNumber;
 }

} /**

* SimpleTable is the basic implementation of Table.
* This table should be used with small amount of data only.
* 
* @author pierre.mage@gmail.ru
*/

class SimpleTable extends Table {

 /**
  * AbsolutePanel defining an invisible layer preventing user from selecting text from this table.
  */
 private AbsolutePanel layer; 
 public SimpleTable() {
   super();
   layer = new AbsolutePanel();
   layer.setStyleName("transparent");
 }
 public void draw() {
   if (arrayColumns != null && arrayRows != null) {
     headersContainer.clear();
     rowsContainer.clear();
     tableWidth = 0;
     this.add(headersContainer, 0, 0);
     this.add(rowsContainer, 0, ROWS_HEIGHT);
     this.add(layer, 0, ROWS_HEIGHT);
     Column column;
     for (Iterator it = arrayColumns.iterator(); it.hasNext();) {
       column = (Column) it.next();
       drawColumn(column);
     }
     headersContainer.setPixelSize(tableWidth, ROWS_HEIGHT);
     rowsContainer.setPixelSize(tableWidth, arrayRows.size() * ROWS_HEIGHT);
     layer.setPixelSize(tableWidth, arrayRows.size() * ROWS_HEIGHT);
     this.setPixelSize(tableWidth, (1 + arrayRows.size()) * ROWS_HEIGHT); 
   }
 }
 protected void drawColumn(Column column) {
   // The column is not drawn if not visible.
   if (column.isVisible()) {
     // Useful variables for drawing.
     HorizontalAlignmentConstant alignment = column.getAlignment();
     String property = column.getProperty();

// int width = column.getWidth();

     int width = calculateWidth(column);
     int top = 0;
     int left = tableWidth;
     // Drawing the header.
     Label header = new Label(column.getText(), false);
     header.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
     header.setPixelSize(width, ROWS_HEIGHT);
     header.setStyleName("header");
     headersContainer.add(header, left, 0);
     // Drawing the rows.
     Row row;
     Object data;
       for (int rowIndex = 0; rowIndex < arrayRows.size(); rowIndex++) {
         row = (Row) arrayRows.get(rowIndex);
         data = row.getProperty(property);
         
         Label cell = new Label("", false);
         if (data != null) {
           cell.setText(data.toString());
         }
         cell.setHorizontalAlignment(alignment);
         cell.setPixelSize(width, ROWS_HEIGHT);
         cell.setStyleName("cell");
         if (rowIndex%2 == 0) {
           cell.addStyleName("evenRow");
         } else {
           cell.addStyleName("oddRow");
         }
         rowsContainer.add(cell, left, top);
         top += ROWS_HEIGHT;
     }
     tableWidth += width;
   }
 }

} /*

* Copyright 2007 Sfeir, www.sfeir.ru
* 
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* 
* http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/

/**

* Table defines a table based on GWT"s AbsolutePanel.
* 
* @author pierre.mage@gmail.ru and didier.girard@gmail.ru
*/

abstract class Table extends AbsolutePanel {

 /**
  * int defining an average size for characters.
  */
 public static int CHARACTER_SIZE;
 
 /**
  * int defining the height of rows in this table (every row has the same height)
  */
 public static int ROWS_HEIGHT;
 public static void setCHARACTER_SIZE(int character_size) {
   CHARACTER_SIZE = character_size;
 }
 /**
  * ArrayList defining the columns of this table.
  */
 protected ArrayList arrayColumns;
 /**
  * ArrayList defining the content of this table.
  */
 protected ArrayList arrayRows;
 // headers and rows are separated for scrolling purpose.
 /**
  * AbsolutePanel containing the headers.
  */
 protected AbsolutePanel headersContainer;
 /**
  * AbsolutePanel containing the rows.
  */
 protected AbsolutePanel rowsContainer;
 /**
  * int defining the width of this table
  */
 protected int tableWidth;
 /**
  * Creates an empty Table.
  */
 public Table() {
   super();
   CHARACTER_SIZE = 10;
   ROWS_HEIGHT = CHARACTER_SIZE * 3;
   headersContainer = new AbsolutePanel();
   rowsContainer = new AbsolutePanel();
   arrayColumns = new ArrayList();
   setStyleName("table");
 }
 public void add(Column column) {
   arrayColumns.add(column);
 }
 /**
  * Calculates the optimal width of this table.
  */
 public int calculateWidth() {
   int width = 0;
   Column column;
   for (Iterator c = arrayColumns.iterator(); c.hasNext();) {
     column = (Column) c.next();
     if (column.isVisible()) {
       width += calculateWidth(column);
     }
   }
   return width;
 }
 
 /**
  * Draws the table.
  */
 public abstract void draw();
 public void setArrayRows(ArrayList arrayRows) {
   this.arrayRows = arrayRows;
 }
 public static void setROWS_HEIGHT(int rows_height) {
   ROWS_HEIGHT = rows_height;
 }
 /**
  * Calculates the optimal width of the specified column considering an average CHARACTER_SIZE;
  */
 protected int calculateWidth(Column column) {
   int width = column.getText().length();
   String property = column.getProperty();
   Row row;
   Object data;
   for (Iterator r = arrayRows.iterator(); r.hasNext();) {
     row = (Row) r.next();
     data = row.getProperty(property);
     if (data != null && data.toString().length() > width) {
       width = data.toString().length();
     }
   }
   return width * CHARACTER_SIZE;
 }
 /**
  * Draws the specified column of this table.
  */
 protected abstract void drawColumn(Column column);

} /*

* Copyright 2007 Sfeir, www.sfeir.ru
* 
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* 
* http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/

/**

* Column defines a column in Table.
* 
* @author pierre.mage@gmail.ru
*/

class Column {

 /**
  * String defining the alignment of this column.
  */
 private HorizontalAlignmentConstant alignment;
 /**
  * boolean defining if this column is sortable.
  */
 private boolean isSortable;
 /**
  * boolean defining if this column is visible.
  */
 private boolean isVisible;
 
 /**
  * String defining the property of this column.
  */
 private String property;
 
 /**
  * String defining the text of this column"s header.
  */
 private String text;
 /**
  * int defining the width of this column.
  */
 private int width;
 /**
  * Creates an empty Column.
  */
 public Column() {
   alignment = HasHorizontalAlignment.ALIGN_CENTER;
   isSortable = false;
   isVisible = true;
   text = "column";
   width = 100;
 }
 public HorizontalAlignmentConstant getAlignment() {
   return alignment;
 }
 public String getProperty() {
   return property;
 }
 public String getText() {
   return text;
 }
 public int getWidth() {
   return width;
 }
 public boolean isSortable() {
   return isSortable;
 }
 public boolean isVisible() {
   return isVisible;
 }
 public void setAlignment(HorizontalAlignmentConstant horizontalAlignement) {
   this.alignment = horizontalAlignement;
 }
 public void setProperty(String property) {
   this.property = property;
 }
 public void setSortable(boolean isSortable) {
   this.isSortable = isSortable;
 }
 public void setText(String text) {
   this.text = text;
 }
 public void setVisible(boolean isVisible) {
   this.isVisible = isVisible;
 }
 public void setWidth(int width) {
   this.width = width;
 }

} /*

* Copyright 2007 Sfeir, www.sfeir.ru
* 
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* 
* http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/

/**

* Row defines a row in Table
* 
* @author pierre.mage@gmail.ru and didier.girard@gmail.ru
*/

interface Row {

 /**
  * Gets Row"s element associated with property.
  * 
  * @param property the property whose associated object is to be retrieved
  * @return the object associated with property
  */
 public abstract Object getProperty(String property);

}


      </source>
   
  
 
  



Dynamic Table

SortableTable Widget for GWT

   <source lang="java">

/*

* SortableTable Widget for GWT library of Google, Inc.
* 
* Copyright (c) 2006 Parvinder Thapar
* http://psthapar.googlepages.ru/
* 
* 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.jexp.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.rupareTo(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.ru/
* 
* 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.rupareTo(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.ru/
* 
* 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.ru/
* 
* 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.ruparable}
*/

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<tableRows.size(); rowIndex++){
       RowData columns = (RowData)tableRows.get(rowIndex);
       for(int colIndex=0; colIndex<columns.getColumnValues().size(); 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<columns.getColumnValues().size(); 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<tableRows.size(); 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(" <img border="0" src=");
   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());
 }

}

      </source>