/**
* 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.examples.test.client;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.gwt.cell.client.AbstractEditableCell;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.Editor.Path;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.cell.core.client.form.ComboBoxCell.TriggerAction;
import com.sencha.gxt.core.client.ValueProvider;
import com.sencha.gxt.core.client.util.ToggleGroup;
import com.sencha.gxt.data.shared.LabelProvider;
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.data.shared.event.StoreUpdateEvent;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
import com.sencha.gxt.widget.core.client.container.Viewport;
import com.sencha.gxt.widget.core.client.event.BeforeStartEditEvent;
import com.sencha.gxt.widget.core.client.event.BeforeStartEditEvent.BeforeStartEditHandler;
import com.sencha.gxt.widget.core.client.event.CompleteEditEvent;
import com.sencha.gxt.widget.core.client.event.CompleteEditEvent.CompleteEditHandler;
import com.sencha.gxt.widget.core.client.form.ComboBox;
import com.sencha.gxt.widget.core.client.form.PropertyEditor;
import com.sencha.gxt.widget.core.client.form.Radio;
import com.sencha.gxt.widget.core.client.form.SimpleComboBox;
import com.sencha.gxt.widget.core.client.form.TextField;
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.editing.GridInlineEditing;
public class Test implements EntryPoint {
interface ItemProperties extends PropertyAccess<Item> {
@Path("name")
ModelKeyProvider<Item> key();
ValueProvider<Item, String> name();
ValueProvider<Item, String> color();
ValueProvider<Item, String> description();
ValueProvider<Item, Boolean> hidden();
}
public class Item {
private String name;
private String color;
private String description;
private boolean hide;
public Item() {
}
public Item(String name, String color, String description) {
this.name = name;
this.color = color;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public void setHidden(boolean hide) {
this.hide = hide;
}
public boolean getHidden() {
return hide;
}
}
private static final List<String> SUPERSET = Arrays.asList("mother of pearl", "very, very dark red", "red", "yellow",
"blue", "green", "orange", "purple", "black", "white");
private Grid<Item> grid;
private ListStore<Item> datastore;
private Item currentRow;
private SimpleComboBox<String> comboBox;
private Widget asWidget() {
VerticalLayoutContainer container = new VerticalLayoutContainer();
ItemProperties properties = GWT.create(ItemProperties.class);
datastore = new ListStore<Item>(properties.key());
createDummyData();
grid = createGrid(properties);
Radio yes = new Radio();
yes.setBoxLabel("yes");
Radio no = new Radio();
no.setBoxLabel("no");
ToggleGroup group = new ToggleGroup();
group.add(yes);
group.add(no);
group.addValueChangeHandler(new ValueChangeHandler<HasValue<Boolean>>() {
@Override
public void onValueChange(ValueChangeEvent<HasValue<Boolean>> event) {
System.out.println("onValueChange");
}
});
container.add(yes);
container.add(no);
container.add(grid);
return container;
}
@SuppressWarnings("unchecked")
private Grid<Item> createGrid(ItemProperties properties) {
ColumnModel<Item> model = createColumnModel(properties);
Grid<Item> myGrid = new Grid<Item>(datastore, model);
final GridInlineEditing<Item> editor = new GridInlineEditing<Item>(myGrid);
final TextField field = new TextField();
comboBox = new SimpleComboBox<String>(new LabelProvider<String>() {
@Override
public String getLabel(String item) {
return (item != null) ? item : "";
}
});
comboBox.setAllowBlank(true);
comboBox.setForceSelection(true);
comboBox.setTriggerAction(TriggerAction.ALL);
comboBox.getStore().replaceAll(SUPERSET);
comboBox.setPropertyEditor(new PropertyEditor<String>() {
@Override
public String parse(CharSequence text) throws ParseException {
System.out.println("parse : " + text.toString());
return text.toString();
}
@Override
public String render(String object) {
System.out.println("render : " + object);
return object == null ? "Default" : object.toString();
}
});
comboBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
System.out.println("onChange " + ((ComboBox<?>) event.getSource()).getCurrentValue());
if ("purple".equals(comboBox.getCurrentValue())) {
currentRow.setHidden(true);
currentRow.setColor(comboBox.getCurrentValue());
datastore.fireEvent(new StoreUpdateEvent<Item>(Arrays.asList(currentRow)));
} else {
currentRow.setHidden(false);
currentRow.setColor(comboBox.getCurrentValue());
datastore.fireEvent(new StoreUpdateEvent<Item>(Arrays.asList(currentRow)));
}
}
});
ColumnConfig<Item, String> col1 = (ColumnConfig<Item, String>) model.findColumnConfig("name");
ColumnConfig<Item, String> col2 = (ColumnConfig<Item, String>) model.findColumnConfig("color");
ColumnConfig<Item, String> col3 = (ColumnConfig<Item, String>) model.findColumnConfig("description");
editor.addEditor(col1, field);
editor.addEditor(col2, comboBox);
editor.addEditor(col3, field);
editor.addBeforeStartEditHandler(new BeforeStartEditHandler<Item>() {
@Override
public void onBeforeStartEdit(BeforeStartEditEvent<Item> event) {
System.out.println("onBeforeStartEdit");
currentRow = datastore.get(event.getEditCell().getRow());
if (event.getEditCell().getCol() == 1) {
List<String> list = new ArrayList<String>();
for (String value : SUPERSET) {
if (Random.nextBoolean()) {
list.add(value);
}
}
comboBox.getStore().replaceAll(list);
}
}
});
editor.addCompleteEditHandler(new CompleteEditHandler<Item>() {
@Override
public void onCompleteEdit(CompleteEditEvent<Item> event) {
System.out.println("onCompleteEdit");
// datastore.fireEvent(new
// StoreUpdateEvent<Item>(Arrays.asList(currentRow)));
currentRow = null;
}
});
return myGrid;
}
private class EditableCell extends AbstractEditableCell<String, String> {
@Override
public boolean isEditing(com.google.gwt.cell.client.Cell.Context context, com.google.gwt.dom.client.Element parent,
String value) {
return true;
}
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb) {
System.out.println("rendering column " + context.getColumn());
Item item = datastore.get(context.getIndex());
// if item is 'hidden', don't display the description
if (!item.getHidden() || context.getColumn() != 2) {
if (item.getColor() != null) {
sb.appendHtmlConstant("<span style='color:" + item.getColor() + "'>");
}
sb.appendHtmlConstant("" + value);
if (item.getColor() != null) {
sb.appendHtmlConstant("</span>");
}
}
}
}
private ColumnModel<Item> createColumnModel(ItemProperties properties) {
List<ColumnConfig<Item, ?>> configs = new ArrayList<ColumnConfig<Item, ?>>();
ColumnConfig<Item, String> name = new ColumnConfig<Item, String>(properties.name());
name.setWidth(100);
name.setHeader("name");
name.setCell(new EditableCell());
ColumnConfig<Item, String> color = new ColumnConfig<Item, String>(properties.color());
color.setWidth(200);
color.setHeader("color");
color.setCell(new EditableCell());
ColumnConfig<Item, String> description = new ColumnConfig<Item, String>(properties.description());
description.setWidth(200);
description.setHeader("description");
description.setCell(new EditableCell());
configs.add(name);
configs.add(color);
configs.add(description);
return new ColumnModel<Item>(configs);
}
private void createDummyData() {
List<Item> list = new ArrayList<Item>(20);
for (int i = 0; i < 20; i++) {
list.add(new Item("name" + i, "black", "desciption" + i));
}
datastore.addAll(list);
datastore.setAutoCommit(true);
}
public void onModuleLoad() {
Viewport viewport = new Viewport();
viewport.add(asWidget());
RootPanel.get().add(viewport);
}
}