/*
* Copyright 2007 Sfeir, www.sfeir.com
*
* 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.rntsoft.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.com");
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.com
*/
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.com
*
* 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.com and didier.girard@gmail.com
*/
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.com
*
* 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.com
*/
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.com
*
* 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.com and didier.girard@gmail.com
*/
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);
}
GWT-tableAboslute.zip( 6 k)