Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package es.inaer.taller.client;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Date;
- import java.util.List;
- import com.google.gwt.cell.client.DateCell;
- 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.Editor.Path;
- import com.google.gwt.editor.client.EditorError;
- import com.google.gwt.editor.client.SimpleBeanEditorDriver;
- import com.google.gwt.i18n.client.DateTimeFormat;
- import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
- import com.google.gwt.safehtml.shared.SafeHtml;
- import com.google.gwt.user.client.Window;
- import com.google.gwt.user.client.Window.ClosingEvent;
- import com.google.gwt.user.client.Window.ClosingHandler;
- 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.google.web.bindery.autobean.shared.AutoBean;
- import com.google.web.bindery.autobean.shared.AutoBeanFactory;
- import com.sencha.gxt.core.client.ValueProvider;
- import com.sencha.gxt.core.client.XTemplates;
- import com.sencha.gxt.core.client.util.Margins;
- import com.sencha.gxt.data.client.editor.ListStoreEditor;
- 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.widget.core.client.ContentPanel;
- import com.sencha.gxt.widget.core.client.FramedPanel;
- 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.FlowLayoutContainer;
- 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.DateTimePropertyEditor;
- import com.sencha.gxt.widget.core.client.form.FieldLabel;
- import com.sencha.gxt.widget.core.client.form.TextField;
- import com.sencha.gxt.widget.core.client.form.validator.AbstractValidator;
- 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.ClicksToEdit;
- import com.sencha.gxt.widget.core.client.grid.editing.GridInlineEditing;
- import com.sencha.gxt.widget.core.client.toolbar.ToolBar;
- // Proof of concept using some new feature of GWT2.4 + GXT3.0RC
- public class Taller implements EntryPoint {
- public interface Person {
- int getId();
- void setId(int value);
- String getName();
- void setName(String value);
- Date getBirthDate();
- void setBirthDate(Date value);
- Person getBoss();
- void setBoss(Person value);
- List<Person> getCollegues();
- void setCollegues(List<Person> value);
- }
- interface BeanFactory extends AutoBeanFactory {
- BeanFactory INSTANCE = GWT.create(BeanFactory.class);
- AutoBean<Person> person();
- }
- public interface PersonPropertyAccess extends PropertyAccess<Person> {
- PersonPropertyAccess INSTANCE = GWT.create(PersonPropertyAccess.class);
- @Path("name")
- LabelProvider<Person> label();
- @Path("id")
- ModelKeyProvider<Person> key();
- ValueProvider<Person, String> name();
- ValueProvider<Person, Date> birthDate();
- // exception throw if boss is null :-/
- //@Path("boss.name")
- //ValueProvider<Person, String> bossName();
- }
- /***
- * Field that shows a grid with all person instances in the Store
- * and allows to add, remove or edit some person properties.
- */
- public class PersonListField extends ContentPanel {
- // new Person objects added on editing time will have negative id numbers
- int fakePersonId = -1;
- public PersonListField(final ListStore<Person> personStore) {
- VerticalLayoutContainer vlc = new VerticalLayoutContainer();
- ToolBar toolbar = new ToolBar();
- TextButton addButton = new TextButton("Add");
- toolbar.add(addButton);
- TextButton deleteButton = new TextButton("Delete");
- toolbar.add(deleteButton);
- vlc.add(toolbar, new VerticalLayoutData(1, -1));
- ArrayList<ColumnConfig<Person, ?>> colConfigs = new ArrayList<ColumnConfig<Person, ?>>();
- ColumnConfig<Person, String> nameCol = new ColumnConfig<Person, String>(PersonPropertyAccess.INSTANCE.name(), 100, "Name");
- ColumnConfig<Person, Date> birthDateCol = new ColumnConfig<Person, Date>(PersonPropertyAccess.INSTANCE.birthDate(), 100, "Birthdate");
- birthDateCol.setCell(new DateCell(DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT)));
- colConfigs.add(nameCol);
- colConfigs.add(birthDateCol);
- ColumnModel<Person> columModel = new ColumnModel<Person>(colConfigs);
- final Grid<Person> grid = new Grid<Person>(personStore, columModel);
- grid.getView().setForceFit(true);
- GridInlineEditing<Person> inlineEditor = new GridInlineEditing<Person>(grid);
- inlineEditor.setClicksToEdit(ClicksToEdit.TWO);
- TextField nameTextField = new TextField();
- inlineEditor.addEditor(nameCol, nameTextField);
- inlineEditor.addEditor(birthDateCol, new DateField(new DateTimePropertyEditor(
- DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT))));
- vlc.add(grid, new VerticalLayoutData(1, 1));
- add(vlc);
- addButton.addSelectHandler(new SelectHandler() {
- @Override
- public void onSelect(SelectEvent event) {
- Person p = createPerson(fakePersonId--, "New Name", null , null);
- personStore.add(p);
- }
- });
- deleteButton.addSelectHandler(new SelectHandler() {
- @Override
- public void onSelect(SelectEvent event) {
- List<Person> selectedItems = grid.getSelectionModel().getSelectedItems();
- for (Person person: selectedItems) {
- personStore.remove(person);
- }
- }
- });
- }
- }
- public class PersonEditor implements IsWidget, Editor<Person> {
- FramedPanel fp;
- FlowLayoutContainer panel;
- TextField name = new TextField();
- DateField birthDate = new DateField();
- ListStore<Person> bossStore = new ListStore<Person>(PersonPropertyAccess.INSTANCE.key());
- ComboBox<Person> boss = new ComboBox<Person>(bossStore, PersonPropertyAccess.INSTANCE.label());
- ListStore<Person> collegueStore = new ListStore<Person>(PersonPropertyAccess.INSTANCE.key());
- ListStoreEditor<Person> collegues = new ListStoreEditor<Person>(collegueStore);
- public PersonEditor(List<Person> bossList) {
- fp = new FramedPanel();
- fp.setHeadingText("Person");
- panel = new FlowLayoutContainer();
- name.setAllowBlank(false);
- name.addValidator(new StartWithEValidator());
- panel.add(new FieldLabel(name, "Name"));
- panel.add(new FieldLabel(birthDate, "Birth date"));
- panel.add(new FieldLabel(boss, "Boss"));
- boss.setForceSelection(true);
- bossStore.addAll(bossList);
- PersonListField colleguesField = new PersonListField(collegueStore);
- colleguesField.setHeadingText("Collegues");
- colleguesField.setHeight(300);
- panel.add(colleguesField);
- fp.add(panel);
- }
- @Override
- public Widget asWidget() {
- return fp;
- }
- }
- public interface PersonDriver extends SimpleBeanEditorDriver<Person, PersonEditor> {}
- public interface PersonTemplate extends XTemplates {
- PersonTemplate INSTANCE = GWT.create(PersonTemplate.class);
- @XTemplate(source = "template.html")
- public SafeHtml render(Person person);
- }
- class StartWithEValidator extends
- AbstractValidator<String> {
- @Override
- public List<EditorError> validate(Editor<String> editor,
- String value) {
- if (value.charAt(0) != 'E') {
- return createError(editor, "Must start with letter E", value);
- }
- return null;
- }
- }
- Person createPerson(int id, String name, Date birthDate, Person boss) {
- Person p = BeanFactory.INSTANCE.person().as();
- p.setId(id);
- p.setName(name);
- p.setBirthDate(birthDate);
- p.setBoss(boss);
- return p;
- }
- public void onModuleLoad() {
- // setup data model
- Person romain = createPerson(3, "Romain", null, null);
- Person andres = createPerson(2, "Andres", null, romain);
- final Person edu = createPerson(1, "Edu", null, andres);
- Person juan = createPerson(4, "Juan", null, andres);
- Person paco = createPerson(5, "Paco", null, andres);
- edu.setCollegues(new ArrayList<Person>(Arrays.asList(andres, paco, juan)));
- ArrayList<Person> bossList = new ArrayList<Person>();
- bossList.add(andres);
- bossList.add(romain);
- VerticalLayoutContainer panel = new VerticalLayoutContainer();
- PersonEditor personEditor = new PersonEditor(bossList);
- panel.add(personEditor, new VerticalLayoutData(1, 0.9f, new Margins(2)));
- TextButton saveButton = new TextButton("Save");
- panel.add(saveButton, new VerticalLayoutData(-1, 0.05f, new Margins(2)));
- TextButton isDirtyButton = new TextButton("is dirty?");
- panel.add(isDirtyButton, new VerticalLayoutData(-1, 0.05f, new Margins(2)));
- panel.setHeight(500);
- panel.setWidth(300);
- RootPanel.get().add(panel);
- final PersonDriver personDriver = GWT.create(PersonDriver.class);
- personDriver.initialize(personEditor);
- personDriver.edit(edu);
- saveButton.addSelectHandler(new SelectHandler() {
- @Override
- public void onSelect(SelectEvent event) {
- // in this point we should evaluate if the list editor needs
- // to check if all columns has data by example because this is not
- // check by the Editor framework workflow.
- personDriver.flush();
- if (!personDriver.hasErrors()){
- MessageBox mb = new MessageBox("View of edited Person", PersonTemplate.INSTANCE.render(edu).asString());
- mb.show();
- } else {
- }
- }
- });
- isDirtyButton.addSelectHandler(new SelectHandler() {
- @Override
- public void onSelect(SelectEvent event) {
- Window.alert("isDirty = " + personDriver.isDirty());
- }
- });
- Window.addWindowClosingHandler(new ClosingHandler() {
- public void onWindowClosing(ClosingEvent event) {
- if (personDriver.isDirty()) {
- event.setMessage("There are unsaved editor changes.");
- }
- }
- });
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement