Mega Code Archive

 
Categories / Java / GWT
 

SortableTable Widget for GWT

/*  * 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 <code>Comparable</code>  * Object in its column values to be able to sort them correctly  *   * The objects being set in the column values must implement the interface  * <code>Comparable</code> 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<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("&nbsp;<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());   } }                               GWT-SortableTable.zip( 9 k)