/**
* Sencha GXT 3.0.0b - Sencha for GWT
* Copyright(c) 2007-2012, Sencha, Inc.
* licensing@sencha.com
*
* http://www.sencha.com/products/gxt/license/
*/
package com.sencha.gxt.explorer.client.grid;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.editor.client.Editor.Path;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.cell.core.client.NumberCell;
import com.sencha.gxt.core.client.IdentityValueProvider;
import com.sencha.gxt.core.client.ValueProvider;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.data.shared.ModelKeyProvider;
import com.sencha.gxt.data.shared.PropertyAccess;
import com.sencha.gxt.examples.resources.client.TestData;
import com.sencha.gxt.examples.resources.client.model.Task;
import com.sencha.gxt.explorer.client.model.Example.Detail;
import com.sencha.gxt.widget.core.client.FramedPanel;
import com.sencha.gxt.widget.core.client.grid.ColumnConfig;
import com.sencha.gxt.widget.core.client.grid.ColumnModel;
import com.sencha.gxt.widget.core.client.grid.Grid;
import com.sencha.gxt.widget.core.client.grid.GroupSummaryView;
import com.sencha.gxt.widget.core.client.grid.SummaryColumnConfig;
import com.sencha.gxt.widget.core.client.grid.SummaryRenderer;
import com.sencha.gxt.widget.core.client.grid.SummaryType;
@Detail(name = "Live GroupSummary", icon = "livegroupsummary", category = "Grid", classes = {Task.class})
public class LiveGroupSummaryExample implements EntryPoint, IsWidget {
interface TaskProperties extends PropertyAccess<Task> {
@Path("id")
ModelKeyProvider<Task> key();
ValueProvider<Task, String> description();
ValueProvider<Task, String> project();
ValueProvider<Task, String> due();
ValueProvider<Task, Double> estimate();
ValueProvider<Task, Double> rate();
}
@Override
public Widget asWidget() {
List<Task> tasks = TestData.getTasks();
TaskProperties properties = GWT.create(TaskProperties.class);
final ListStore<Task> store = new ListStore<Task>(properties.key());
store.addAll(tasks);
SummaryColumnConfig<Task, String> desc = new SummaryColumnConfig<Task, String>(properties.description(), 65, "Task");
desc.setSummaryType(new SummaryType.CountSummaryType<String>());
desc.setSummaryRenderer(new SummaryRenderer<Task>() {
@Override
public SafeHtml render(Number value, Map<ValueProvider<? super Task, ?>, Number> data) {
return SafeHtmlUtils.fromTrustedString(value.intValue() > 1 ? "(" + value.intValue() + " Tasks)" : "(1 Task)");
}
});
final SummaryColumnConfig<Task, String> project = new SummaryColumnConfig<Task, String>(properties.project(), 55,
"Project");
SummaryColumnConfig<Task, String> due = new SummaryColumnConfig<Task, String>(properties.due(), 20, "Due");
SummaryColumnConfig<Task, Double> estimate = new SummaryColumnConfig<Task, Double>(properties.estimate(), 20,
"Estimate");
estimate.setSummaryType(new SummaryType.SumSummaryType<Double>());
estimate.setSummaryRenderer(new SummaryRenderer<Task>() {
@Override
public SafeHtml render(Number value, Map<ValueProvider<? super Task, ?>, Number> data) {
return SafeHtmlUtils.fromTrustedString(value + " hours");
}
});
estimate.setCell(new AbstractCell<Double>() {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, Double value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant(value + " hours");
}
});
SummaryColumnConfig<Task, Double> rate = new SummaryColumnConfig<Task, Double>(properties.rate(), 20, "Rate");
rate.setAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
rate.setCell(new NumberCell<Double>(NumberFormat.getCurrencyFormat()));
rate.setSummaryType(new SummaryType.AvgSummaryType<Double>());
rate.setSummaryFormat(NumberFormat.getCurrencyFormat());
SummaryColumnConfig<Task, Task> cost = new SummaryColumnConfig<Task, Task>(new IdentityValueProvider<Task>(), 20,
"Cost");
cost.setColumnClassSuffix("cost");
cost.setAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
cost.setCell(new AbstractCell<Task>() {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, Task value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant(NumberFormat.getCurrencyFormat().format(value.getRate() * value.getEstimate()));
}
});
cost.setSummaryFormat(NumberFormat.getCurrencyFormat());
cost.setSummaryType(new SummaryType<Task, Double>() {
@Override
public <M> Double calculate(List<? extends M> m, ValueProvider<? super M, Task> valueProvider) {
double value = 0;
for (int i = 0; i < m.size(); i++) {
Task t = valueProvider.getValue(m.get(i));
value = value + (t.getRate() * t.getEstimate());
}
return value;
}
});
cost.setComparator(new Comparator<Task>() {
@Override
public int compare(Task o1, Task o2) {
return Double.valueOf(o1.getRate() * o1.getEstimate()).compareTo(o2.getRate() * o2.getEstimate());
}
});
List<ColumnConfig<Task, ?>> cfgs = new ArrayList<ColumnConfig<Task, ?>>();
cfgs.add(desc);
cfgs.add(project);
cfgs.add(due);
cfgs.add(estimate);
cfgs.add(rate);
cfgs.add(cost);
ColumnModel<Task> cm = new ColumnModel<Task>(cfgs);
final GroupSummaryView<Task> summary = new GroupSummaryView<Task>();
summary.setForceFit(true);
summary.setShowGroupedColumn(false);
Grid<Task> grid = new Grid<Task>(store, cm);
grid.setBorders(true);
grid.setView(summary);
grid.getView().setShowDirtyCells(false);
Scheduler.get().scheduleFinally(new ScheduledCommand() {
@Override
public void execute() {
summary.groupBy(project);
}
});
FramedPanel panel = new FramedPanel();
panel.setHeadingHtml("Sponsored Projects");
panel.setSize("800", "450");
panel.add(grid);
panel.addStyleName("margin-10");
panel.setCollapsible(true);
return panel;
}
@Override
public void onModuleLoad() {
RootPanel.get().add(this);
}
}