From: Marc Englund Date: Tue, 13 Jan 2009 13:02:48 +0000 (+0000) Subject: Sampler samples. X-Git-Tag: 6.7.0.beta1~3347 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=c732da4aa80e98a1d2d2bf243e788ff9b45fd07c;p=vaadin-framework.git Sampler samples. svn changeset:6517/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/demo/sampler/FeatureSet.java b/src/com/itmill/toolkit/demo/sampler/FeatureSet.java index a16ed83a66..5dbbbcf65f 100644 --- a/src/com/itmill/toolkit/demo/sampler/FeatureSet.java +++ b/src/com/itmill/toolkit/demo/sampler/FeatureSet.java @@ -12,8 +12,11 @@ import com.itmill.toolkit.demo.sampler.features.blueprints.ProminentPrimaryActio import com.itmill.toolkit.demo.sampler.features.buttons.ButtonLink; import com.itmill.toolkit.demo.sampler.features.buttons.ButtonPush; import com.itmill.toolkit.demo.sampler.features.buttons.ButtonSwitch; +import com.itmill.toolkit.demo.sampler.features.commons.Errors; import com.itmill.toolkit.demo.sampler.features.commons.Icons; import com.itmill.toolkit.demo.sampler.features.commons.Tooltips; +import com.itmill.toolkit.demo.sampler.features.commons.Validation; +import com.itmill.toolkit.demo.sampler.features.form.FormBasic; import com.itmill.toolkit.demo.sampler.features.layouts.HorizontalLayoutBasic; import com.itmill.toolkit.demo.sampler.features.layouts.LayoutAlignment; import com.itmill.toolkit.demo.sampler.features.layouts.LayoutSpacing; @@ -92,6 +95,7 @@ public class FeatureSet extends Feature { new Tabsheets(), // new Accordions(), // new Panels(), // + // new Forms(), not done yet new Windows(), // }); } @@ -141,8 +145,10 @@ public class FeatureSet extends Feature { public Commons() { super("Commons", new Feature[] { // - new Tooltips(), // tooltips - new Icons(), // icons + new Tooltips(), // + new Icons(), // + new Errors(), // + new Validation(), // }); } } @@ -207,6 +213,15 @@ public class FeatureSet extends Feature { } } + public static class Forms extends FeatureSet { + public Forms() { + super("Forms", new Feature[] { + // + new FormBasic(), // + }); + } + } + public static class Windows extends FeatureSet { public Windows() { super("Windows", new Feature[] { diff --git a/src/com/itmill/toolkit/demo/sampler/features/commons/Errors.java b/src/com/itmill/toolkit/demo/sampler/features/commons/Errors.java new file mode 100644 index 0000000000..2f1a9286a9 --- /dev/null +++ b/src/com/itmill/toolkit/demo/sampler/features/commons/Errors.java @@ -0,0 +1,47 @@ +package com.itmill.toolkit.demo.sampler.features.commons; + +import com.itmill.toolkit.demo.sampler.APIResource; +import com.itmill.toolkit.demo.sampler.Feature; +import com.itmill.toolkit.demo.sampler.NamedExternalResource; +import com.itmill.toolkit.demo.sampler.features.notifications.NotificationError; +import com.itmill.toolkit.ui.Component; +import com.itmill.toolkit.ui.Window; + +public class Errors extends Feature { + + private static final String desc = "A component error can be set to" + + " indicate an error - an error indicator icon will appear," + + " and the error message will appear as a 'tooltip' when" + + " mousing over.
" + + "You can do this on almost any component, but please note" + + " that from a usability standpoint it's not always the best" + + " solution.
" + + "Component error is most useful to indicate what is" + + " causing the error (e.g an 'email' TextField), so that the user" + + " can find and correct the problem.
" + + "On the other hand, it is usually not a good idea to set an error" + + " on a Button: the user can not click 'Save' differently to" + + " correct the error.
" + + "If there is no component causing the error, consider using a" + + " (styled) Label or a Notification to indicate the error."; + + public String getDescription() { + return desc; + } + + public APIResource[] getRelatedAPI() { + return new APIResource[] { new APIResource(Component.class), + new APIResource(Window.Notification.class) }; + } + + public Class[] getRelatedFeatures() { + // TODO link validation sample, form sample + return new Class[] { NotificationError.class }; + } + + public NamedExternalResource[] getRelatedResources() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/com/itmill/toolkit/demo/sampler/features/commons/ErrorsExample.java b/src/com/itmill/toolkit/demo/sampler/features/commons/ErrorsExample.java new file mode 100644 index 0000000000..f402fa699b --- /dev/null +++ b/src/com/itmill/toolkit/demo/sampler/features/commons/ErrorsExample.java @@ -0,0 +1,24 @@ +package com.itmill.toolkit.demo.sampler.features.commons; + +import com.itmill.toolkit.terminal.UserError; +import com.itmill.toolkit.ui.Panel; +import com.itmill.toolkit.ui.TextField; +import com.itmill.toolkit.ui.VerticalLayout; + +public class ErrorsExample extends VerticalLayout { + + public ErrorsExample() { + setSpacing(true); + + Panel panel = new Panel("Configure this"); + panel.setComponentError(new UserError("This panel contains errors")); + addComponent(panel); + + TextField input = new TextField("Input"); + input + .setComponentError(new UserError( + "This field is never satisfied.")); + panel.addComponent(input); + + } +} diff --git a/src/com/itmill/toolkit/demo/sampler/features/commons/Tooltips.java b/src/com/itmill/toolkit/demo/sampler/features/commons/Tooltips.java index 3644424ebc..4b729aefef 100644 --- a/src/com/itmill/toolkit/demo/sampler/features/commons/Tooltips.java +++ b/src/com/itmill/toolkit/demo/sampler/features/commons/Tooltips.java @@ -15,7 +15,7 @@ public class Tooltips extends Feature { + "Note that description is more generic term than" + " tooltip - a component might choose to show" + " the description in another way, if that's more appropriate" - + " for that compoenent.)"; + + " for that component.)"; } @Override diff --git a/src/com/itmill/toolkit/demo/sampler/features/commons/Validation.java b/src/com/itmill/toolkit/demo/sampler/features/commons/Validation.java new file mode 100644 index 0000000000..ca84439eb6 --- /dev/null +++ b/src/com/itmill/toolkit/demo/sampler/features/commons/Validation.java @@ -0,0 +1,32 @@ +package com.itmill.toolkit.demo.sampler.features.commons; + +import com.itmill.toolkit.data.Validatable; +import com.itmill.toolkit.data.Validator; +import com.itmill.toolkit.demo.sampler.APIResource; +import com.itmill.toolkit.demo.sampler.Feature; +import com.itmill.toolkit.demo.sampler.NamedExternalResource; + +public class Validation extends Feature { + + private static final String desc = ""; + + public String getDescription() { + return desc; + } + + public APIResource[] getRelatedAPI() { + return new APIResource[] { new APIResource(Validatable.class), + new APIResource(Validator.class) }; + } + + public Class[] getRelatedFeatures() { + // TODO link form sample + return new Class[] { Errors.class }; + } + + public NamedExternalResource[] getRelatedResources() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/com/itmill/toolkit/demo/sampler/features/commons/ValidationExample.java b/src/com/itmill/toolkit/demo/sampler/features/commons/ValidationExample.java new file mode 100644 index 0000000000..75bacd5b10 --- /dev/null +++ b/src/com/itmill/toolkit/demo/sampler/features/commons/ValidationExample.java @@ -0,0 +1,64 @@ +package com.itmill.toolkit.demo.sampler.features.commons; + +import java.util.HashSet; + +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.validator.CompositeValidator; +import com.itmill.toolkit.data.validator.StringLengthValidator; +import com.itmill.toolkit.ui.Label; +import com.itmill.toolkit.ui.TextField; +import com.itmill.toolkit.ui.VerticalLayout; + +public class ValidationExample extends VerticalLayout { + + HashSet usernames = new HashSet(); + + public ValidationExample() { + setSpacing(true); + + TextField pin = new TextField("PIN"); + pin.setWidth("50px"); + // optional; validate at once instead of when clicking 'save' (e.g) + pin.setImmediate(true); + addComponent(pin); + // add the validator + pin.addValidator(new StringLengthValidator("Must be 4-6 characters", 4, + 6, false)); + + TextField username = new TextField("Username"); + // optional; validate at once instead of when clicking 'save' (e.g) + username.setImmediate(true); + addComponent(username); + CompositeValidator usernameValidator = new CompositeValidator(); + username.addValidator(usernameValidator); + usernameValidator.addValidator(new StringLengthValidator( + "Username must be at least 4 characters", 4, 255, false)); + usernameValidator.addValidator(new Validator() { + + public boolean isValid(Object value) { + return !usernames.contains(value); + } + + public void validate(Object value) throws InvalidValueException { + if (!isValid(value)) { + throw new Validator.InvalidValueException("Username " + + value + " already in use"); + } + usernames.add(value); + } + }); + username.addListener(new ValueChangeListener() { + public void valueChange(ValueChangeEvent event) { + TextField tf = (TextField) event.getProperty(); + tf.validate(); + if (tf.isValid()) { + addComponent(new Label("Added " + tf.getValue() + + " to usernames")); + } + } + }); + + } +} diff --git a/src/com/itmill/toolkit/demo/sampler/features/form/FormBasic.java b/src/com/itmill/toolkit/demo/sampler/features/form/FormBasic.java new file mode 100644 index 0000000000..7ecf234c3d --- /dev/null +++ b/src/com/itmill/toolkit/demo/sampler/features/form/FormBasic.java @@ -0,0 +1,38 @@ +package com.itmill.toolkit.demo.sampler.features.form; + +import com.itmill.toolkit.demo.sampler.APIResource; +import com.itmill.toolkit.demo.sampler.Feature; +import com.itmill.toolkit.demo.sampler.NamedExternalResource; +import com.itmill.toolkit.ui.Component; + +public class FormBasic extends Feature { + + @Override + public Component getExample() { + return new FormPojoExample(); + } + + @Override + public String getDescription() { + return "A basic form"; + } + + @Override + public APIResource[] getRelatedAPI() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Class[] getRelatedFeatures() { + // TODO Auto-generated method stub + return null; + } + + @Override + public NamedExternalResource[] getRelatedResources() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/com/itmill/toolkit/demo/sampler/features/form/FormPojoExample.java b/src/com/itmill/toolkit/demo/sampler/features/form/FormPojoExample.java new file mode 100644 index 0000000000..1b4dd9ff52 --- /dev/null +++ b/src/com/itmill/toolkit/demo/sampler/features/form/FormPojoExample.java @@ -0,0 +1,207 @@ +package com.itmill.toolkit.demo.sampler.features.form; + +import java.util.Arrays; +import java.util.Date; +import java.util.UUID; + +import com.itmill.toolkit.data.Item; +import com.itmill.toolkit.data.util.BeanItem; +import com.itmill.toolkit.data.validator.StringLengthValidator; +import com.itmill.toolkit.demo.sampler.ExampleUtil; +import com.itmill.toolkit.ui.BaseFieldFactory; +import com.itmill.toolkit.ui.Button; +import com.itmill.toolkit.ui.ComboBox; +import com.itmill.toolkit.ui.Component; +import com.itmill.toolkit.ui.Field; +import com.itmill.toolkit.ui.Form; +import com.itmill.toolkit.ui.HorizontalLayout; +import com.itmill.toolkit.ui.TextField; +import com.itmill.toolkit.ui.VerticalLayout; +import com.itmill.toolkit.ui.Window; +import com.itmill.toolkit.ui.Button.ClickEvent; + +public class FormPojoExample extends VerticalLayout { + + // the 'POJO' we're editing + Person person; + + public FormPojoExample() { + + person = new Person(); // a person POJO + BeanItem personItem = new BeanItem(person); // item from POJO + + // create the Form + final Form personForm = new Form(); + personForm.setWriteThrough(false); // we want explicit 'apply' + personForm.setInvalidCommitted(false); // no invalid values in datamodel + // FieldFactory for customizing the fields and adding validators + personForm.setFieldFactory(new PersonFieldFactory()); + personForm.setItemDataSource(personItem); // bind to POJO via BeanItem + // determines which properties are shown, and in which order: + personForm.setVisibleItemProperties(Arrays.asList(new String[] { + "firstName", "lastName", "countryCode", "password", + "birthdate", "shoesize", "uuid" })); + addComponent(personForm); // add to layout + + // the cancel / apply buttons + HorizontalLayout buttons = new HorizontalLayout(); + buttons.setSpacing(true); + Button discardChanges = new Button("Discard changes", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + personForm.discard(); + } + }); + discardChanges.setStyleName(Button.STYLE_LINK); + buttons.addComponent(discardChanges); + Button apply = new Button("Apply", new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + personForm.commit(); + } + }); + buttons.addComponent(apply); + personForm.getLayout().addComponent(buttons); + + // button for showing the internal state of the POJO + Button showPojoState = new Button("Show POJO internal state", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + showPojoState(); + } + }); + addComponent(showPojoState); + // showPojoState(); + } + + private void showPojoState() { + Window.Notification n = new Window.Notification("POJO state", + Window.Notification.TYPE_TRAY_NOTIFICATION); + n.setPosition(Window.Notification.POSITION_CENTERED); + n.setDescription("First name: " + person.getFirstName() + + "
Last name: " + person.getLastName() + "
Country: " + + person.getCountryCode() + "
Birthdate: " + + person.getBirthdate() + "
Shoe size: " + + +person.getShoesize() + "
Password: " + + person.getPassword() + "
UUID: " + person.getUuid()); + getWindow().showNotification(n); + } + + private class PersonFieldFactory extends BaseFieldFactory { + + final ComboBox countries = new ComboBox("Country"); + + public PersonFieldFactory() { + countries.setWidth("30em"); + countries.setContainerDataSource(ExampleUtil.getISO3166Container()); + countries + .setItemCaptionPropertyId(ExampleUtil.iso3166_PROPERTY_NAME); + countries.setItemIconPropertyId(ExampleUtil.iso3166_PROPERTY_FLAG); + countries.setFilteringMode(ComboBox.FILTERINGMODE_STARTSWITH); + } + + @Override + public Field createField(Item item, Object propertyId, + Component uiContext) { + if ("countryCode".equals(propertyId)) { + // filtering ComboBox w/ country names + return countries; + } + Field f = super.createField(item, propertyId, uiContext); + if ("firstName".equals(propertyId)) { + TextField tf = (TextField) f; + tf.setRequired(true); + tf.setWidth("15em"); + tf.addValidator(new StringLengthValidator( + "First Name must be 3-25 characters", 3, 25, false)); + } else if ("lastName".equals(propertyId)) { + TextField tf = (TextField) f; + tf.setRequired(true); + tf.setWidth("20em"); + tf.addValidator(new StringLengthValidator( + "Last Name must be 3-50 characters", 3, 50, false)); + } else if ("password".equals(propertyId)) { + TextField tf = (TextField) f; + tf.setSecret(true); + tf.setRequired(true); + tf.setWidth("10em"); + tf.addValidator(new StringLengthValidator( + "Password must be 6-20 characters", 6, 20, false)); + } else if ("shoesize".equals(propertyId)) { + TextField tf = (TextField) f; + tf.setWidth("2em"); + } else if ("uuid".equals(propertyId)) { + TextField tf = (TextField) f; + tf.setWidth("20em"); + } + + return f; + } + } + + public class Person { + private String firstName = ""; + private String lastName = ""; + private Date birthdate; + private int shoesize = 42; + private String password = ""; + private UUID uuid; + private String countryCode = ""; + + public Person() { + uuid = UUID.randomUUID(); + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Date getBirthdate() { + return birthdate; + } + + public void setBirthdate(Date birthdate) { + this.birthdate = birthdate; + } + + public int getShoesize() { + return shoesize; + } + + public void setShoesize(int shoesize) { + this.shoesize = shoesize; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public UUID getUuid() { + return uuid; + } + + public String getCountryCode() { + return countryCode; + } + + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; + } + + } +} diff --git a/src/com/itmill/toolkit/demo/sampler/features/notifications/NotificationCustomExample.java b/src/com/itmill/toolkit/demo/sampler/features/notifications/NotificationCustomExample.java index c56cfdab96..2f71e01f9a 100644 --- a/src/com/itmill/toolkit/demo/sampler/features/notifications/NotificationCustomExample.java +++ b/src/com/itmill/toolkit/demo/sampler/features/notifications/NotificationCustomExample.java @@ -51,7 +51,6 @@ public class NotificationCustomExample extends OrderedLayout { delay .setDescription("Delay before fading
Pull all the way to the left to get -1, which means forever (click to hide)."); delay.setWidth("400px"); - delay.setHeight("20px"); delay.setMin(Notification.DELAY_FOREVER); delay.setMax(10000); addComponent(delay);