]> source.dussan.org Git - vaadin-framework.git/commitdiff
Created com.itmill.toolkit.automatedtests package which contains "official" automated...
authorJani Laakso <jani.laakso@itmill.com>
Mon, 7 Apr 2008 15:38:15 +0000 (15:38 +0000)
committerJani Laakso <jani.laakso@itmill.com>
Mon, 7 Apr 2008 15:38:15 +0000 (15:38 +0000)
 * do not touch them unless you change automated test client's testcase scripts too.
 * copy your testing application to package com.itmill.toolkit.automatedtests
 * do not point to "development / testing / production" packages which are edited in the future without relation to testing
 * use setDebugId's for all components that are used in testing

Moved few classes from "experimental" com.itmill.toolkit.tests package into "official" side.

Copied featurebrowser to automatedtests package and added setDebugId's for most components that are used in the testing.

svn changeset:4138/svn branch:trunk

32 files changed:
build/package/WebContent/WEB-INF/web.xml
src/com/itmill/toolkit/automatedtests/ComponentsInTable.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/SimplestApplication.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/ComboBoxExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/robustness/Robustness.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/robustness/RobustnessComplex.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/util/DebugId.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/util/Log.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/util/MultiListener.java [new file with mode: 0644]
src/com/itmill/toolkit/automatedtests/util/RandomComponents.java [new file with mode: 0644]
src/com/itmill/toolkit/launcher/ITMillToolkitWebMode.java
src/com/itmill/toolkit/tests/TestComponentsAndLayouts.java
src/com/itmill/toolkit/tests/robustness/Robustness.java
src/com/itmill/toolkit/tests/robustness/RobustnessComplex.java [deleted file]
src/com/itmill/toolkit/tests/robustness/RobustnessSimple.java
src/com/itmill/toolkit/tests/util/Log.java [deleted file]
src/com/itmill/toolkit/tests/util/MultiListener.java [deleted file]
src/com/itmill/toolkit/tests/util/RandomComponents.java

index 6fed0561d20f45d55a29af940c0f595fe022c0ee..86ae7b7d2919a09a2b9dd90aa8a2d22c4541143a 100644 (file)
     </init-param>
   </servlet>
   
+  <servlet>
+    <servlet-name>RobustnessComplex</servlet-name>
+    <servlet-class>com.itmill.toolkit.terminal.gwt.server.ApplicationServlet</servlet-class>
+    <init-param>
+      <param-name>application</param-name>
+      <param-value>com.itmill.toolkit.automatedtests.RobustnessComplex</param-value>
+    </init-param>
+  </servlet>
+  
   <servlet>
     <servlet-name>FeatureBrowser</servlet-name>
     <servlet-class>com.itmill.toolkit.terminal.gwt.server.ApplicationServlet</servlet-class>
     </init-param>
   </servlet>
   
+   <!-- Automated tests used by Testing Tools plug-in client -->
+   <servlet>
+    <servlet-name>TestSimplestApplication</servlet-name>
+    <servlet-class>com.itmill.toolkit.terminal.gwt.server.ApplicationServlet</servlet-class>
+    <init-param>
+      <param-name>application</param-name>
+      <param-value>com.itmill.toolkit.automatedtests.SimplestApplication</param-value>
+    </init-param>
+  </servlet>
+  
+  <servlet>
+    <servlet-name>TestRobustnessComplex</servlet-name>
+    <servlet-class>com.itmill.toolkit.terminal.gwt.server.ApplicationServlet</servlet-class>
+    <init-param>
+      <param-name>application</param-name>
+      <param-value>com.itmill.toolkit.automatedtests.robustness.RobustnessComplex</param-value>
+    </init-param>
+  </servlet>
+  
+  <servlet>
+    <servlet-name>TestFeatureBrowser</servlet-name>
+    <servlet-class>com.itmill.toolkit.terminal.gwt.server.ApplicationServlet</servlet-class>
+    <init-param>
+      <param-name>application</param-name>
+      <param-value>com.itmill.toolkit.automatedtests.featurebrowser.FeatureBrowser</param-value>
+    </init-param>
+  </servlet>
+  
   <servlet-mapping>
     <servlet-name>ITMillToolkitApplicationRunner</servlet-name>
     <url-pattern>/run/*</url-pattern>
     <servlet-name>NotificationDemo</servlet-name>
     <url-pattern>/NotificationDemo/*</url-pattern>
   </servlet-mapping>
-
+  
+  <!-- Automated tests used by Testing Tools plug-in client -->
+    <servlet-mapping>
+    <servlet-name>TestSimplestApplication</servlet-name>
+    <url-pattern>/TestSimplestApplication/*</url-pattern>
+  </servlet-mapping>
+  
+  <servlet-mapping>
+    <servlet-name>TestRobustnessComplex</servlet-name>
+    <url-pattern>/TestRobustnessComplex/*</url-pattern>
+  </servlet-mapping>
+  
+   <servlet-mapping>
+    <servlet-name>TestFeatureBrowser</servlet-name>
+    <url-pattern>/TestFeatureBrowser/*</url-pattern>
+  </servlet-mapping>
 
   <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
diff --git a/src/com/itmill/toolkit/automatedtests/ComponentsInTable.java b/src/com/itmill/toolkit/automatedtests/ComponentsInTable.java
new file mode 100644 (file)
index 0000000..619b54b
--- /dev/null
@@ -0,0 +1,74 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests;\r
+\r
+import java.util.Date;\r
+import java.util.Vector;\r
+\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Table;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+\r
+public class ComponentsInTable extends CustomComponent {\r
+\r
+    public ComponentsInTable(int cols, int rows) {\r
+        final OrderedLayout main = new OrderedLayout();\r
+        setCompositionRoot(main);\r
+\r
+        main.addComponent(getTestTable(cols, rows));\r
+    }\r
+\r
+    public static Table getTestTable(int cols, int rows) {\r
+        final Table t = new Table();\r
+        t.setColumnCollapsingAllowed(true);\r
+        for (int i = 0; i < cols; i++) {\r
+            t.addContainerProperty(testString[i], String.class, "");\r
+        }\r
+        t.addContainerProperty("button", Button.class, null);\r
+        for (int i = 0; i < rows; i++) {\r
+            final Vector content = new Vector();\r
+            for (int j = 0; j < cols; j++) {\r
+                content.add(rndString());\r
+            }\r
+            content.add(new Button("b" + i, new Button.ClickListener() {\r
+\r
+                public void buttonClick(ClickEvent event) {\r
+                    Button b = event.getButton();\r
+                    System.out.println(event.getButton().getCaption()\r
+                            + " click: " + (new Date()).toGMTString());\r
+                    System.out.println(event.getButton().getApplication());\r
+\r
+                }\r
+            }));\r
+            t.addItem(content.toArray(), "" + i);\r
+        }\r
+        t.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);\r
+        return t;\r
+    }\r
+\r
+    static String[] testString = new String[] { "Jacob", "Michael", "Joshua",\r
+            "Matthew", "Ethan", "Andrew", "Daniel", "Anthony", "Christopher",\r
+            "Joseph", "William", "Alexander", "Ryan", "David", "Nicholas",\r
+            "Tyler", "James", "John", "Jonathan", "Nathan", "Samuel",\r
+            "Christian", "Noah", "Dylan", "Benjamin", "Logan", "Brandon",\r
+            "Gabriel", "Zachary", "Jose", "Elijah", "Angel", "Kevin", "Jack",\r
+            "Caleb", "Justin", "Austin", "Evan", "Robert", "Thomas", "Luke",\r
+            "Mason", "Aidan", "Jackson", "Isaiah", "Jordan", "Gavin", "Connor",\r
+            "Aiden", "Isaac", "Jason", "Cameron", "Hunter", "Jayden", "Juan",\r
+            "Charles", "Aaron", "Lucas", "Luis", "Owen", "Landon", "Diego",\r
+            "Brian", "Adam", "Adrian", "Kyle", "Eric", "Ian", "Nathaniel",\r
+            "Carlos", "Alex", "Bryan", "Jesus", "Julian", "Sean", "Carter",\r
+            "Hayden", "Jeremiah", "Cole", "Brayden", "Wyatt", "Chase",\r
+            "Steven", "Timothy", "Dominic", "Sebastian", "Xavier", "Jaden",\r
+            "Jesse", "Devin", "Seth", "Antonio", "Richard", "Miguel", "Colin",\r
+            "Cody", "Alejandro", "Caden", "Blake", "Carson" };\r
+\r
+    public static String rndString() {\r
+        return testString[(int) (Math.random() * testString.length)];\r
+    }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/SimplestApplication.java b/src/com/itmill/toolkit/automatedtests/SimplestApplication.java
new file mode 100644 (file)
index 0000000..a81e1da
--- /dev/null
@@ -0,0 +1,17 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests;
+
+import com.itmill.toolkit.ui.Label;
+import com.itmill.toolkit.ui.Window;
+
+public class SimplestApplication extends com.itmill.toolkit.Application {
+
+    public void init() {
+        final Window main = new Window("Simplest Application window");
+        setMainWindow(main);
+        main.addComponent(new Label("Simplest Application label"));
+    }
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/ButtonExample.java
new file mode 100644 (file)
index 0000000..5f73b3f
--- /dev/null
@@ -0,0 +1,149 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import com.itmill.toolkit.terminal.ExternalResource;\r
+import com.itmill.toolkit.terminal.ThemeResource;\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.CheckBox;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.Link;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Panel;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+\r
+/**\r
+ * Shows a few variations of Buttons and Links.\r
+ * \r
+ * @author IT Mill Ltd.\r
+ */\r
+public class ButtonExample extends CustomComponent implements\r
+        Button.ClickListener {\r
+\r
+    public ButtonExample() {\r
+\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        final OrderedLayout horiz = new OrderedLayout(\r
+                OrderedLayout.ORIENTATION_HORIZONTAL);\r
+        main.addComponent(horiz);\r
+        final Panel basic = new Panel("Basic buttons");\r
+        basic.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(basic);\r
+\r
+        final Panel bells = new Panel("w/ bells & whistles");\r
+        bells.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(bells);\r
+\r
+        Button b = new Button("Basic button");\r
+        b.setDebugId("Basic1");\r
+        b.addListener(this);\r
+        basic.addComponent(b);\r
+\r
+        b = new Button("Button w/ icon + tooltip");\r
+        b.setDebugId("Button2");\r
+        b.addListener(this);\r
+        b.setIcon(new ThemeResource("icons/ok.png"));\r
+        b.setDescription("This button does nothing, fast");\r
+        bells.addComponent(b);\r
+\r
+        b = new CheckBox("CheckBox - a switch-button");\r
+        b.setDebugId("Button3");\r
+        b.setImmediate(true); // checkboxes are not immediate by default\r
+        b.addListener(this);\r
+        basic.addComponent(b);\r
+\r
+        b = new CheckBox("CheckBox w/ icon + tooltip");\r
+        b.setDebugId("Button4");\r
+        b.setImmediate(true); // checkboxes are not immediate by default\r
+        b.addListener(this);\r
+        b.setIcon(new ThemeResource("icons/ok.png"));\r
+        b.setDescription("This is a CheckBox");\r
+        bells.addComponent(b);\r
+\r
+        b = new Button("Link-style button");\r
+        b.setDebugId("Button5");\r
+        b.addListener(this);\r
+        b.setStyleName(Button.STYLE_LINK);\r
+        basic.addComponent(b);\r
+\r
+        b = new Button("Link button w/ icon + tooltip");\r
+        b.setDebugId("Button6");\r
+        b.addListener(this);\r
+        b.setStyleName(Button.STYLE_LINK);\r
+        b.setIcon(new ThemeResource("icons/ok.png"));\r
+        b.setDescription("Link-style, icon+tootip, no caption");\r
+        bells.addComponent(b);\r
+\r
+        b = new Button();\r
+        b.setDebugId("Button7");\r
+        b.addListener(this);\r
+        b.setStyleName(Button.STYLE_LINK);\r
+        b.setIcon(new ThemeResource("icons/ok.png"));\r
+        b.setDescription("Link-style, icon+tootip, no caption");\r
+        basic.addComponent(b);\r
+\r
+        final Panel links = new Panel("Links");\r
+        links.setStyleName(Panel.STYLE_LIGHT);\r
+        main.addComponent(links);\r
+        final Label desc = new Label(\r
+                "The main difference between a Link and"\r
+                        + " a link-styled Button is that the Link works client-"\r
+                        + " side, whereas the Button works server side.<br/> This means"\r
+                        + " that the Button triggers some event on the server,"\r
+                        + " while the Link is a normal web-link. <br/><br/>Note that for"\r
+                        + " opening new windows, the Link might be a safer "\r
+                        + " choice, since popup-blockers might interfer with "\r
+                        + " server-initiated window opening.");\r
+        desc.setContentMode(Label.CONTENT_XHTML);\r
+        links.addComponent(desc);\r
+        Link l = new Link("IT Mill home", new ExternalResource(\r
+                "http://www.itmill.com"));\r
+        l.setDebugId("Link1");\r
+        l.setDescription("Link without target name, opens in this window");\r
+        links.addComponent(l);\r
+\r
+        l = new Link("IT Mill home (new window)", new ExternalResource(\r
+                "http://www.itmill.com"));\r
+        l.setDebugId("Link2");\r
+        l.setTargetName("_blank");\r
+        l.setDescription("Link with target name, opens in new window");\r
+        links.addComponent(l);\r
+\r
+        l = new Link("IT Mill home (new window, less decor)",\r
+                new ExternalResource("http://www.itmill.com"));\r
+        l.setDebugId("Link3");\r
+        l.setTargetName("_blank");\r
+        l.setTargetBorder(Link.TARGET_BORDER_MINIMAL);\r
+        l.setTargetName("_blank");\r
+        l\r
+                .setDescription("Link with target name and BORDER_MINIMAL, opens in new window with less decor");\r
+        links.addComponent(l);\r
+\r
+        l = new Link("IT Mill home (new 200x200 window, no decor, icon)",\r
+                new ExternalResource("http://www.itmill.com"), "_blank", 200,\r
+                200, Link.TARGET_BORDER_NONE);\r
+        l.setDebugId("Link4");\r
+        l.setTargetName("_blank");\r
+        l\r
+                .setDescription("Link with target name and BORDER_NONE, opens in new window with no decor");\r
+        l.setIcon(new ThemeResource("icons/ok.png"));\r
+        links.addComponent(l);\r
+\r
+    }\r
+\r
+    public void buttonClick(ClickEvent event) {\r
+        final Button b = event.getButton();\r
+        getWindow().showNotification(\r
+                "Clicked"\r
+                        + (b instanceof CheckBox ? ", value: "\r
+                                + event.getButton().getValue() : ""));\r
+\r
+    }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/ClientCachingExample.java
new file mode 100644 (file)
index 0000000..42199b1
--- /dev/null
@@ -0,0 +1,70 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import com.itmill.toolkit.terminal.PaintException;\r
+import com.itmill.toolkit.terminal.PaintTarget;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.Layout;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.TabSheet;\r
+\r
+/**\r
+ * This example is a (simple) demonstration of client-side caching. The content\r
+ * in one tab is intentionally made very slow to produce server-side. When the\r
+ * user changes to this tab for the first time, there will be a 3 second wait\r
+ * before the content shows up, but the second time it shows up immediately\r
+ * since the content has not changed and is cached client-side.\r
+ * \r
+ * @author IT Mill Ltd.\r
+ */\r
+public class ClientCachingExample extends CustomComponent {\r
+\r
+    private static final String msg = "This example is a (simple) demonstration of client-side caching."\r
+            + " The content in one tab is intentionally made very slow to"\r
+            + " 'produce' server-side. When you changes to this tab for the"\r
+            + " first time, there will be a 3 second wait before the content"\r
+            + " shows up, but the second time it shows up immediately since the"\r
+            + " content has not changed and is cached client-side.";\r
+\r
+    public ClientCachingExample() {\r
+\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        main.addComponent(new Label(msg));\r
+\r
+        final TabSheet ts = new TabSheet();\r
+        main.addComponent(ts);\r
+\r
+        Layout layout = new OrderedLayout();\r
+        layout.setMargin(true);\r
+        Label l = new Label("This is a normal label, quick to render.");\r
+        l.setCaption("A normal label");\r
+        layout.addComponent(l);\r
+\r
+        ts.addTab(layout, "Normal", null);\r
+\r
+        layout = new OrderedLayout();\r
+        layout.setMargin(true);\r
+        l = new Label("Slow label - until cached client side.") {\r
+            public void paintContent(PaintTarget target) throws PaintException {\r
+                try {\r
+                    Thread.sleep(3000);\r
+                } catch (final Exception e) {\r
+                    // IGNORED\r
+                }\r
+                super.paintContent(target);\r
+            }\r
+\r
+        };\r
+        l.setCaption("A slow label");\r
+        layout.addComponent(l);\r
+        ts.addTab(layout, "Slow", null);\r
+\r
+    }\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/ComboBoxExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/ComboBoxExample.java
new file mode 100644 (file)
index 0000000..03271a9
--- /dev/null
@@ -0,0 +1,73 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.featurebrowser;
+
+import java.util.Random;
+
+import com.itmill.toolkit.ui.ComboBox;
+import com.itmill.toolkit.ui.CustomComponent;
+import com.itmill.toolkit.ui.OrderedLayout;
+import com.itmill.toolkit.ui.AbstractSelect.Filtering;
+
+/**
+ * 
+ */
+public class ComboBoxExample extends CustomComponent {
+
+    private static final String[] firstnames = new String[] { "John", "Mary",
+            "Joe", "Sarah", "Jeff", "Jane", "Peter", "Marc", "Robert", "Paula",
+            "Lenny", "Kenny", "Nathan", "Nicole", "Laura", "Jos", "Josie",
+            "Linus" };
+
+    private static final String[] lastnames = new String[] { "Torvalds",
+            "Smith", "Adams", "Black", "Wilson", "Richards", "Thompson",
+            "McGoff", "Halas", "Jones", "Beck", "Sheridan", "Picard", "Hill",
+            "Fielding", "Einstein" };
+
+    public ComboBoxExample() {
+        final OrderedLayout main = new OrderedLayout();
+        main.setMargin(true);
+        setCompositionRoot(main);
+
+        // starts-with filter
+        final ComboBox s1 = new ComboBox("Select with starts-with filter");
+        s1.setDebugId("ComboBoxStartFilter");
+        s1.setFilteringMode(Filtering.FILTERINGMODE_STARTSWITH);
+        s1.setColumns(20);
+        Random r = new Random(5);
+        for (int i = 0; i < 105; i++) {
+            s1
+                    .addItem(firstnames[(int) (r.nextDouble() * (firstnames.length - 1))]
+                            + " "
+                            + lastnames[(int) (r.nextDouble() * (lastnames.length - 1))]);
+        }
+        s1.setImmediate(true);
+        main.addComponent(s1);
+
+        // contains filter
+        final ComboBox s2 = new ComboBox("Select with contains filter");
+        s2.setDebugId("ComboBoxContainsFilter");
+        s2.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
+        s2.setColumns(20);
+        for (int i = 0; i < 500; i++) {
+            s2
+                    .addItem(firstnames[(int) (r.nextDouble() * (firstnames.length - 1))]
+                            + " "
+                            + lastnames[(int) (r.nextDouble() * (lastnames.length - 1))]);
+        }
+        s2.setImmediate(true);
+        main.addComponent(s2);
+
+        // initially empty
+        final ComboBox s3 = new ComboBox("Initially empty; enter your own");
+        s3.setDebugId("EmptyComboBox");
+        s3.setColumns(20);
+        s3.setImmediate(true);
+        s3.setNewItemsAllowed(true);
+        main.addComponent(s3);
+
+    }
+
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/EmbeddedBrowserExample.java
new file mode 100644 (file)
index 0000000..2134c8c
--- /dev/null
@@ -0,0 +1,74 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.featurebrowser;
+
+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;
+
+/**
+ * Demonstrates the use of Embedded and "suggesting" Select by creating a simple
+ * web-browser. Note: does not check for recursion.
+ * 
+ * @author IT Mill Ltd.
+ * @see com.itmill.toolkit.ui.Window
+ */
+public class EmbeddedBrowserExample extends ExpandLayout implements
+        Select.ValueChangeListener {
+
+    // Default URL to open.
+    private static final String DEFAULT_URL = "http://www.itmill.com/index_itmill_toolkit.htm";
+
+    // The embedded page
+    Embedded emb = new Embedded();
+
+    public EmbeddedBrowserExample() {
+        this(new String[] { DEFAULT_URL,
+                "http://www.itmill.com/index_developers.htm",
+                "http://toolkit.itmill.com/demo/doc/api/",
+                "http://www.itmill.com/manual/index.html" });
+    }
+
+    public EmbeddedBrowserExample(String[] urls) {
+        setSizeFull();
+
+        // create the address combobox
+        final Select select = new Select();
+        // allow input
+        select.setNewItemsAllowed(true);
+        // no empty selection
+        select.setNullSelectionAllowed(false);
+        // no 'go' -button clicking necessary
+        select.setImmediate(true);
+        // add some pre-configured URLs
+        for (int i = 0; i < urls.length; i++) {
+            select.addItem(urls[i]);
+        }
+        // add to layout
+        addComponent(select);
+        // add listener and select initial URL
+        select.addListener(this);
+        select.setValue(urls[0]);
+
+        // configure the embedded and add to layout
+        emb.setType(Embedded.TYPE_BROWSER);
+        addComponent(emb);
+        // make the embedded as large as possible
+        expand(emb);
+
+    }
+
+    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));
+        }
+
+    }
+
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/FeatureBrowser.java
new file mode 100644 (file)
index 0000000..4eb7f9e
--- /dev/null
@@ -0,0 +1,369 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.featurebrowser;
+
+import java.util.HashMap;
+
+import com.itmill.toolkit.data.Item;
+import com.itmill.toolkit.data.Property;
+import com.itmill.toolkit.data.Property.ValueChangeEvent;
+import com.itmill.toolkit.data.util.HierarchicalContainer;
+import com.itmill.toolkit.data.util.IndexedContainer;
+import com.itmill.toolkit.terminal.ExternalResource;
+import com.itmill.toolkit.terminal.ThemeResource;
+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.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.Window;
+import com.itmill.toolkit.ui.Button.ClickEvent;
+
+/**
+ * 
+ * @author IT Mill Ltd.
+ * @see com.itmill.toolkit.ui.Window
+ */
+public class FeatureBrowser extends com.itmill.toolkit.Application implements
+        Select.ValueChangeListener {
+
+    // Property IDs
+    private static final Object PROPERTY_ID_CATEGORY = "Category";
+    private static final Object PROPERTY_ID_NAME = "Name";
+    private static final Object PROPERTY_ID_DESC = "Description";
+    private static final Object PROPERTY_ID_CLASS = "Class";
+    private static final Object PROPERTY_ID_VIEWED = "Viewed";
+
+    // Global components
+    private Tree tree;
+    private Table table;
+    private TabSheet ts;
+
+    // Example "cache"
+    private final HashMap exampleInstances = new HashMap();
+    private String section;
+
+    // List of examples
+    private static final Object[][] demos = new Object[][] {
+    // Category, Name, Desc, Class, Viewed
+            // Getting started: Labels
+            { "Getting started", "Labels", "Some variations of Labels",
+                    LabelExample.class },
+            // Getting started: Buttons
+            { "Getting started", "Buttons and links",
+                    "Various Buttons and Links", ButtonExample.class },
+            // Getting started: Fields
+            { "Getting started", "Basic value input",
+                    "TextFields, DateFields, and such", ValueInputExample.class },
+            //
+            { "Getting started", "RichText", "Rich text editing",
+                    RichTextExample.class },
+            // Getting started: Selects
+            { "Getting started", "Choices, choices",
+                    "Some variations of simple selects", SelectExample.class },
+            // Layouts
+            { "Getting started", "Layouts", "Laying out components",
+                    LayoutExample.class },
+            // Wrangling data: ComboBox
+            { "Wrangling data", "ComboBox", "ComboBox - the swiss army select",
+                    ComboBoxExample.class },
+            // Wrangling data: Table
+            {
+                    "Wrangling data",
+                    "Table (\"grid\")",
+                    "Table with bells, whistles, editmode and actions (contextmenu)",
+                    TableExample.class },
+            // Wrangling data: Tree
+            { "Wrangling data", "Tree", "A hierarchy of things",
+                    TreeExample.class },
+            // Misc: Notifications
+            { "Misc", "Notifications", "Notifications can improve usability",
+                    NotificationExample.class },
+            // Misc: Caching
+            { "Misc", "Client caching", "Demonstrating of client-side caching",
+                    ClientCachingExample.class },
+            // Misc: Embedded
+            { "Misc", "Embedding",
+                    "Embedding resources - another site in this case",
+                    EmbeddedBrowserExample.class },
+            // Windowing
+            { "Misc", "Windowing", "About windowing", WindowingExample.class },
+            // JavaScript API
+            { "Misc", "JavaScript API",
+                    "JavaScript to IT Mill Toolkit communication",
+                    JavaScriptAPIExample.class },
+    // END
+    };
+
+    public void init() {
+
+        // Need to set a theme for ThemeResources to work
+        setTheme("example");
+
+        // Create new window for the application and give the window a visible.
+        final Window main = new Window("IT Mill Toolkit 5");
+        main.setDebugId("mainWindow");
+        // set as main window
+        setMainWindow(main);
+
+        final SplitPanel split = new SplitPanel(
+                SplitPanel.ORIENTATION_HORIZONTAL);
+        split.setSplitPosition(200, SplitPanel.UNITS_PIXELS);
+        main.setLayout(split);
+
+        final HashMap sectionIds = new HashMap();
+        final HierarchicalContainer container = createContainer();
+        final Object rootId = container.addItem();
+        Item item = container.getItem(rootId);
+        Property p = item.getItemProperty(PROPERTY_ID_NAME);
+        p.setValue("All examples");
+        for (int i = 0; i < demos.length; i++) {
+            final Object[] demo = demos[i];
+            final String section = (String) demo[0];
+            Object sectionId;
+            if (sectionIds.containsKey(section)) {
+                sectionId = sectionIds.get(section);
+            } else {
+                sectionId = container.addItem();
+                sectionIds.put(section, sectionId);
+                container.setParent(sectionId, rootId);
+                item = container.getItem(sectionId);
+                p = item.getItemProperty(PROPERTY_ID_NAME);
+                p.setValue(section);
+            }
+            final Object id = container.addItem();
+            container.setParent(id, sectionId);
+            initItem(container.getItem(id), demo);
+
+        }
+
+        tree = new Tree();
+        tree.setDebugId("FeatureBrowser: Main Tree");
+        tree.setSelectable(true);
+        tree.setMultiSelect(false);
+        tree.setNullSelectionAllowed(false);
+        tree.setContainerDataSource(container);
+        tree.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
+        tree.setItemCaptionPropertyId(PROPERTY_ID_NAME);
+        tree.addListener(this);
+        tree.setImmediate(true);
+        tree.expandItemsRecursively(rootId);
+
+        split.addComponent(tree);
+
+        final SplitPanel split2 = new SplitPanel();
+        split2.setSplitPosition(200, SplitPanel.UNITS_PIXELS);
+        split.addComponent(split2);
+
+        table = new Table();
+        table.setDebugId("FeatureBrowser: Main Table");
+        table.setSizeFull();
+        table.setColumnReorderingAllowed(true);
+        table.setColumnCollapsingAllowed(true);
+        table.setSelectable(true);
+        table.setMultiSelect(false);
+        table.setNullSelectionAllowed(false);
+        try {
+            table.setContainerDataSource((IndexedContainer) container.clone());
+        } catch (final Exception e) {
+            e.printStackTrace(System.err);
+        }
+        // Hide some columns
+        table.setVisibleColumns(new Object[] { PROPERTY_ID_CATEGORY,
+                PROPERTY_ID_NAME, PROPERTY_ID_DESC, PROPERTY_ID_VIEWED });
+        table.addListener(this);
+        table.setImmediate(true);
+        split2.addComponent(table);
+
+        final ExpandLayout exp = new ExpandLayout();
+        exp.setMargin(true);
+        split2.addComponent(exp);
+
+        final OrderedLayout wbLayout = new OrderedLayout(
+                OrderedLayout.ORIENTATION_HORIZONTAL);
+        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();
+                } catch (Exception e) {
+                    // Could not create
+                    return;
+                }
+                Window w = new Window(caption);
+                w.setWidth(640);
+                if (Layout.class.isAssignableFrom(component.getClass())) {
+                    w.setLayout((Layout) component);
+                } else {
+                    // w.getLayout().getSize().setSizeFull();
+                    w.addComponent(component);
+                }
+                getMainWindow().addWindow(w);
+            }
+        });
+        b.setStyleName(Button.STYLE_LINK);
+        wbLayout.addComponent(b);
+        b = new Button("Open in native window", new Button.ClickListener() {
+            public void buttonClick(ClickEvent event) {
+                Component component = (Component) ts.getComponentIterator()
+                        .next();
+                final String caption = ts.getTabCaption(component);
+                Window w = getWindow(caption);
+                if (w == null) {
+                    try {
+                        component = (Component) component.getClass()
+                                .newInstance();
+                    } catch (final Exception e) {
+                        // Could not create
+                        return;
+                    }
+                    w = new Window(caption);
+                    w.setName(caption);
+                    if (Layout.class.isAssignableFrom(component.getClass())) {
+                        w.setLayout((Layout) component);
+                    } else {
+                        // w.getLayout().getSize().setSizeFull();
+                        w.addComponent(component);
+                    }
+                    addWindow(w);
+                }
+                getMainWindow().open(new ExternalResource(w.getURL()), caption);
+            }
+        });
+        b.setStyleName(Button.STYLE_LINK);
+        wbLayout.addComponent(b);
+
+        exp.addComponent(wbLayout);
+        exp.setComponentAlignment(wbLayout, OrderedLayout.ALIGNMENT_RIGHT,
+                OrderedLayout.ALIGNMENT_TOP);
+
+        ts = new TabSheet();
+        ts.setSizeFull();
+        ts.addTab(new Label(""), "Choose example", null);
+        exp.addComponent(ts);
+        exp.expand(ts);
+
+        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);
+
+        // select initial section ("All")
+        tree.setValue(rootId);
+
+        getMainWindow()
+                .showNotification(
+                        "Welcome",
+                        "Choose an example to begin.<br/><br/>And remember to experiment!",
+                        Window.Notification.TYPE_TRAY_NOTIFICATION);
+    }
+
+    private void initItem(Item item, Object[] data) {
+        int p = 0;
+        Property prop = item.getItemProperty(PROPERTY_ID_CATEGORY);
+        prop.setValue(data[p++]);
+        prop = item.getItemProperty(PROPERTY_ID_NAME);
+        prop.setValue(data[p++]);
+        prop = item.getItemProperty(PROPERTY_ID_DESC);
+        prop.setValue(data[p++]);
+        prop = item.getItemProperty(PROPERTY_ID_CLASS);
+        prop.setValue(data[p++]);
+    }
+
+    private HierarchicalContainer createContainer() {
+        final HierarchicalContainer c = new HierarchicalContainer();
+        c.addContainerProperty(PROPERTY_ID_CATEGORY, String.class, null);
+        c.addContainerProperty(PROPERTY_ID_NAME, String.class, "");
+        c.addContainerProperty(PROPERTY_ID_DESC, String.class, "");
+        c.addContainerProperty(PROPERTY_ID_CLASS, Class.class, null);
+        c.addContainerProperty(PROPERTY_ID_VIEWED, Embedded.class, null);
+        return c;
+    }
+
+    public void valueChange(ValueChangeEvent event) {
+        if (event.getProperty() == tree) {
+            final Object id = tree.getValue();
+            final Item item = tree.getItem(id);
+            //
+            String newSection;
+            if (tree.isRoot(id)) {
+                newSection = ""; // show all sections
+            } else if (tree.hasChildren(id)) {
+                newSection = (String) item.getItemProperty(PROPERTY_ID_NAME)
+                        .getValue();
+            } else {
+                newSection = (String) item
+                        .getItemProperty(PROPERTY_ID_CATEGORY).getValue();
+            }
+
+            table.setValue(null);
+            final IndexedContainer c = (IndexedContainer) table
+                    .getContainerDataSource();
+
+            if (newSection != null && !newSection.equals(section)) {
+                c.removeAllContainerFilters();
+                c.addContainerFilter(PROPERTY_ID_CATEGORY, newSection, false,
+                        true);
+            }
+            section = newSection;
+            if (!tree.hasChildren(id)) {
+                // Example, not section
+                // update table selection
+                table.setValue(id);
+            }
+
+        } else if (event.getProperty() == table) {
+            if (table.getValue() != null) {
+                table.removeListener(this);
+                tree.setValue(table.getValue());
+                table.addListener(this);
+                final Item item = table.getItem(table.getValue());
+                final Class c = (Class) item.getItemProperty(PROPERTY_ID_CLASS)
+                        .getValue();
+                final Component component = getComponent(c);
+                if (component != null) {
+                    final String caption = (String) item.getItemProperty(
+                            PROPERTY_ID_NAME).getValue();
+                    ts.removeAllComponents();
+                    ts.addTab(component, caption, null);
+                }
+                // update "viewed" state
+                final Property p = item.getItemProperty(PROPERTY_ID_VIEWED);
+                if (p.getValue() == null) {
+                    p.setValue(new Embedded("", new ThemeResource(
+                            "icons/ok.png")));
+                }
+                table.requestRepaint();
+            }
+        }
+
+    }
+
+    private Component getComponent(Class componentClass) {
+        if (!exampleInstances.containsKey(componentClass)) {
+            try {
+                final Component c = (Component) componentClass.newInstance();
+                exampleInstances.put(componentClass, c);
+            } catch (final Exception e) {
+                return null;
+            }
+        }
+        return (Component) exampleInstances.get(componentClass);
+    }
+
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/JavaScriptAPIExample.java
new file mode 100644 (file)
index 0000000..15f4e36
--- /dev/null
@@ -0,0 +1,95 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import java.util.Date;\r
+\r
+import com.itmill.toolkit.terminal.PaintException;\r
+import com.itmill.toolkit.terminal.PaintTarget;\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.TextField;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+\r
+/**\r
+ * An example using a RichTextArea to edit a Label in XHTML-mode.\r
+ * \r
+ */\r
+public class JavaScriptAPIExample extends CustomComponent {\r
+\r
+    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>";\r
+\r
+    private final OrderedLayout main;\r
+    private final Label l;\r
+    private final TextField editor = new TextField();\r
+\r
+    public JavaScriptAPIExample() {\r
+        // main layout\r
+        main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+        editor.setRows(7);\r
+        editor.setColumns(50);\r
+        // Add the label\r
+        l = new Label(txt);\r
+        l.setContentMode(Label.CONTENT_XHTML);\r
+        main.addComponent(l);\r
+        // Edit button with inline click-listener\r
+        Button b = new Button("Edit", new Button.ClickListener() {\r
+            public void buttonClick(ClickEvent event) {\r
+                // swap Label <-> RichTextArea\r
+                if (main.getComponentIterator().next() == l) {\r
+                    editor.setValue(l.getValue());\r
+                    main.replaceComponent(l, editor);\r
+                    event.getButton().setCaption("Save");\r
+                } else {\r
+                    l.setValue(editor.getValue());\r
+                    main.replaceComponent(editor, l);\r
+                    event.getButton().setCaption("Edit");\r
+                }\r
+            }\r
+        });\r
+        main.addComponent(b);\r
+        main.setComponentAlignment(b, OrderedLayout.ALIGNMENT_RIGHT,\r
+                OrderedLayout.ALIGNMENT_VERTICAL_CENTER);\r
+\r
+        // \r
+        Label l = new Label(\r
+                "This label will update it's server-side value AFTER it's rendered to the client-side. "\r
+                        + "The client will be synchronized on reload, when you click a button, "\r
+                        + "or when itmill.forceSync() is called.") {\r
+\r
+            public void paintContent(PaintTarget target) throws PaintException {\r
+\r
+                super.paintContent(target);\r
+                Delay d = new Delay(this);\r
+                d.start();\r
+            }\r
+\r
+        };\r
+        main.addComponent(l);\r
+\r
+    }\r
+\r
+    private class Delay extends Thread {\r
+        Label label;\r
+\r
+        public Delay(Label l) {\r
+            label = l;\r
+        }\r
+\r
+        public void run() {\r
+            try {\r
+                Thread.sleep(500);\r
+                label.setValue(new Date().toString());\r
+            } catch (Exception e) {\r
+                e.printStackTrace();\r
+            }\r
+        }\r
+\r
+    }\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/LabelExample.java
new file mode 100644 (file)
index 0000000..ec90f37
--- /dev/null
@@ -0,0 +1,93 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.GridLayout;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Panel;\r
+\r
+/**\r
+ * Shows a few variations of Labels, including the effects of XHTML- and\r
+ * pre-formatted mode.\r
+ * \r
+ * @author IT Mill Ltd.\r
+ */\r
+public class LabelExample extends CustomComponent {\r
+\r
+    private static final String xhtml = "This text has <b>HTML</b> formatting.<br/>"\r
+            + "A plain <i>Label</i> will show the markup, while a <u>XHTML-mode</u>"\r
+            + " <i>Label</i> will show the formatted text.";\r
+\r
+    private static final String pre = "This text has linebreaks.\n\n"\r
+            + "They will show up in a preformatted Label,\n"\r
+            + "but not in a \"plain\" Label.\n\n"\r
+            + "       This is an indented row. \n       Same indentation here.";\r
+\r
+    public LabelExample() {\r
+\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        final GridLayout g = new GridLayout(2, 4);\r
+        main.addComponent(g);\r
+\r
+        // plain w/o caption\r
+        Panel p = new Panel("Plain");\r
+        p.setDebugId(p.getCaption());\r
+        p.setStyleName(Panel.STYLE_LIGHT);\r
+        Label l = new Label("A plain label without caption.");\r
+        l.setDebugId("label1");\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+        // plain w/ caption\r
+        p = new Panel("Plain w/ caption + tooltip");\r
+        p.setDebugId(p.getCaption());\r
+        p.setStyleName(Panel.STYLE_LIGHT);\r
+        l = new Label("A plain label with caption.");\r
+        l.setCaption("Label caption");\r
+        l.setDebugId("label2");\r
+        l.setDescription("This is a description (tooltip) for the label.");\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+        // plain w/ xhtml\r
+        p = new Panel("Plain w/ XHTML content");\r
+        p.setDebugId(p.getCaption());\r
+        p.setStyleName(Panel.STYLE_LIGHT);\r
+        l = new Label(xhtml);\r
+        l.setDebugId("label3");\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+        // xhtml w/ xhtml\r
+        p = new Panel("XHTML-mode w/ XHTML content");\r
+        p.setDebugId(p.getCaption());\r
+        p.setStyleName(Panel.STYLE_LIGHT);\r
+        l = new Label(xhtml);\r
+        l.setDebugId("label4");\r
+        l.setContentMode(Label.CONTENT_XHTML);\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+        // plain w/ preformatted\r
+        p = new Panel("Plain w/ preformatted content");\r
+        p.setDebugId(p.getCaption());\r
+        p.setStyleName(Panel.STYLE_LIGHT);\r
+        l = new Label(pre);\r
+        l.setDebugId("label5");\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+        // preformatted w/ preformatted\r
+        p = new Panel("Preformatted-mode w/ preformatted content");\r
+        p.setDebugId(p.getCaption());\r
+        p.setStyleName(Panel.STYLE_LIGHT);\r
+        l = new Label(pre);\r
+        l.setDebugId("label6");\r
+        l.setContentMode(Label.CONTENT_PREFORMATTED);\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+\r
+    }\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/LayoutExample.java
new file mode 100644 (file)
index 0000000..184e3f1
--- /dev/null
@@ -0,0 +1,91 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.GridLayout;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Panel;\r
+import com.itmill.toolkit.ui.TabSheet;\r
+\r
+/**\r
+ * A few examples of layout possibilities.\r
+ * \r
+ * @author IT Mill Ltd.\r
+ */\r
+public class LayoutExample extends CustomComponent {\r
+\r
+    public LayoutExample() {\r
+\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        final GridLayout g = new GridLayout(2, 5);\r
+        main.addComponent(g);\r
+\r
+        // panel\r
+        Panel p = new Panel("This is a normal panel");\r
+        p.setDebugId("NormalPanel");\r
+        Label l = new Label("A normal panel.");\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+        // lightpanel\r
+        p = new Panel("This is a light panel");\r
+        p.setDebugId("LightPanel");\r
+        p.setStyleName(Panel.STYLE_LIGHT);\r
+        l = new Label("A light-style panel.");\r
+        p.addComponent(l);\r
+        g.addComponent(p);\r
+\r
+        TabSheet ts = new TabSheet();\r
+        g.addComponent(ts, 0, 1, 1, 1);\r
+\r
+        OrderedLayout ol = new OrderedLayout();\r
+        ol.setDebugId("VerticalOrderedLayout");\r
+        ol.setMargin(true);\r
+        ol.addComponent(new Label("Component 1"));\r
+        ol.addComponent(new Label("Component 2"));\r
+        ol.addComponent(new Label("Component 3"));\r
+        ts.addTab(ol, "Vertical OrderedLayout", null);\r
+\r
+        ol = new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL);\r
+        ol.setDebugId("HorizontalOrderedLayout");\r
+        ol.setMargin(true);\r
+        ol.addComponent(new Label("Component 1"));\r
+        ol.addComponent(new Label("Component 2"));\r
+        ol.addComponent(new Label("Component 3"));\r
+        ts.addTab(ol, "Horizontal OrderedLayout", null);\r
+\r
+        final GridLayout gl = new GridLayout(3, 3);\r
+        gl.setDebugId("GridLayout");\r
+        gl.setMargin(true);\r
+        gl.addComponent(new Label("Component 1.1"));\r
+        gl.addComponent(new Label("Component 1.2"));\r
+        gl.addComponent(new Label("Component 1.3"));\r
+        gl.addComponent(new Label("Component 2.2"), 1, 1);\r
+        gl.addComponent(new Label("Component 3.1"), 0, 2);\r
+        gl.addComponent(new Label("Component 3.3"), 2, 2);\r
+        ts.addTab(gl, "GridLayout", null);\r
+\r
+        /*- TODO spitpanel removed for now - do we need it here?\r
+        ts = new TabSheet();\r
+        ts.setHeight(150);\r
+        g.addComponent(ts, 0, 2, 1, 2);\r
+\r
+        SplitPanel sp = new SplitPanel();\r
+        sp.addComponent(new Label("Component 1"));\r
+        sp.addComponent(new Label("Component 2"));\r
+        ts.addTab(sp, "Vertical SplitPanel", null);\r
+\r
+        sp = new SplitPanel(SplitPanel.ORIENTATION_HORIZONTAL);\r
+        sp.addComponent(new Label("Component 1"));\r
+        sp.addComponent(new Label("Component 2"));\r
+        ts.addTab(sp, "Horizontal SplitPanel", null);\r
+        -*/\r
+\r
+    }\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/NotificationExample.java
new file mode 100644 (file)
index 0000000..f6518c1
--- /dev/null
@@ -0,0 +1,96 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+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.Window;
+import com.itmill.toolkit.ui.Button.ClickEvent;
+import com.itmill.toolkit.ui.Button.ClickListener;
+
+/**
+ * Demonstrates the use of Notifications.
+ * 
+ * @author IT Mill Ltd.
+ * @see com.itmill.toolkit.ui.Window
+ */
+public class NotificationExample extends CustomComponent {
+
+    // Dropdown select for notification type, using the native dropdown
+    NativeSelect type;
+    // Textfield for the notification caption
+    TextField caption;
+    // Textfield for the notification content
+    TextField message;
+
+    /**
+     * Default constructor; We're subclassing CustomComponent, so we need to
+     * choose a root component and set it as composition root.
+     */
+    public NotificationExample() {
+        // Main layout
+        final OrderedLayout main = new OrderedLayout();
+        main.setMargin(true); // use theme-specific margin
+        setCompositionRoot(main);
+
+        // Create the 'type' dropdown select.
+        type = new NativeSelect("Notification type");
+        main.addComponent(type);
+        // no empty selection allowed
+        type.setNullSelectionAllowed(false);
+        // we want a different caption than the value
+        type.addContainerProperty("caption", String.class, null);
+        type.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
+        type.setItemCaptionPropertyId("caption");
+        // add some content (items) using the Container API
+        Item i = type.addItem(new Integer(
+                Window.Notification.TYPE_HUMANIZED_MESSAGE));
+        i.getItemProperty("caption").setValue("Humanized message");
+        i = type.addItem(new Integer(Window.Notification.TYPE_WARNING_MESSAGE));
+        i.getItemProperty("caption").setValue("Warning message");
+        i = type.addItem(new Integer(Window.Notification.TYPE_ERROR_MESSAGE));
+        i.getItemProperty("caption").setValue("Error message");
+        i = type
+                .addItem(new Integer(Window.Notification.TYPE_TRAY_NOTIFICATION));
+        i.getItemProperty("caption").setValue("Tray notification");
+        // set the initially selected item
+        type.setValue(new Integer(Window.Notification.TYPE_HUMANIZED_MESSAGE));
+
+        // Notification caption
+        caption = new TextField("Caption");
+        main.addComponent(caption);
+        caption.setColumns(20);
+        caption.setValue("Brown Fox!");
+
+        // Notification message
+        message = new RichTextArea();
+        main.addComponent(message);
+        message.setCaption("Message");
+        message.setValue("A quick one jumped over the lazy dog.");
+
+        // Button to show the notification
+        final Button b = new Button("Show notification", new ClickListener() {
+            // this is an inline ClickListener
+            public void buttonClick(ClickEvent event) {
+                // show the notification
+                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);
+    }
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/RichTextExample.java
new file mode 100644 (file)
index 0000000..edc6589
--- /dev/null
@@ -0,0 +1,60 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.RichTextArea;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+\r
+/**\r
+ * An example using a RichTextArea to edit a Label in XHTML-mode.\r
+ * \r
+ */\r
+public class RichTextExample extends CustomComponent {\r
+\r
+    public static final String txt = "<h1>RichText editor example</h1>"\r
+            + "To edit this text, press the <b>Edit</b> button below."\r
+            + "<br/>"\r
+            + "See the <A href=\"http://www.itmill.com/documentation/itmill-toolkit-5-reference-manual/\">manual</a> "\r
+            + "for more information.";\r
+\r
+    private final OrderedLayout main;\r
+    private final Label l;\r
+    private final RichTextArea editor = new RichTextArea();\r
+    private final Button b;\r
+\r
+    public RichTextExample() {\r
+        // main layout\r
+        main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+        // Add the label\r
+        l = new Label(txt);\r
+        l.setContentMode(Label.CONTENT_XHTML);\r
+        main.addComponent(l);\r
+        // Edit button with inline click-listener\r
+        b = new Button("Edit", new Button.ClickListener() {\r
+            public void buttonClick(ClickEvent event) {\r
+                // swap Label <-> RichTextArea\r
+                if (main.getComponentIterator().next() == l) {\r
+                    editor.setValue(l.getValue());\r
+                    main.replaceComponent(l, editor);\r
+                    b.setCaption("Save");\r
+                } else {\r
+                    l.setValue(editor.getValue());\r
+                    main.replaceComponent(editor, l);\r
+                    b.setCaption("Edit");\r
+                }\r
+            }\r
+        });\r
+        main.addComponent(b);\r
+        main.setComponentAlignment(b, OrderedLayout.ALIGNMENT_RIGHT,\r
+                OrderedLayout.ALIGNMENT_VERTICAL_CENTER);\r
+    }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/SelectExample.java
new file mode 100644 (file)
index 0000000..c636956
--- /dev/null
@@ -0,0 +1,107 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import com.itmill.toolkit.data.Property.ValueChangeEvent;\r
+import com.itmill.toolkit.ui.AbstractSelect;\r
+import com.itmill.toolkit.ui.ComboBox;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.Field;\r
+import com.itmill.toolkit.ui.ListSelect;\r
+import com.itmill.toolkit.ui.NativeSelect;\r
+import com.itmill.toolkit.ui.OptionGroup;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Panel;\r
+import com.itmill.toolkit.ui.TwinColSelect;\r
+\r
+/**\r
+ * Shows some basic fields for value input; TextField, DateField, Slider...\r
+ * \r
+ * @author IT Mill Ltd.\r
+ */\r
+public class SelectExample extends CustomComponent {\r
+\r
+    // listener that shows a value change notification\r
+    private final Field.ValueChangeListener listener = new Field.ValueChangeListener() {\r
+        public void valueChange(ValueChangeEvent event) {\r
+            getWindow().showNotification("" + event.getProperty().getValue());\r
+        }\r
+    };\r
+\r
+    public SelectExample() {\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        final OrderedLayout horiz = new OrderedLayout(\r
+                OrderedLayout.ORIENTATION_HORIZONTAL);\r
+        main.addComponent(horiz);\r
+        final Panel single = new Panel("Single selects");\r
+        single.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(single);\r
+        final Panel multi = new Panel("Multi selects");\r
+        multi.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(multi);\r
+\r
+        // radio button group\r
+        AbstractSelect sel = new OptionGroup("OptionGroup");\r
+        sel.setDebugId("RadioButtons");\r
+        initSelect(sel);\r
+        single.addComponent(sel);\r
+        // checkbox group\r
+        sel = new OptionGroup("OptionGroup");\r
+        sel.setDebugId("OptionGroup");\r
+        sel.setMultiSelect(true); // TODO: throws if set after listener - why?\r
+        initSelect(sel);\r
+        multi.addComponent(sel);\r
+        // single-select list\r
+        sel = new ListSelect("ListSelect");\r
+        sel.setDebugId("SingleListSelect");\r
+        ((ListSelect) sel).setColumns(15);\r
+        initSelect(sel);\r
+        single.addComponent(sel);\r
+        // multi-select list\r
+        sel = new ListSelect("ListSelect");\r
+        sel.setDebugId("MultiListSelect");\r
+        ((ListSelect) sel).setColumns(15);\r
+        sel.setMultiSelect(true);\r
+        initSelect(sel);\r
+        multi.addComponent(sel);\r
+        // native-style dropdows\r
+        sel = new NativeSelect("NativeSelect");\r
+        sel.setDebugId("NativeSelect");\r
+        ((NativeSelect) sel).setColumns(15);\r
+        initSelect(sel);\r
+        single.addComponent(sel);\r
+        // combobox\r
+        sel = new ComboBox("ComboBox");\r
+        sel.setDebugId("ComboBox");\r
+        ((ComboBox) sel).setColumns(15);\r
+        initSelect(sel);\r
+        single.addComponent(sel);\r
+        // "twin column" select\r
+        sel = new TwinColSelect("TwinColSelect");\r
+        sel.setDebugId("TwinColSelect");\r
+        ((TwinColSelect) sel).setColumns(15);\r
+        initSelect(sel);\r
+        multi.addComponent(sel);\r
+    }\r
+\r
+    /*\r
+     * Initialize select with some values, make immediate and add listener.\r
+     */\r
+    private void initSelect(AbstractSelect sel) {\r
+        for (int i = 1; i <= 5; i++) {\r
+            sel.addItem("Item " + i);\r
+        }\r
+        // select one item\r
+        sel.select("Item 1");\r
+\r
+        // make immediate, add listener\r
+        sel.setImmediate(true);\r
+        sel.addListener(listener);\r
+    }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/TableExample.java
new file mode 100644 (file)
index 0000000..83f9ca1
--- /dev/null
@@ -0,0 +1,295 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import java.util.Iterator;\r
+import java.util.Random;\r
+import java.util.Set;\r
+\r
+import com.itmill.toolkit.data.Item;\r
+import com.itmill.toolkit.data.Property;\r
+import com.itmill.toolkit.event.Action;\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.CheckBox;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Table;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+\r
+/**\r
+ * Table example.\r
+ * \r
+ * @author IT Mill Ltd.\r
+ */\r
+public class TableExample extends CustomComponent implements Action.Handler,\r
+        Button.ClickListener {\r
+\r
+    // Actions\r
+    private static final Action ACTION_SAVE = new Action("Save");\r
+    private static final Action ACTION_DELETE = new Action("Delete");\r
+    private static final Action ACTION_HIRE = new Action("Hire");\r
+    // Action sets\r
+    private static final Action[] ACTIONS_NOHIRE = new Action[] { ACTION_SAVE,\r
+            ACTION_DELETE };\r
+    private static final Action[] ACTIONS_HIRE = new Action[] { ACTION_HIRE,\r
+            ACTION_SAVE, ACTION_DELETE };\r
+    // Properties\r
+    private static final Object PROPERTY_SPECIES = "Species";\r
+    private static final Object PROPERTY_TYPE = "Type";\r
+    private static final Object PROPERTY_KIND = "Kind";\r
+    private static final Object PROPERTY_HIRED = "Hired";\r
+\r
+    // "global" components\r
+    Table source;\r
+    Table saved;\r
+    Button saveSelected;\r
+    Button hireSelected;\r
+    Button deleteSelected;\r
+    Button deselect;\r
+\r
+    public TableExample() {\r
+        // main layout\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        // "source" table with bells & whistlesenabled\r
+        source = new Table("All creatures");\r
+        source.setPageLength(7);\r
+        source.setWidth(550);\r
+        source.setColumnCollapsingAllowed(true);\r
+        source.setColumnReorderingAllowed(true);\r
+        source.setSelectable(true);\r
+        source.setMultiSelect(true);\r
+        source.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);\r
+        fillTable(source);\r
+        source.addActionHandler(this);\r
+        main.addComponent(source);\r
+        source.setDebugId("AllCreatures");\r
+\r
+        // x-selected button row\r
+        final OrderedLayout horiz = new OrderedLayout(\r
+                OrderedLayout.ORIENTATION_HORIZONTAL);\r
+        horiz.setMargin(false, false, true, false);\r
+        main.addComponent(horiz);\r
+        saveSelected = new Button("Save selected");\r
+        saveSelected.setStyleName(Button.STYLE_LINK);\r
+        saveSelected.addListener(this);\r
+        horiz.addComponent(saveSelected);\r
+        hireSelected = new Button("Hire selected");\r
+        hireSelected.setStyleName(Button.STYLE_LINK);\r
+        hireSelected.addListener(this);\r
+        horiz.addComponent(hireSelected);\r
+        deleteSelected = new Button("Delete selected");\r
+        deleteSelected.setStyleName(Button.STYLE_LINK);\r
+        deleteSelected.addListener(this);\r
+        horiz.addComponent(deleteSelected);\r
+        deselect = new Button("Deselect all");\r
+        deselect.setStyleName(Button.STYLE_LINK);\r
+        deselect.addListener(this);\r
+        horiz.addComponent(deselect);\r
+        final CheckBox editmode = new CheckBox("Editmode ");\r
+        editmode.setDebugId("editMode");\r
+        editmode.addListener(new CheckBox.ClickListener() {\r
+            public void buttonClick(ClickEvent event) {\r
+                source.setEditable(((Boolean) event.getButton().getValue())\r
+                        .booleanValue());\r
+            }\r
+        });\r
+        editmode.setImmediate(true);\r
+        horiz.addComponent(editmode);\r
+\r
+        // "saved" table, minimalistic\r
+        saved = new Table("Saved creatures");\r
+        saved.setPageLength(5);\r
+        saved.setWidth(550);\r
+        saved.setSelectable(false);\r
+        saved.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN);\r
+        saved.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);\r
+        initProperties(saved);\r
+        saved.addActionHandler(this);\r
+        main.addComponent(saved);\r
+        saved.setDebugId("SavedCreatures");\r
+\r
+        final CheckBox b = new CheckBox("Modify saved creatures");\r
+        b.setDebugId("modifySavedCreatures");\r
+        b.addListener(new CheckBox.ClickListener() {\r
+            public void buttonClick(ClickEvent event) {\r
+                saved.setEditable(((Boolean) event.getButton().getValue())\r
+                        .booleanValue());\r
+            }\r
+        });\r
+        b.setImmediate(true);\r
+        main.addComponent(b);\r
+\r
+    }\r
+\r
+    // set up the properties (columns)\r
+    private void initProperties(Table table) {\r
+        table.addContainerProperty(PROPERTY_SPECIES, String.class, "");\r
+        table.addContainerProperty(PROPERTY_TYPE, String.class, "");\r
+        table.addContainerProperty(PROPERTY_KIND, String.class, "");\r
+        table\r
+                .addContainerProperty(PROPERTY_HIRED, Boolean.class,\r
+                        Boolean.FALSE);\r
+    }\r
+\r
+    // fill the table with some random data\r
+    private void fillTable(Table table) {\r
+        initProperties(table);\r
+\r
+        final String[] sp = new String[] { "Fox", "Dog", "Cat", "Moose",\r
+                "Penguin", "Cow" };\r
+        final String[] ty = new String[] { "Quick", "Lazy", "Sleepy",\r
+                "Fidgety", "Crazy", "Kewl" };\r
+        final String[] ki = new String[] { "Jumping", "Walking", "Sleeping",\r
+                "Skipping", "Dancing" };\r
+\r
+        Random r = new Random(5);\r
+\r
+        for (int i = 0; i < 100; i++) {\r
+            final String s = sp[(int) (r.nextDouble() * sp.length)];\r
+            final String t = ty[(int) (r.nextDouble() * ty.length)];\r
+            final String k = ki[(int) (r.nextDouble() * ki.length)];\r
+            table.addItem(new Object[] { s, t, k, Boolean.FALSE }, new Integer(\r
+                    i));\r
+        }\r
+\r
+    }\r
+\r
+    // Called for each item (row), returns valid actions for that item\r
+    public Action[] getActions(Object target, Object sender) {\r
+        if (sender == source) {\r
+            final Item item = source.getItem(target);\r
+            // save, delete, and hire if not already hired\r
+            if (item != null\r
+                    && item.getItemProperty(PROPERTY_HIRED).getValue() == Boolean.FALSE) {\r
+                return ACTIONS_HIRE;\r
+            } else {\r
+                return ACTIONS_NOHIRE;\r
+            }\r
+        } else {\r
+            // "saved" table only has one action\r
+            return new Action[] { ACTION_DELETE };\r
+        }\r
+    }\r
+\r
+    // called when an action is invoked on an item (row)\r
+    public void handleAction(Action action, Object sender, Object target) {\r
+        if (sender == source) {\r
+            Item item = source.getItem(target);\r
+            if (action == ACTION_HIRE) {\r
+                // set HIRED property to true\r
+                item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE);\r
+                source.requestRepaint();\r
+                if (saved.containsId(target)) {\r
+                    item = saved.getItem(target);\r
+                    item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE);\r
+                    saved.requestRepaint();\r
+                }\r
+                getWindow().showNotification("Hired", "" + item);\r
+\r
+            } else if (action == ACTION_SAVE) {\r
+                if (saved.containsId(target)) {\r
+                    // let's not save twice\r
+                    getWindow().showNotification("Already saved", "" + item);\r
+                    return;\r
+                }\r
+                // "manual" copy of the item properties we want\r
+                final Item added = saved.addItem(target);\r
+                Property p = added.getItemProperty(PROPERTY_SPECIES);\r
+                p.setValue(item.getItemProperty(PROPERTY_SPECIES).getValue());\r
+                p = added.getItemProperty(PROPERTY_TYPE);\r
+                p.setValue(item.getItemProperty(PROPERTY_TYPE).getValue());\r
+                p = added.getItemProperty(PROPERTY_KIND);\r
+                p.setValue(item.getItemProperty(PROPERTY_KIND).getValue());\r
+                p = added.getItemProperty(PROPERTY_HIRED);\r
+                p.setValue(item.getItemProperty(PROPERTY_HIRED).getValue());\r
+                getWindow().showNotification("Saved", "" + item);\r
+            } else {\r
+                // ACTION_DELETE\r
+                getWindow().showNotification("Deleted ", "" + item);\r
+                source.removeItem(target);\r
+            }\r
+\r
+        } else {\r
+            // sender==saved\r
+            if (action == ACTION_DELETE) {\r
+                final Item item = saved.getItem(target);\r
+                getWindow().showNotification("Deleted", "" + item);\r
+                saved.removeItem(target);\r
+            }\r
+        }\r
+    }\r
+\r
+    public void buttonClick(ClickEvent event) {\r
+        final Button b = event.getButton();\r
+        if (b == deselect) {\r
+            source.setValue(null);\r
+        } else if (b == saveSelected) {\r
+            // loop each selected and copy to "saved" table\r
+            final Set selected = (Set) source.getValue();\r
+            int s = 0;\r
+            for (final Iterator it = selected.iterator(); it.hasNext();) {\r
+                final Object id = it.next();\r
+                if (!saved.containsId(id)) {\r
+                    final Item item = source.getItem(id);\r
+                    final Item added = saved.addItem(id);\r
+                    // "manual" copy of the properties we want\r
+                    Property p = added.getItemProperty(PROPERTY_SPECIES);\r
+                    p.setValue(item.getItemProperty(PROPERTY_SPECIES)\r
+                            .getValue());\r
+                    p = added.getItemProperty(PROPERTY_TYPE);\r
+                    p.setValue(item.getItemProperty(PROPERTY_TYPE).getValue());\r
+                    p = added.getItemProperty(PROPERTY_KIND);\r
+                    p.setValue(item.getItemProperty(PROPERTY_KIND).getValue());\r
+                    p = added.getItemProperty(PROPERTY_HIRED);\r
+                    p.setValue(item.getItemProperty(PROPERTY_HIRED).getValue());\r
+                    s++;\r
+                }\r
+            }\r
+            getWindow().showNotification("Saved " + s);\r
+            saved.requestRepaint();\r
+\r
+        } else if (b == hireSelected) {\r
+            // loop each selected and set property HIRED to true\r
+            int s = 0;\r
+            final Set selected = (Set) source.getValue();\r
+            for (final Iterator it = selected.iterator(); it.hasNext();) {\r
+                final Object id = it.next();\r
+                Item item = source.getItem(id);\r
+                final Property p = item.getItemProperty(PROPERTY_HIRED);\r
+                if (p.getValue() == Boolean.FALSE) {\r
+                    p.setValue(Boolean.TRUE);\r
+                    source.requestRepaint();\r
+                    s++;\r
+                }\r
+                if (saved.containsId(id)) {\r
+                    // also update "saved" table\r
+                    item = saved.getItem(id);\r
+                    item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE);\r
+                    saved.requestRepaint();\r
+                }\r
+            }\r
+            getWindow().showNotification("Hired " + s);\r
+\r
+        } else {\r
+            // loop trough selected and delete\r
+            int s = 0;\r
+            final Set selected = (Set) source.getValue();\r
+            for (final Iterator it = selected.iterator(); it.hasNext();) {\r
+                final Object id = it.next();\r
+                if (source.containsId(id)) {\r
+                    s++;\r
+                    source.removeItem(id);\r
+                    source.requestRepaint();\r
+                }\r
+            }\r
+            getWindow().showNotification("Deleted " + s);\r
+        }\r
+\r
+    }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/TreeExample.java
new file mode 100644 (file)
index 0000000..f5c0bd5
--- /dev/null
@@ -0,0 +1,161 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.featurebrowser;
+
+import com.itmill.toolkit.data.Item;
+import com.itmill.toolkit.data.Property;
+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.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;
+
+/**
+ * Demonstrates basic Tree -functionality. Actions are used for add/remove item
+ * functionality, and a ValueChangeListener reacts to both the Tree and the
+ * TextField.
+ */
+public class TreeExample extends CustomComponent implements Action.Handler,
+        Tree.ValueChangeListener {
+
+    private static final Action ADD = new Action("Add item");
+    private static final Action DELETE = new Action("Delete item");
+    private static final Action[] actions = new Action[] { ADD, DELETE };
+
+    // Id for the caption property
+    private static final Object CAPTION_PROPERTY = "caption";
+
+    private static final String desc = "Try both right- and left-click!";
+
+    Tree tree;
+    TextField editor;
+
+    public TreeExample() {
+        final OrderedLayout main = new OrderedLayout(
+                OrderedLayout.ORIENTATION_HORIZONTAL);
+        main.setDebugId("mainLayout");
+        main.setMargin(true);
+        setCompositionRoot(main);
+
+        // Panel w/ Tree
+        Panel p = new Panel("Select item");
+        p.setStyleName(Panel.STYLE_LIGHT);
+        p.setWidth(250);
+        // Description
+        p.addComponent(new Label(desc));
+        // Tree with a few items
+        tree = new Tree();
+        tree.setDebugId("tree");
+        tree.setImmediate(true);
+        // we'll use a property for caption instead of the item id ("value"),
+        // so that multiple items can have the same caption
+        tree.addContainerProperty(CAPTION_PROPERTY, String.class, "");
+        tree.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
+        tree.setItemCaptionPropertyId(CAPTION_PROPERTY);
+        for (int i = 1; i <= 3; i++) {
+            final Object id = addCaptionedItem("Section " + i, null);
+            tree.expandItem(id);
+            addCaptionedItem("Team A", id);
+            addCaptionedItem("Team B", id);
+        }
+        // listen for selections
+        tree.addListener(this);
+        // "context menu"
+        tree.addActionHandler(this);
+        p.addComponent(tree);
+        main.addComponent(p);
+
+        // Panel w/ TextField ("editor")
+        p = new Panel("Edit item caption");
+        p.setStyleName(Panel.STYLE_LIGHT);
+        editor = new TextField();
+        // make immediate, instead of adding an "apply" button
+        editor.setImmediate(true);
+        editor.setEnabled(false);
+        editor.setColumns(15);
+        p.addComponent(editor);
+        main.addComponent(p);
+    }
+
+    public Action[] getActions(Object target, Object sender) {
+        // We can provide different actions for each target (item), but we'll
+        // use the same actions all the time.
+        return actions;
+    }
+
+    public void handleAction(Action action, Object sender, Object target) {
+        if (action == DELETE) {
+            tree.removeItem(target);
+        } else {
+            // Add
+            final Object id = addCaptionedItem("New Item", target);
+            tree.expandItem(target);
+            tree.setValue(id);
+            editor.focus();
+        }
+    }
+
+    public void valueChange(ValueChangeEvent event) {
+        final Object id = tree.getValue(); // selected item id
+        if (event.getProperty() == tree) {
+            // a Tree item was (un) selected
+            if (id == null) {
+                // no selecteion, disable TextField
+                editor.removeListener(this);
+                editor.setValue("");
+                editor.setEnabled(false);
+            } else {
+                // item selected
+                // first remove previous listener
+                editor.removeListener(this);
+                // enable TextField and update value
+                editor.setEnabled(true);
+                final Item item = tree.getItem(id);
+                editor.setValue(item.getItemProperty(CAPTION_PROPERTY)
+                        .getValue());
+                // listen for TextField changes
+                editor.addListener(this);
+                editor.focus();
+            }
+        } else {
+            // TextField
+            if (id != null) {
+                final Item item = tree.getItem(id);
+                final Property p = item.getItemProperty(CAPTION_PROPERTY);
+                p.setValue(editor.getValue());
+                tree.requestRepaint();
+            }
+
+        }
+    }
+
+    /**
+     * Helper to add an item with specified caption and (optional) parent.
+     * 
+     * @param caption
+     *                The item caption
+     * @param parent
+     *                The (optional) parent item id
+     * @return the created item's id
+     */
+    private Object addCaptionedItem(String caption, Object parent) {
+        // add item, let tree decide id
+        final Object id = tree.addItem();
+        // get the created item
+        final Item item = tree.getItem(id);
+        // set our "caption" property
+        final Property p = item.getItemProperty(CAPTION_PROPERTY);
+        p.setValue(caption);
+        if (parent != null) {
+            tree.setParent(id, parent);
+        }
+        return id;
+    }
+
+}
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/ValueInputExample.java
new file mode 100644 (file)
index 0000000..dc5ad33
--- /dev/null
@@ -0,0 +1,151 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import com.itmill.toolkit.data.Property.ValueChangeEvent;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.DateField;\r
+import com.itmill.toolkit.ui.Field;\r
+import com.itmill.toolkit.ui.InlineDateField;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Panel;\r
+import com.itmill.toolkit.ui.Slider;\r
+import com.itmill.toolkit.ui.TextField;\r
+import com.itmill.toolkit.ui.Window.Notification;\r
+\r
+/**\r
+ * Shows some basic fields for value input; TextField, DateField, Slider...\r
+ * \r
+ * @author IT Mill Ltd.\r
+ */\r
+public class ValueInputExample extends CustomComponent {\r
+\r
+    public ValueInputExample() {\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        // listener that shows a value change notification\r
+        final Field.ValueChangeListener listener = new Field.ValueChangeListener() {\r
+            public void valueChange(ValueChangeEvent event) {\r
+                getWindow().showNotification("Received",\r
+                        "<pre>" + event.getProperty().getValue() + "</pre>",\r
+                        Notification.TYPE_WARNING_MESSAGE);\r
+            }\r
+        };\r
+\r
+        // TextField\r
+        OrderedLayout horiz = new OrderedLayout(\r
+                OrderedLayout.ORIENTATION_HORIZONTAL);\r
+        main.addComponent(horiz);\r
+        Panel left = new Panel("TextField");\r
+        left.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(left);\r
+        Panel right = new Panel("multiline");\r
+        right.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(right);\r
+        // basic TextField\r
+        TextField tf = new TextField("Basic");\r
+        tf.setDebugId("BasicTextField");\r
+        tf.setColumns(15);\r
+        tf.setImmediate(true);\r
+        tf.addListener(listener);\r
+        left.addComponent(tf);\r
+        // multiline TextField a.k.a TextArea\r
+        tf = new TextField("Area");\r
+        tf.setDebugId("AreaTextField");\r
+        tf.setColumns(15);\r
+        tf.setRows(5);\r
+        tf.setImmediate(true);\r
+        tf.addListener(listener);\r
+        right.addComponent(tf);\r
+\r
+        // DateFields\r
+        horiz = new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL);\r
+        main.addComponent(horiz);\r
+        left = new Panel("DateField");\r
+        left.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(left);\r
+        right = new Panel("inline");\r
+        right.setStyleName(Panel.STYLE_LIGHT);\r
+        horiz.addComponent(right);\r
+        // default\r
+        DateField df = new DateField("Day resolution");\r
+        df.setDebugId("DayResolutionDateField");\r
+        df.addListener(listener);\r
+        df.setImmediate(true);\r
+        df.setResolution(DateField.RESOLUTION_DAY);\r
+        left.addComponent(df);\r
+        // minute\r
+        df = new DateField("Minute resolution");\r
+        df.setDebugId("MinuteResolutionDateField");\r
+        df.addListener(listener);\r
+        df.setImmediate(true);\r
+        df.setResolution(DateField.RESOLUTION_MIN);\r
+        left.addComponent(df);\r
+        // year\r
+        df = new DateField("Year resolution");\r
+        df.setDebugId("YearResolutionDateField");\r
+        df.addListener(listener);\r
+        df.setImmediate(true);\r
+        df.setResolution(DateField.RESOLUTION_YEAR);\r
+        left.addComponent(df);\r
+        // msec\r
+        df = new DateField("Millisecond resolution");\r
+        df.setDebugId("MillisecondResolutionDateField");\r
+        df.addListener(listener);\r
+        df.setImmediate(true);\r
+        df.setResolution(DateField.RESOLUTION_MSEC);\r
+        left.addComponent(df);\r
+        // Inline\r
+        df = new InlineDateField();\r
+        df.setDebugId("InlineDateField");\r
+        df.addListener(listener);\r
+        df.setImmediate(true);\r
+        right.addComponent(df);\r
+\r
+        // Slider\r
+        left = new Panel("Slider");\r
+        left.setStyleName(Panel.STYLE_LIGHT);\r
+        main.addComponent(left);\r
+        // int slider\r
+        Slider slider = new Slider(0, 100);\r
+        slider.setDebugId("Slider1");\r
+        slider.setSize(300);\r
+        slider.setImmediate(true);\r
+        slider.addListener(new Slider.ValueChangeListener() {\r
+            public void valueChange(ValueChangeEvent event) {\r
+                // update caption when value changes\r
+                final Slider s = (Slider) event.getProperty();\r
+                s.setCaption("Value: " + s.getValue());\r
+            }\r
+        });\r
+        try {\r
+            slider.setValue(20);\r
+        } catch (final Exception e) {\r
+            e.printStackTrace(System.err);\r
+        }\r
+        left.addComponent(slider);\r
+        // double slider\r
+        slider = new Slider(0.0, 1.0, 1);\r
+        slider.setDebugId("Slider2");\r
+        slider.setImmediate(true);\r
+        slider.addListener(new Slider.ValueChangeListener() {\r
+            public void valueChange(ValueChangeEvent event) {\r
+                // update caption when value changes\r
+                final Slider s = (Slider) event.getProperty();\r
+                s.setCaption("Value: " + s.getValue());\r
+            }\r
+        });\r
+        try {\r
+            slider.setValue(0.5);\r
+        } catch (final Exception e) {\r
+            e.printStackTrace(System.err);\r
+        }\r
+        left.addComponent(slider);\r
+\r
+    }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java b/src/com/itmill/toolkit/automatedtests/featurebrowser/WindowingExample.java
new file mode 100644 (file)
index 0000000..9da87d8
--- /dev/null
@@ -0,0 +1,104 @@
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.automatedtests.featurebrowser;\r
+\r
+import java.net.URL;\r
+\r
+import com.itmill.toolkit.terminal.ExternalResource;\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.CustomComponent;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Window;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+\r
+/**\r
+ * @author marc\r
+ * \r
+ */\r
+public class WindowingExample extends CustomComponent {\r
+\r
+    public static final String txt = "<p>There are two main types of windows: application-level windows, and"\r
+            + "\"subwindows\". </p><p> A subwindow is rendered as a \"inline\" popup window"\r
+            + " within the (native) browser window to which it was added. You can create"\r
+            + " a subwindow by creating a new Window and adding it to a application-level window, for instance"\r
+            + " your main window. </p><p> In contrast, you create a application-level window by"\r
+            + " creating a new Window and adding it to the Application. Application-level"\r
+            + " windows are not shown by default - you need to open a browser window for"\r
+            + " the url representing the window. You can think of the application-level"\r
+            + " windows as separate views into your application - and a way to create a"\r
+            + " \"native\" browser window. </p><p> Depending on your needs, it's also"\r
+            + " possible to create a new window instance (with it's own internal state)"\r
+            + " for each new (native) browser window, or you can share the same instance"\r
+            + " (and state) between several browser windows (the latter is most useful"\r
+            + " for read-only views).</p>";\r
+\r
+    private URL windowUrl = null;\r
+\r
+    public WindowingExample() {\r
+        final OrderedLayout main = new OrderedLayout();\r
+        main.setMargin(true);\r
+        setCompositionRoot(main);\r
+\r
+        final Label l = new Label(txt);\r
+        l.setContentMode(Label.CONTENT_XHTML);\r
+        main.addComponent(l);\r
+\r
+        main.addComponent(new Button("Create a new subwindow",\r
+                new Button.ClickListener() {\r
+                    public void buttonClick(ClickEvent event) {\r
+                        final Window w = new Window("Subwindow");\r
+                        final Label l = new Label(txt);\r
+                        l.setContentMode(Label.CONTENT_XHTML);\r
+                        w.addComponent(l);\r
+                        getApplication().getMainWindow().addWindow(w);\r
+                    }\r
+                }));\r
+        main.addComponent(new Button("Create a new modal window",\r
+                new Button.ClickListener() {\r
+                    public void buttonClick(ClickEvent event) {\r
+                        final Window w = new Window("Modal window");\r
+                        w.setModal(true);\r
+                        final Label l = new Label(txt);\r
+                        l.setContentMode(Label.CONTENT_XHTML);\r
+                        w.addComponent(l);\r
+                        getApplication().getMainWindow().addWindow(w);\r
+                    }\r
+                }));\r
+        main.addComponent(new Button(\r
+                "Open a application-level window, with shared state",\r
+                new Button.ClickListener() {\r
+                    public void buttonClick(ClickEvent event) {\r
+                        if (windowUrl == null) {\r
+                            final Window w = new Window("Subwindow");\r
+                            final Label l = new Label(txt);\r
+                            l.setContentMode(Label.CONTENT_XHTML);\r
+                            w.addComponent(l);\r
+                            getApplication().addWindow(w);\r
+                            windowUrl = w.getURL();\r
+                        }\r
+                        getApplication().getMainWindow().open(\r
+                                new ExternalResource(windowUrl), "_new");\r
+                    }\r
+                }));\r
+        main.addComponent(new Button(\r
+                "Create a new application-level window, with it's own state",\r
+                new Button.ClickListener() {\r
+                    public void buttonClick(ClickEvent event) {\r
+                        final Window w = new Window("Subwindow");\r
+                        getApplication().addWindow(w);\r
+                        final Label l = new Label(\r
+                                "Each opened window has its own"\r
+                                        + " name, and is accessed trough its own uri.");\r
+                        l.setCaption("Window " + w.getName());\r
+                        w.addComponent(l);\r
+                        getApplication().getMainWindow().open(\r
+                                new ExternalResource(w.getURL()), "_new");\r
+                    }\r
+                }));\r
+\r
+    }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/automatedtests/robustness/Robustness.java b/src/com/itmill/toolkit/automatedtests/robustness/Robustness.java
new file mode 100644 (file)
index 0000000..c8034e2
--- /dev/null
@@ -0,0 +1,90 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.robustness;
+
+import com.itmill.toolkit.automatedtests.util.Log;
+import com.itmill.toolkit.automatedtests.util.RandomComponents;
+import com.itmill.toolkit.ui.Button;
+import com.itmill.toolkit.ui.ComponentContainer;
+import com.itmill.toolkit.ui.Label;
+import com.itmill.toolkit.ui.Window;
+import com.itmill.toolkit.ui.Button.ClickEvent;
+
+public abstract class Robustness extends com.itmill.toolkit.Application
+        implements Button.ClickListener {
+
+    static int totalCount = 0;
+
+    int count = 0;
+
+    final Window main = new Window("Robustness tests by featurebrowser");
+
+    Button close = new Button("Close application");
+
+    Button remove = new Button("Remove all components");
+
+    Button create = new Button("Create");
+
+    Label label = new Label();
+
+    ComponentContainer stressLayout;
+
+    RandomComponents randomComponents = new RandomComponents();
+
+    public void init() {
+        createNewView();
+    }
+
+    public void createNewView() {
+        setMainWindow(main);
+        main.setDebugId("MainWindow");
+        main.removeAllComponents();
+
+        main.addComponent(label);
+        main.addComponent(close);
+        main.addComponent(remove);
+        main.addComponent(create);
+        close.addListener(this);
+        remove.addListener(this);
+        create.addListener(this);
+
+        remove.setDescription("After this garbage collector should"
+                + " be able to collect every component"
+                + " inside stressLayout.");
+
+        close.setDebugId("close");
+        remove.setDebugId("remove");
+        create.setDebugId("create");
+
+    }
+
+    public void buttonClick(ClickEvent event) {
+        if (event.getButton() == create)
+            create();
+        else if (event.getButton() == remove) {
+            main.removeAllComponents();
+            close.removeListener(this);
+            remove.removeListener(this);
+            create.removeListener(this);
+            close = null;
+            remove = null;
+            create = null;
+            label = null;
+            stressLayout = null;
+            System.out.println("main.getLayout()=" + main.getLayout());
+            System.out.println(Log.getMemoryStatistics());
+        } else if (event.getButton() == close) {
+            System.out.println("Before close, memory statistics:");
+            System.out.println(Log.getMemoryStatistics());
+            close();
+            // Still valueUnbound (session expiration) needs to occur for GC to
+            // do its work
+            System.out.println("After close, memory statistics:");
+            System.out.println(Log.getMemoryStatistics());
+        }
+    }
+
+    public abstract void create();
+}
diff --git a/src/com/itmill/toolkit/automatedtests/robustness/RobustnessComplex.java b/src/com/itmill/toolkit/automatedtests/robustness/RobustnessComplex.java
new file mode 100644 (file)
index 0000000..4f93256
--- /dev/null
@@ -0,0 +1,43 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.robustness;
+
+import com.itmill.toolkit.automatedtests.util.Log;
+import com.itmill.toolkit.ui.Button;
+import com.itmill.toolkit.ui.Label;
+
+public class RobustnessComplex extends Robustness implements
+        Button.ClickListener {
+
+    /**
+     * Create complex layouts with components and listeners.
+     */
+    public void create() {
+        count++;
+
+        // remove old stressLayout, all dependant components should be now
+        // allowed for garbage collection.
+        if (stressLayout != null)
+            main.removeComponent(stressLayout);
+
+        // create new stress layout
+        stressLayout = randomComponents
+                .getRandomComponentContainer("Component container " + count);
+
+        Label label = new Label("Label " + Log.getMemoryStatistics(),
+                Label.CONTENT_PREFORMATTED);
+        stressLayout.addComponent(label);
+
+        // fill with random components
+        randomComponents.fillLayout(stressLayout, 50);
+
+        // add new component container to main layout
+        main.addComponent(stressLayout);
+
+        // if ((count % 100) == 0) {
+        System.out.println("Created " + count + " times.");
+        // }
+    }
+}
diff --git a/src/com/itmill/toolkit/automatedtests/util/DebugId.java b/src/com/itmill/toolkit/automatedtests/util/DebugId.java
new file mode 100644 (file)
index 0000000..03dc6ce
--- /dev/null
@@ -0,0 +1,49 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.util;
+
+import java.util.HashMap;
+
+import com.itmill.toolkit.ui.Component;
+
+public class DebugId {
+
+    private static HashMap debugIds = new HashMap();
+
+    /**
+     * Generate static debug id based on package and component type. If
+     * duplicate package, component type then number of instances count is
+     * appended to debugId.
+     * 
+     * @param c
+     */
+    public static void set(Component c, String description) {
+        String debugId = "";
+
+        // add package name
+        StackTraceElement[] st = new Throwable().fillInStackTrace()
+                .getStackTrace();
+        try {
+            debugId += st[3].getClassName();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        // add component type
+        debugId += c.getClass();
+
+        // add given description
+        debugId += description;
+
+        if (debugIds.containsKey(debugId)) {
+            int count = ((Integer) debugIds.get(debugId)).intValue();
+            count++;
+            debugIds.put(debugId, new Integer(count));
+            debugId = debugId + "-" + count;
+        }
+
+        c.setDebugId(debugId);
+    }
+}
diff --git a/src/com/itmill/toolkit/automatedtests/util/Log.java b/src/com/itmill/toolkit/automatedtests/util/Log.java
new file mode 100644 (file)
index 0000000..43c0efe
--- /dev/null
@@ -0,0 +1,133 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.util;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * 
+ * Execution output and error messages should be handled through this class. It
+ * is likely that we need these messages back to TT Server at some point just to
+ * figure out what went wrong.
+ * 
+ */
+public class Log {
+
+    // 3 (errors only)
+    // 2 (+ warnings)
+    // 1 (+logs)
+    // 0 (all, print messages also to System.out)
+    public static final int debug = 0;
+
+    // Should class.method() and it's call times be told on debug?
+    public static final boolean showClassInformation = true;
+
+    public static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    public static int DEBUG = 0;
+
+    public static int LOG = 1;
+
+    public static int WARN = 2;
+
+    public static int ERROR = 3;
+
+    private static Log log;
+
+    public static HashMap classMethodCallCounter = new HashMap();
+
+    static {
+        log = new Log();
+    }
+
+    public static void reset() {
+        classMethodCallCounter = new HashMap();
+    }
+
+    public static String getNow() {
+        return df.format(new Date());
+    }
+
+    private Log() {
+    }
+
+    public static String getSource() {
+        StackTraceElement[] st = new Throwable().fillInStackTrace()
+                .getStackTrace();
+        try {
+            String key = "";
+            String methodName = st[3].getMethodName();
+            int line = st[3].getLineNumber();
+
+            String clazz = st[3].getClassName() + ".java";
+            key = "(" + clazz + ":" + line + ")" + " " + methodName;
+            Integer value = (Integer) classMethodCallCounter.get(key);
+            if (value == null)
+                value = new Integer(1);
+            else
+                value = new Integer(value.intValue() + 1);
+            classMethodCallCounter.put(key, value);
+            return value.intValue() + ": " + key;
+        } catch (Exception e) {
+            return "unknown class.method";
+        }
+
+    }
+
+    public static String getClassMethodCounters() {
+        String result = "";
+        for (final Iterator it = classMethodCallCounter.keySet().iterator(); it
+                .hasNext();) {
+            String key = (String) it.next();
+            result += classMethodCallCounter.get(key) + ": " + key + "\n";
+        }
+        return result;
+    }
+
+    public void add(int type, String message) {
+        String source = getSource();
+        if (type >= debug) {
+            if (showClassInformation)
+                System.out.println(source + ": " + message);
+            else
+                System.out.println(message);
+        }
+    }
+
+    public static void debug(String message) {
+        log.add(DEBUG, message);
+    }
+
+    public static void log(String message) {
+        log.add(LOG, message);
+    }
+
+    public static void warn(String message) {
+        log.add(WARN, message);
+    }
+
+    public static void error(String message) {
+        log.add(ERROR, message);
+    }
+
+    /**
+     * Simple way to check for memory consumption without profiler.
+     */
+    public static String getMemoryStatistics() {
+        // You should call gc before printing statistics (if you are not using a
+        // profiler)
+        System.gc();
+        long inUse = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime()
+                .freeMemory());
+        return "Memory:\n" + inUse + " (Used)\n"
+                + Runtime.getRuntime().totalMemory() + " (Total)\n"
+                + Runtime.getRuntime().freeMemory() + " (Free)\n";
+
+    }
+}
diff --git a/src/com/itmill/toolkit/automatedtests/util/MultiListener.java b/src/com/itmill/toolkit/automatedtests/util/MultiListener.java
new file mode 100644 (file)
index 0000000..f210099
--- /dev/null
@@ -0,0 +1,35 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.util;
+
+import com.itmill.toolkit.data.Container.ItemSetChangeEvent;
+import com.itmill.toolkit.data.Container.ItemSetChangeListener;
+import com.itmill.toolkit.data.Container.PropertySetChangeEvent;
+import com.itmill.toolkit.data.Container.PropertySetChangeListener;
+import com.itmill.toolkit.data.Property.ValueChangeEvent;
+import com.itmill.toolkit.data.Property.ValueChangeListener;
+import com.itmill.toolkit.ui.Button;
+import com.itmill.toolkit.ui.Button.ClickEvent;
+
+public class MultiListener implements Button.ClickListener,
+        PropertySetChangeListener, ItemSetChangeListener, ValueChangeListener {
+
+    public void buttonClick(ClickEvent event) {
+        Log.debug("ClickEvent from " + event.getButton().getCaption());
+    }
+
+    public void containerPropertySetChange(PropertySetChangeEvent event) {
+        Log.debug("containerPropertySetChange from " + event.getContainer());
+    }
+
+    public void containerItemSetChange(ItemSetChangeEvent event) {
+        Log.debug("containerItemSetChange from " + event.getContainer());
+    }
+
+    public void valueChange(ValueChangeEvent event) {
+        Log.debug("valueChange from " + event.getProperty());
+    }
+
+}
diff --git a/src/com/itmill/toolkit/automatedtests/util/RandomComponents.java b/src/com/itmill/toolkit/automatedtests/util/RandomComponents.java
new file mode 100644 (file)
index 0000000..395924c
--- /dev/null
@@ -0,0 +1,278 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.automatedtests.util;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import com.itmill.toolkit.automatedtests.ComponentsInTable;
+import com.itmill.toolkit.data.Container.ItemSetChangeListener;
+import com.itmill.toolkit.data.Container.PropertySetChangeListener;
+import com.itmill.toolkit.data.Property.ValueChangeListener;
+import com.itmill.toolkit.demo.featurebrowser.ButtonExample;
+import com.itmill.toolkit.demo.featurebrowser.ClientCachingExample;
+import com.itmill.toolkit.demo.featurebrowser.ComboBoxExample;
+import com.itmill.toolkit.demo.featurebrowser.EmbeddedBrowserExample;
+import com.itmill.toolkit.demo.featurebrowser.JavaScriptAPIExample;
+import com.itmill.toolkit.demo.featurebrowser.LabelExample;
+import com.itmill.toolkit.demo.featurebrowser.LayoutExample;
+import com.itmill.toolkit.demo.featurebrowser.NotificationExample;
+import com.itmill.toolkit.demo.featurebrowser.RichTextExample;
+import com.itmill.toolkit.demo.featurebrowser.SelectExample;
+import com.itmill.toolkit.demo.featurebrowser.TableExample;
+import com.itmill.toolkit.demo.featurebrowser.TreeExample;
+import com.itmill.toolkit.demo.featurebrowser.ValueInputExample;
+import com.itmill.toolkit.demo.featurebrowser.WindowingExample;
+import com.itmill.toolkit.terminal.ExternalResource;
+import com.itmill.toolkit.terminal.ThemeResource;
+import com.itmill.toolkit.ui.AbstractComponent;
+import com.itmill.toolkit.ui.Button;
+import com.itmill.toolkit.ui.ComponentContainer;
+import com.itmill.toolkit.ui.DateField;
+import com.itmill.toolkit.ui.Embedded;
+import com.itmill.toolkit.ui.GridLayout;
+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.Select;
+import com.itmill.toolkit.ui.TabSheet;
+import com.itmill.toolkit.ui.TextField;
+
+public class RandomComponents {
+
+    private Random rand = null;
+
+    public RandomComponents() {
+        // Always use the same seed, used to ensure deterministic behaviour
+        rand = new Random(1);
+    }
+
+    /**
+     * Get random component container
+     * 
+     * @param caption
+     * @return
+     */
+    public ComponentContainer getRandomComponentContainer(String caption) {
+        ComponentContainer result = null;
+        final int randint = rand.nextInt(5);
+        switch (randint) {
+
+        case 0:
+            result = new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL);
+            ((OrderedLayout) result).setCaption("OrderedLayout_horizontal_"
+                    + caption);
+            break;
+        case 1:
+            result = new OrderedLayout(OrderedLayout.ORIENTATION_VERTICAL);
+            ((OrderedLayout) result).setCaption("OrderedLayout_vertical_"
+                    + caption);
+            break;
+        case 2:
+            GridLayout gl;
+            if (rand.nextInt(1) > 0) {
+                gl = new GridLayout();
+            } else {
+                gl = new GridLayout(rand.nextInt(3) + 1, rand.nextInt(3) + 1);
+            }
+            gl.setCaption("GridLayout_" + caption);
+            gl.setDescription(gl.getCaption());
+            for (int x = 0; x < gl.getColumns(); x++) {
+                for (int y = 0; y < gl.getRows(); y++) {
+                    // gl.addComponent(getExamplePicture("x=" + x + ", y=" + y),
+                    // x, y);
+                    gl.addComponent(new Label("x=" + x + ", y=" + y));
+                }
+            }
+            result = gl;
+            break;
+        case 3:
+            result = new Panel();
+            ((Panel) result).setCaption("Panel_" + caption);
+            break;
+        case 4:
+            final TabSheet ts = new TabSheet();
+            ts.setCaption("TabSheet_" + caption);
+            // randomly select one of the tabs
+            final int selectedTab = rand.nextInt(3);
+            final ArrayList tabs = new ArrayList();
+            for (int i = 0; i < 3; i++) {
+                String tabCaption = "tab" + i;
+                if (selectedTab == i) {
+                    tabCaption = "tabX";
+                }
+                tabs.add(new OrderedLayout());
+                ts.addTab((ComponentContainer) tabs.get(tabs.size() - 1),
+                        tabCaption, null);
+            }
+            ts.setSelectedTab((ComponentContainer) tabs.get(selectedTab));
+            result = ts;
+            break;
+        }
+
+        return result;
+    }
+
+    public AbstractComponent getRandomComponent(int caption) {
+        AbstractComponent result = null;
+        int randint = rand.nextInt(23);
+        MultiListener l = new MultiListener();
+        switch (randint) {
+        case 0:
+            // Label
+            result = new Label();
+            result.setCaption("Label component " + caption);
+            result.setDebugId(result.getCaption());
+            break;
+        case 1:
+            // Button
+            result = new Button();
+            result.setCaption("Button component " + caption);
+            result.setDebugId(result.getCaption());
+            // some listeners
+            ((Button) result).addListener((Button.ClickListener) l);
+            break;
+        case 2:
+            // TextField
+            result = new TextField();
+            result.setCaption("TextField component " + caption);
+            result.setDebugId(result.getCaption());
+            break;
+        case 3:
+            // Select
+            result = new Select("Select component " + caption);
+            result.setCaption("Select component " + caption);
+            result.setDebugId(result.getCaption());
+            result.setImmediate(true);
+            ((Select) result).setNewItemsAllowed(true);
+            // items
+            ((Select) result).addItem("first");
+            ((Select) result).addItem("first");
+            ((Select) result).addItem("first");
+            ((Select) result).addItem("second");
+            ((Select) result).addItem("third");
+            ((Select) result).addItem("fourth");
+            // some listeners
+            ((Select) result).addListener((ValueChangeListener) l);
+            ((Select) result).addListener((PropertySetChangeListener) l);
+            ((Select) result).addListener((ItemSetChangeListener) l);
+            break;
+        case 4:
+            // Link
+            result = new Link("", new ExternalResource("http://www.itmill.com"));
+            result.setCaption("Link component " + caption);
+            break;
+        case 5:
+            // Link
+            result = new Panel();
+            result.setCaption("Panel component " + caption);
+            ((Panel) result)
+                    .addComponent(new Label(
+                            "Panel is a container for other components, by default it draws a frame around it's "
+                                    + "extremities and may have a caption to clarify the nature of the contained components' purpose."
+                                    + " Panel contains an layout where the actual contained components are added, "
+                                    + "this layout may be switched on the fly."));
+            ((Panel) result).setWidth(250);
+            break;
+        case 6:
+            // Datefield
+            result = new DateField();
+            ((DateField) result).setStyleName("calendar");
+            ((DateField) result).setValue(new java.util.Date());
+            result.setCaption("Calendar component " + caption);
+            result.setDebugId(result.getCaption());
+            break;
+        case 7:
+            // Datefield
+            result = new DateField();
+            ((DateField) result).setValue(new java.util.Date());
+            result.setCaption("Calendar component " + caption);
+            result.setDebugId(result.getCaption());
+            break;
+        case 8:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new ButtonExample());
+            break;
+        case 9:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new ClientCachingExample());
+            break;
+        case 10:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new ComboBoxExample());
+            break;
+        case 11:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new EmbeddedBrowserExample());
+            break;
+        case 12:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new JavaScriptAPIExample());
+            break;
+        case 13:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new LabelExample());
+            break;
+        case 14:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new LayoutExample());
+            break;
+        case 15:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new NotificationExample());
+            break;
+        case 16:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new RichTextExample());
+            break;
+        case 17:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new SelectExample());
+            break;
+        case 18:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new ValueInputExample());
+            break;
+        case 19:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new WindowingExample());
+            break;
+        case 20:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new TreeExample());
+            break;
+        case 21:
+            result = new OrderedLayout();
+            ((OrderedLayout) result).addComponent(new TableExample());
+            break;
+        case 22:
+            result = new OrderedLayout();
+            ((OrderedLayout) result)
+                    .addComponent(new ComponentsInTable(4, 1000));
+            break;
+        }
+
+        return result;
+    }
+
+    /**
+     * Add demo components to given container
+     * 
+     * @param container
+     */
+    public void fillLayout(ComponentContainer container, int numberOfComponents) {
+        for (int i = 0; i < numberOfComponents; i++) {
+            container.addComponent(getRandomComponent(i));
+        }
+    }
+
+    public AbstractComponent getExamplePicture(String caption) {
+        final ThemeResource res = new ThemeResource("test.png");
+        final Embedded em = new Embedded("Embedded " + caption, res);
+        return em;
+    }
+
+}
index 0d8297504cbb2a4d02e6870e1d3f6160e278202b..cc74ce87b53736d82b05619c9f89568da19700f8 100644 (file)
@@ -12,8 +12,6 @@ import org.mortbay.jetty.Server;
 import org.mortbay.jetty.nio.SelectChannelConnector;\r
 import org.mortbay.jetty.webapp.WebAppContext;\r
 \r
-import com.itmill.toolkit.launcher.util.BrowserLauncher;\r
-\r
 /**\r
  * Class for running Jetty servlet container within Eclipse project.\r
  * \r
@@ -42,7 +40,7 @@ public class ITMillToolkitWebMode {
         // Start Browser\r
         System.out.println("Starting Web Browser.");\r
         if (url != null) {\r
-            BrowserLauncher.openBrowser(url);\r
+            // BrowserLauncher.openBrowser(url);\r
         }\r
 \r
     }\r
index 028a0bda3452712bc04f3568fa3a961c316847af..0d55cd5c82b161e24e0df8de9665d2337bc10d29 100644 (file)
@@ -96,7 +96,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         main.addComponent(eventListenerFeedback);
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             window = new Window("Components inside Window (TEST: Window)");
 
             if (false) {
@@ -110,7 +110,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target
                     .addComponent(new Label(
                             "<hr /><h1>Components inside horizontal OrderedLayout</h3>",
@@ -122,7 +122,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target
                     .addComponent(new Label(
                             "<br/><br/><br/><hr /><h1>Components inside vertical OrderedLayout</h3>",
@@ -134,7 +134,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target.addComponent(new Label(
                     "<hr /><h1>Components inside TabSheet</h3>",
                     Label.CONTENT_XHTML));
@@ -160,6 +160,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
                     "<hr /><h1>Components inside Accordion</h3>",
                     Label.CONTENT_XHTML));
             final Accordion accordion = new Accordion();
+            accordion.setHeight(500);
             final OrderedLayout acc1 = new OrderedLayout();
             acc1.addComponent(new Label("try acc2"));
             final OrderedLayout acc2 = new OrderedLayout();
@@ -176,7 +177,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target.addComponent(new Label(
                     "<hr /><h1>Components inside GridLayout</h3>",
                     Label.CONTENT_XHTML));
@@ -187,7 +188,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target
                     .addComponent(new Label(
                             "<hr /><h1>Components inside ExpandLayout (height 250px)</h3>",
@@ -200,7 +201,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target.addComponent(new Label(
                     "<hr /><h1>Components inside Panel</h3>",
                     Label.CONTENT_XHTML));
@@ -210,7 +211,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target
                     .addComponent(new Label(
                             "<hr /><h1>Components inside vertical SplitPanel (splitpanel is under 250height ExpandLayout)</h3>",
@@ -230,7 +231,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // //////////////////////////////////////////////////////////////////////////
-        if (true) {
+        if (false) {
             target
                     .addComponent(new Label(
                             "<hr /><h1>Components inside horizontal SplitPanel (splitpanel is under 250px height ExpandLayout)</h3>",
@@ -408,7 +409,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         // TWEAK these
         // c.setEnabled(false);
         // c.setVisible(false);
-        c.setStyleName("testStyleName");
+        // c.setStyleName("testStyleName");
         // c.setReadOnly(true);
 
         // try to add listener
@@ -427,7 +428,7 @@ public class TestComponentsAndLayouts extends Application implements Listener,
      */
     void test(AbstractComponent c) {
         // configure common component properties
-        setComponentProperties(c);
+        // setComponentProperties(c);
 
         // AbstractComponent specific configuration
         final ClassResource res = new ClassResource("m.gif", this);
@@ -437,12 +438,12 @@ public class TestComponentsAndLayouts extends Application implements Listener,
         }
 
         // TWEAK these
-        c.setComponentError(errorMsg);
-        c.setIcon(res);
-        c.setImmediate(true);
-        c.addStyleName("addedTestStyleName");
+        // c.setComponentError(errorMsg);
+        // c.setIcon(res);
+        // c.setImmediate(true);
+        // c.addStyleName("addedTestStyleName");
         // c.setStyleName("singleTestStyleName");
-        c.setDescription("Description here..");
+        // c.setDescription("Description here..");
     }
 
     void test(CustomComponent c) {
index 075e3f2db40bd2ef1d8608ce81ae5f106bc524cb..03c1b57aeb8f212e1a3c2356b7b959b1b29b1561 100644 (file)
@@ -1,6 +1,6 @@
 package com.itmill.toolkit.tests.robustness;
 
-import com.itmill.toolkit.tests.util.Log;
+import com.itmill.toolkit.automatedtests.util.Log;
 import com.itmill.toolkit.tests.util.RandomComponents;
 import com.itmill.toolkit.ui.Button;
 import com.itmill.toolkit.ui.ComponentContainer;
diff --git a/src/com/itmill/toolkit/tests/robustness/RobustnessComplex.java b/src/com/itmill/toolkit/tests/robustness/RobustnessComplex.java
deleted file mode 100644 (file)
index dffaeed..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.itmill.toolkit.tests.robustness;
-
-import com.itmill.toolkit.tests.util.Log;
-import com.itmill.toolkit.ui.Button;
-import com.itmill.toolkit.ui.Label;
-
-public class RobustnessComplex extends Robustness implements
-        Button.ClickListener {
-
-    /**
-     * Create complex layouts with components and listeners.
-     */
-    public void create() {
-        count++;
-
-        // remove old stressLayout, all dependant components should be now
-        // allowed for garbage collection.
-        if (stressLayout != null)
-            main.removeComponent(stressLayout);
-
-        // create new stress layout
-        stressLayout = randomComponents
-                .getRandomComponentContainer("Component container " + count);
-
-        Label label = new Label("Label " + Log.getMemoryStatistics(),
-                Label.CONTENT_PREFORMATTED);
-        stressLayout.addComponent(label);
-
-        // fill with random components
-        randomComponents.fillLayout(stressLayout, 25);
-
-        // add new component container to main layout
-        main.addComponent(stressLayout);
-
-        // if ((count % 100) == 0) {
-        System.out.println("Created " + count + " times.");
-        // }
-    }
-}
index 755e6c4225632cabc819973724a7fe966aff6c65..04d64bb972c7549ab35a0a988d2e83932d2bff4e 100644 (file)
@@ -1,6 +1,6 @@
 package com.itmill.toolkit.tests.robustness;
 
-import com.itmill.toolkit.tests.util.Log;
+import com.itmill.toolkit.automatedtests.util.Log;
 import com.itmill.toolkit.ui.Button;
 import com.itmill.toolkit.ui.Label;
 import com.itmill.toolkit.ui.OrderedLayout;
diff --git a/src/com/itmill/toolkit/tests/util/Log.java b/src/com/itmill/toolkit/tests/util/Log.java
deleted file mode 100644 (file)
index e587201..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-package com.itmill.toolkit.tests.util;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-
-/**
- * 
- * Execution output and error messages should be handled through this class. It
- * is likely that we need these messages back to TT Server at some point just to
- * figure out what went wrong.
- * 
- */
-public class Log {
-
-    // 3 (errors only)
-    // 2 (+ warnings)
-    // 1 (+logs)
-    // 0 (all, print messages also to System.out)
-    public static final int debug = 0;
-
-    // Should class.method() and it's call times be told on debug?
-    public static final boolean showClassInformation = true;
-
-    public static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
-    public static int DEBUG = 0;
-
-    public static int LOG = 1;
-
-    public static int WARN = 2;
-
-    public static int ERROR = 3;
-
-    // public List messages = new LinkedList();
-
-    private static Log log;
-
-    public static HashMap classMethodCallCounter = new HashMap();
-
-    static {
-        log = new Log();
-    }
-
-    public static void reset() {
-        // log.messages = new LinkedList();
-        classMethodCallCounter = new HashMap();
-    }
-
-    public static String getNow() {
-        return df.format(new Date());
-    }
-
-    private Log() {
-    }
-
-    public static String getSource() {
-        StackTraceElement[] st = new Throwable().fillInStackTrace()
-                .getStackTrace();
-        try {
-            String key = "";
-            // Class fromCallerClass = Class.forName(st[4].getClassName());
-            // String fromMethodName = st[4].getMethodName();
-            // Class callerClass = Class.forName(st[3].getClassName());
-            String methodName = st[3].getMethodName();
-            int line = st[3].getLineNumber();
-
-            String clazz = st[3].getClassName() + ".java";
-            // String clazz = st[3].getClassName().substring(
-            // st[3].getClassName().lastIndexOf('.') + 1)
-            // + ".java";
-            key = "(" + clazz + ":" + line + ")" + " " + methodName;
-            Integer value = (Integer) classMethodCallCounter.get(key);
-            if (value == null)
-                value = new Integer(1);
-            else
-                value = new Integer(value.intValue() + 1);
-            classMethodCallCounter.put(key, value);
-            return value.intValue() + ": " + key;
-        } catch (Exception e) {
-            return "unknown class.method";
-        }
-
-        // List stacks = new ArrayList();
-        // for (int i = 0; i < st.length; i++) {
-        // try {
-        // Class callerClass = Class.forName(st[i].getClassName());
-        // String methodName = st[i].getMethodName();
-        // System.out.println(i + " = " + callerClass + ", " + methodName);
-        // stacks.add(callerClass.getSimpleName());
-        // } catch (ClassNotFoundException e) {
-        // }
-        // }
-        // System.out.println("\n");
-        // return "";
-
-    }
-
-    public static String getClassMethodCounters() {
-        String result = "";
-        for (final Iterator it = classMethodCallCounter.keySet().iterator(); it
-                .hasNext();) {
-            String key = (String) it.next();
-            result += classMethodCallCounter.get(key) + ": " + key + "\n";
-        }
-        return result;
-    }
-
-    // public String toString() {
-    // StringBuffer sb = new StringBuffer(2048);
-    // for (final Iterator it = messages.iterator(); it.hasNext();) {
-    // Message msg = (Message) it.next();
-    // sb.append(msg.toString() + "\n");
-    // }
-    // return sb.toString();
-    // }
-
-    public void add(int type, String message) {
-        String source = getSource();
-        // log.messages.add(new Message(DEBUG, message, source));
-        if (type >= debug) {
-            if (showClassInformation)
-                System.out.println(source + ": " + message);
-            else
-                System.out.println(message);
-        }
-    }
-
-    public static void debug(String message) {
-        log.add(DEBUG, message);
-    }
-
-    public static void log(String message) {
-        log.add(LOG, message);
-    }
-
-    public static void warn(String message) {
-        log.add(WARN, message);
-    }
-
-    public static void error(String message) {
-        log.add(ERROR, message);
-    }
-
-    public class Message {
-
-        private final long timemillis = System.currentTimeMillis();
-
-        private final int type;
-
-        private final String source;
-
-        private final String message;
-
-        public Message(int type, String message, String source) {
-            this.source = source;
-            this.type = type;
-            this.message = message;
-        }
-
-        public String toString() {
-            return df.format(new Date(timemillis)) + ";" + source + ";" + type
-                    + ";" + message;
-        }
-
-    }
-
-    // public List getMessages() {
-    // return messages;
-    // }
-
-    /**
-     * Simple way to check for memory consumption without profiler.
-     */
-    public static String getMemoryStatistics() {
-        // You should call gc before printing statistics (if you are not using a
-        // profiler)
-        System.gc();
-        long inUse = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime()
-                .freeMemory());
-        return "Memory:\n" + inUse + " (Used)\n"
-                + Runtime.getRuntime().totalMemory() + " (Total)\n"
-                + Runtime.getRuntime().freeMemory() + " (Free)\n";
-
-    }
-}
diff --git a/src/com/itmill/toolkit/tests/util/MultiListener.java b/src/com/itmill/toolkit/tests/util/MultiListener.java
deleted file mode 100644 (file)
index efdc7f9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.itmill.toolkit.tests.util;
-
-import com.itmill.toolkit.data.Container.ItemSetChangeEvent;
-import com.itmill.toolkit.data.Container.ItemSetChangeListener;
-import com.itmill.toolkit.data.Container.PropertySetChangeEvent;
-import com.itmill.toolkit.data.Container.PropertySetChangeListener;
-import com.itmill.toolkit.data.Property.ValueChangeEvent;
-import com.itmill.toolkit.data.Property.ValueChangeListener;
-import com.itmill.toolkit.ui.Button;
-import com.itmill.toolkit.ui.Button.ClickEvent;
-
-public class MultiListener implements Button.ClickListener,
-        PropertySetChangeListener, ItemSetChangeListener, ValueChangeListener {
-
-    public void buttonClick(ClickEvent event) {
-        Log.debug("ClickEvent from " + event.getButton().getCaption());
-    }
-
-    public void containerPropertySetChange(PropertySetChangeEvent event) {
-        Log.debug("containerPropertySetChange from " + event.getContainer());
-    }
-
-    public void containerItemSetChange(ItemSetChangeEvent event) {
-        Log.debug("containerItemSetChange from " + event.getContainer());
-    }
-
-    public void valueChange(ValueChangeEvent event) {
-        Log.debug("valueChange from " + event.getProperty());
-    }
-
-}
index 2ead601f9fad8ecf5fe781eb9777a528e406a7f7..03555b9ee0d813ef8fd69ed809070ba09818b672 100644 (file)
@@ -3,6 +3,7 @@ package com.itmill.toolkit.tests.util;
 import java.util.ArrayList;
 import java.util.Random;
 
+import com.itmill.toolkit.automatedtests.util.MultiListener;
 import com.itmill.toolkit.data.Container.ItemSetChangeListener;
 import com.itmill.toolkit.data.Container.PropertySetChangeListener;
 import com.itmill.toolkit.data.Property.ValueChangeListener;