Total summary table (Ext GWT)
/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.google.gwt.sample.hello.client; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.extjs.gxt.ui.client.Style.HorizontalAlignment; import com.extjs.gxt.ui.client.data.BaseModelData; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.store.GroupingStore; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.form.NumberField; import com.extjs.gxt.ui.client.widget.grid.CellEditor; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnData; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.grid.EditorGrid; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer; import com.extjs.gxt.ui.client.widget.grid.GroupSummaryView; import com.extjs.gxt.ui.client.widget.grid.SummaryColumnConfig; import com.extjs.gxt.ui.client.widget.grid.SummaryRenderer; import com.extjs.gxt.ui.client.widget.grid.SummaryType; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.layout.FlowLayout; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.RootPanel; public class Hello implements EntryPoint { public void onModuleLoad() { RootPanel.get().add(new TotalsGridExample()); } } class TotalsGridExample extends LayoutContainer { @Override protected void onRender(Element parent, int index) { super.onRender(parent, index); setLayout(new FlowLayout(10)); List<Task> tasks = getTasks(); GroupingStore<Task> store = new GroupingStore<Task>(); store.groupBy("project"); store.add(tasks); List<ColumnConfig> columns = new ArrayList<ColumnConfig>(); SummaryColumnConfig<Integer> desc = new SummaryColumnConfig<Integer>("description", "Task", 65); desc.setSummaryType(SummaryType.COUNT); desc.setSummaryRenderer(new SummaryRenderer() { public String render(Number value, Map<String, Number> data) { return value.intValue() > 1 ? "(" + value.intValue() + " Tasks)" : "(1 Task)"; } }); SummaryColumnConfig<Double> project = new SummaryColumnConfig<Double>("project", "Project", 55); SummaryColumnConfig<Double> due = new SummaryColumnConfig<Double>("due", "Due Date", 20); SummaryColumnConfig<Double> estimate = new SummaryColumnConfig<Double>("estimate", "Estimate", 20); estimate.setRenderer(new GridCellRenderer<Task>() { public String render(Task model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<Task> store, Grid<Task> grid) { return model.get(property) + " hours"; } }); estimate.setSummaryType(SummaryType.SUM); estimate.setSummaryRenderer(new SummaryRenderer() { public String render(Number value, Map<String, Number> data) { return value.intValue() + " hours"; } }); estimate.setEditor(new CellEditor(new NumberField())); SummaryColumnConfig<Double> rate = new SummaryColumnConfig<Double>("rate", "Rate", 20); rate.setNumberFormat(NumberFormat.getCurrencyFormat()); rate.setSummaryFormat(NumberFormat.getCurrencyFormat()); rate.setSummaryType(SummaryType.AVG); rate.setAlignment(HorizontalAlignment.RIGHT); NumberField nf = new NumberField(); nf.setAutoValidate(true); CellEditor ce = new CellEditor(nf); ce.setCancelOnEsc(true); rate.setEditor(ce); SummaryColumnConfig<Double> cost = new SummaryColumnConfig<Double>("cost", "Cost", 20); cost.setSummaryFormat(NumberFormat.getCurrencyFormat()); cost.setSummaryType(new SummaryType<Double>() { @Override public Double render(Object v, ModelData m, String field, Map<String, Object> data) { if (v == null) { v = 0d; } Task task = (Task) m; return ((Double) v).doubleValue() + (task.getEstimate() * task.getRate()); } }); cost.setAlignment(HorizontalAlignment.RIGHT); cost.setRenderer(new GridCellRenderer<Task>() { public String render(Task model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<Task> store, Grid<Task> grid) { Task task = (Task) model; return NumberFormat.getCurrencyFormat().format(task.getRate() * task.getEstimate()); } }); columns.add(desc); columns.add(project); columns.add(due); columns.add(estimate); columns.add(rate); columns.add(cost); ColumnModel cm = new ColumnModel(columns); GroupSummaryView summary = new GroupSummaryView(); summary.setForceFit(true); summary.setShowGroupedColumn(false); EditorGrid<Task> grid = new EditorGrid<Task>(store, cm); grid.setBorders(true); grid.setView(summary); grid.getView().setShowDirtyCells(false); ContentPanel panel = new ContentPanel(); panel.setHeading("Sponsored Projects"); //panel.setIcon(Resources.ICONS.table()); panel.setCollapsible(true); panel.setFrame(true); panel.setSize(800, 450); panel.setLayout(new FitLayout()); panel.add(grid); add(panel); } public static List<Task> getTasks() { List<Task> tasks = new ArrayList<Task>(); tasks.add(new Task(100, "Ext Forms: Field Anchoring", 112, "Integrate 2.0 Forms with 2.0 Layouts", 6, 150, "06/24/2007")); tasks.add(new Task(100, "Ext Forms: Field Anchoring", 113, "Implement AnchorLayout", 4, 150, "06/25/2007")); tasks.add(new Task(100, "Ext Forms: Field Anchoring", 114, "Add support for multiple types of anchors", 4, 150, "06/27/2007")); tasks.add(new Task(100, "Ext Forms: Field Anchoring", 115, "Testing and debugging", 8, 0, "06/29/2007")); tasks.add(new Task(101, "Ext Grid: Single-level Grouping", 101, "Add required rendering 'hooks' to GridView", 6, 100, "07/01/2007")); tasks.add(new Task(101, "Ext Grid: Single-level Grouping", 102, "Extend GridView and override rendering functions", 4, 0, "07/03/2007")); tasks.add(new Task(101, "Ext Grid: Single-level Grouping", 103, "Extend Store with grouping functionality", 4, 100, "07/04/2007")); tasks.add(new Task(101, "Ext Grid: Single-level Grouping", 121, "Default CSS Styling", 2, 1000, "07/05/2007")); tasks.add(new Task(101, "Ext Grid: Single-level Grouping", 104, "Testing and debugging", 6, 100, "07/06/2007")); tasks.add(new Task(102, "Ext Grid: Summary Rows", 105, "Ext Grid plugin integration", 4, 125, "07/01/2007")); tasks.add(new Task(102, "Ext Grid: Summary Rows", 106, "Summary creation during rendering phase", 6, 125, "07/02/2007")); tasks.add(new Task(102, "Ext Grid: Summary Rows", 107, "Dynamic summary updates in editor grids", 6, 125, "07/05/2007")); tasks.add(new Task(102, "Ext Grid: Summary Rows", 108, "Remote summary integration", 4, 125, "07/05/2007")); tasks.add(new Task(102, "Ext Grid: Summary Rows", 109, "Summary renderers and calculators", 4, 125, "07/06/2007")); tasks.add(new Task(102, "Ext Grid: Summary Rows", 110, "Integrate summaries with GroupingView", 10, 125, "07/11/2007")); tasks.add(new Task(102, "Ext Grid: Summary Rows", 111, "Testing and debugging", 8, 125, "07/15/2007")); return tasks; } } class Task extends BaseModelData { public Task(int id, String project, int taskId, String desc, double estimate, double rate, String due) { set("id", id); set("project", project); set("taskId", taskId); set("description", desc); set("estimate", estimate); set("rate", rate); set("due", due); } public Double getEstimate() { return (Double) get("estimate"); } public double getRate() { return (Double) get("rate"); } }