/**
* 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.binding;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
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.form.ComboBoxCell.TriggerAction;
import com.sencha.gxt.core.client.XTemplates;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.examples.resources.client.TestData;
import com.sencha.gxt.examples.resources.client.model.Stock;
import com.sencha.gxt.examples.resources.client.model.StockProperties;
import com.sencha.gxt.explorer.client.model.Example.Detail;
import com.sencha.gxt.widget.core.client.ContentPanel;
import com.sencha.gxt.widget.core.client.box.MessageBox;
import com.sencha.gxt.widget.core.client.button.TextButton;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
import com.sencha.gxt.widget.core.client.form.ComboBox;
import com.sencha.gxt.widget.core.client.form.DateField;
import com.sencha.gxt.widget.core.client.form.FieldLabel;
import com.sencha.gxt.widget.core.client.form.NumberField;
import com.sencha.gxt.widget.core.client.form.NumberPropertyEditor.DoublePropertyEditor;
import com.sencha.gxt.widget.core.client.form.TextField;
import com.sencha.gxt.widget.core.client.form.validator.MinNumberValidator;
import com.sencha.gxt.widget.core.client.form.validator.RegExValidator;
@Detail(name = "Basic Binding", icon = "basicbinding", category = "Binding", files = "BasicBindingExample.html", classes = {
Stock.class, StockProperties.class})
public class BasicBindingExample implements IsWidget, EntryPoint, Editor<Stock> {
interface StockDriver extends SimpleBeanEditorDriver<Stock, BasicBindingExample> {
}
interface StockTemplate extends XTemplates {
@XTemplate(source = "BasicBindingExample.html")
SafeHtml drawStock(Stock stock);
}
private HorizontalPanel hp;
private Stock stock;
private HTML display;
private ComboBox<Stock> nameCombo;
// editor fields
TextField symbol;
TextField name;
NumberField<Double> last;
NumberField<Double> change;
DateField lastTrans;
private ListStore<Stock> stockStore;
private StockDriver driver = GWT.create(StockDriver.class);
private StockProperties props;
public Widget asWidget() {
if (hp == null) {
props = GWT.create(StockProperties.class);
stockStore = new ListStore<Stock>(props.key());
stockStore.addAll(TestData.getStocks());
stock = stockStore.get(0);
hp = new HorizontalPanel();
hp.setSpacing(10);
hp.add(updateDisplay());
hp.add(createEditor());
hp.setCellWidth(updateDisplay(), "200");
driver.initialize(this);
nameCombo.setValue(stock);
driver.edit(stock);
}
return hp;
}
public void onModuleLoad() {
RootPanel.get().add(asWidget());
}
private Widget createEditor() {
ContentPanel panel = new ContentPanel();
panel.setWidth(400);
panel.setBodyStyle("padding: 5px;");
panel.setHeaderVisible(false);
VerticalLayoutContainer c = new VerticalLayoutContainer();
nameCombo = new ComboBox<Stock>(stockStore, props.nameLabel());
nameCombo.setForceSelection(true);
nameCombo.setTypeAhead(true);
nameCombo.setName("company");
nameCombo.setTriggerAction(TriggerAction.ALL);
nameCombo.setEditable(false);
nameCombo.addSelectionHandler(new SelectionHandler<Stock>() {
@Override
public void onSelection(SelectionEvent<Stock> event) {
symbol.clearInvalid();
change.clearInvalid();
last.clearInvalid();
lastTrans.clearInvalid();
stock = event.getSelectedItem();
driver.edit(stock);
updateDisplay();
}
});
c.add(new FieldLabel(nameCombo, "Select Company"), new VerticalLayoutData(1, -1));
name = new TextField();
name.setAllowBlank(false);
c.add(new FieldLabel(name, "Name"), new VerticalLayoutData(1, -1));
symbol = new TextField();
symbol.addValidator(new RegExValidator("[^a-z]+", "Only uppercase letters allowed"));
symbol.setAutoValidate(true);
symbol.setName("symbol");
c.add(new FieldLabel(symbol, "Symbol"), new VerticalLayoutData(1, -1));
last = new NumberField<Double>(new DoublePropertyEditor());
last.setName("last");
last.setFormat(NumberFormat.getFormat("0.00"));
last.setAllowNegative(false);
last.addValidator(new MinNumberValidator<Double>(0D));
c.add(new FieldLabel(last, "Last"), new VerticalLayoutData(1, -1));
change = new NumberField<Double>(new DoublePropertyEditor());
change.setName("change");
change.setFormat(NumberFormat.getFormat("0.00"));
c.add(new FieldLabel(change, "Change"), new VerticalLayoutData(1, -1));
lastTrans = new DateField();
lastTrans.setName("date");
lastTrans.setAutoValidate(true);
c.add(new FieldLabel(lastTrans, "Updated"), new VerticalLayoutData(1, -1));
TextButton reset = new TextButton("Cancel");
reset.addSelectHandler(new SelectHandler() {
@Override
public void onSelect(SelectEvent event) {
driver.edit(stock);
}
});
panel.addButton(reset);
TextButton save = new TextButton("Save");
save.addSelectHandler(new SelectHandler() {
@Override
public void onSelect(SelectEvent event) {
driver.flush();
stock = driver.flush();
if (driver.hasErrors()) {
new MessageBox("Please correct the errors before saving.").show();
return;
}
updateDisplay();
stockStore.update(stock);
}
});
panel.addButton(save);
panel.add(c);
return panel;
}
private HTML updateDisplay() {
if (display == null) {
display = new HTML();
}
StockTemplate template = GWT.create(StockTemplate.class);
display.setHTML(template.drawStock(stock));
return display;
}
}