aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/itmill
diff options
context:
space:
mode:
authorArtur Signell <artur.signell@itmill.com>2008-12-23 08:47:44 +0000
committerArtur Signell <artur.signell@itmill.com>2008-12-23 08:47:44 +0000
commit76aedb1690ac753c2efd0a0682de35e892b2e218 (patch)
tree55986e54109cebec41250bac1046866dc4826b3c /src/com/itmill
parent3026e47f8e553dd8a122548b36a5c3942786fb77 (diff)
downloadvaadin-framework-76aedb1690ac753c2efd0a0682de35e892b2e218.tar.gz
vaadin-framework-76aedb1690ac753c2efd0a0682de35e892b2e218.zip
Updated feature browser in automatedtests package to current feature browser.
svn changeset:6342/svn branch:trunk
Diffstat (limited to 'src/com/itmill')
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/AccordionExample.java38
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java9
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java9
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java28
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java46
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/FormExample.java206
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/GeneratedColumnExample.java556
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java14
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java41
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java22
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java13
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java13
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java9
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java45
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java11
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java17
-rw-r--r--src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java56
17 files changed, 987 insertions, 146 deletions
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/AccordionExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/AccordionExample.java
new file mode 100644
index 0000000000..f5e81ba9d5
--- /dev/null
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/AccordionExample.java
@@ -0,0 +1,38 @@
+package com.itmill.toolkit.automatedtests.featurebrowser;
+
+import com.itmill.toolkit.ui.Accordion;
+import com.itmill.toolkit.ui.CustomComponent;
+import com.itmill.toolkit.ui.Label;
+import com.itmill.toolkit.ui.TextField;
+import com.itmill.toolkit.ui.VerticalLayout;
+
+/**
+ * Accordion is a derivative of TabSheet, a vertical tabbed layout that places
+ * the tab contents between the vertical tabs.
+ */
+public class AccordionExample extends CustomComponent {
+ public AccordionExample() {
+ // Create a new accordion
+ final Accordion accordion = new Accordion();
+ setCompositionRoot(accordion);
+
+ // Add a few tabs to the accordion.
+ for (int i = 0; i < 5; i++) {
+ // Create a root component for a accordion tab
+ VerticalLayout layout = new VerticalLayout();
+ accordion.addComponent(layout);
+
+ // The accordion tab label is taken from the caption of the root
+ // component. Notice that layouts can have a caption too.
+ layout.setCaption("Tab " + (i + 1));
+
+ // Add some components in each accordion tab
+ Label label = new Label("These are the contents of Tab " + (i + 1)
+ + ".");
+ layout.addComponent(label);
+
+ TextField textfield = new TextField("Some text field");
+ layout.addComponent(textfield);
+ }
+ }
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java
index 5f73b3fc43..bf61a443c6 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java
@@ -9,10 +9,11 @@ import com.itmill.toolkit.terminal.ThemeResource;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CheckBox;
import com.itmill.toolkit.ui.CustomComponent;
+import com.itmill.toolkit.ui.HorizontalLayout;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.Link;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
+import com.itmill.toolkit.ui.VerticalLayout;
import com.itmill.toolkit.ui.Button.ClickEvent;
/**
@@ -25,12 +26,12 @@ public class ButtonExample extends CustomComponent implements
public ButtonExample() {
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
- final OrderedLayout horiz = new OrderedLayout(
- OrderedLayout.ORIENTATION_HORIZONTAL);
+ final HorizontalLayout horiz = new HorizontalLayout();
+ horiz.setWidth("100%");
main.addComponent(horiz);
final Panel basic = new Panel("Basic buttons");
basic.setStyleName(Panel.STYLE_LIGHT);
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java
index 42199b1cd1..6cddcd29dc 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java
@@ -9,8 +9,8 @@ import com.itmill.toolkit.terminal.PaintTarget;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.Layout;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.TabSheet;
+import com.itmill.toolkit.ui.VerticalLayout;
/**
* This example is a (simple) demonstration of client-side caching. The content
@@ -32,7 +32,7 @@ public class ClientCachingExample extends CustomComponent {
public ClientCachingExample() {
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
@@ -41,7 +41,7 @@ public class ClientCachingExample extends CustomComponent {
final TabSheet ts = new TabSheet();
main.addComponent(ts);
- Layout layout = new OrderedLayout();
+ Layout layout = new VerticalLayout();
layout.setMargin(true);
Label l = new Label("This is a normal label, quick to render.");
l.setCaption("A normal label");
@@ -49,9 +49,10 @@ public class ClientCachingExample extends CustomComponent {
ts.addTab(layout, "Normal", null);
- layout = new OrderedLayout();
+ layout = new VerticalLayout();
layout.setMargin(true);
l = new Label("Slow label - until cached client side.") {
+ @Override
public void paintContent(PaintTarget target) throws PaintException {
try {
Thread.sleep(3000);
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java
index 2134c8cff3..22f7d103f4 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java
@@ -4,11 +4,15 @@
package com.itmill.toolkit.automatedtests.featurebrowser;
+import java.net.MalformedURLException;
+import java.net.URL;
+
import com.itmill.toolkit.data.Property.ValueChangeEvent;
import com.itmill.toolkit.terminal.ExternalResource;
import com.itmill.toolkit.ui.Embedded;
-import com.itmill.toolkit.ui.ExpandLayout;
import com.itmill.toolkit.ui.Select;
+import com.itmill.toolkit.ui.VerticalLayout;
+import com.itmill.toolkit.ui.Window.Notification;
/**
* Demonstrates the use of Embedded and "suggesting" Select by creating a simple
@@ -17,7 +21,7 @@ import com.itmill.toolkit.ui.Select;
* @author IT Mill Ltd.
* @see com.itmill.toolkit.ui.Window
*/
-public class EmbeddedBrowserExample extends ExpandLayout implements
+public class EmbeddedBrowserExample extends VerticalLayout implements
Select.ValueChangeListener {
// Default URL to open.
@@ -54,21 +58,33 @@ public class EmbeddedBrowserExample extends ExpandLayout implements
select.addListener(this);
select.setValue(urls[0]);
+ select.setWidth("100%");
+
// configure the embedded and add to layout
emb.setType(Embedded.TYPE_BROWSER);
+ emb.setSizeFull();
addComponent(emb);
// make the embedded as large as possible
- expand(emb);
+ setExpandRatio(emb, 1);
}
public void valueChange(ValueChangeEvent event) {
final String url = (String) event.getProperty().getValue();
if (url != null) {
- // the selected url has changed, let's go there
- emb.setSource(new ExternalResource(url));
+ try {
+ // the selected url has changed, let's go there
+ @SuppressWarnings("unused")
+ URL u = new URL(url);
+ emb.setSource(new ExternalResource(url));
+
+ } catch (MalformedURLException e) {
+ getWindow().showNotification("Invalid address",
+ e.getMessage() + " (example: http://www.itmill.com)",
+ Notification.TYPE_WARNING_MESSAGE);
+ }
+
}
}
-
}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java
index 4eb7f9e321..499aa60f15 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java
@@ -5,6 +5,7 @@
package com.itmill.toolkit.automatedtests.featurebrowser;
import java.util.HashMap;
+import java.util.Iterator;
import com.itmill.toolkit.data.Item;
import com.itmill.toolkit.data.Property;
@@ -17,15 +18,15 @@ import com.itmill.toolkit.ui.AbstractSelect;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.Component;
import com.itmill.toolkit.ui.Embedded;
-import com.itmill.toolkit.ui.ExpandLayout;
+import com.itmill.toolkit.ui.HorizontalLayout;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.Layout;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Select;
import com.itmill.toolkit.ui.SplitPanel;
import com.itmill.toolkit.ui.TabSheet;
import com.itmill.toolkit.ui.Table;
import com.itmill.toolkit.ui.Tree;
+import com.itmill.toolkit.ui.VerticalLayout;
import com.itmill.toolkit.ui.Window;
import com.itmill.toolkit.ui.Button.ClickEvent;
@@ -72,8 +73,11 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
{ "Getting started", "Choices, choices",
"Some variations of simple selects", SelectExample.class },
// Layouts
- { "Getting started", "Layouts", "Laying out components",
+ { "Layouts", "Basic layouts", "Laying out components",
LayoutExample.class },
+ // Layouts
+ { "Layouts", "Accordion", "Play the Accordion!",
+ AccordionExample.class },
// Wrangling data: ComboBox
{ "Wrangling data", "ComboBox", "ComboBox - the swiss army select",
ComboBoxExample.class },
@@ -83,6 +87,9 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
"Table (\"grid\")",
"Table with bells, whistles, editmode and actions (contextmenu)",
TableExample.class },
+ // Wrangling data: Form
+ { "Wrangling data", "Form", "Every application needs forms",
+ FormExample.class },
// Wrangling data: Tree
{ "Wrangling data", "Tree", "A hierarchy of things",
TreeExample.class },
@@ -105,6 +112,7 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
// END
};
+ @Override
public void init() {
// Need to set a theme for ThemeResources to work
@@ -158,6 +166,12 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
tree.addListener(this);
tree.setImmediate(true);
tree.expandItemsRecursively(rootId);
+ for (Iterator i = container.getItemIds().iterator(); i.hasNext();) {
+ Object id = i.next();
+ if (container.getChildren(id) == null) {
+ tree.setChildrenAllowed(id, false);
+ }
+ }
split.addComponent(tree);
@@ -185,25 +199,25 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
table.setImmediate(true);
split2.addComponent(table);
- final ExpandLayout exp = new ExpandLayout();
+ final VerticalLayout exp = new VerticalLayout();
+ exp.setSizeFull();
exp.setMargin(true);
split2.addComponent(exp);
- final OrderedLayout wbLayout = new OrderedLayout(
- OrderedLayout.ORIENTATION_HORIZONTAL);
+ final HorizontalLayout wbLayout = new HorizontalLayout();
Button b = new Button("Open in sub-window", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
Component component = (Component) ts.getComponentIterator()
.next();
String caption = ts.getTabCaption(component);
try {
- component = (Component) component.getClass().newInstance();
+ component = component.getClass().newInstance();
} catch (Exception e) {
// Could not create
return;
}
Window w = new Window(caption);
- w.setWidth(640);
+ w.setWidth("640px");
if (Layout.class.isAssignableFrom(component.getClass())) {
w.setLayout((Layout) component);
} else {
@@ -223,8 +237,7 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
Window w = getWindow(caption);
if (w == null) {
try {
- component = (Component) component.getClass()
- .newInstance();
+ component = component.getClass().newInstance();
} catch (final Exception e) {
// Could not create
return;
@@ -246,22 +259,22 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
wbLayout.addComponent(b);
exp.addComponent(wbLayout);
- exp.setComponentAlignment(wbLayout, OrderedLayout.ALIGNMENT_RIGHT,
- OrderedLayout.ALIGNMENT_TOP);
+ exp.setComponentAlignment(wbLayout, VerticalLayout.ALIGNMENT_RIGHT,
+ VerticalLayout.ALIGNMENT_TOP);
ts = new TabSheet();
ts.setSizeFull();
ts.addTab(new Label(""), "Choose example", null);
exp.addComponent(ts);
- exp.expand(ts);
+ exp.setExpandRatio(ts, 1);
final Label status = new Label(
"<a href=\"http://www.itmill.com/developers/\">Developer Area</a>"
+ " | <a href=\"http://www.itmill.com/documentation/\">Documentation</a>");
status.setContentMode(Label.CONTENT_XHTML);
exp.addComponent(status);
- exp.setComponentAlignment(status, OrderedLayout.ALIGNMENT_RIGHT,
- OrderedLayout.ALIGNMENT_VERTICAL_CENTER);
+ exp.setComponentAlignment(status, VerticalLayout.ALIGNMENT_RIGHT,
+ VerticalLayout.ALIGNMENT_VERTICAL_CENTER);
// select initial section ("All")
tree.setValue(rootId);
@@ -298,6 +311,9 @@ public class FeatureBrowser extends com.itmill.toolkit.Application implements
public void valueChange(ValueChangeEvent event) {
if (event.getProperty() == tree) {
final Object id = tree.getValue();
+ if (id == null) {
+ return;
+ }
final Item item = tree.getItem(id);
//
String newSection;
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/FormExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/FormExample.java
new file mode 100644
index 0000000000..90ce0237c7
--- /dev/null
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/FormExample.java
@@ -0,0 +1,206 @@
+package com.itmill.toolkit.automatedtests.featurebrowser;
+
+import com.itmill.toolkit.data.Item;
+import com.itmill.toolkit.data.Validator;
+import com.itmill.toolkit.data.util.BeanItem;
+import com.itmill.toolkit.ui.BaseFieldFactory;
+import com.itmill.toolkit.ui.Button;
+import com.itmill.toolkit.ui.Component;
+import com.itmill.toolkit.ui.CustomComponent;
+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.Button.ClickEvent;
+
+/**
+ * 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 custom field editors using a
+ * FieldFactory, customizing the form without FieldFactory, buffering
+ * (commit/discard) and validation. Please note that the example is quite a bit
+ * more complex than real use, as it tries to demonstrate more features than
+ * needed in general case.
+ */
+public class FormExample extends CustomComponent {
+
+ static final String cities[] = { "Amsterdam", "Berlin", "Helsinki",
+ "Hong Kong", "London", "Luxemburg", "New York", "Oslo", "Paris",
+ "Rome", "Stockholm", "Tokyo", "Turku" };
+
+ /** Compose the demo. */
+ public FormExample() {
+
+ // Example data model
+ final Address dataModel = new Address();
+ Button peekDataModelState = new Button("Show the data model state",
+ new Button.ClickListener() {
+
+ public void buttonClick(ClickEvent event) {
+ getWindow().showNotification(
+ dataModel.getAddressAsText());
+ }
+ });
+
+ // Example form
+ final AddressForm form = new AddressForm("Contact Information");
+ form.setDataSource(dataModel);
+ form
+ .setDescription("Please enter valid name and address. Fields marked with * are required. "
+ + "If you try to commit with invalid values, a form error message is displayed. "
+ + "(Address is required but failing to give it a value does not display an error.)");
+
+ // Layout the example
+ VerticalLayout root = new VerticalLayout();
+ root.setMargin(true);
+ root.setSpacing(true);
+ root.addComponent(form);
+ root.addComponent(peekDataModelState);
+ setCompositionRoot(root);
+ }
+
+ public static class AddressForm extends Form {
+ public AddressForm(String caption) {
+
+ setCaption(caption);
+
+ // Use custom field factory to modify the defaults on how the
+ // components are created
+ setFieldFactory(new MyFieldFactory());
+
+ // Add Commit and Discard controls to the form.
+ Button commit = new Button("Save", this, "commit");
+ Button discard = new Button("Reset", this, "discard");
+ HorizontalLayout footer = new HorizontalLayout();
+ footer.addComponent(commit);
+ footer.addComponent(discard);
+ setFooter(footer);
+ }
+
+ public void setDataSource(Address dataModel) {
+
+ // Set the form to edit given datamodel by converting pojo used as
+ // the datamodel to Item
+ setItemDataSource(new BeanItem(dataModel));
+
+ // Ensure that the fields are shown in correct order as the
+ // datamodel does not force any specific order.
+ setVisibleItemProperties(new String[] { "name", "streetAddress",
+ "postalCode", "city" });
+
+ // For examples sake, customize some of the form fields directly
+ // here. The alternative way is to use custom field factory as shown
+ // above.
+ getField("name").setRequired(true);
+ getField("name").setRequiredError("Name is missing");
+ getField("streetAddress").setRequired(true); // No error message
+ getField("postalCode").setRequired(true); // No error message
+ replaceWithSelect("city", cities, cities).setNewItemsAllowed(true);
+
+ // Set the form to act immediately on user input. This is
+ // automatically transports data between the client and the server
+ // to do server-side validation.
+ setImmediate(true);
+
+ // Enable buffering so that commit() must be called for the form
+ // before input is written to the data. (Form input is not written
+ // immediately through to the underlying object.)
+ setWriteThrough(false);
+ }
+ }
+
+ /**
+ * This is example on how to customize field creation. Any kind of field
+ * components could be created on the fly.
+ */
+ static class MyFieldFactory extends BaseFieldFactory {
+
+ @Override
+ public Field createField(Item item, Object propertyId,
+ Component uiContext) {
+
+ Field field = super.createField(item, propertyId, uiContext);
+
+ if ("postalCode".equals(propertyId)) {
+ ((TextField) field).setColumns(5);
+ field.addValidator(new PostalCodeValidator());
+ }
+
+ return field;
+ }
+
+ }
+
+ /**
+ * This is an example of how to create a custom validator for automatic
+ * input validation.
+ */
+ static class PostalCodeValidator implements Validator {
+
+ public boolean isValid(Object value) {
+ if (value == null || !(value instanceof String)) {
+ return false;
+ }
+
+ return ((String) value).matches("[0-9]{5}");
+ }
+
+ public void validate(Object value) throws InvalidValueException {
+ if (!isValid(value)) {
+ throw new InvalidValueException(
+ "Postal code must be a five digit number.");
+ }
+ }
+ }
+
+ /**
+ * Contact information data model created as POJO. Note that in many cases
+ * it would be a good idea to implement Item -interface for the datamodel to
+ * make it directly bindable to form (without BeanItem wrapper)
+ */
+ public static class Address {
+ String name = "";
+ String streetAddress = "";
+ String postalCode = "";
+ String city;
+
+ public String getAddressAsText() {
+ return name + "\n" + streetAddress + "\n" + postalCode + " "
+ + (city == null ? "" : city);
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setStreetAddress(String address) {
+ streetAddress = address;
+ }
+
+ public String getStreetAddress() {
+ return streetAddress;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getCity() {
+ return city;
+ }
+ }
+
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/GeneratedColumnExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/GeneratedColumnExample.java
new file mode 100644
index 0000000000..6052d96642
--- /dev/null
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/GeneratedColumnExample.java
@@ -0,0 +1,556 @@
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.featurebrowser;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.GregorianCalendar;
+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.Container.Indexed;
+import com.itmill.toolkit.data.util.BeanItem;
+import com.itmill.toolkit.ui.AbstractField;
+import com.itmill.toolkit.ui.BaseFieldFactory;
+import com.itmill.toolkit.ui.CheckBox;
+import com.itmill.toolkit.ui.Component;
+import com.itmill.toolkit.ui.CustomComponent;
+import com.itmill.toolkit.ui.Field;
+import com.itmill.toolkit.ui.Label;
+import com.itmill.toolkit.ui.Table;
+import com.itmill.toolkit.ui.VerticalLayout;
+import com.itmill.toolkit.ui.Button.ClickEvent;
+import com.itmill.toolkit.ui.Button.ClickListener;
+
+/**
+ * This example demonstrates the use of generated columns in a table. Generated
+ * columns can be used for formatting values or calculating them from other
+ * columns (or properties of the items).
+ *
+ * For the data model, we use POJOs bound to a custom Container with BeanItem
+ * items.
+ *
+ * @author magi
+ */
+public class GeneratedColumnExample extends CustomComponent {
+ /**
+ * The business model: fill-up at a gas station.
+ */
+ public class FillUp {
+ Date date;
+ double quantity;
+ double total;
+
+ public FillUp() {
+ }
+
+ public FillUp(int day, int month, int year, double quantity,
+ double total) {
+ date = new GregorianCalendar(year, month - 1, day).getTime();
+ this.quantity = quantity;
+ this.total = total;
+ }
+
+ /** Calculates price per unit of quantity (€/l). */
+ public double price() {
+ if (quantity != 0.0) {
+ return total / quantity;
+ } else {
+ return 0.0;
+ }
+ }
+
+ /** Calculates average daily consumption between two fill-ups. */
+ public double dailyConsumption(FillUp other) {
+ double difference_ms = date.getTime() - other.date.getTime();
+ double days = difference_ms / 1000 / 3600 / 24;
+ if (days < 0.5) {
+ days = 1.0; // Avoid division by zero if two fill-ups on the
+ // same day.
+ }
+ return quantity / days;
+ }
+
+ /** Calculates average daily consumption between two fill-ups. */
+ public double dailyCost(FillUp other) {
+ return price() * dailyConsumption(other);
+ }
+
+ // Getters and setters
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public double getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(double quantity) {
+ this.quantity = quantity;
+ }
+
+ public double getTotal() {
+ return total;
+ }
+
+ public void setTotal(double total) {
+ this.total = total;
+ }
+ };
+
+ /**
+ * This is a custom container that allows adding BeanItems inside it. The
+ * BeanItem objects must be bound to an object. The item ID is an Integer
+ * from 0 to 99.
+ *
+ * Most of the interface methods are implemented with just dummy
+ * implementations, as they are not needed in this example.
+ */
+ public class MySimpleIndexedContainer implements Container, Indexed {
+ Vector items;
+ Object itemtemplate;
+
+ public MySimpleIndexedContainer(Object itemtemplate) {
+ this.itemtemplate = itemtemplate;
+ items = new Vector(); // Yeah this is just a test
+ }
+
+ public boolean addContainerProperty(Object propertyId, Class type,
+ Object defaultValue) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
+ }
+
+ public Item addItem(Object itemId) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object addItem() throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This addItem method is specific for this container and allows adding
+ * BeanItem objects. The BeanItems must be bound to MyBean objects.
+ */
+ public void addItem(BeanItem item) throws UnsupportedOperationException {
+ items.add(item);
+ }
+
+ public boolean containsId(Object itemId) {
+ if (itemId instanceof Integer) {
+ int pos = ((Integer) itemId).intValue();
+ if (pos >= 0 && pos < items.size()) {
+ return items.get(pos) != null;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * The Table will call this method to get the property objects for the
+ * columns. It uses the property objects to determine the data types of
+ * the columns.
+ */
+ public Property getContainerProperty(Object itemId, Object propertyId) {
+ if (itemId instanceof Integer) {
+ int pos = ((Integer) itemId).intValue();
+ if (pos >= 0 && pos < items.size()) {
+ Item item = (Item) items.get(pos);
+
+ // The BeanItem provides the property objects for the items.
+ return item.getItemProperty(propertyId);
+ }
+ }
+ return null;
+ }
+
+ /** Table calls this to get the column names. */
+ public Collection getContainerPropertyIds() {
+ Item item = new BeanItem(itemtemplate);
+
+ // The BeanItem knows how to get the property names from the bean.
+ return item.getItemPropertyIds();
+ }
+
+ public Item getItem(Object itemId) {
+ if (itemId instanceof Integer) {
+ int pos = ((Integer) itemId).intValue();
+ if (pos >= 0 && pos < items.size()) {
+ return (Item) items.get(pos);
+ }
+ }
+ return null;
+ }
+
+ public Collection getItemIds() {
+ Vector ids = new Vector(items.size());
+ for (int i = 0; i < items.size(); i++) {
+ ids.add(Integer.valueOf(i));
+ }
+ return ids;
+ }
+
+ public Class getType(Object propertyId) {
+ return BeanItem.class;
+ }
+
+ public boolean removeAllItems() throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean removeContainerProperty(Object propertyId)
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean removeItem(Object itemId)
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
+ }
+
+ public int size() {
+ return items.size();
+ }
+
+ public Object addItemAt(int index) throws UnsupportedOperationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Item addItemAt(int index, Object newItemId)
+ throws UnsupportedOperationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Object getIdByIndex(int index) {
+ return Integer.valueOf(index);
+ }
+
+ public int indexOfId(Object itemId) {
+ return ((Integer) itemId).intValue();
+ }
+
+ public Object addItemAfter(Object previousItemId)
+ throws UnsupportedOperationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Item addItemAfter(Object previousItemId, Object newItemId)
+ throws UnsupportedOperationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Object firstItemId() {
+ return new Integer(0);
+ }
+
+ public boolean isFirstId(Object itemId) {
+ return ((Integer) itemId).intValue() == 0;
+ }
+
+ public boolean isLastId(Object itemId) {
+ return ((Integer) itemId).intValue() == (items.size() - 1);
+ }
+
+ public Object lastItemId() {
+ return new Integer(items.size() - 1);
+ }
+
+ public Object nextItemId(Object itemId) {
+ int pos = indexOfId(itemId);
+ if (pos >= items.size() - 1) {
+ return null;
+ }
+ return getIdByIndex(pos + 1);
+ }
+
+ public Object prevItemId(Object itemId) {
+ int pos = indexOfId(itemId);
+ if (pos <= 0) {
+ return null;
+ }
+ return getIdByIndex(pos - 1);
+ }
+ }
+
+ /** Formats the dates in a column containing Date objects. */
+ class DateColumnGenerator implements Table.ColumnGenerator {
+ /**
+ * Generates the cell containing the Date value. The column is
+ * irrelevant in this use case.
+ */
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ Property prop = source.getItem(itemId).getItemProperty(columnId);
+ if (prop.getType().equals(Date.class)) {
+ Label label = new Label(String.format("%tF",
+ new Object[] { (Date) prop.getValue() }));
+ label.addStyleName("column-type-date");
+ return label;
+ }
+
+ return null;
+ }
+ }
+
+ /** Formats the value in a column containing Double objects. */
+ class ValueColumnGenerator implements Table.ColumnGenerator {
+ String format; /* Format string for the Double values. */
+
+ /** Creates double value column formatter with the given format string. */
+ public ValueColumnGenerator(String format) {
+ this.format = format;
+ }
+
+ /**
+ * Generates the cell containing the Double value. The column is
+ * irrelevant in this use case.
+ */
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ Property prop = source.getItem(itemId).getItemProperty(columnId);
+ if (prop.getType().equals(Double.class)) {
+ Label label = new Label(String.format(format,
+ new Object[] { (Double) prop.getValue() }));
+
+ // Set styles for the column: one indicating that it's a value
+ // and a more
+ // specific one with the column name in it. This assumes that
+ // the column
+ // name is proper for CSS.
+ label.addStyleName("column-type-value");
+ label.addStyleName("column-" + (String) columnId);
+ return label;
+ }
+ return null;
+ }
+ }
+
+ /** Table column generator for calculating price column. */
+ class PriceColumnGenerator implements Table.ColumnGenerator {
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ // Retrieve the item.
+ BeanItem item = (BeanItem) source.getItem(itemId);
+
+ // Retrieves the underlying POJO from the item.
+ FillUp fillup = (FillUp) item.getBean();
+
+ // Do the business logic
+ double price = fillup.price();
+
+ // Create the generated component for displaying the calcucated
+ // value.
+ Label label = new Label(String.format("%1.2f €",
+ new Object[] { new Double(price) }));
+
+ // We set the style here. You can't use a CellStyleGenerator for
+ // generated columns.
+ label.addStyleName("column-price");
+ return label;
+ }
+ }
+
+ /** Table column generator for calculating consumption column. */
+ class ConsumptionColumnGenerator implements Table.ColumnGenerator {
+ /**
+ * Generates a cell containing value calculated from the item.
+ */
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ Indexed indexedSource = (Indexed) source.getContainerDataSource();
+
+ // Can not calculate consumption for the first item.
+ if (indexedSource.isFirstId(itemId)) {
+ Label label = new Label("N/A");
+ label.addStyleName("column-consumption");
+ return label;
+ }
+
+ // Index of the previous item.
+ Object prevItemId = indexedSource.prevItemId(itemId);
+
+ // Retrieve the POJOs.
+ FillUp fillup = (FillUp) ((BeanItem) indexedSource.getItem(itemId))
+ .getBean();
+ FillUp prev = (FillUp) ((BeanItem) source.getItem(prevItemId))
+ .getBean();
+
+ // Do the business logic
+ return generateCell(fillup, prev);
+ }
+
+ public Component generateCell(FillUp fillup, FillUp prev) {
+ double consumption = fillup.dailyConsumption(prev);
+
+ // Generate the component for displaying the calculated value.
+ Label label = new Label(String.format("%3.2f l",
+ new Object[] { new Double(consumption) }));
+
+ // We set the style here. You can't use a CellStyleGenerator for
+ // generated columns.
+ label.addStyleName("column-consumption");
+ return label;
+ }
+ }
+
+ /** Table column generator for calculating daily cost column. */
+ class DailyCostColumnGenerator extends ConsumptionColumnGenerator {
+ @Override
+ public Component generateCell(FillUp fillup, FillUp prev) {
+ double dailycost = fillup.dailyCost(prev);
+
+ // Generate the component for displaying the calculated value.
+ Label label = new Label(String.format("%3.2f €",
+ new Object[] { new Double(dailycost) }));
+
+ // We set the style here. You can't use a CellStyleGenerator for
+ // generated columns.
+ label.addStyleName("column-dailycost");
+ return label;
+ }
+ }
+
+ /**
+ * Custom field factory that sets the fields as immediate.
+ */
+ public class ImmediateFieldFactory extends BaseFieldFactory {
+ @Override
+ public Field createField(Class type, Component uiContext) {
+ // Let the BaseFieldFactory create the fields
+ Field field = super.createField(type, uiContext);
+
+ // ...and just set them as immediate
+ ((AbstractField) field).setImmediate(true);
+
+ return field;
+ }
+ }
+
+ public GeneratedColumnExample() {
+ final Table table = new Table();
+
+ // Define table columns. These include also the column for the generated
+ // column, because we want to set the column label to something
+ // different than the property ID.
+ table
+ .addContainerProperty("date", Date.class, null, "Date", null,
+ null);
+ table.addContainerProperty("quantity", Double.class, null,
+ "Quantity (l)", null, null);
+ table.addContainerProperty("price", Double.class, null, "Price (€/l)",
+ null, null);
+ table.addContainerProperty("total", Double.class, null, "Total (€)",
+ null, null);
+ table.addContainerProperty("consumption", Double.class, null,
+ "Consumption (l/day)", null, null);
+ table.addContainerProperty("dailycost", Double.class, null,
+ "Daily Cost (€/day)", null, null);
+
+ // Define the generated columns and their generators.
+ table.addGeneratedColumn("date", new DateColumnGenerator());
+ table
+ .addGeneratedColumn("quantity", new ValueColumnGenerator(
+ "%.2f l"));
+ table.addGeneratedColumn("price", new PriceColumnGenerator());
+ table.addGeneratedColumn("total", new ValueColumnGenerator("%.2f €"));
+ table.addGeneratedColumn("consumption",
+ new ConsumptionColumnGenerator());
+ table.addGeneratedColumn("dailycost", new DailyCostColumnGenerator());
+
+ // Create a data source and bind it to the table.
+ MySimpleIndexedContainer data = new MySimpleIndexedContainer(
+ new FillUp());
+ table.setContainerDataSource(data);
+
+ // Generated columns are automatically placed after property columns, so
+ // we have to set the order of the columns explicitly.
+ table.setVisibleColumns(new Object[] { "date", "quantity", "price",
+ "total", "consumption", "dailycost" });
+
+ // Add some data.
+ data.addItem(new BeanItem(new FillUp(19, 2, 2005, 44.96, 51.21)));
+ data.addItem(new BeanItem(new FillUp(30, 3, 2005, 44.91, 53.67)));
+ data.addItem(new BeanItem(new FillUp(20, 4, 2005, 42.96, 49.06)));
+ data.addItem(new BeanItem(new FillUp(23, 5, 2005, 47.37, 55.28)));
+ data.addItem(new BeanItem(new FillUp(6, 6, 2005, 35.34, 41.52)));
+ data.addItem(new BeanItem(new FillUp(30, 6, 2005, 16.07, 20.00)));
+ data.addItem(new BeanItem(new FillUp(2, 7, 2005, 36.40, 36.19)));
+ data.addItem(new BeanItem(new FillUp(6, 7, 2005, 39.17, 50.90)));
+ data.addItem(new BeanItem(new FillUp(27, 7, 2005, 43.43, 53.03)));
+ data.addItem(new BeanItem(new FillUp(17, 8, 2005, 20, 29.18)));
+ data.addItem(new BeanItem(new FillUp(30, 8, 2005, 46.06, 59.09)));
+ data.addItem(new BeanItem(new FillUp(22, 9, 2005, 46.11, 60.36)));
+ data.addItem(new BeanItem(new FillUp(14, 10, 2005, 41.51, 50.19)));
+ data.addItem(new BeanItem(new FillUp(12, 11, 2005, 35.24, 40.00)));
+ data.addItem(new BeanItem(new FillUp(28, 11, 2005, 45.26, 53.27)));
+
+ // Have a check box that allows the user to make the quantity
+ // and total columns editable.
+ final CheckBox editable = new CheckBox(
+ "Edit the input values - calculated columns are regenerated");
+ editable.setImmediate(true);
+ editable.addListener(new ClickListener() {
+ public void buttonClick(ClickEvent event) {
+ table.setEditable(editable.booleanValue());
+
+ // The columns may not be generated when we want to have them
+ // editable.
+ if (editable.booleanValue()) {
+ table.removeGeneratedColumn("quantity");
+ table.removeGeneratedColumn("total");
+ } else {
+ // In non-editable mode we want to show the formatted
+ // values.
+ table.addGeneratedColumn("quantity",
+ new ValueColumnGenerator("%.2f l"));
+ table.addGeneratedColumn("total", new ValueColumnGenerator(
+ "%.2f €"));
+ }
+ // The visible columns are affected by removal and addition of
+ // generated columns so we have to redefine them.
+ table.setVisibleColumns(new Object[] { "date", "quantity",
+ "price", "total", "consumption", "dailycost" });
+ }
+ });
+
+ // Use a custom field factory to set the edit fields as immediate.
+ // This is used when the table is in editable mode.
+ table.setFieldFactory(new ImmediateFieldFactory());
+
+ // Setting the table itself as immediate has no relevance in this
+ // example,
+ // because it is relevant only if the table is selectable and we want to
+ // get the selection changes immediately.
+ table.setImmediate(true);
+
+ table.setHeight("300px");
+
+ VerticalLayout layout = new VerticalLayout();
+ layout.setMargin(true);
+ layout
+ .addComponent(new Label(
+ "Table with column generators that format and calculate cell values."));
+ layout.addComponent(table);
+ layout.addComponent(editable);
+ layout.addComponent(new Label(
+ "Columns displayed in blue are calculated from Quantity and Total. "
+ + "Others are simply formatted."));
+ layout.setExpandRatio(table, 1);
+ layout.setSizeUndefined();
+ setCompositionRoot(layout);
+ // setSizeFull();
+ }
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java
index 15f4e36777..1f7825d661 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java
@@ -11,8 +11,8 @@ import com.itmill.toolkit.terminal.PaintTarget;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.Label;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.TextField;
+import com.itmill.toolkit.ui.VerticalLayout;
import com.itmill.toolkit.ui.Button.ClickEvent;
/**
@@ -21,15 +21,15 @@ import com.itmill.toolkit.ui.Button.ClickEvent;
*/
public class JavaScriptAPIExample extends CustomComponent {
- public static final String txt = "(more examples will be added here as the APIs are made public)<br/><br/><A href=\"javascript:itmill.forceSync();\">javascript:itmill.forceSync();</A>";
+ public static final String txt = "<p>For advanced client side programmers Toolkit offers a simple method which can be used to force sync client with server. This may be needed for example if another part of a mashup changes things on server.</p> (more examples will be added here as the APIs are made public)<br/><br/><A href=\"javascript:itmill.forceSync();\">javascript:itmill.forceSync();</A>";
- private final OrderedLayout main;
+ private final VerticalLayout main;
private final Label l;
private final TextField editor = new TextField();
public JavaScriptAPIExample() {
// main layout
- main = new OrderedLayout();
+ main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
editor.setRows(7);
@@ -54,8 +54,8 @@ public class JavaScriptAPIExample extends CustomComponent {
}
});
main.addComponent(b);
- main.setComponentAlignment(b, OrderedLayout.ALIGNMENT_RIGHT,
- OrderedLayout.ALIGNMENT_VERTICAL_CENTER);
+ main.setComponentAlignment(b, VerticalLayout.ALIGNMENT_RIGHT,
+ VerticalLayout.ALIGNMENT_VERTICAL_CENTER);
//
Label l = new Label(
@@ -63,6 +63,7 @@ public class JavaScriptAPIExample extends CustomComponent {
+ "The client will be synchronized on reload, when you click a button, "
+ "or when itmill.forceSync() is called.") {
+ @Override
public void paintContent(PaintTarget target) throws PaintException {
super.paintContent(target);
@@ -82,6 +83,7 @@ public class JavaScriptAPIExample extends CustomComponent {
label = l;
}
+ @Override
public void run() {
try {
Thread.sleep(500);
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java
index ec90f37231..0412a85104 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java
@@ -7,7 +7,6 @@ package com.itmill.toolkit.automatedtests.featurebrowser;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.GridLayout;
import com.itmill.toolkit.ui.Label;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
/**
@@ -28,26 +27,19 @@ public class LabelExample extends CustomComponent {
+ " This is an indented row. \n Same indentation here.";
public LabelExample() {
-
- final OrderedLayout main = new OrderedLayout();
- main.setMargin(true);
- setCompositionRoot(main);
-
final GridLayout g = new GridLayout(2, 4);
- main.addComponent(g);
+ g.setMargin(true);
+ setCompositionRoot(g);
+ g.setWidth("100%");
// plain w/o caption
- Panel p = new Panel("Plain");
- p.setDebugId(p.getCaption());
- p.setStyleName(Panel.STYLE_LIGHT);
+ Panel p = getExpamplePanel("Plain");
Label l = new Label("A plain label without caption.");
l.setDebugId("label1");
p.addComponent(l);
g.addComponent(p);
// plain w/ caption
- p = new Panel("Plain w/ caption + tooltip");
- p.setDebugId(p.getCaption());
- p.setStyleName(Panel.STYLE_LIGHT);
+ p = getExpamplePanel("Plain w/ caption + tooltip");
l = new Label("A plain label with caption.");
l.setCaption("Label caption");
l.setDebugId("label2");
@@ -55,34 +47,26 @@ public class LabelExample extends CustomComponent {
p.addComponent(l);
g.addComponent(p);
// plain w/ xhtml
- p = new Panel("Plain w/ XHTML content");
- p.setDebugId(p.getCaption());
- p.setStyleName(Panel.STYLE_LIGHT);
+ p = getExpamplePanel("Plain w/ XHTML content");
l = new Label(xhtml);
l.setDebugId("label3");
p.addComponent(l);
g.addComponent(p);
// xhtml w/ xhtml
- p = new Panel("XHTML-mode w/ XHTML content");
- p.setDebugId(p.getCaption());
- p.setStyleName(Panel.STYLE_LIGHT);
+ p = getExpamplePanel("XHTML-mode w/ XHTML content");
l = new Label(xhtml);
l.setDebugId("label4");
l.setContentMode(Label.CONTENT_XHTML);
p.addComponent(l);
g.addComponent(p);
// plain w/ preformatted
- p = new Panel("Plain w/ preformatted content");
- p.setDebugId(p.getCaption());
- p.setStyleName(Panel.STYLE_LIGHT);
+ p = getExpamplePanel("Plain w/ preformatted content");
l = new Label(pre);
l.setDebugId("label5");
p.addComponent(l);
g.addComponent(p);
// preformatted w/ preformatted
- p = new Panel("Preformatted-mode w/ preformatted content");
- p.setDebugId(p.getCaption());
- p.setStyleName(Panel.STYLE_LIGHT);
+ p = getExpamplePanel("Preformatted-mode w/ preformatted content");
l = new Label(pre);
l.setDebugId("label6");
l.setContentMode(Label.CONTENT_PREFORMATTED);
@@ -90,4 +74,11 @@ public class LabelExample extends CustomComponent {
g.addComponent(p);
}
+
+ private Panel getExpamplePanel(String caption) {
+ Panel p = new Panel(caption);
+ p.setDebugId(p.getCaption());
+ p.addStyleName(Panel.STYLE_LIGHT);
+ return p;
+ }
}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java
index 184e3f1812..5229cfc25e 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java
@@ -6,10 +6,11 @@ package com.itmill.toolkit.automatedtests.featurebrowser;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.GridLayout;
+import com.itmill.toolkit.ui.HorizontalLayout;
import com.itmill.toolkit.ui.Label;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.TabSheet;
+import com.itmill.toolkit.ui.VerticalLayout;
/**
* A few examples of layout possibilities.
@@ -20,11 +21,12 @@ public class LayoutExample extends CustomComponent {
public LayoutExample() {
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
final GridLayout g = new GridLayout(2, 5);
+ g.setWidth("100%");
main.addComponent(g);
// panel
@@ -44,7 +46,7 @@ public class LayoutExample extends CustomComponent {
TabSheet ts = new TabSheet();
g.addComponent(ts, 0, 1, 1, 1);
- OrderedLayout ol = new OrderedLayout();
+ VerticalLayout ol = new VerticalLayout();
ol.setDebugId("VerticalOrderedLayout");
ol.setMargin(true);
ol.addComponent(new Label("Component 1"));
@@ -52,13 +54,13 @@ public class LayoutExample extends CustomComponent {
ol.addComponent(new Label("Component 3"));
ts.addTab(ol, "Vertical OrderedLayout", null);
- ol = new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL);
- ol.setDebugId("HorizontalOrderedLayout");
- ol.setMargin(true);
- ol.addComponent(new Label("Component 1"));
- ol.addComponent(new Label("Component 2"));
- ol.addComponent(new Label("Component 3"));
- ts.addTab(ol, "Horizontal OrderedLayout", null);
+ HorizontalLayout hl = new HorizontalLayout();
+ hl.setDebugId("HorizontalOrderedLayout");
+ hl.setMargin(true);
+ hl.addComponent(new Label("Component 1"));
+ hl.addComponent(new Label("Component 2"));
+ hl.addComponent(new Label("Component 3"));
+ ts.addTab(hl, "Horizontal OrderedLayout", null);
final GridLayout gl = new GridLayout(3, 3);
gl.setDebugId("GridLayout");
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java
index f6518c13e9..30a86e9ad0 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java
@@ -4,16 +4,14 @@
package com.itmill.toolkit.automatedtests.featurebrowser;
-import java.util.Date;
-
import com.itmill.toolkit.data.Item;
import com.itmill.toolkit.ui.AbstractSelect;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.NativeSelect;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.RichTextArea;
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;
import com.itmill.toolkit.ui.Button.ClickListener;
@@ -39,7 +37,9 @@ public class NotificationExample extends CustomComponent {
*/
public NotificationExample() {
// Main layout
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
+ main.setSizeUndefined();
+ main.setSpacing(true);
main.setMargin(true); // use theme-specific margin
setCompositionRoot(main);
@@ -86,11 +86,10 @@ public class NotificationExample extends CustomComponent {
getWindow().showNotification((String) caption.getValue(),
(String) message.getValue(),
((Integer) type.getValue()).intValue());
- getWindow().setCaption(new Date().toString());
}
});
main.addComponent(b);
- main.setComponentAlignment(b, OrderedLayout.ALIGNMENT_RIGHT,
- OrderedLayout.ALIGNMENT_VERTICAL_CENTER);
+ main.setComponentAlignment(b, VerticalLayout.ALIGNMENT_RIGHT,
+ VerticalLayout.ALIGNMENT_VERTICAL_CENTER);
}
}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java
index edc65899f3..1ea2fba00d 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java
@@ -7,8 +7,8 @@ package com.itmill.toolkit.automatedtests.featurebrowser;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.Label;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.RichTextArea;
+import com.itmill.toolkit.ui.VerticalLayout;
import com.itmill.toolkit.ui.Button.ClickEvent;
/**
@@ -23,16 +23,19 @@ public class RichTextExample extends CustomComponent {
+ "See the <A href=\"http://www.itmill.com/documentation/itmill-toolkit-5-reference-manual/\">manual</a> "
+ "for more information.";
- private final OrderedLayout main;
+ private final VerticalLayout main;
private final Label l;
private final RichTextArea editor = new RichTextArea();
private final Button b;
public RichTextExample() {
// main layout
- main = new OrderedLayout();
+ main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
+
+ editor.setWidth("100%");
+
// Add the label
l = new Label(txt);
l.setContentMode(Label.CONTENT_XHTML);
@@ -53,8 +56,8 @@ public class RichTextExample extends CustomComponent {
}
});
main.addComponent(b);
- main.setComponentAlignment(b, OrderedLayout.ALIGNMENT_RIGHT,
- OrderedLayout.ALIGNMENT_VERTICAL_CENTER);
+ main.setComponentAlignment(b, VerticalLayout.ALIGNMENT_RIGHT,
+ VerticalLayout.ALIGNMENT_VERTICAL_CENTER);
}
}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java
index c6369562ad..f1b305a4e2 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java
@@ -9,12 +9,13 @@ import com.itmill.toolkit.ui.AbstractSelect;
import com.itmill.toolkit.ui.ComboBox;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.Field;
+import com.itmill.toolkit.ui.HorizontalLayout;
import com.itmill.toolkit.ui.ListSelect;
import com.itmill.toolkit.ui.NativeSelect;
import com.itmill.toolkit.ui.OptionGroup;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.TwinColSelect;
+import com.itmill.toolkit.ui.VerticalLayout;
/**
* Shows some basic fields for value input; TextField, DateField, Slider...
@@ -31,12 +32,12 @@ public class SelectExample extends CustomComponent {
};
public SelectExample() {
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
- final OrderedLayout horiz = new OrderedLayout(
- OrderedLayout.ORIENTATION_HORIZONTAL);
+ final HorizontalLayout horiz = new HorizontalLayout();
+ horiz.setWidth("100%");
main.addComponent(horiz);
final Panel single = new Panel("Single selects");
single.setStyleName(Panel.STYLE_LIGHT);
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java
index ddfe92acd7..c67a4ef03b 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java
@@ -5,8 +5,6 @@
package com.itmill.toolkit.automatedtests.featurebrowser;
import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
import java.util.Random;
import java.util.Set;
@@ -16,8 +14,10 @@ import com.itmill.toolkit.event.Action;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CheckBox;
import com.itmill.toolkit.ui.CustomComponent;
-import com.itmill.toolkit.ui.OrderedLayout;
+import com.itmill.toolkit.ui.HorizontalLayout;
+import com.itmill.toolkit.ui.TabSheet;
import com.itmill.toolkit.ui.Table;
+import com.itmill.toolkit.ui.VerticalLayout;
import com.itmill.toolkit.ui.Button.ClickEvent;
/**
@@ -52,15 +52,23 @@ public class TableExample extends CustomComponent implements Action.Handler,
Button deselect;
public TableExample() {
+ VerticalLayout margin = new VerticalLayout();
+ margin.setMargin(true);
+
+ TabSheet root = new TabSheet();
+ setCompositionRoot(margin);
+ margin.addComponent(root);
+
// main layout
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
+ root.addComponent(main);
+ main.setCaption("Basic Table");
main.setMargin(true);
- setCompositionRoot(main);
// "source" table with bells & whistlesenabled
source = new Table("All creatures");
source.setPageLength(7);
- source.setWidth(550);
+ source.setWidth("550px");
source.setColumnCollapsingAllowed(true);
source.setColumnReorderingAllowed(true);
source.setSelectable(true);
@@ -72,8 +80,8 @@ public class TableExample extends CustomComponent implements Action.Handler,
source.setDebugId("AllCreatures");
// x-selected button row
- final OrderedLayout horiz = new OrderedLayout(
- OrderedLayout.ORIENTATION_HORIZONTAL);
+ final HorizontalLayout horiz = new HorizontalLayout();
+
horiz.setMargin(false, false, true, false);
main.addComponent(horiz);
saveSelected = new Button("Save selected");
@@ -106,7 +114,7 @@ public class TableExample extends CustomComponent implements Action.Handler,
// "saved" table, minimalistic
saved = new Table("Saved creatures");
saved.setPageLength(5);
- saved.setWidth(550);
+ saved.setWidth("550px");
saved.setSelectable(false);
saved.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN);
saved.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);
@@ -126,6 +134,9 @@ public class TableExample extends CustomComponent implements Action.Handler,
b.setImmediate(true);
main.addComponent(b);
+ GeneratedColumnExample gencols = new GeneratedColumnExample();
+ gencols.setCaption("Generated Columns");
+ root.addComponent(gencols);
}
// set up the properties (columns)
@@ -185,11 +196,9 @@ public class TableExample extends CustomComponent implements Action.Handler,
if (action == ACTION_HIRE) {
// set HIRED property to true
item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE);
- source.requestRepaint();
if (saved.containsId(target)) {
item = saved.getItem(target);
item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE);
- saved.requestRepaint();
}
getWindow().showNotification("Hired", "" + item);
@@ -234,15 +243,7 @@ public class TableExample extends CustomComponent implements Action.Handler,
// loop each selected and copy to "saved" table
final Set selected = (Set) source.getValue();
int s = 0;
-
- // The set can return the items in quite any order, but
- // for testing purposes they always have to be in the
- // same order.
- List ordered = new LinkedList(selected);
- java.util.Collections.sort(ordered);
-
- // Now move the items to the other table
- for (final Iterator it = ordered.iterator(); it.hasNext();) {
+ for (final Iterator it = selected.iterator(); it.hasNext();) {
final Object id = it.next();
if (!saved.containsId(id)) {
final Item item = source.getItem(id);
@@ -261,7 +262,6 @@ public class TableExample extends CustomComponent implements Action.Handler,
}
}
getWindow().showNotification("Saved " + s);
- saved.requestRepaint();
} else if (b == hireSelected) {
// loop each selected and set property HIRED to true
@@ -273,14 +273,12 @@ public class TableExample extends CustomComponent implements Action.Handler,
final Property p = item.getItemProperty(PROPERTY_HIRED);
if (p.getValue() == Boolean.FALSE) {
p.setValue(Boolean.TRUE);
- source.requestRepaint();
s++;
}
if (saved.containsId(id)) {
// also update "saved" table
item = saved.getItem(id);
item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE);
- saved.requestRepaint();
}
}
getWindow().showNotification("Hired " + s);
@@ -294,7 +292,6 @@ public class TableExample extends CustomComponent implements Action.Handler,
if (source.containsId(id)) {
s++;
source.removeItem(id);
- source.requestRepaint();
}
}
getWindow().showNotification("Deleted " + s);
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java
index 496af76842..c2f6e2e930 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java
@@ -10,8 +10,8 @@ import com.itmill.toolkit.data.Property.ValueChangeEvent;
import com.itmill.toolkit.event.Action;
import com.itmill.toolkit.ui.AbstractSelect;
import com.itmill.toolkit.ui.CustomComponent;
+import com.itmill.toolkit.ui.HorizontalLayout;
import com.itmill.toolkit.ui.Label;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.TextField;
import com.itmill.toolkit.ui.Tree;
@@ -37,8 +37,8 @@ public class TreeExample extends CustomComponent implements Action.Handler,
TextField editor;
public TreeExample() {
- final OrderedLayout main = new OrderedLayout(
- OrderedLayout.ORIENTATION_HORIZONTAL);
+ final HorizontalLayout main = new HorizontalLayout();
+ main.setWidth("100%");
main.setDebugId("mainLayout");
main.setMargin(true);
setCompositionRoot(main);
@@ -46,7 +46,7 @@ public class TreeExample extends CustomComponent implements Action.Handler,
// Panel w/ Tree
Panel p = new Panel("Select item");
p.setStyleName(Panel.STYLE_LIGHT);
- p.setWidth(250);
+ p.setWidth("250px");
// Description
p.addComponent(new Label(desc));
// Tree with a few items
@@ -81,6 +81,7 @@ public class TreeExample extends CustomComponent implements Action.Handler,
editor.setColumns(15);
p.addComponent(editor);
main.addComponent(p);
+ main.setExpandRatio(p, 1);
}
public Action[] getActions(Object target, Object sender) {
@@ -153,7 +154,9 @@ public class TreeExample extends CustomComponent implements Action.Handler,
final Property p = item.getItemProperty(CAPTION_PROPERTY);
p.setValue(caption);
if (parent != null) {
+ tree.setChildrenAllowed(parent, true);
tree.setParent(id, parent);
+ tree.setChildrenAllowed(id, false);
}
return id;
}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java
index 8704d6f347..e291499adc 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java
@@ -10,11 +10,12 @@ import com.itmill.toolkit.data.Property.ValueChangeEvent;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.DateField;
import com.itmill.toolkit.ui.Field;
+import com.itmill.toolkit.ui.HorizontalLayout;
import com.itmill.toolkit.ui.InlineDateField;
-import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.Slider;
import com.itmill.toolkit.ui.TextField;
+import com.itmill.toolkit.ui.VerticalLayout;
import com.itmill.toolkit.ui.Window.Notification;
/**
@@ -25,7 +26,7 @@ import com.itmill.toolkit.ui.Window.Notification;
public class ValueInputExample extends CustomComponent {
public ValueInputExample() {
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
@@ -39,8 +40,8 @@ public class ValueInputExample extends CustomComponent {
};
// TextField
- OrderedLayout horiz = new OrderedLayout(
- OrderedLayout.ORIENTATION_HORIZONTAL);
+ HorizontalLayout horiz = new HorizontalLayout();
+ horiz.setWidth("100%");
main.addComponent(horiz);
Panel left = new Panel("TextField");
left.setStyleName(Panel.STYLE_LIGHT);
@@ -65,10 +66,9 @@ public class ValueInputExample extends CustomComponent {
right.addComponent(tf);
// DateFields
-
Date d = new Date(98, 1, 22, 13, 14, 15);
-
- horiz = new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL);
+ horiz = new HorizontalLayout();
+ horiz.setWidth("100%");
main.addComponent(horiz);
left = new Panel("DateField");
left.setStyleName(Panel.STYLE_LIGHT);
@@ -123,7 +123,7 @@ public class ValueInputExample extends CustomComponent {
// int slider
Slider slider = new Slider(0, 100);
slider.setDebugId("Slider1");
- slider.setSize(300);
+ slider.setWidth("300px");
slider.setImmediate(true);
slider.addListener(new Slider.ValueChangeListener() {
public void valueChange(ValueChangeEvent event) {
@@ -140,6 +140,7 @@ public class ValueInputExample extends CustomComponent {
left.addComponent(slider);
// double slider
slider = new Slider(0.0, 1.0, 1);
+ slider.setOrientation(Slider.ORIENTATION_VERTICAL);
slider.setDebugId("Slider2");
slider.setImmediate(true);
slider.addListener(new Slider.ValueChangeListener() {
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java
index 9da87d87a6..6c46853dca 100644
--- a/src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java
+++ b/src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java
@@ -10,7 +10,7 @@ import com.itmill.toolkit.terminal.ExternalResource;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.Label;
-import com.itmill.toolkit.ui.OrderedLayout;
+import com.itmill.toolkit.ui.VerticalLayout;
import com.itmill.toolkit.ui.Window;
import com.itmill.toolkit.ui.Button.ClickEvent;
@@ -20,16 +20,16 @@ import com.itmill.toolkit.ui.Button.ClickEvent;
*/
public class WindowingExample extends CustomComponent {
- public static final String txt = "<p>There are two main types of windows: application-level windows, and"
- + "\"subwindows\". </p><p> A subwindow is rendered as a \"inline\" popup window"
+ public static final String txt = "<p>There are two main types of windows: application-level windows, and "
+ + "\"sub windows\".</p><p>A sub window is rendered as a \"inline\" popup window"
+ " within the (native) browser window to which it was added. You can create"
- + " a subwindow by creating a new Window and adding it to a application-level window, for instance"
+ + " a sub window by creating a new Window and adding it to a application-level window, for instance"
+ " your main window. </p><p> In contrast, you create a application-level window by"
+ " creating a new Window and adding it to the Application. Application-level"
+ " windows are not shown by default - you need to open a browser window for"
+ " the url representing the window. You can think of the application-level"
+ " windows as separate views into your application - and a way to create a"
- + " \"native\" browser window. </p><p> Depending on your needs, it's also"
+ + " \"native\" browser window.</p><p>Depending on your needs, it's also"
+ " possible to create a new window instance (with it's own internal state)"
+ " for each new (native) browser window, or you can share the same instance"
+ " (and state) between several browser windows (the latter is most useful"
@@ -38,7 +38,7 @@ public class WindowingExample extends CustomComponent {
private URL windowUrl = null;
public WindowingExample() {
- final OrderedLayout main = new OrderedLayout();
+ final VerticalLayout main = new VerticalLayout();
main.setMargin(true);
setCompositionRoot(main);
@@ -46,29 +46,33 @@ public class WindowingExample extends CustomComponent {
l.setContentMode(Label.CONTENT_XHTML);
main.addComponent(l);
- main.addComponent(new Button("Create a new subwindow",
+ Button b = new Button("Create a new subwindow",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
final Window w = new Window("Subwindow");
+ w.setWidth("50%");
final Label l = new Label(txt);
l.setContentMode(Label.CONTENT_XHTML);
w.addComponent(l);
getApplication().getMainWindow().addWindow(w);
}
- }));
- main.addComponent(new Button("Create a new modal window",
- new Button.ClickListener() {
- public void buttonClick(ClickEvent event) {
- final Window w = new Window("Modal window");
- w.setModal(true);
- final Label l = new Label(txt);
- l.setContentMode(Label.CONTENT_XHTML);
- w.addComponent(l);
- getApplication().getMainWindow().addWindow(w);
- }
- }));
- main.addComponent(new Button(
- "Open a application-level window, with shared state",
+ });
+ b.setStyleName(Button.STYLE_LINK);
+ main.addComponent(b);
+ b = new Button("Create a new modal window", new Button.ClickListener() {
+ public void buttonClick(ClickEvent event) {
+ final Window w = new Window("Modal window");
+ w.setWidth("50%");
+ w.setModal(true);
+ final Label l = new Label(txt);
+ l.setContentMode(Label.CONTENT_XHTML);
+ w.addComponent(l);
+ getApplication().getMainWindow().addWindow(w);
+ }
+ });
+ b.setStyleName(Button.STYLE_LINK);
+ main.addComponent(b);
+ b = new Button("Open a application-level window, with shared state",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
if (windowUrl == null) {
@@ -82,8 +86,10 @@ public class WindowingExample extends CustomComponent {
getApplication().getMainWindow().open(
new ExternalResource(windowUrl), "_new");
}
- }));
- main.addComponent(new Button(
+ });
+ b.setStyleName(Button.STYLE_LINK);
+ main.addComponent(b);
+ b = new Button(
"Create a new application-level window, with it's own state",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
@@ -97,7 +103,9 @@ public class WindowingExample extends CustomComponent {
getApplication().getMainWindow().open(
new ExternalResource(w.getURL()), "_new");
}
- }));
+ });
+ b.setStyleName(Button.STYLE_LINK);
+ main.addComponent(b);
}