From 09d1d220237557e1b4c3190dcc1d76207bc818a9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marko=20Gr=C3=B6nroos?= Date: Tue, 3 Jun 2008 16:11:23 +0000 Subject: [PATCH] Form example. svn changeset:4735/svn branch:trunk --- .../tests/book/BookTestApplication.java | 16 +- .../toolkit/tests/book/FormExample.java | 207 ++++++++++++++++++ 2 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 src/com/itmill/toolkit/tests/book/FormExample.java diff --git a/src/com/itmill/toolkit/tests/book/BookTestApplication.java b/src/com/itmill/toolkit/tests/book/BookTestApplication.java index e0e524c964..1db09d5598 100644 --- a/src/com/itmill/toolkit/tests/book/BookTestApplication.java +++ b/src/com/itmill/toolkit/tests/book/BookTestApplication.java @@ -8,10 +8,15 @@ import java.net.URL; import java.util.Iterator; import java.util.Locale; import java.util.Set; +import java.util.Vector; +import com.itmill.toolkit.data.Container; +import com.itmill.toolkit.data.Item; +import com.itmill.toolkit.data.Property; import com.itmill.toolkit.data.Validator; import com.itmill.toolkit.data.Property.ValueChangeEvent; import com.itmill.toolkit.data.Property.ValueChangeListener; +import com.itmill.toolkit.data.util.BeanItem; import com.itmill.toolkit.data.validator.StringLengthValidator; import com.itmill.toolkit.terminal.ClassResource; import com.itmill.toolkit.terminal.DownloadStream; @@ -28,6 +33,9 @@ import com.itmill.toolkit.ui.CustomLayout; import com.itmill.toolkit.ui.DateField; import com.itmill.toolkit.ui.Embedded; import com.itmill.toolkit.ui.ExpandLayout; +import com.itmill.toolkit.ui.Field; +import com.itmill.toolkit.ui.FieldFactory; +import com.itmill.toolkit.ui.Form; import com.itmill.toolkit.ui.FormLayout; import com.itmill.toolkit.ui.GridLayout; import com.itmill.toolkit.ui.InlineDateField; @@ -102,7 +110,7 @@ public class BookTestApplication extends com.itmill.toolkit.Application { "select/select", "select/native", "select/optiongroup", "select/twincol", "filterselect", "validator", "table", "table/select", "upload", "link", "gridlayout", "orderedlayout", - "formlayout", "panel", "expandlayout", "tabsheet", + "formlayout", "form", "panel", "expandlayout", "tabsheet", "alignment", "alignment/grid", "window", "window/opener", "window/multiple", "classresource", "usererror", "progress/window", "progress/thread", "progress", @@ -156,6 +164,8 @@ public class BookTestApplication extends com.itmill.toolkit.Application { example_OrderedLayout(main, param); } else if (example.equals("formlayout")) { example_FormLayout(main, param); + } else if (example.equals("form")) { + example_Form(main, param); } else if (example.equals("tabsheet")) { example_TabSheet(main, param); } else if (example.equals("panel")) { @@ -679,6 +689,10 @@ public class BookTestApplication extends com.itmill.toolkit.Application { main.addComponent(layout); } + void example_Form(Window main, String param) { + main.addComponent(new FormExample()); + } + void example_ExpandLayout(Window main, String param) { if (param != null && param.equals("centered")) { Label widget = new Label("Here is text"); diff --git a/src/com/itmill/toolkit/tests/book/FormExample.java b/src/com/itmill/toolkit/tests/book/FormExample.java new file mode 100644 index 0000000000..5be974a0fc --- /dev/null +++ b/src/com/itmill/toolkit/tests/book/FormExample.java @@ -0,0 +1,207 @@ +package com.itmill.toolkit.tests.book; + +import java.util.Vector; + +import com.itmill.toolkit.data.Container; +import com.itmill.toolkit.data.Item; +import com.itmill.toolkit.data.Property; +import com.itmill.toolkit.data.Validator; +import com.itmill.toolkit.data.util.BeanItem; +import com.itmill.toolkit.ui.Button; +import com.itmill.toolkit.ui.Component; +import com.itmill.toolkit.ui.CustomComponent; +import com.itmill.toolkit.ui.ExpandLayout; +import com.itmill.toolkit.ui.Field; +import com.itmill.toolkit.ui.FieldFactory; +import com.itmill.toolkit.ui.Form; +import com.itmill.toolkit.ui.FormLayout; +import com.itmill.toolkit.ui.OrderedLayout; +import com.itmill.toolkit.ui.Select; +import com.itmill.toolkit.ui.TextField; + +/** + * This example demonstrates the most important features of the Form component: + * binding Form to a JavaBean so that form fields are automatically generated + * from the bean properties, creation of fields with proper types for each bean + * properly using a FieldFactory, buffering (commit/discard), and validation. + * + * The Form is used with a FormLayout, which automatically lays the components + * out in a format typical for forms. + */ +public class FormExample extends CustomComponent { + /** Contact information data model. */ + public class Contact { + String name = ""; + + String address = ""; + + int postalCode = 20540; + + String city; + } + + /** JavaBean wrapper for the data model. */ + public class ContactBean extends Contact { + public ContactBean() { + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getAddress() { + return address; + } + + public void setPostalCode(String postalCode) { + try { + if (postalCode != null) + this.postalCode = Integer.parseInt(postalCode); + else + this.postalCode = 0; + } catch (NumberFormatException e) { + this.postalCode = 0; + } + } + + public String getPostalCode() { + if (postalCode > 0) + return String.valueOf(postalCode); + else + return ""; + } + + public void setCity(String city) { + this.city = city; + } + + public String getCity() { + return city; + } + } + + /** + * Factory to create the proper type of field for each property type. We + * need to implement just one of the factory methods. + */ + class MyFieldFactory implements FieldFactory { + + public Field createField(Class type, Component uiContext) { + return null; + } + + public Field createField(Property property, Component uiContext) { + return null; + } + + public Field createField(Item item, Object propertyId, + Component uiContext) { + String pid = (String) propertyId; + if (pid.equals("name")) + return new TextField("Name"); + if (pid.equals("address")) + return new TextField("Street Address"); + if (pid.equals("postalCode")) { + TextField field = new TextField("Postal Code"); + field.setColumns(5); + Validator postalCodeValidator = new Validator() { + + public boolean isValid(Object value) { + if (value == null || !(value instanceof String)) + return false; + int val = Integer.parseInt((String) value); + return val >= 10000 && val < 100000; + } + + public void validate(Object value) + throws InvalidValueException { + if (!isValid(value)) + throw new InvalidValueException( + "Postal code must be a number 10000-99999."); + } + }; + field.addValidator(postalCodeValidator); + return field; + } + if (pid.equals("city")) { + Select select = new Select("City"); + final String cities[] = new String[] { "Amsterdam", "Berlin", + "Helsinki", "Hong Kong", "London", "Luxemburg", + "New York", "Oslo", "Paris", "Rome", "Stockholm", + "Tokyo", "Turku" }; + for (int i = 0; i < cities.length; i++) + select.addItem(cities[i]); + return select; + } + return null; + } + + public Field createField(Container container, Object itemId, + Object propertyId, Component uiContext) { + return null; + } + } + + public FormExample() { + // Create a form and use FormLayout as its layout. + final Form form = new Form(); + final FormLayout layout = new FormLayout(); + form.setLayout(layout); + + // Set form caption and description texts + form.setCaption("Contact Information"); + form.setDescription("Please enter valid name and address. Fields marked with * are required."); + + // Use custom field factory to create the fields in the form. + form.setFieldFactory(new MyFieldFactory()); + + // Create the custom bean. + ContactBean bean = new ContactBean(); + + // Create a bean item that is bound to the bean. + BeanItem item = new BeanItem(bean); + + // Bind the bean item as the data source for the form. + form.setItemDataSource(item); + + // Set the order of the items in the form. + Vector order = new Vector(); + order.add("name"); + order.add("address"); + order.add("postalCode"); + order.add("city"); + form.setVisibleItemProperties(order); + + // Set required fields. + form.getField("name").setRequired(true); + + form.setImmediate(true); + form.setWriteThrough(false); + form.setReadThrough(false); + + // Add Ok and Reset controls to the form. + ExpandLayout footer = new ExpandLayout( + OrderedLayout.ORIENTATION_HORIZONTAL); + Button ok = new Button("Ok", form, "commit"); + Button reset = new Button("Reset", form, "discard"); + footer.addComponent(ok); + footer.setComponentAlignment(ok, ExpandLayout.ALIGNMENT_RIGHT, + ExpandLayout.ALIGNMENT_TOP); + footer.setHeight("30px"); + footer.addComponent(reset); + + OrderedLayout root = new OrderedLayout(); + root.setWidth(400, OrderedLayout.UNITS_PIXELS); + root.addComponent(form); + root.addComponent(footer); + this.setCompositionRoot(root); + } +} -- 2.39.5