Java tutorial
/* * Copyright 2008 Sander Berents * * 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 org.gwtlib.samples.table.client.ui; import java.util.Arrays; import java.util.Comparator; import java.util.Date; import org.gwtlib.client.table.ColumnLayout; import org.gwtlib.client.table.ContentProvider; import org.gwtlib.client.table.Row; import org.gwtlib.client.table.Rows; import org.gwtlib.client.table.ui.Column; import org.gwtlib.client.table.ui.PagingBar; import org.gwtlib.client.table.ui.PagingTable; import org.gwtlib.client.table.ui.SourcesTableEvents; import org.gwtlib.client.table.ui.TableListenerAdapter; import org.gwtlib.client.table.ui.renderer.ButtonRenderer; import org.gwtlib.client.table.ui.renderer.CheckBoxRenderer; import org.gwtlib.client.table.ui.renderer.DateTimeRenderer; import org.gwtlib.client.table.ui.renderer.HyperlinkRenderer; import org.gwtlib.client.table.ui.renderer.ImageRenderer; import org.gwtlib.client.table.ui.renderer.ListBoxRenderer; import org.gwtlib.client.table.ui.renderer.NumberRenderer; import org.gwtlib.client.table.ui.renderer.TextBoxRenderer; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.Random; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Hyperlink; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; /** * A demonstration of many paging table features. * * @author Sander Berents */ public class PagingTableEntryPoint implements EntryPoint { private static final String ID = "gwtlib-table"; private static final Date NOW = new Date(); private static final int TOTAL_SIZE = 25; public void onModuleLoad() { RootPanel root = RootPanel.get(ID); if (root != null) init(root); } private void init(RootPanel root) { /* TabPanel tabPanel = new TabPanel(); tabPanel.setSize("100%", "100%"); tabPanel.add(createGrid(), "First"); tabPanel.add(createGrid(), "Second"); tabPanel.selectTab(0); root.add(tabPanel); */ root.add(createGrid()); } private Grid createGrid() { final Grid grid = new Grid(3, 1); final PagingTable table = createTable(); table.setSize("100%", "100%"); grid.setWidget(0, 0, table); grid.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP); grid.getCellFormatter().setWidth(0, 0, "100%"); grid.getCellFormatter().setHeight(0, 0, "100%"); HorizontalPanel hpanel = new HorizontalPanel(); hpanel.add(new Label("Show Column:")); for (int i = 0; i < table.getColumnLayout().getTotalColumnCount(); ++i) { final CheckBox checkbox = new CheckBox(String.valueOf(i)); checkbox.setValue(true); hpanel.add(checkbox); final int ii = i; checkbox.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { table.show(ii, checkbox.getValue()); table.update(); } }); } grid.setWidget(1, 0, hpanel); hpanel = new HorizontalPanel(); hpanel.add(new Button("Clear", new ClickHandler() { public void onClick(ClickEvent event) { table.clear(); } })); hpanel.add(new Button("Reset", new ClickHandler() { public void onClick(ClickEvent event) { table.reset(); } })); hpanel.add(new Button("Simulate Failure", new ClickHandler() { public void onClick(ClickEvent event) { table.onFailure(null); } })); grid.setWidget(2, 0, hpanel); grid.setSize("100%", "100%"); return grid; } private PagingTable createTable() { // Set up the columns we want to be displayed final CheckBox checkAll = new CheckBox(); final Column[] columns = { new Column(0, false, checkAll, "20", new CheckBoxRenderer()), new Column(1, true, "Text (StringRenderer)", "10%"), new Column(2, false, "Date (StringRenderer)", "10%"), new Column(3, false, "Number (StringRenderer)", "10%"), new Column(4, true, "Date (DateTimeRenderer)", "10%", new DateTimeRenderer(DateTimeFormat.getFormat("yyyy-MM-dd"))), new Column(5, true, "Number (NumberRenderer)", "10%", new NumberRenderer(NumberFormat.getDecimalFormat())), new Column(6, false, "(ListBoxRenderer)", "10%", new ListBoxRenderer(new String[] { "One", "Two", "Three" }, "Select an item")), new Column(7, false, "(ButtonRenderer)", "10%", new ButtonRenderer("Click here")), new Column(8, false, "(TextBoxRenderer)", "10%", new TextBoxRenderer(50, 5, "Enter your message")), new Column(9, false, "(HyperlinkRenderer)", "10%", new HyperlinkRenderer("A Hyperlink")), new Column(10, false, "(ImageRenderer)", "10%", new ImageRenderer("An Image")), }; // Generate some semi-random data for our example final Row[] rows = new Row[TOTAL_SIZE]; for (int i = 0; i < rows.length; ++i) { Boolean check = new Boolean(false); StringBuffer label = new StringBuffer(); for (int j = 0; j < 25; ++j) label.append((char) ('a' + i)); Date date = new Date(NOW.getTime() + Random.nextInt(365 * 24 * 3600 * 1000)); Integer number = new Integer(Random.nextInt(10000)); rows[i] = new Row(i, new Object[] { check, label.toString(), date, number, date, number, "One", number.toString(), number.toString(), "Hyperlink", "img/down.gif" }); } // Now configure the table ColumnLayout layout = new ColumnLayout(columns); final PagingTable table = new PagingTable(layout, new PagingBar(0, TOTAL_SIZE, 10, new int[] { 5, 10, 20, 50, 100 })); ContentProvider provider = new ContentProvider() { // Simulate retrieval of sample data, in requested sort order public void load(int begin, int end, final int sortId, boolean ascending) { final int sign = ascending ? 1 : -1; Row[] tmp = new Row[rows.length]; for (int i = 0; i < rows.length; ++i) tmp[i] = rows[i]; switch (sortId) { case 1: Arrays.sort(tmp, new Comparator<Row>() { public int compare(Row o1, Row o2) { String v1 = (String) o1.getValue(sortId); String v2 = (String) o2.getValue(sortId); return sign * (v1.compareTo(v2)); } }); break; case 4: Arrays.sort(tmp, new Comparator<Row>() { public int compare(Row o1, Row o2) { Date v1 = (Date) o1.getValue(sortId); Date v2 = (Date) o2.getValue(sortId); return sign * (v1.compareTo(v2)); } }); break; case 5: Arrays.sort(tmp, new Comparator<Row>() { public int compare(Row o1, Row o2) { int v1 = ((Integer) o1.getValue(sortId)).intValue(); int v2 = ((Integer) o2.getValue(sortId)).intValue(); return sign * (v1 < v2 ? -1 : (v1 == v2 ? 0 : 1)); } }); break; default: break; } Row[] srows = new Row[Math.min(end - begin, tmp.length - begin)]; for (int i = 0; i < srows.length; ++i) srows[i] = tmp[begin + i]; table.onSuccess(new Rows(srows, begin, sortId, ascending)); } }; table.setContentProvider(provider); table.addTableListener(new TableListenerAdapter() { public void onCellClicked(SourcesTableEvents sender, Row row, Column column) { for (int i = 0; i < columns.length; ++i) columns[i].setState(Column.State.NONE); column.setState(Column.State.SELECT); } public void onRowClicked(SourcesTableEvents sender, Row row) { GWT.log("Row clicked (id " + row.getId() + ")", null); for (int i = 0; i < rows.length; ++i) rows[i].setState(Row.State.NONE); row.setState(Row.State.SELECT); table.refreshRowState(); } public void onClick(SourcesTableEvents sender, Row row, Column column, Widget widget) { GWT.log("Renderer widget clicked", null); if (widget instanceof CheckBox) { row.setValue(0, new Boolean(((CheckBox) widget).getValue())); } else if (widget instanceof Button) { Window.alert(((Button) widget).getHTML()); } else if (widget instanceof Hyperlink) { Window.alert(((Hyperlink) widget).getHTML()); } else if (widget instanceof Image) { Window.alert(((Image) widget).getUrl()); } } public void onChange(SourcesTableEvents sender, Row row, Column column, Widget widget) { GWT.log("Renderer widget changed", null); if (widget instanceof ListBox) { ListBox listBox = (ListBox) widget; row.setValue(6, listBox.getValue(listBox.getSelectedIndex())); } else if (widget instanceof TextBox) { row.setValue(8, ((TextBox) widget).getText()); } } }); checkAll.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { for (int i = 0; i < rows.length; ++i) rows[i].setValue(0, new Boolean(checkAll.getValue())); table.update(); } }); table.update(); return table; } }