Java/GWT/Table
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 needsComparable
* 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>