Java/GWT/Table
Absolute Table
/*
* 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);
}
Dynamic Table
SortableTable Widget for GWT
/*
* 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 <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.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());
}
}