]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merge from 5.3 to 6.0:
authorHenri Sara <henri.sara@itmill.com>
Wed, 25 Mar 2009 07:33:58 +0000 (07:33 +0000)
committerHenri Sara <henri.sara@itmill.com>
Wed, 25 Mar 2009 07:33:58 +0000 (07:33 +0000)
[7128] Fixes to merge tool.
[7129] Merge from branches/manual_2009_03 to versions/5.3 (multiple changesets)
[7131] Fixed language problems in the section on layout cell spacing.
[7132] Use 24 hour format instead of 12 hour for Eclipse Manual plugin timestamp.

svn changeset:7169/svn branch:6.0

13 files changed:
WebContent/index.html
build/bin/mergetool.py
build/build.xml
src/com/itmill/toolkit/Application.java
src/com/itmill/toolkit/data/util/PropertysetItem.java
src/com/itmill/toolkit/demo/sampler/APIResource.java
src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java
src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java
src/com/itmill/toolkit/tests/TestBench.java
src/com/itmill/toolkit/tests/book/BookTestApplication.java
src/com/itmill/toolkit/tests/book/DefaultButtonExample.java
src/com/itmill/toolkit/ui/ProgressIndicator.java
src/com/itmill/toolkit/ui/Slider.java

index 02cbaf26b9abfaa20925d2d69c5f21961bcd74f5..61121b78efbf4d6c6e78d606911ab8a37f1cb37b 100644 (file)
                                <h4>Eclipse IDE QuickStart</h4>
                                <p>The easiest way to start working with IT Mill Toolkit is to 
                                use Eclipse IDE with the Toolkit QuickStart project.
-                               <a href="doc/manual/intro.quickstart.html" class="more">Instant Toolkit workspace for Eclipse</a></p>
+                               <a href="doc/manual/getting-started.quickstart.html" class="more">Instant Toolkit workspace for Eclipse</a></p>
                                
                        </div> <!-- /getting-started -->
                        
index bc1b23b090a50e712ea355cf7e6a5ac2ab5a896a..7ed1cb157945c92f9f2c15f037d8a212bd3dbed6 100755 (executable)
@@ -25,7 +25,7 @@ def help(exitvalue = 0):
        print "\t-author\tHTML output. (Include author in HTML log.)"
        print "\t-milestone <ms>\tList tickets in milestone (For 'log' command.)"
        print "\nCommands:"
-       print "massmerge <cfg> <src> <trg> [<from>] "
+       print "massmerge <cfg> <src> [<from>] "
        print "                          - Merges changesets listed in the configuration"
        print "                            file. The file is in svn log (text) format."
        print "                            You can comment out unwanted changesets."
@@ -370,9 +370,26 @@ class Configuration:
                                if currentChange:
                                        currentChange.addCommentLine(line)
 
-       def massMerge(self, trunkURI, dryrun=0):
-               for change in self.changes:
-                       change.merge(trunkURI, dryrun=dryrun)
+       def massMerge(self, trunkURI, dryrun=0, allatonce=0):
+               if not allatonce:
+                       # Merge one changeset at a time
+                       for change in self.changes:
+                               change.merge(trunkURI, dryrun=dryrun)
+               else:
+                       # What is the first changeset in the merge?
+                       smallest = 99999999
+                       for change in self.changes:
+                               if change.getNumber() < smallest:
+                                       smallest = change.getNumber()
+
+                       drycmd = ""
+                       if dryrun:
+                               drycmd = "--dry-run"
+                               
+                       # Merge from the first changeset to HEAD
+                       cmd = "svn merge --non-interactive %s -r %d:HEAD %s" % (drycmd, smallest, trunkURI)
+                       print cmd
+                       command(cmd)
 
        def createLogComment(self):
                # Create a log comment that lists all merged changesets with
@@ -563,9 +580,9 @@ def commandRevert():
                print "Nothing to do."
 
 # Command: massmerge
-def commandMassmerge(cfgfilename, sourceuri, startfrom, dryrun=0):
+def commandMassmerge(cfgfilename, sourceuri, startfrom, dryrun=0, allatonce=0):
        cfg = Configuration(cfgfilename, startfrom=startfrom)
-       cfg.massMerge(sourceuri, dryrun=dryrun)
+       cfg.massMerge(sourceuri, dryrun=dryrun, allatonce=allatonce)
 
 # Command: single
 def commandSingle(trunkuri, changeset, sourcebranch, targetbranch, onlymerge=0, onlycommit=0):
@@ -612,6 +629,7 @@ html_author = 0
 html_milestone = None
 onlymerge = 0
 onlycommit = 0
+all        = 0
 while len(sys.argv)>1 and sys.argv[1][0] == '-':
        if sys.argv[1] == "-d":
                dryrun = 1
@@ -637,6 +655,10 @@ while len(sys.argv)>1 and sys.argv[1][0] == '-':
                onlycommit = 1
                del sys.argv[1:2]
 
+       elif sys.argv[1] == "-all":
+               all = 1
+               del sys.argv[1:2]
+
        else:
                print "Invalid option '%s'." % (sys.argv[1])
                sys.exit(1)
@@ -654,7 +676,7 @@ elif (len(sys.argv) == 4 or len(sys.argv)==5) and sys.argv[1] == "massmerge":
        startfrom = None
        if len(sys.argv)>4:
                startfrom = int(sys.argv[4])
-       commandMassmerge(cfgfilename, sourceuri=REPOSITORY+sourcebranch, startfrom=startfrom, dryrun=dryrun)
+       commandMassmerge(cfgfilename, sourceuri=REPOSITORY+sourcebranch, startfrom=startfrom, dryrun=dryrun, allatonce=all)
 
 elif len(sys.argv) == 5 and sys.argv[1] == "single":
        changeset = int(sys.argv[2])
index 384739dd40cf9ff80e4cb13df53db861f089bb8a..b483fffda7ba791f3c0093153a57d6350b562080 100644 (file)
         <tstamp>
             <format property="manual.pubdate" pattern="yyyy-MM-dd"/>
         </tstamp>
+
+        <!-- Classpath for running the XSLT processor. -->
+               <path id="docbook-xsl.classpath">
+                       <pathelement path="build/lib/fserializer.jar" />
+                       <pathelement path="build/lib/xalan.jar" />
+                       <pathelement path="build/lib/xercesImpl.jar" />
+                       <pathelement path="build/lib/xml-apis.jar" />
+               </path>
        </target>
 
        <!-- Build PDF manual from sources or just copy it. -->
                        <arg value="-param" />
                        <arg value="manual.version" />
                        <arg value="${version}" />
-                       <classpath>
-                               <pathelement location="build/lib/xalan.jar" />
-                               <pathelement location="build/lib/xercesImpl.jar" />
-                               <pathelement location="build/lib/xml-apis.jar" />
-                       </classpath>
+                       <classpath refid="docbook-xsl.classpath" />
                </java>
                <echo>PDF Manual: converting fo to pdf</echo>
                <!-- Run XEP FO processor to convert FO to PDF -->
                </java>
        </target>
 
-       <target name="manual-html" depends="init, init-manual, preprocess-src">
-               <echo>Manual: HTML</echo>
-               <delete file="build/docbook/conf/temp.xsl" />
-               <copy file="build/docbook/conf/custom-html-docbook.xsl" tofile="build/docbook/conf/temp.xsl">
+    <!-- Common initialization tasks for a HTML manual.                                   -->
+    <!-- Some properties must be defined in the more specific HTML manual initialization. -->
+       <target name="init-manual-html-common" depends="preprocess-src">
+        <!-- Create the manual output directory if it doesn't already exist. -->
+        <mkdir dir="${manual.html.output.dir}"/>
+
+        <property name="manual.html.xsl.template"  value="build/docbook/conf/custom-html-template.xsl"/>
+        <property name="manual.html.xsl.processed" value="build/docbook/conf/custom-html-processed.xsl"/>
+
+        <!-- Replace tags in the HTML stylesheet template. -->
+               <delete file="${manual.html.xsl.processed}" />
+               <copy file="${manual.html.xsl.template}" tofile="${manual.html.xsl.processed}">
                        <filterchain>
                                <replacetokens>
                                        <token key="BODYHEADER" value="${html.body.start1}${docbook.head.title}${html.body.start2}" />
                                </replacetokens>
                        </filterchain>
                </copy>
-               <path id="docbook-xsl.classpath">
-                       <pathelement path="build/lib/fserializer.jar" />
-                       <pathelement path="build/lib/xalan.jar" />
-                       <pathelement path="build/lib/xercesImpl.jar" />
-                       <pathelement path="build/lib/xml-apis.jar" />
-               </path>
+    </target>
+
+       <target name="manual-html-build" depends="init-manual-html, init-manual-html-common">
                <java classname="org.apache.xalan.xslt.Process" failonerror="yes" fork="yes" maxmemory="512m">
                        <arg value="-in" />
                        <arg value="doc/manual/book.xml" />
                        <arg value="-xsl" />
-                       <arg value="build/docbook/conf/temp.xsl" />
+                       <arg value="${manual.html.xsl}" />
+            <!-- The output file will be empty for eclipse plugin. -->
                        <arg value="-out" />
-                       <arg value="${output-dir}/WebContent/doc/manual/index.html" />
+                       <arg value="${manual.html.output.index}" />
                        <arg value="-param" />
                        <arg value="section.autolabel" />
                        <arg value="1" />
                        <arg value="-param" />
                        <arg value="manual.version" />
                        <arg value="${version}" />
+            <!-- This is needed only for the Eclipse Help plugin. -->
+                       <arg value="-param" />
+                       <arg value="eclipse.plugin.version" />
+                       <arg value="${eclipse.plugin.manual.version}" />
                        <classpath refid="docbook-xsl.classpath" />
                </java>
-               <delete file="build/docbook/conf/temp.xsl" />
-               <copy todir="${output-dir}/WebContent/doc/manual/img">
+
+               <delete file="${manual.html.xsl.processed}" />
+               <copy todir="${output-dir}/WebContent/doc/eclipse/img">
                        <fileset dir="doc/manual/img">
                                <exclude name="**/.svn" />
                        </fileset>
                </copy>
+    </target>
+
+    <!-- Configuration for building the regular HTML manual. -->
+       <target name="init-manual-html" depends="init, init-manual">
+        <property name="manual.html.xsl" value="build/docbook/conf/manual-html.xsl"/>
+        <property name="manual.html.output.dir" value="${output-dir}/WebContent/doc/manual"/>
+        <property name="manual.html.output.index" value="${manual.html.output.dir}/index.html"/>
+
+        <property name="output-dir-manual" value="${output-dir}/WebContent/doc/manual" />
+
+               <echo>Manual: HTML</echo>
+               <echo>Published: ${manual.pubdate}</echo>
+    </target>
+
+       <target name="manual-html" depends="init, init-manual, init-manual-html, init-manual-html-common, manual-html-build">
        </target>
 
        <!-- ant contrib required for flow control (for loop, if, property override) -->
        <!-- java2html converter -->
        <taskdef name="java2html" classname="de.java2html.anttasks.Java2HtmlTask" classpath="build/lib/java2html.jar" />
 
+       <target name="init-manual-eclipse" depends="">
+        <!-- Timestamp in YYYYMMDDHHMM format for plugin version number. -->
+        <tstamp>
+            <format property="eclipse.plugin.manual.pubtime" pattern="yyyyMMddkkmm"/>
+        </tstamp>
+
+        <property name="eclipse.plugin.manual.version" value="${version}.v${eclipse.plugin.manual.pubtime}" />
+               <echo>Manual: Eclipse Help Plugin (version ${eclipse.plugin.manual.version})</echo>
+
+        <property name="manual.html.xsl" value="build/docbook/conf/manual-eclipse-plugin.xsl"/>
+        <property name="manual.html.output.dir" value="${output-dir}/WebContent/doc/eclipse"/>
+        <property name="manual.html.output.index" value="${manual.html.output.dir}/index-eclipse.html"/>
+
+        <property name="output-dir-manual" value="${output-dir}/WebContent/doc/manual" />
+    </target>
+
+    <!-- Builds Eclipse Help plugin. Uses the manual-html-build target  -->
+    <!-- to build the HTML content of the manual.                       -->
+       <target name="manual-eclipse" depends="init, init-manual, init-manual-eclipse, init-manual-html-common, manual-html-build">
+        <!-- The index-eclipse.html file is empty. -->
+               <delete file="${manual.html.output.index}" />
+
+        <!-- Plugin JAR filename -->
+        <property name="eclipse.plugin.manual.jar-name"
+                 value="com.itmill.toolkit.manual_${eclipse.plugin.manual.version}.jar" />
+
+        <!-- Package the JAR. -->
+        <jar jarfile="${output-dir}/${eclipse.plugin.manual.jar-name}" compress="true">
+            <fileset dir="${manual.html.output.dir}">
+                               <patternset>
+                                       <include name="**/*" />
+                               </patternset>
+            </fileset>
+            <manifest>
+                <attribute name="Built-By" value="${user.name}"/>
+                <attribute name="Bundle-Name" value="IT Mill Toolkit Reference Manual"/>
+                <attribute name="Bundle-SymbolicName" value="com.itmill.toolkit.manual"/>
+                <attribute name="Bundle-Version" value="${eclipse.plugin.manual.version}"/>
+                <attribute name="Bundle-Vendor" value="IT Mill Inc."/>
+            </manifest>
+        </jar>
+       </target>
+
     <!-- ================================================================== -->
     <!-- Build Application Tutorial.                                        -->
     <!-- ================================================================== -->
index 1b3f1843826098939bcacd0760e2a1375fb447dc..60045ac702fb05cf21838d7cf7581195f50a14a4 100644 (file)
@@ -1096,7 +1096,7 @@ public abstract class Application implements URIHandler, Terminal.ErrorListener
      * @see com.itmill.toolkit.terminal.Terminal.ErrorListener#terminalError(com.itmill.toolkit.terminal.Terminal.ErrorEvent)
      */
     public void terminalError(Terminal.ErrorEvent event) {
-        Throwable t = event.getThrowable();
+        final Throwable t = event.getThrowable();
         if (t instanceof SocketException) {
             // Most likely client browser closed socket
             System.err
@@ -1119,21 +1119,16 @@ public abstract class Application implements URIHandler, Terminal.ErrorListener
 
         // Shows the error in AbstractComponent
         if (owner instanceof AbstractComponent) {
-            final Throwable e = event.getThrowable();
-            if (e instanceof ErrorMessage) {
-                ((AbstractComponent) owner).setComponentError((ErrorMessage) e);
+            if (t instanceof ErrorMessage) {
+                ((AbstractComponent) owner).setComponentError((ErrorMessage) t);
             } else {
                 ((AbstractComponent) owner)
-                        .setComponentError(new SystemError(e));
+                        .setComponentError(new SystemError(t));
             }
-        } else {
-            /*
-             * Can't show it to the user in any way so we print to standard
-             * error
-             */
-            t.printStackTrace();
-
         }
+
+        // also print the error on console
+        t.printStackTrace();
     }
 
     /**
index dfc819ca7eeab5a6456635fd094296a7aab87826..c6c01743e29b248f86e88f352011369851b818ac 100644 (file)
@@ -259,15 +259,9 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier,
         return npsi;
     }
 
-    /**
-     * Returns <code>true</code> if and only if the argument is not
-     * <code>null</code> and is a Boolean object that represents the same
-     * boolean value as this object.
+    /*
+     * (non-Javadoc)
      * 
-     * @param obj
-     *            the object to compare with.
-     * @return <code>true</code> if the Boolean objects represent the same value
-     *         otherwise <code>false</code>.
      * @see java.lang.Object#equals(java.lang.Object)
      */
     @Override
@@ -308,10 +302,9 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier,
         return true;
     }
 
-    /**
-     * Returns the hash code value for this list.
+    /*
+     * (non-Javadoc)
      * 
-     * @return the hash code value.
      * @see java.lang.Object#hashCode()
      */
     @Override
index 183c9c3a525eb3e710f3e045186f48520fa483ea..e1973f9140793f1e5c6244306e44b397dbfa75e9 100644 (file)
@@ -2,7 +2,7 @@ package com.itmill.toolkit.demo.sampler;
 
 /**
  * A NamedExternalResource pointing to the javadoc for the given class. Knows
- * where the javadocs are located for som common APIs, but one can also specify
+ * where the javadocs are located for some common APIs, but one can also specify
  * a javadoc baseurl. The name will be set to the class simpleName.
  * 
  */
index 2321e50051d40bb1cb76ee7bdb278f70dd0bdf2f..bada4af66faa86bef9750a7d6f12ce09cd48e0b3 100644 (file)
@@ -577,7 +577,8 @@ public class ApplicationServlet extends HttpServlet {
                         .getInternalErrorCaption(), ci
                         .getInternalErrorMessage(), ci.getInternalErrorURL());
                 if (application != null) {
-                    application.terminalError(new RequestError(e));
+                    application.getErrorHandler().terminalError(
+                            new RequestError(e));
                 } else {
                     throw new ServletException(e);
                 }
index 16281a3c8a3586cedabcedde3cf98310d709ffc2..5cb8405d2a8f9206c839020def80f36771d7a2c5 100644 (file)
@@ -1473,7 +1473,8 @@ public class CommunicationManager implements Paintable.RepaintRequestListener {
             }
 
         } catch (final Throwable t) {
-            application.terminalError(new URIHandlerErrorImpl(application, t));
+            application.getErrorHandler().terminalError(
+                    new URIHandlerErrorImpl(application, t));
             return null;
         }
     }
index 99e770f4875a9bb0a81c450b7bc11678b05f75be..1ea727a8a317eda9ee514074aa3fa5ee2a079ede 100644 (file)
@@ -41,292 +41,292 @@ import com.itmill.toolkit.ui.UriFragmentUtility.FragmentChangedEvent;
  * 
  */
 public class TestBench extends com.itmill.toolkit.Application implements
-        Property.ValueChangeListener {
-
-    // Add here packages which are used for finding testable classes
-    String[] testablePackages = { "com.itmill.toolkit.tests",
-            "com.itmill.toolkit.demo", "com.itmill.toolkit.demo.colorpicker",
-            "com.itmill.toolkit.demo.reservation",
-            "com.itmill.toolkit.demo.features",
-            "com.itmill.toolkit.tests.tickets" };
-
-    HierarchicalContainer testables = new HierarchicalContainer();
-
-    Window mainWindow = new Window("TestBench window");
-
-    // Main layout consists of tree menu and body layout
-    SplitPanel mainLayout = new SplitPanel(SplitPanel.ORIENTATION_HORIZONTAL);
-
-    Tree menu;
-
-    Panel bodyLayout = new Panel();
-
-    HashMap itemCaptions = new HashMap();
-
-    @Override
-    public void init() {
-
-        // Add testable classes to hierarchical container
-        for (int p = 0; p < testablePackages.length; p++) {
-            testables.addItem(testablePackages[p]);
-            try {
-                final List testableClasses = getTestableClassesForPackage(testablePackages[p]);
-                for (final Iterator it = testableClasses.iterator(); it
-                        .hasNext();) {
-                    final Class t = (Class) it.next();
-                    // ignore TestBench itself
-                    if (t.equals(TestBench.class)) {
-                        continue;
-                    }
-                    try {
-                        testables.addItem(t);
-                        itemCaptions.put(t, t.getName());
-                        testables.setParent(t, testablePackages[p]);
-                        testables.setChildrenAllowed(t, false);
-                        continue;
-                    } catch (final Exception e) {
-                        try {
-                            testables.addItem(t);
-                            itemCaptions.put(t, t.getName());
-                            testables.setParent(t, testablePackages[p]);
-                            testables.setChildrenAllowed(t, false);
-                            continue;
-                        } catch (final Exception e1) {
-                            e1.printStackTrace();
-                        }
-                    }
-                }
-            } catch (final Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-        menu = new Tree("Testables", testables);
-
-        for (final Iterator i = itemCaptions.keySet().iterator(); i.hasNext();) {
-            final Class testable = (Class) i.next();
-            // simplify captions
-            final String name = testable.getName().substring(
-                    testable.getName().lastIndexOf('.') + 1);
-            menu.setItemCaption(testable, name);
-        }
-        // expand all root items
-        for (final Iterator i = menu.rootItemIds().iterator(); i.hasNext();) {
-            menu.expandItemsRecursively(i.next());
-        }
-
-        menu.addListener(this);
-        menu.setImmediate(true);
-        menu.setNullSelectionAllowed(false);
-        VerticalLayout lo = new VerticalLayout();
-        lo.addComponent(menu);
-
-        UriFragmentUtility uri = new UriFragmentUtility();
-        lo.addComponent(uri);
-
-        uri.addListener(new UriFragmentUtility.FragmentChangedListener() {
-            public void fragmentChanged(FragmentChangedEvent source) {
-                String fragment = source.getUriFragmentUtility().getFragment();
-                if (fragment != null && !"".equals(fragment)) {
-                    // try to find a proper test class
-
-                    // exact match
-                    Iterator iterator = menu.getItemIds().iterator();
-                    while (iterator.hasNext()) {
-                        Object next = iterator.next();
-                        if (next instanceof Class) {
-                            Class c = (Class) next;
-                            String string = c.getName();
-                            if (string.equals(fragment)) {
-                                menu.setValue(c);
-                                mainLayout.setSplitPosition(0);
-                                return;
-                            }
-                        }
-                    }
-
-                    // simple name match
-                    iterator = menu.getItemIds().iterator();
-                    while (iterator.hasNext()) {
-                        Object next = iterator.next();
-                        if (next instanceof Class) {
-                            Class c = (Class) next;
-                            String string = c.getSimpleName();
-                            if (string.equals(fragment)) {
-                                menu.setValue(c);
-                                mainLayout.setSplitPosition(0);
-                                return;
-                            }
-                        }
-                    }
-                    // ticket match
-                    iterator = menu.getItemIds().iterator();
-                    while (iterator.hasNext()) {
-                        Object next = iterator.next();
-                        if (next instanceof Class) {
-                            Class c = (Class) next;
-                            String string = c.getSimpleName();
-                            if (string.startsWith("Ticket" + fragment)) {
-                                menu.setValue(c);
-                                mainLayout.setSplitPosition(0);
-                                return;
-                            }
-                        }
-                    }
-
-                    // just partly mach lowercase
-                    iterator = menu.getItemIds().iterator();
-                    while (iterator.hasNext()) {
-                        Object next = iterator.next();
-                        if (next instanceof Class) {
-                            Class c = (Class) next;
-                            String string = c.getSimpleName();
-                            if (string.toLowerCase().contains(
-                                    fragment.toLowerCase())) {
-                                menu.setValue(c);
-                                mainLayout.setSplitPosition(0);
-                                return;
-                            }
-                        }
-                    }
-
-                    getMainWindow().showNotification(
-                            "No potential matc for #" + fragment);
-
-                }
-
-            }
-        });
-
-        mainLayout.addComponent(lo);
-
-        bodyLayout.addStyleName("light");
-        bodyLayout.setSizeFull();
-        bodyLayout.setLayout(new ExpandLayout());
-
-        mainLayout.addComponent(bodyLayout);
-
-        mainLayout.setSplitPosition(30);
-
-        mainWindow.setLayout(mainLayout);
-
-        setMainWindow(mainWindow);
-    }
-
-    private Component createTestable(Class c) {
-        try {
-            final Application app = (Application) c.newInstance();
-            app.init();
-            Layout lo = app.getMainWindow().getLayout();
-            lo.setParent(null);
-            return lo;
-        } catch (final Exception e) {
-            try {
-                final CustomComponent cc = (CustomComponent) c.newInstance();
-                cc.setSizeFull();
-                return cc;
-            } catch (final Exception e1) {
-                e1.printStackTrace();
-                VerticalLayout lo = new VerticalLayout();
-                lo.addComponent(new Label(
-                        "Cannot create application / custom component: "
-                                + e1.toString()));
-
-                Link l = new Link("Try opening via app runner",
-                        new ExternalResource("../run/" + c.getName()));
-                lo.addComponent(l);
-
-                return lo;
-            }
-        }
-    }
-
-    // Handle menu selection and update body
-    public void valueChange(Property.ValueChangeEvent event) {
-        bodyLayout.removeAllComponents();
-        bodyLayout.setCaption(null);
-
-        final Object o = menu.getValue();
-        if (o != null && o instanceof Class) {
-            final Class c = (Class) o;
-            final String title = c.getName();
-            bodyLayout.setCaption(title);
-            bodyLayout.addComponent(createTestable(c));
-        } else {
-            // NOP node selected or deselected tree item
-        }
-    }
-
-    /**
-     * Return all testable classes within given package. Class is considered
-     * testable if it's superclass is Application or CustomComponent.
-     * 
-     * @param packageName
-     * @return
-     * @throws ClassNotFoundException
-     */
-    public static List getTestableClassesForPackage(String packageName)
-            throws Exception {
-        final ArrayList directories = new ArrayList();
-        try {
-            final ClassLoader cld = Thread.currentThread()
-                    .getContextClassLoader();
-            if (cld == null) {
-                throw new ClassNotFoundException("Can't get class loader.");
-            }
-            final String path = packageName.replace('.', '/');
-            // Ask for all resources for the path
-            final Enumeration resources = cld.getResources(path);
-            while (resources.hasMoreElements()) {
-                final URL url = (URL) resources.nextElement();
-                directories.add(new File(url.getFile()));
-            }
-        } catch (final Exception x) {
-            throw new Exception(packageName
-                    + " does not appear to be a valid package.");
-        }
-
-        final ArrayList classes = new ArrayList();
-        // For every directory identified capture all the .class files
-        for (final Iterator it = directories.iterator(); it.hasNext();) {
-            final File directory = (File) it.next();
-            if (directory.exists()) {
-                // Get the list of the files contained in the package
-                final String[] files = directory.list();
-                for (int j = 0; j < files.length; j++) {
-                    // we are only interested in .class files
-                    if (files[j].endsWith(".class")) {
-                        // removes the .class extension
-                        final String p = packageName + '.'
-                                + files[j].substring(0, files[j].length() - 6);
-                        final Class c = Class.forName(p);
-                        if (c.getSuperclass() != null) {
-                            if ((c.getSuperclass()
-                                    .equals(com.itmill.toolkit.Application.class))) {
-                                classes.add(c);
-                            } else if ((c.getSuperclass()
-                                    .equals(com.itmill.toolkit.ui.CustomComponent.class))) {
-                                classes.add(c);
-                            }
-                        }
-
-                        // for (int i = 0; i < c.getInterfaces().length; i++) {
-                        // Class cc = c.getInterfaces()[i];
-                        // if (c.getInterfaces()[i].equals(Testable.class)) {
-                        // // Class is testable
-                        // classes.add(c);
-                        // }
-                        // }
-                    }
-                }
-            } else {
-                throw new ClassNotFoundException(packageName + " ("
-                        + directory.getPath()
-                        + ") does not appear to be a valid package");
-            }
-        }
-
-        return classes;
-    }
+               Property.ValueChangeListener {
+
+       // Add here packages which are used for finding testable classes
+       String[] testablePackages = { "com.itmill.toolkit.tests",
+                       "com.itmill.toolkit.demo", "com.itmill.toolkit.demo.colorpicker",
+                       "com.itmill.toolkit.demo.reservation",
+                       "com.itmill.toolkit.demo.features",
+                       "com.itmill.toolkit.tests.tickets", "com.itmill.toolkit.tests.book" };
+
+       HierarchicalContainer testables = new HierarchicalContainer();
+
+       Window mainWindow = new Window("TestBench window");
+
+       // Main layout consists of tree menu and body layout
+       SplitPanel mainLayout = new SplitPanel(SplitPanel.ORIENTATION_HORIZONTAL);
+
+       Tree menu;
+
+       Panel bodyLayout = new Panel();
+
+       HashMap itemCaptions = new HashMap();
+
+       @Override
+       public void init() {
+
+               // Add testable classes to hierarchical container
+               for (int p = 0; p < testablePackages.length; p++) {
+                       testables.addItem(testablePackages[p]);
+                       try {
+                               final List testableClasses = getTestableClassesForPackage(testablePackages[p]);
+                               for (final Iterator it = testableClasses.iterator(); it
+                                               .hasNext();) {
+                                       final Class t = (Class) it.next();
+                                       // ignore TestBench itself
+                                       if (t.equals(TestBench.class)) {
+                                               continue;
+                                       }
+                                       try {
+                                               testables.addItem(t);
+                                               itemCaptions.put(t, t.getName());
+                                               testables.setParent(t, testablePackages[p]);
+                                               testables.setChildrenAllowed(t, false);
+                                               continue;
+                                       } catch (final Exception e) {
+                                               try {
+                                                       testables.addItem(t);
+                                                       itemCaptions.put(t, t.getName());
+                                                       testables.setParent(t, testablePackages[p]);
+                                                       testables.setChildrenAllowed(t, false);
+                                                       continue;
+                                               } catch (final Exception e1) {
+                                                       e1.printStackTrace();
+                                               }
+                                       }
+                               }
+                       } catch (final Exception e) {
+                               e.printStackTrace();
+                       }
+               }
+
+               menu = new Tree("Testables", testables);
+
+               for (final Iterator i = itemCaptions.keySet().iterator(); i.hasNext();) {
+                       final Class testable = (Class) i.next();
+                       // simplify captions
+                       final String name = testable.getName().substring(
+                                       testable.getName().lastIndexOf('.') + 1);
+                       menu.setItemCaption(testable, name);
+               }
+               // expand all root items
+               for (final Iterator i = menu.rootItemIds().iterator(); i.hasNext();) {
+                       menu.expandItemsRecursively(i.next());
+               }
+
+               menu.addListener(this);
+               menu.setImmediate(true);
+               menu.setNullSelectionAllowed(false);
+               VerticalLayout lo = new VerticalLayout();
+               lo.addComponent(menu);
+
+               UriFragmentUtility uri = new UriFragmentUtility();
+               lo.addComponent(uri);
+
+               uri.addListener(new UriFragmentUtility.FragmentChangedListener() {
+                       public void fragmentChanged(FragmentChangedEvent source) {
+                               String fragment = source.getUriFragmentUtility().getFragment();
+                               if (fragment != null && !"".equals(fragment)) {
+                                       // try to find a proper test class
+
+                                       // exact match
+                                       Iterator iterator = menu.getItemIds().iterator();
+                                       while (iterator.hasNext()) {
+                                               Object next = iterator.next();
+                                               if (next instanceof Class) {
+                                                       Class c = (Class) next;
+                                                       String string = c.getName();
+                                                       if (string.equals(fragment)) {
+                                                               menu.setValue(c);
+                                                               mainLayout.setSplitPosition(0);
+                                                               return;
+                                                       }
+                                               }
+                                       }
+
+                                       // simple name match
+                                       iterator = menu.getItemIds().iterator();
+                                       while (iterator.hasNext()) {
+                                               Object next = iterator.next();
+                                               if (next instanceof Class) {
+                                                       Class c = (Class) next;
+                                                       String string = c.getSimpleName();
+                                                       if (string.equals(fragment)) {
+                                                               menu.setValue(c);
+                                                               mainLayout.setSplitPosition(0);
+                                                               return;
+                                                       }
+                                               }
+                                       }
+                                       // ticket match
+                                       iterator = menu.getItemIds().iterator();
+                                       while (iterator.hasNext()) {
+                                               Object next = iterator.next();
+                                               if (next instanceof Class) {
+                                                       Class c = (Class) next;
+                                                       String string = c.getSimpleName();
+                                                       if (string.startsWith("Ticket" + fragment)) {
+                                                               menu.setValue(c);
+                                                               mainLayout.setSplitPosition(0);
+                                                               return;
+                                                       }
+                                               }
+                                       }
+
+                                       // just partly mach lowercase
+                                       iterator = menu.getItemIds().iterator();
+                                       while (iterator.hasNext()) {
+                                               Object next = iterator.next();
+                                               if (next instanceof Class) {
+                                                       Class c = (Class) next;
+                                                       String string = c.getSimpleName();
+                                                       if (string.toLowerCase().contains(
+                                                                       fragment.toLowerCase())) {
+                                                               menu.setValue(c);
+                                                               mainLayout.setSplitPosition(0);
+                                                               return;
+                                                       }
+                                               }
+                                       }
+
+                                       getMainWindow().showNotification(
+                                                       "No potential matc for #" + fragment);
+
+                               }
+
+                       }
+               });
+
+               mainLayout.addComponent(lo);
+
+               bodyLayout.addStyleName("light");
+               bodyLayout.setSizeFull();
+               bodyLayout.setLayout(new ExpandLayout());
+
+               mainLayout.addComponent(bodyLayout);
+
+               mainLayout.setSplitPosition(30);
+
+               mainWindow.setLayout(mainLayout);
+
+               setMainWindow(mainWindow);
+       }
+
+       private Component createTestable(Class c) {
+               try {
+                       final Application app = (Application) c.newInstance();
+                       app.init();
+                       Layout lo = app.getMainWindow().getLayout();
+                       lo.setParent(null);
+                       return lo;
+               } catch (final Exception e) {
+                       try {
+                               final CustomComponent cc = (CustomComponent) c.newInstance();
+                               cc.setSizeFull();
+                               return cc;
+                       } catch (final Exception e1) {
+                               e1.printStackTrace();
+                               VerticalLayout lo = new VerticalLayout();
+                               lo.addComponent(new Label(
+                                               "Cannot create application / custom component: "
+                                                               + e1.toString()));
+
+                               Link l = new Link("Try opening via app runner",
+                                               new ExternalResource("../run/" + c.getName()));
+                               lo.addComponent(l);
+
+                               return lo;
+                       }
+               }
+       }
+
+       // Handle menu selection and update body
+       public void valueChange(Property.ValueChangeEvent event) {
+               bodyLayout.removeAllComponents();
+               bodyLayout.setCaption(null);
+
+               final Object o = menu.getValue();
+               if (o != null && o instanceof Class) {
+                       final Class c = (Class) o;
+                       final String title = c.getName();
+                       bodyLayout.setCaption(title);
+                       bodyLayout.addComponent(createTestable(c));
+               } else {
+                       // NOP node selected or deselected tree item
+               }
+       }
+
+       /**
+        * Return all testable classes within given package. Class is considered
+        * testable if it's superclass is Application or CustomComponent.
+        
+        * @param packageName
+        * @return
+        * @throws ClassNotFoundException
+        */
+       public static List getTestableClassesForPackage(String packageName)
+                       throws Exception {
+               final ArrayList directories = new ArrayList();
+               try {
+                       final ClassLoader cld = Thread.currentThread()
+                                       .getContextClassLoader();
+                       if (cld == null) {
+                               throw new ClassNotFoundException("Can't get class loader.");
+                       }
+                       final String path = packageName.replace('.', '/');
+                       // Ask for all resources for the path
+                       final Enumeration resources = cld.getResources(path);
+                       while (resources.hasMoreElements()) {
+                               final URL url = (URL) resources.nextElement();
+                               directories.add(new File(url.getFile()));
+                       }
+               } catch (final Exception x) {
+                       throw new Exception(packageName
+                                       + " does not appear to be a valid package.");
+               }
+
+               final ArrayList classes = new ArrayList();
+               // For every directory identified capture all the .class files
+               for (final Iterator it = directories.iterator(); it.hasNext();) {
+                       final File directory = (File) it.next();
+                       if (directory.exists()) {
+                               // Get the list of the files contained in the package
+                               final String[] files = directory.list();
+                               for (int j = 0; j < files.length; j++) {
+                                       // we are only interested in .class files
+                                       if (files[j].endsWith(".class")) {
+                                               // removes the .class extension
+                                               final String p = packageName + '.'
+                                                               + files[j].substring(0, files[j].length() - 6);
+                                               final Class c = Class.forName(p);
+                                               if (c.getSuperclass() != null) {
+                                                       if ((c.getSuperclass()
+                                                                       .equals(com.itmill.toolkit.Application.class))) {
+                                                               classes.add(c);
+                                                       } else if ((c.getSuperclass()
+                                                                       .equals(com.itmill.toolkit.ui.CustomComponent.class))) {
+                                                               classes.add(c);
+                                                       }
+                                               }
+
+                                               // for (int i = 0; i < c.getInterfaces().length; i++) {
+                                               // Class cc = c.getInterfaces()[i];
+                                               // if (c.getInterfaces()[i].equals(Testable.class)) {
+                                               // // Class is testable
+                                               // classes.add(c);
+                                               // }
+                                               // }
+                                       }
+                               }
+                       } else {
+                               throw new ClassNotFoundException(packageName + " ("
+                                               + directory.getPath()
+                                               + ") does not appear to be a valid package");
+                       }
+               }
+
+               return classes;
+       }
 
 }
index 2402b0a57d18f9132e61b9c5e8d26b9d07ade713..678f49c7dc83722155c22c9e4b9d7e289fbd085c 100644 (file)
@@ -14,8 +14,6 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
-import javax.management.Notification;
-
 import com.itmill.toolkit.data.Item;
 import com.itmill.toolkit.data.Validator;
 import com.itmill.toolkit.data.Property.ValueChangeEvent;
@@ -63,1682 +61,1689 @@ import com.itmill.toolkit.ui.Layout.AlignmentHandler;
 import com.itmill.toolkit.ui.MenuBar.MenuItem;
 
 public class BookTestApplication extends com.itmill.toolkit.Application {
-    Window main = new Window("Application window");
-
-    TheButton butts1;
-    TheButtons butts2;
-    TheButtons2 butts3;
-
-    Label mylabel1;
-    Label mylabel2;
-    Label mylabel3;
-
-    StreamResource strres;
-    VerticalLayout ol;
-    int getwincount = 0;
-
-    public void init() {
-        setTheme("tests-book");
-
-        setMainWindow(main);
-
-        // Demo the use of parameter and URI handlers
-        main.addParameterHandler(new MyParameterHandler());
-        main.addURIHandler(new MyURIHandler());
-
-        MyDynamicResource myresource = new MyDynamicResource();
-        main.addParameterHandler(myresource);
-        main.addURIHandler(myresource);
-
-        main.addURIHandler(new BookTestURIHandler());
-    }
-
-    class MyParameterHandler implements ParameterHandler {
-        public void handleParameters(Map parameters) {
-            // Print out the parameters to standard output
-            for (Iterator it = parameters.keySet().iterator(); it.hasNext();) {
-                String key = (String) it.next();
-                String value = ((String[]) parameters.get(key))[0];
-                System.out.println("Key: " + key + ", value: " + value);
-            }
-        }
-    }
-
-    class MyURIHandler implements URIHandler {
-        public DownloadStream handleURI(URL context, String relativeUri) {
-            System.out.println("Context: " + context.toString()
-                    + ", relative: " + relativeUri);
-            return null; // Let the Application provide the response
-        }
-    }
-
-    class BookTestURIHandler implements URIHandler {
-        public DownloadStream handleURI(URL context, String relativeUri) {
-            String example;
-            String param = null;
-
-            final int slashPos = relativeUri.indexOf("/");
-            if (slashPos > 0) {
-                example = relativeUri.substring(0, slashPos);
-                param = relativeUri.substring(slashPos + 1);
-            } else {
-                example = relativeUri;
-            }
-
-            /* Remove existing components and windows. */
-            main.removeAllComponents();
-            final Set childwindows = main.getChildWindows();
-            for (final Iterator cwi = childwindows.iterator(); cwi.hasNext();) {
-                final Window child = (Window) cwi.next();
-                main.removeWindow(child);
-            }
-
-            // The index is listed inside a grid layout
-            main.setLayout(new VerticalLayout());
-            GridLayout grid = new GridLayout(4, 4);
-            grid.addStyleName("index");
-            main.addComponent(grid);
-
-            if (example.equals("index")) {
-                final String examples[] = { "defaultbutton", "label",
-                        "labelcontent", "tree", "embedded", "textfield",
-                        "textfieldvalidation", "datefield", "button",
-                        "select/select", "select/native", "select/optiongroup",
-                        "select/twincol", "filterselect", "validator", "table",
-                        "table/select", "table/component", "table/paging",
-                        "table/editable", "upload", "link", "gridlayout",
-                        "orderedlayout", "formlayout", "form", "form/simple",
-                        "form/layout", "panel", "expandlayout",
-                        "expandlayout/root", "tabsheet", "alignment",
-                        "alignment/grid", "window", "window/opener",
-                        "window/multiple", "classresource", "usererror",
-                        "progress/window", "progress/thread", "progress",
-                        "customlayout", "spacing", "margin", "clientinfo",
-                        "fillinform/templates", "notification", "print",
-                        "richtextfield", "querycontainer", "menubar" };
-                for (int i = 0; i < examples.length; i++) {
-                    grid.addComponent(new Label("<a href='"
-                            + context.toString() + examples[i] + "'>"
-                            + examples[i] + "</a>", Label.CONTENT_XHTML));
-                }
-                return null;
-            }
-
-            if (example.equals("defaultbutton")) {
-                example_defaultButton(main, param);
-            } else if (example.equals("label")) {
-                example_Label(main, param);
-            } else if (example.equals("labelcontent")) {
-                example_LabelContent(main, param);
-            } else if (example.equals("tree")) {
-                example_Tree(main, param);
-            } else if (example.equals("embedded")) {
-                example_Embedded(main, param);
-            } else if (example.equals("textfield")) {
-                example_TextField(main, param);
-            } else if (example.equals("textfieldvalidation")) {
-                example_TextFieldValidation(main, param);
-            } else if (example.equals("usererror")) {
-                example_UserError(main, param);
-            } else if (example.equals("datefield")) {
-                example_DateField(main, param);
-            } else if (example.equals("button")) {
-                example_Button(main, param);
-            } else if (example.equals("checkbox")) {
-                example_CheckBox(main, param);
-            } else if (example.equals("select")) {
-                example_Select(main, param);
-            } else if (example.equals("filterselect")) {
-                example_FilterSelect(main, param);
-            } else if (example.equals("validator")) {
-                example_Validator(main, param);
-            } else if (example.equals("table")) {
-                example_Table(main, param);
-            } else if (example.equals("upload")) {
-                example_Upload(main, param);
-            } else if (example.equals("link")) {
-                example_Link(main, param);
-            } else if (example.equals("gridlayout")) {
-                example_GridLayout(main, param);
-            } else if (example.equals("orderedlayout")) {
-                example_OrderedLayout(main, param);
-            } else if (example.equals("formlayout")) {
-                example_FormLayout(main, param);
-            } else if (example.equals("form")) {
-                example_Form(main, param);
-            } else if (example.equals("tabsheet")) {
-                example_TabSheet(main, param);
-            } else if (example.equals("panel")) {
-                example_Panel(main, param);
-            } else if (example.equals("expandlayout")) {
-                example_ExpandLayout(main, param);
-            } else if (example.equals("alignment")) {
-                example_Alignment(main, param);
-            } else if (example.equals("window")) {
-                example_Window(main, param);
-            } else if (example.equals("classresource")) {
-                example_ClassResource(main, param);
-            } else if (example.equals("progress")) {
-                example_ProgressIndicator(main, param);
-            } else if (example.equals("customlayout")) {
-                example_CustomLayout(main, param);
-            } else if (example.equals("spacing")) {
-                example_Spacing(main, param);
-            } else if (example.equals("margin")) {
-                example_Margin(main, param);
-            } else if (example.equals("clientinfo")) {
-                example_ClientInfo(main, param);
-            } else if (example.equals("fillinform")) {
-                example_FillInForm(main, param);
-            } else if (example.equals("notification")) {
-                example_Notification(main, param);
-            } else if (example.equals("print")) {
-                example_Print(main, param);
-            } else if (example.equals("richtextfield")) {
-                example_RichTextArea(main, param);
-            } else if (example.equals("querycontainer")) {
-                example_QueryContainer(main, param);
-            } else if (example.equals("menubar")) {
-                example_MenuBar(main, param);
-            } else {
-                ; // main.addComponent(new
-                // Label("Unknown test '"+example+"'."));
-            }
-
-            return null;
-        }
-    }
-
-    /*
-     * public Window getWindow(String name) { Window superwin =
-     * super.getWindow(name); if (superwin != null) return superwin;
-     * 
-     * main.addComponent(new Label("Request 2 for window '"+name+"'.")); if
-     * (name.equals("panel")) { Window window = new Window("Other Window " +
-     * getwincount++); example_Panel(window, null); return window; } return
-     * null; }
-     */
-    public void handleButton(Button.ClickEvent event) {
-        ol.addStyleName("myLayout2");
-    }
-
-    void example_defaultButton(Window main, String param) {
-        main.addComponent(new DefaultButtonExample(main));
-    }
-
-    void example_Label(Window main, String param) {
-        /* Some container for the Label. */
-        final Panel panel = new Panel("Panel Containing a Label");
-        main.addComponent(panel);
-
-        panel.addComponent(new Label(
-                "This is a Label inside a Panel. There is enough "
-                        + "text in the label to make the text wrap if it "
-                        + "exceeds the width of the panel."));
-    }
-
-    void example_LabelContent(Window main, String param) {
-        final GridLayout labelgrid = new GridLayout(2, 1);
-        labelgrid.addStyleName("labelgrid");
-        labelgrid.addComponent(new Label("CONTENT_DEFAULT"));
-        labelgrid.addComponent(new Label(
-                "This is a label in default mode: <plain text>",
-                Label.CONTENT_DEFAULT));
-        labelgrid.addComponent(new Label("CONTENT_PREFORMATTED"));
-        labelgrid
-                .addComponent(new Label(
-                        "This is a preformatted label.\nThe newline character \\n breaks the line.",
-                        Label.CONTENT_PREFORMATTED));
-        labelgrid.addComponent(new Label("CONTENT_RAW"));
-        labelgrid
-                .addComponent(new Label(
-                        "This is a label in raw mode.<br>It can contain, for example, unbalanced markup.",
-                        Label.CONTENT_RAW));
-        labelgrid.addComponent(new Label("CONTENT_TEXT"));
-        labelgrid.addComponent(new Label(
-                "This is a label in (plain) text mode", Label.CONTENT_TEXT));
-        labelgrid.addComponent(new Label("CONTENT_XHTML"));
-        labelgrid.addComponent(new Label(
-                "<i>This</i> is an <b>XHTML<b> formatted label",
-                Label.CONTENT_XHTML));
-        labelgrid.addComponent(new Label("CONTENT_XML"));
-        labelgrid.addComponent(new Label(
-                "This is an <myelement>XML</myelement> formatted label",
-                Label.CONTENT_XML));
-        main.addComponent(labelgrid);
-
-        final ClassResource labelimage = new ClassResource("smiley.jpg", this);
-        main.addComponent(new Label("Here we have an image <img src=\""
-                + getRelativeLocation(labelimage) + "\"/> within some text.",
-                Label.CONTENT_XHTML));
-    }
-
-    void example_Tree(Window main, String param) {
-        final Object[][] planets = new Object[][] {
-                new Object[] { "Mercury" },
-                new Object[] { "Venus" },
-                new Object[] { "Earth", "The Moon" },
-                new Object[] { "Mars", "Phobos", "Deimos" },
-                new Object[] { "Jupiter", "Io", "Europa", "Ganymedes",
-                        "Callisto" },
-                new Object[] { "Saturn", "Titan", "Tethys", "Dione", "Rhea",
-                        "Iapetus" },
-                new Object[] { "Uranus", "Miranda", "Ariel", "Umbriel",
-                        "Titania", "Oberon" },
-                new Object[] { "Neptune", "Triton", "Proteus", "Nereid",
-                        "Larissa" } };
-
-        final Tree tree = new Tree();
-
-        // Add planets as root items in the tree.
-        for (int i = 0; i < planets.length; i++) {
-            final String planet = (String) (planets[i][0]);
-            tree.addItem(planet);
-
-            if (planets[i].length == 1) {
-                // The planet has no moons so make it a leaf.
-                tree.setChildrenAllowed(planet, false);
-            } else {
-                // Add children (moons) under the planets.
-                for (int j = 1; j < planets[i].length; j++) {
-                    final String moon = (String) planets[i][j];
-
-                    // Add the item as a regular item.
-                    tree.addItem(moon);
-
-                    // Set it to be a child.
-                    tree.setParent(moon, planet);
-
-                    // Make the moons look like leaves.
-                    tree.setChildrenAllowed(moon, false);
-                }
-
-                // Expand the subtree.
-                tree.expandItemsRecursively(planet);
-            }
-        }
-
-        // Horizontal layout with the tree on the left and a details panel on
-        // the right.
-        final HorizontalLayout horlayout = new HorizontalLayout();
-        horlayout.addStyleName("treeexample");
-        horlayout.setSizeFull();
-
-        final Panel treepanel = new Panel("The Planets and Major Moons");
-        treepanel.addComponent(tree);
-        horlayout.addComponent(treepanel);
-
-        final Panel detailspanel = new Panel("Details");
-        horlayout.addComponent(detailspanel);
-        horlayout.setExpandRatio(detailspanel, 1);
-
-        final VerticalLayout detailslayout = new VerticalLayout();
-        detailspanel.setLayout(detailslayout);
-
-        // Allow null selection - this is the default actually.
-        tree.setNullSelectionAllowed(true);
-
-        // When a tree item (planet or moon) is clicked, open the item in
-        // Details view.
-        tree.setImmediate(true);
-        tree.addListener(new ValueChangeListener() {
-            String lastselected = null;
-
-            public void valueChange(ValueChangeEvent event) {
-                String planet = (String) tree.getValue();
-
-                // Reselect a selected item if it is unselected by clicking it.
-                if (planet == null) {
-                    planet = lastselected;
-                    tree.setValue(planet);
-                }
-                lastselected = planet;
-
-                detailspanel.setCaption("Details on " + planet);
-                detailslayout.removeAllComponents();
-
-                // Put some stuff in the Details view.
-                detailslayout.addComponent(new Label("Where is the cat?"));
-                detailslayout.addComponent(new Label("The cat is in " + planet
-                        + "."));
-
-            }
-        });
-
-        main.setLayout(horlayout);
-    }
-
-    void example_Select(Window main, String param) {
-        final HorizontalLayout layout = new HorizontalLayout();
-        layout.addStyleName("aligntop");
-
-        if (param.equals("twincol")) {
-            final SelectExample select1 = new SelectExample(this, param,
-                    "Select some items", true);
-            layout.addComponent(select1);
-        } else if (param.equals("filter")) {
-            final SelectExample select1 = new SelectExample(this, param,
-                    "Enter containing substring", false);
-            layout.addComponent(select1);
-        } else {
-            final SelectExample select1 = new SelectExample(this, param,
-                    "Single Selection Mode", false);
-            final SelectExample select2 = new SelectExample(this, param,
-                    "Multiple Selection Mode", true);
-            layout.addComponent(select1);
-            layout.addComponent(select2);
-        }
-        main.addComponent(layout);
-    }
-
-    void example_FilterSelect(Window main, String param) {
-        final Select select = new Select("Enter containing substring");
-        main.addComponent(select);
-
-        select
-                .setFilteringMode(AbstractSelect.Filtering.FILTERINGMODE_CONTAINS);
-
-        /* Fill the component with some items. */
-        final String[] planets = new String[] { "Mercury", "Venus", "Earth",
-                "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" };
-
-        for (int i = 0; i < planets.length; i++) {
-            for (int j = 0; j < planets.length; j++) {
-                select.addItem(planets[j] + " to " + planets[i]);
-            }
-        }
-    }
-
-    void example_TextField(Window main, String param) {
-        /* Add a single-line text field. */
-        final TextField subject = new TextField("Subject");
-        subject.setColumns(40);
-        main.addComponent(subject);
-
-        /* Add a multi-line text field. */
-        final TextField message = new TextField("Message");
-        message.setRows(7);
-        message.setColumns(40);
-        main.addComponent(message);
-    }
-
-    void example_TextFieldValidation(Window main, String param) {
-        // Create a text field with a label
-        final TextField username = new TextField("Username");
-        main.addComponent(username);
-
-        // Set visible length to 16 characters
-        username.setColumns(16);
-
-        // Set content length to minimum of 6 and maximum of 16 characters.
-        // The string also may not be null.
-        username.addValidator(new StringLengthValidator(
-                "Must be 6 to 16 characters long", 6, 16, false));
-
-        // Setting component immediate causes a ValueChangeEvent to occur
-        // when the TextField loses focus.
-        username.setImmediate(true);
-
-        // Listen for ValueChangeEvents and handle them
-        username.addListener(new ValueChangeListener() {
-            public void valueChange(ValueChangeEvent event) {
-                // Get the source of the event
-                final TextField username = (TextField) (event.getProperty());
-
-                try {
-                    // Validate the field value.
-                    username.validate();
-                } catch (final Validator.InvalidValueException e) {
-                    // The value was not ok. The error was set.
-                }
-            }
-        });
-    }
-
-    void example_UserError(final Window main, String param) {
-        if (param != null) {
-            if (param.equals("form")) {
-
-                final FormLayout layout = new FormLayout();
-                main.addComponent(layout);
-
-                final TextField textfield = new TextField("Enter code");
-                layout.addComponent(textfield);
-                textfield.setComponentError(null);
-
-                final Button button = new Button("Ok!");
-                layout.addComponent(button);
-
-                button.addListener(new Button.ClickListener() {
-                    public void buttonClick(ClickEvent event) {
-                        if (((String) textfield.getValue()).length() == 0) {
-                            textfield.setComponentError(new UserError(
-                                    "Must be letters and numbers."));
-                        } else {
-                            textfield.setComponentError(null);
-                        }
-                    }
-                });
-            }
-        } else {
-            main.setLayout(new HorizontalLayout());
-            
-            // Create a field.
-            final TextField textfield = new TextField("Enter code");
-            main.addComponent(textfield);
-            
-            // Let the component error be initially clear. (It actually is by default.)
-            textfield.setComponentError(null);
-            
-            // Have a button right of the field (and align it properly).
-            final Button button = new Button("Ok!");
-            main.addComponent(button);
-            ((HorizontalLayout)main.getLayout()).setComponentAlignment(button,
-                    HorizontalLayout.ALIGNMENT_LEFT, HorizontalLayout.ALIGNMENT_BOTTOM);
-            
-            // Handle button clicks
-            button.addListener(new Button.ClickListener() {
-                public void buttonClick(ClickEvent event) {
-                    // If the field value is bad, set its error.
-                    // (Here the content must be only alphanumeric characters.)
-                    if (! ((String) textfield.getValue()).matches("^\\w*$")) {
-                        // Put the component in error state and set the error message.
-                        textfield.setComponentError(new UserError("Must be letters and numbers"));
-                    } else {
-                        // Otherwise clear it. 
-                        textfield.setComponentError(null);
-                    }
-                }
-            });
-        }
-    }
-
-    void example_DateField(Window main, String param) {
-        HorizontalLayout layout = new HorizontalLayout();
-
-        /* Create a DateField with the calendar style. */
-        final DateField popupdate = new PopupDateField("Popup calendar field");
-
-        /* Set resolution of the date/time display. */
-        popupdate.setResolution(DateField.RESOLUTION_MIN);
-
-        /* Set the date and time to present. */
-        popupdate.setValue(new java.util.Date());
-
-        /* Create a DateField with the calendar style. */
-        final DateField inlinedate = new InlineDateField(
-                "Inline calendar field");
-
-        /* Set locale of the DateField to American English. */
-        inlinedate.setLocale(new Locale("en", "US"));
-
-        /* Set the date and time to present. */
-        inlinedate.setValue(new java.util.Date());
-
-        /* Set resolution of the date/time display. */
-        inlinedate.setResolution(DateField.RESOLUTION_MIN);
-
-        layout.addComponent(popupdate);
-        layout.addComponent(inlinedate);
-        layout.setSpacing(true);
-        main.addComponent(layout);
-    }
-
-    void example_Validator(Window main, String param) {
-        if (param != null && param.equals("required")) {
-            Form form = new Form();
-            form.setCaption("My Form");
-            form.setRequired(true);
-            main.addComponent(form);
-
-            TextField text = new TextField("This is a required text field");
-            text.setRequired(true);
-            text.setImmediate(true);
-            form.getLayout().addComponent(text);
-            return;
-        }
-        main.addComponent(new SSNField());
-    }
-
-    class PagingTable extends Table {
-        public String getTag() {
-            return "pagingtable";
-        }
-    }
-
-    void example_Table(Window main, String param) {
-        if (param != null) {
-            if (param.equals("select")) {
-                main.addComponent(new TableExample2());
-            } else if (param.equals("component")) {
-                main.addComponent(new TableExample3());
-            } else if (param.equals("editable")) {
-                main.addComponent(new TableEditable());
-            } else if (param.equals("bean")) {
-                main.addComponent(new TableEditableBean());
-            } else if (param.equals("long")) {
-                main.addComponent(new TableExample());
-            } else if (param.equals("cellstyle")) {
-                main.addComponent(new TableCellStyle());
-            } else if (param.equals("huge")) {
-                main.addComponent(new TableHuge());
-            } else if (param.equals("paging")) {
-                PagingTable table = new PagingTable();
-                table.addContainerProperty("Column 1", String.class, null);
-                for (int i = 0; i < 100; i++) {
-                    table.addItem(new Object[] { "Item " + i }, new Integer(i));
-                }
-                main.addComponent(table);
-            }
-        } else {
-            main.addComponent(new TableExample1());
-        }
-    }
-
-    void example_Upload(Window main, String param) {
-        main.addComponent(new MyUploader());
-    }
-
-    void example_Link(Window main, String param) {
-
-        /* Create a link that opens the popup window. */
-        final Link alink = new Link();
-
-        /* Set the resource to be opened in the window. */
-        alink.setResource(new ExternalResource("http://www.itmill.com/"));
-
-        main.addComponent(alink);
-
-        final ClassResource mydocument = new ClassResource("mydocument.pdf",
-                this);
-        main.addComponent(new Link("The document (pdf)", mydocument));
-        main.addComponent(new Link("link to a resource", new ExternalResource(
-                "http://www.itmill.com/")));
-    }
-
-    void example_Button(Window main, String param) {
-        if (param != null) {
-            if (param.equals("buttons")) {
-                main.addComponent(new TheButton());
-            }
-            return;
-        }
-
-        // butts1 = new TheButton ();
-        // main.addComponent(butts1);
-
-        // butts2 = new TheButtons (main);
-        // butts3 = new TheButtons2 (main);
-
-        // Button checkbox = new Button ("This is a checkbox");
-
-        // main.addComponent(checkbox);
-        final Button button = new Button("My Button");
-        main.addComponent(button);
-    }
-
-    void example_CheckBox(Window main, String param) {
-        /* A check box with default state (not checked, i.e., false). */
-        final CheckBox checkbox1 = new CheckBox("My CheckBox");
-        checkbox1.addStyleName("mybox");
-        main.addComponent(checkbox1);
-
-        /* Another check box with explicitly set checked state. */
-        final CheckBox checkbox2 = new CheckBox("Checked CheckBox");
-        /*
-         * @TODO: Build fails here, why? checkbox2.setValue(true);
-         */
-        main.addComponent(checkbox2);
-
-        /*
-         * Make some application logic. We use anynymous listener classes here.
-         * The above references were defined as "final" to allow accessing them
-         * from inside anonymous classes.
-         */
-        checkbox1.addListener(new ValueChangeListener() {
-            public void valueChange(ValueChangeEvent event) {
-                /* Copy the value to the other checkbox. */
-                checkbox2.setValue(checkbox1.getValue());
-            }
-        });
-        checkbox2.addListener(new ValueChangeListener() {
-            public void valueChange(ValueChangeEvent event) {
-                /* Copy the value to the other checkbox. */
-                checkbox1.setValue(checkbox2.getValue());
-            }
-        });
-    }
-
-    void example_Panel(Window main, String param) {
-        // Create a panel with a caption.
-        final Panel panel = new Panel("Contact Information");
-
-        // Create a layout inside the panel
-        final FormLayout form = new FormLayout();
-
-        // Set the layout as the root layout of the panel
-        panel.setLayout(form);
-
-        // Add some components
-        form.addComponent(new TextField("Name"));
-        form.addComponent(new TextField("Email"));
-
-        // Add the panel to the main window
-        final ClassResource icon = new ClassResource("smiley.jpg", main
-                .getApplication());
-        form.addComponent(new Embedded("Image", icon));
-        panel.setIcon(icon);
-        panel.addComponent(form);
-        main.addComponent(panel);
-    }
-
-    void example_GridLayout(Window main, String param) {
-        if (param.equals("embedded")) {
-            final GridLayout grid = new GridLayout(3, 3);
-            for (int i = 0; i < 3 * 3; i++) {
-                ClassResource img = new ClassResource("smiley.jpg", main
-                        .getApplication());
-                Embedded embedded = new Embedded("", img);
-                grid.addComponent(embedded);
-            }
-            main.addComponent(grid);
-            return;
-        }
-        /* Create a 4 by 4 grid layout. */
-        final GridLayout grid = new GridLayout(4, 4);
-        grid.addStyleName("example-gridlayout");
-
-        /* Fill out the first row using the cursor. */
-        grid.addComponent(new Button("R/C 1"));
-        for (int i = 0; i < 3; i++) {
-            grid.addComponent(new Button("Col " + (grid.getCursorX() + 1)));
-        }
-
-        /* Fill out the first column using coordinates. */
-        for (int i = 1; i < 4; i++) {
-            grid.addComponent(new Button("Row " + i), 0, i);
-        }
-
-        /* Add some components of various shapes. */
-        grid.addComponent(new Button("3x1 button"), 1, 1, 3, 1);
-        grid.addComponent(new Label("1x2 cell"), 1, 2, 1, 3);
-        final InlineDateField date = new InlineDateField("A 2x2 date field");
-        date.setResolution(DateField.RESOLUTION_DAY);
-        grid.addComponent(date, 2, 2, 3, 3);
-
-        main.addComponent(grid);
-    }
-
-    void example_Alignment(Window main, String param) {
-        if (param.equals("grid")) {
-            /* Create a 3 by 3 grid layout. */
-            final GridLayout layout = new GridLayout(3, 3);
-            // OrderedLayout layout = new
-            // OrderedLayout(OrderedLayout.ORIENTATION_VERTICAL);
-            main.setLayout(layout);
-            layout.addStyleName("example-alignment");
-
-            layout.setWidth(400, Sizeable.UNITS_PIXELS);
-            layout.setHeight(400, Sizeable.UNITS_PIXELS);
-
-            /* Define cells and their layouts to create. */
-
-            Object cells[][] = {
-                    { new Button("Top Left"),
-                            new Integer(AlignmentHandler.ALIGNMENT_LEFT),
-                            new Integer(AlignmentHandler.ALIGNMENT_TOP) },
-                    {
-                            new Label("Top Center"),
-                            new Integer(
-                                    AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER),
-                            new Integer(AlignmentHandler.ALIGNMENT_TOP) },
-                    { new Label("Top Right"),
-                            new Integer(AlignmentHandler.ALIGNMENT_RIGHT),
-                            new Integer(AlignmentHandler.ALIGNMENT_TOP) },
-                    {
-                            new Button("Center Left"),
-                            new Integer(AlignmentHandler.ALIGNMENT_LEFT),
-                            new Integer(
-                                    AlignmentHandler.ALIGNMENT_VERTICAL_CENTER) },
-                    {
-                            new Button("Center Center"),
-                            new Integer(
-                                    AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER),
-                            new Integer(
-                                    AlignmentHandler.ALIGNMENT_VERTICAL_CENTER) },
-                    {
-                            new Button("Center Right"),
-                            new Integer(AlignmentHandler.ALIGNMENT_RIGHT),
-                            new Integer(
-                                    AlignmentHandler.ALIGNMENT_VERTICAL_CENTER) },
-                    { new Button("Bottom Left"),
-                            new Integer(AlignmentHandler.ALIGNMENT_LEFT),
-                            new Integer(AlignmentHandler.ALIGNMENT_BOTTOM) },
-                    {
-                            new Button("Bottom Center"),
-                            new Integer(
-                                    AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER),
-                            new Integer(AlignmentHandler.ALIGNMENT_BOTTOM) },
-                    { new Button("Bottom Right"),
-                            new Integer(AlignmentHandler.ALIGNMENT_RIGHT),
-                            new Integer(AlignmentHandler.ALIGNMENT_BOTTOM) } };
-
-            for (int i = 0; i < 9; i++) {
-                HorizontalLayout celllayout = new HorizontalLayout();
-                celllayout.addComponent((Component) cells[i][0]);
-                if (i == 0) {
-                    celllayout.setExpandRatio((Component) cells[i][0], 1);
-                }
-
-                celllayout.setComponentAlignment((Component) cells[i][0],
-                        ((Integer) cells[i][1]).intValue(),
-                        ((Integer) cells[i][2]).intValue());
-                layout.addComponent(celllayout);
-                // layout.setComponentAlignment((Component)cells[i][0],
-                // ((Integer)cells[i][1]).intValue(),
-                // ((Integer)cells[i][2]).intValue());
-            }
-        } else {
-            final Panel panel = new Panel("A Panel with a Layout");
-            main.addComponent(panel);
-
-            // panel.addComponent(new )
-        }
-    }
-
-    void example_OrderedLayout(Window main, String param) {
-        final VerticalLayout layout = new VerticalLayout();
-        layout.addComponent(new TextField("Name"));
-        layout.addComponent(new TextField("Street address"));
-        layout.addComponent(new TextField("Postal code"));
-        main.addComponent(layout);
-    }
-
-    void example_FormLayout(Window main, String param) {
-        final FormLayout layout = new FormLayout();
-        layout.addComponent(new TextField("Text Field"));
-        layout.addComponent(new CheckBox("Check Box"));
-        layout.addComponent(new Select("Select"));
-        main.addComponent(layout);
-    }
-
-    void example_Form(Window main, String param) {
-        if (param != null && param.equals("simple")) {
-            main.addComponent(new FormExample2());
-        } else if (param != null && param.equals("layout")) {
-            Form form = new Form();
-            form.setCaption("Form Caption");
-            form
-                    .setDescription("This is a description of the Form that is "
-                            + "displayed in the upper part of the form. You normally enter some "
-                            + "descriptive text about the form and its use here.");
-
-            // Add a field directly to the layout. This field will not be bound
-            // to
-            // the data source Item of the form.
-            form.getLayout().addComponent(new TextField("A Field"));
-
-            // Add a field and bind it to an named item property.
-            form.addField("another", new TextField("Another Field"));
-
-            form.setComponentError(new UserError(
-                    "This is the error indicator of the Form."));
-
-            // Set the footer layout and add some text.
-            form.setFooter(new VerticalLayout());
-            form
-                    .getFooter()
-                    .addComponent(
-                            new Label(
-                                    "This is the footer area of the Form. "
-                                            + "You can use any layout here. This is nice for buttons."));
-
-            // Add an Ok (commit), Reset (discard), and Cancel buttons for the
-            // form.
-            HorizontalLayout okbar = new HorizontalLayout();
-            okbar.setHeight("25px");
-            Button okbutton = new Button("OK", form, "commit");
-            okbar.addComponent(okbutton);
-            okbar.setExpandRatio(okbutton, 1);
-            okbar.setComponentAlignment(okbutton,
-                    AlignmentHandler.ALIGNMENT_RIGHT,
-                    AlignmentHandler.ALIGNMENT_TOP);
-            okbar.addComponent(new Button("Reset", form, "discard"));
-            okbar.addComponent(new Button("Cancel"));
-            form.getFooter().addComponent(okbar);
-
-            main.addComponent(form);
-        } else {
-            main.addComponent(new FormExample());
-        }
-    }
-
-    void example_ExpandLayout(Window main, String param) {
-        if (param != null && param.equals("centered")) {
-            Label widget = new Label("Here is text");
-
-            HorizontalLayout layout = new HorizontalLayout();
-            layout.addComponent(widget);
-            layout.setExpandRatio(widget, 1);
-            layout.setComponentAlignment(widget,
-                    AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
-                    AlignmentHandler.ALIGNMENT_VERTICAL_CENTER);
-            layout.setWidth(100, Sizeable.UNITS_PERCENTAGE);
-            layout.setHeight(100, Sizeable.UNITS_PERCENTAGE);
-
-            main.setLayout(layout);
-
-            return;
-        } else if (param != null && param.equals("window")) {
-            Window window = new Window("Progress");
-            window.setHeight(100, Sizeable.UNITS_PIXELS);
-            window.setWidth(200, Sizeable.UNITS_PIXELS);
-            main.addWindow(window);
-
-            ProgressIndicator progress = new ProgressIndicator(new Float(0.4));
-            progress.addStyleName("fullwidth");
-            progress.setPollingInterval(1000000);
-            progress.setIndeterminate(false);
-
-            HorizontalLayout layout = new HorizontalLayout();
-            layout.setHeight(100, Sizeable.UNITS_PERCENTAGE);
-            layout.setComponentAlignment(progress,
-                    HorizontalLayout.ALIGNMENT_HORIZONTAL_CENTER,
-                    HorizontalLayout.ALIGNMENT_VERTICAL_CENTER);
-            window.setLayout(layout);
-            window.addComponent(progress);
-
-            return;
-        } else if (param != null && param.equals("root")) {
-            final Window mainwin = main;
-
-            // Layout to switch to
-            final VerticalLayout expand2 = new VerticalLayout();
-            expand2.addComponent(new Label("I am layout too."));
-
-            // Original layout
-            final VerticalLayout expand1 = new VerticalLayout();
-            Button switchButton = new Button("Switch to other layout");
-            switchButton.addListener(new Button.ClickListener() {
-                public void buttonClick(ClickEvent event) {
-                    mainwin.setLayout(null);
-                    mainwin.setLayout(expand2);
-                }
-            });
-            expand1.addComponent(switchButton);
-            main.setLayout(expand1);
-
-            return;
-        } else if (param != null && param.equals("size")) {
-            VerticalLayout layout = new VerticalLayout();
-            layout.setSizeFull();
-            main.setLayout(layout);
-
-            Button button = new Button("This is a button in middle of nowhere");
-            layout.addComponent(button);
-            layout.setComponentAlignment(button,
-                    VerticalLayout.ALIGNMENT_HORIZONTAL_CENTER,
-                    VerticalLayout.ALIGNMENT_VERTICAL_CENTER);
-            layout.setExpandRatio(button, 1.0f);
-            return;
-        }
-
-        for (int w = 0; w < 2; w++) {
-            final VerticalLayout layout = new VerticalLayout();
-
-            /* Set the expanding layout as the root layout of a child window. */
-            final Window window = new Window("A Child Window", layout);
-            main.addWindow(window);
-
-            /* Add some component above the expanding one. */
-            layout.addComponent(new Label("Here be some component."));
-
-            /* Create the expanding component. */
-            final Table table = new Table("My Ever-Expanding Table");
-            /*
-             * FIXME Java 5 -> 1.4 for (int i=0; i<5; i++)
-             * table.addContainerProperty("col "+(i+1), Integer.class, 0); for
-             * (int j=0; j<20; j++) table.addItem(new Object[]{1j,2j,3j,4j,5j},
-             * j);
-             */
-            layout.addComponent(table);
-
-            /* Designate the table to be the expanding component. */
-            layout.setExpandRatio(table, 1.0f);
-
-            /* Set it to use all available area. */
-            table.setSizeFull();
-
-            /* Add some component below the expanding one. */
-            final Button button2 = new Button("Ok");
-            layout.addComponent(button2);
-            layout.setComponentAlignment(button2,
-                    AlignmentHandler.ALIGNMENT_RIGHT, 0);
-        }
-    }
-
-    void example_TabSheet(Window main, String param) {
-        if (param.equals("icon")) {
-            final TabSheet tabsheet = new TabSheet();
-
-            tabsheet.addTab(new Label("Contents of the first tab"),
-                    "First Tab", new ClassResource("images/Mercury_small.png",
-                            main.getApplication()));
-            tabsheet.addTab(new Label("Contents of the second tab"),
-                    "Second Tab", new ClassResource("images/Venus_small.png",
-                            this));
-            tabsheet.addTab(new Label("Contents of the third tab"),
-                    "Third tab", new ClassResource("images/Earth_small.png",
-                            this));
-
-            main.addComponent(tabsheet);
-            // main.addComponent(new Embedded("Emb", new ClassResource
-            // ("images/Mercury_small.png", this)));
-        } else if (param.equals("expanding")) {
-            // Create the layout
-            VerticalLayout expanding = new VerticalLayout();
-
-            // It is important to set the expanding layout as the root layout
-            // of the containing window, in this case the main window, and not
-            // use addComponent(), which would place the layout inside the
-            // default root layout.
-            main.setLayout(expanding);
-
-            // Create a tab sheet that fills the expanding layout
-            final TabSheet tabsheet = new TabSheet();
-            tabsheet.addTab(new Label("Contents of the first tab"),
-                    "First Tab", null);
-            tabsheet.addTab(new Label("Contents of the second tab"),
-                    "Second Tab", null);
-            tabsheet.addTab(new Label("Contents of the third tab"),
-                    "Third tab", null);
-
-            // Set the tabsheet to scale to full size inside its container
-            tabsheet.setWidth(100, Sizeable.UNITS_PERCENTAGE);
-            tabsheet.setHeight(100, Sizeable.UNITS_PERCENTAGE);
-
-            // Add the tab sheet to the layout as usual
-            expanding.addComponent(tabsheet);
-
-            // Set the tab sheet to be the expanding component
-            expanding.setExpandRatio(tabsheet, 1);
-        } else if (param.equals("ordered")) {
-            // Create the layout
-            VerticalLayout layout = new VerticalLayout();
-
-            // It is important to set the expanding layout as the root layout
-            // of the containing window, in this case the main window, and not
-            // use addComponent(), which would place the layout inside the
-            // default root layout.
-            main.setLayout(layout);
-
-            // Create a tab sheet that fills the expanding layout
-            final TabSheet tabsheet = new TabSheet();
-            tabsheet.addTab(new Label("Contents of the first tab"),
-                    "First Tab", null);
-            tabsheet.addTab(new Label("Contents of the second tab"),
-                    "Second Tab", null);
-            tabsheet.addTab(new Label("Contents of the third tab"),
-                    "Third tab", null);
-
-            // Set the tabsheet to scale to full size inside its container
-            tabsheet.setWidth(100, Sizeable.UNITS_PERCENTAGE);
-            // tabsheet().setHeight(100, Sizeable.UNITS_PERCENTAGE);
-
-            // Add the tab sheet to the layout as usual
-            layout.addComponent(tabsheet);
-        } else {
-            main.addComponent(new TabSheetExample());
-        }
-    }
-
-    void example_Embedded(Window main, String param) {
-        final Embedded image = new Embedded("", new ClassResource("smiley.jpg",
-                this));
-        image.addStyleName("omaimage");
-        main.addComponent(image);
-
-        final EmbeddedButton button = new EmbeddedButton(new ClassResource(
-                "smiley.jpg", this));
-        main.addComponent(button);
-    }
-
-    void example_Window(Window main, String param) {
-        if (param != null) {
-            if (param.equals("opener")) {
-                main.addComponent(new WindowOpener("Window Opener", main));
-            } else if (param.equals("multiple")) {
-                /* Create a new window. */
-                final Window mywindow = new Window("Second Window");
-                mywindow.setName("mywindow");
-                mywindow.addComponent(new Label("This is a second window."));
-
-                /* Add the window to the application. */
-                main.getApplication().addWindow(mywindow);
-
-                /* Add link to the second window in the main window. */
-                main.addComponent(new Label("Second window: <a href='"
-                        + mywindow.getURL() + "'>middle-click to open</a>",
-                        Label.CONTENT_XHTML));
-                main.addComponent(new Label(
-                        "The second window can be accessed through URL: "
-                                + mywindow.getURL()));
-            }
-            return;
-        }
-
-        /* Create a new window. */
-        final Window mywindow = new Window("My Window");
-        mywindow.setName("mywindow");
-
-        /* Add some components in the window. */
-        mywindow.addComponent(new Label("A text label in the window."));
-        final Button okbutton = new Button("OK");
-        mywindow.addComponent(okbutton);
-
-        /* Set window size. */
-        mywindow.setHeight("200px");
-        mywindow.setWidth("400px");
-
-        /* Set window position. */
-        mywindow.setPositionX(200);
-        mywindow.setPositionY(50);
-
-        /* Add the window to the Application object. */
-        main.addWindow(mywindow);
-
-    }
-
-    void example_ClassResource(Window main, String param) {
-        final DateField df = new DateField();
-        main.addComponent(df);
-        df.setIcon(new ClassResource("smiley.jpg", main.getApplication()));
-        main.addComponent(new Embedded("This is Embedded", new ClassResource(
-                "smiley.jpg", main.getApplication())));
-    }
-
-    void example_ProgressIndicator(final Window main, String param) {
-        if (param != null) {
-            if (param.equals("thread")) {
-
-                // Create the indicator
-                final ProgressIndicator indicator = new ProgressIndicator(
-                        new Float(0.0));
-                main.addComponent(indicator);
-
-                // Set polling frequency to 0.5 seconds.
-                indicator.setPollingInterval(1000);
-
-                // indicator.addStyleName("invisible");
-                final Label text = new Label("-- Not running --");
-                main.addComponent(text);
-
-                // Add a button to start the progress
-                final Button button = new Button("Click to start");
-                main.addComponent(button);
-
-                // Another thread to do some work
-                class WorkThread extends Thread {
-                    public void run() {
-                        double current = 0.0;
-                        while (true) {
-                            // Do some "heavy work"
-                            try {
-                                sleep(50); // Sleep for 50 milliseconds
-                            } catch (InterruptedException e) {
-                            }
-
-                            // Grow the progress value until it reaches 1.0.
-                            current += 0.01;
-                            if (current > 1.0) {
-                                indicator.setValue(new Float(1.0));
-                            } else {
-                                indicator.setValue(new Float(current));
-                            }
-
-                            // After the progress is full for a while, stop.
-                            if (current > 1.2) {
-                                // Restore the state to initial.
-                                indicator.setValue(new Float(0.0));
-                                button.setVisible(true);
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                // Clicking the button creates and runs a work thread
-                button.addListener(new Button.ClickListener() {
-                    public void buttonClick(ClickEvent event) {
-                        final WorkThread thread = new WorkThread();
-                        thread.start();
-
-                        // The button hides until the work is done.
-                        button.setVisible(false);
-                    }
-                });
-            } else if (param.equals("window")) {
-                // Create a table in the main window to hold items added in the
-                // second window
-                final Table table = new Table();
-                table.setPageLength(5);
-                table.setWidth(100, Sizeable.UNITS_PERCENTAGE);
-                table.addContainerProperty("Name", String.class, "");
-                main.addComponent(table);
-
-                // Create the second window
-                final Window adderWindow = new Window("Add Items");
-                adderWindow.setName("win-adder");
-                main.getApplication().addWindow(adderWindow);
-
-                // Create selection component to add items to the table
-                final NativeSelect select = new NativeSelect(
-                        "Select item to add");
-                select.setImmediate(true);
-                adderWindow.addComponent(select);
-
-                // Add some items to the selection
-                String items[] = new String[] { "-- Select --", "Mercury",
-                        "Venus", "Earth", "Mars", "Jupiter", "Saturn",
-                        "Uranus", "Neptune" };
-                for (int i = 0; i < items.length; i++) {
-                    select.addItem(items[i]);
-                }
-                select.setNullSelectionItemId(items[0]);
-
-                // When an item is selected in the second window, add
-                // table in the main window
-                select.addListener(new ValueChangeListener() {
-                    public void valueChange(ValueChangeEvent event) {
-                        // If the selected value is something else but null
-                        // selection item.
-                        if (select.getValue() != null) {
-                            // Add the selected item to the table in the main
-                            // window
-                            table.addItem(new Object[] { select.getValue() },
-                                    new Integer(table.size()));
-                        }
-                    }
-                });
-
-                // Link to open the selection window
-                Link link = new Link("Click to open second window",
-                        new ExternalResource(adderWindow.getURL()), "_new", 50,
-                        200, Link.TARGET_BORDER_DEFAULT);
-                main.addComponent(link);
-
-                // Enable polling to update the main window
-                ProgressIndicator poller = new ProgressIndicator();
-                poller.addStyleName("invisible");
-                main.addComponent(poller);
-            } else if (param.equals("centered")) {
-                /*
-                 * GridLayout grid = new GridLayout(3,3); main.setLayout(grid);
-                 * grid().setWidth(100, Sizeable.UNITS_PERCENTAGE);
-                 * 
-                 * ExpandLayout layout2 = new
-                 * ExpandLayout(OrderedLayout.ORIENTATION_HORIZONTAL);
-                 * layout2().setWidth(50, Sizeable.UNITS_PERCENTAGE);
-                 * 
-                 * ProgressIndicator poller = new ProgressIndicator(new
-                 * Float(0.4)); poller.setPollingInterval(1000000);
-                 * poller.setIndeterminate(false); layout2.addComponent(poller);
-                 * 
-                 * grid.addComponent(layout2, 1, 1);
-                 */
-
-                // ExpandLayout layout2 = new
-                // ExpandLayout(OrderedLayout.ORIENTATION_HORIZONTAL);
-                /*
-                 * ProgressIndicator poller = new ProgressIndicator(new
-                 * Float(0.4)); poller.setPollingInterval(1000000);
-                 * poller.setIndeterminate(false);
-                 */
-                /*
-                 * layout2.addComponent(poller); layout2().setWidth(50,
-                 * Sizeable.UNITS_PERCENTAGE);
-                 */
-
-                // layout.setComponentAlignment(poller,
-                // AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
-                // AlignmentHandler.ALIGNMENT_VERTICAL_CENTER);
-                /*
-                 * GridLayout grid = new GridLayout(1,1);
-                 * grid.addComponent(layout2, 0, 0); grid().setWidth(100,
-                 * Sizeable.UNITS_PERCENTAGE);
-                 */
-
-                /*
-                 * GridLayout layout = new GridLayout(1,1);
-                 * //OrderedLayout.ORIENTATION_HORIZONTAL);
-                 * layout.addComponent(poller); //layout.expand(poller);
-                 * layout.setComponentAlignment(poller,
-                 * AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
-                 * AlignmentHandler.ALIGNMENT_VERTICAL_CENTER);
-                 * layout().setWidth(100, Sizeable.UNITS_PERCENTAGE);
-                 * layout().setHeight(100, Sizeable.UNITS_PERCENTAGE);
-                 */
-
-            }
-        } else {
-            ProgressIndicator poller = new ProgressIndicator(new Float(0.0));
-            poller.setPollingInterval(1000000);
-            poller.setIndeterminate(true);
-            main.addComponent(poller);
-        }
-    }
-
-    void example_CustomLayout(final Window main, String param) {
-        Window sub = new Window("Login");
-        sub.setModal(true);
-        main.addWindow(sub);
-
-        // Create the custom layout and set it as the root layout of
-        // the containing window.
-        final CustomLayout custom = new CustomLayout("layoutname");
-        sub.setLayout(custom);
-
-        // Create components and bind them to the location tags
-        // in the custom layout.
-        TextField username = new TextField();
-        custom.addComponent(username, "username");
-
-        TextField password = new TextField();
-        custom.addComponent(password, "password");
-
-        final Button ok = new Button("Login");
-        custom.addComponent(ok, "okbutton");
-
-        final Button deny = new Button("No can do!");
-
-        Button.ClickListener listener = new Button.ClickListener() {
-            public void buttonClick(ClickEvent event) {
-                // Switch between ok and deny
-                if (custom.getComponent("okbutton") == ok) {
-                    System.out.println("Changing to deny button.");
-                    custom.addComponent(deny, "okbutton");
-                } else {
-                    System.out.println("Changing to ok button.");
-                    custom.addComponent(ok, "okbutton");
-                }
-            }
-        };
-
-        ok.addListener(listener);
-        deny.addListener(listener);
-    }
-
-    void example_Spacing(final Window main, String param) {
-        VerticalLayout containinglayout = new VerticalLayout();
-        main.setLayout(containinglayout);
-
-        GridLayout grid = new GridLayout(4, 3);
-        grid.addStyleName("spacingexample");
-        containinglayout.addComponent(grid);
-        grid.addComponent(new Label(""), 0, 0);
-        grid.addComponent(new Label(""), 1, 0);
-
-        grid.addComponent(new Label("No spacing:"), 0, 1);
-        HorizontalLayout layout1 = new HorizontalLayout();
-        grid.addComponent(layout1, 1, 1);
-        layout1.addStyleName("spacingexample");
-        layout1.addComponent(new Button("Component 1"));
-        layout1.addComponent(new Button("Component 2"));
-        layout1.addComponent(new Button("Component 3"));
-
-        grid.addComponent(new Label("Horizontal spacing:"), 0, 2);
-        HorizontalLayout layout2 = new HorizontalLayout();
-        grid.addComponent(layout2, 1, 2);
-        layout2.addStyleName("spacingexample");
-        layout2.setSpacing(true);
-        layout2.addComponent(new Button("Component 1"));
-        layout2.addComponent(new Button("Component 2"));
-        layout2.addComponent(new Button("Component 3"));
-
-        grid.addComponent(new Label("No spacing:"), 2, 0);
-        VerticalLayout layout3 = new VerticalLayout();
-        grid.addComponent(layout3, 2, 1, 2, 2);
-        layout3.addStyleName("spacingexample");
-        layout3.addComponent(new Button("Component 1"));
-        layout3.addComponent(new Button("Component 2"));
-        layout3.addComponent(new Button("Component 3"));
-
-        grid.addComponent(new Label("Vertical spacing:"), 3, 0);
-        VerticalLayout layout4 = new VerticalLayout();
-        grid.addComponent(layout4, 3, 1, 3, 2);
-        layout4.addStyleName("spacingexample");
-        layout4.setSpacing(true);
-        layout4.addComponent(new Button("Component 1"));
-        layout4.addComponent(new Button("Component 2"));
-        layout4.addComponent(new Button("Component 3"));
-    }
-
-    void example_Margin(final Window main, String param) {
-        HorizontalLayout hor = new HorizontalLayout();
-        main.setLayout(hor);
-
-        VerticalLayout containinglayout = new VerticalLayout();
-        hor.addComponent(containinglayout);
-
-        VerticalLayout layout1 = new VerticalLayout();
-        containinglayout.addComponent(new Label("Regular layout margins:"));
-        containinglayout.addComponent(layout1);
-        layout1.addStyleName("marginexample1");
-        layout1.addComponent(new Button("Component 1"));
-        layout1.addComponent(new Button("Component 2"));
-        layout1.addComponent(new Button("Component 3"));
-
-        // Create a layout
-        VerticalLayout layout2 = new VerticalLayout();
-        containinglayout.addComponent(new Label(
-                "Layout with a special margin element:"));
-        containinglayout.addComponent(layout2);
-
-        // Set style name for the layout to allow styling it
-        layout2.addStyleName("marginexample2");
-
-        // Have margin on all sides around the layout
-        layout2.setMargin(true);
-
-        // Put something inside the layout
-        layout2.addComponent(new Button("Component 1"));
-        layout2.addComponent(new Button("Component 2"));
-        layout2.addComponent(new Button("Component 3"));
-    }
-
-    void example_ClientInfo(final Window main, String param) {
-        // Get the client identification string
-        WebApplicationContext context2 = (WebApplicationContext) getContext();
-        String browserApplication = context2.getBrowser()
-                .getBrowserApplication();
-
-        // Add a browser-dependent style name for the main window
-        if (browserApplication.indexOf("Firefox/2") != -1) {
-            main.addStyleName("firefox2");
-        }
-
-        // Display the client identification string
-        main.addComponent(new Label(browserApplication));
-    }
-
-    void example_FillInForm(final Window main, String param) {
-        if (param.equals("templates")) {
-            // Create a custom layout from the fill-in-form.html template.
-            CustomLayout fillinlayout = new CustomLayout("fill-in-form");
-
-            // The style will set the display to be "inline".
-            fillinlayout.addStyleName("fillinlayout");
-
-            // Create the fields that occur in the text.
-            TextField field1 = new TextField();
-            TextField field2 = new TextField();
-            fillinlayout.addComponent(field1, "q1");
-            fillinlayout.addComponent(field2, "q2");
-
-            main.addComponent(fillinlayout);
-        } else {
-            String fillintext = "The <q1> is mightier than <q2>.";
-            int pos = 0;
-            while (pos < fillintext.length()) {
-                int nexttag = fillintext.indexOf("<", pos);
-                if (nexttag == -1) {
-
-                }
-            }
-        }
-    }
-
-    void example_Notification(final Window main, String param) {
-        //final Window sub1 = new Window("");
-        //main.addWindow(sub1);
-        if (param.equals("example")) {
-            main.showNotification("This is the caption",
-                                  "This is the description");
-            return;
-        } else if (param.equals("type")) {
-            main.showNotification("This is a warning",
-                                  "<br/>This is the <i>last</i> warning",
-                                  Window.Notification.TYPE_WARNING_MESSAGE);
-            return;
-        } else if (param.equals("pos")) {
-            // Create a notification with the default settings for a warning.
-            Window.Notification notif = new Window.Notification(
-                    "Be warned!", "This message lurks in the top-left corner!",
-                    Window.Notification.TYPE_WARNING_MESSAGE);
-            
-            // Set the position.
-            notif.setPosition(Window.Notification.POSITION_TOP_LEFT);
-            
-            // Let it stay there until the user clicks it
-            notif.setDelayMsec(-1);
-            
-            // Show it in the main window.
-            main.showNotification(notif);
-            return;
-        }
-
-        main.setLayout(new HorizontalLayout());
-        
-        final Integer type_humanized = Window.Notification.TYPE_HUMANIZED_MESSAGE; 
-        final Integer type_warning   = Window.Notification.TYPE_WARNING_MESSAGE; 
-        final Integer type_error     = Window.Notification.TYPE_ERROR_MESSAGE; 
-        final Integer type_tray      = Window.Notification.TYPE_TRAY_NOTIFICATION; 
-        final NativeSelect types = new NativeSelect();
-        main.addComponent(types);
-        types.addItem(type_humanized);
-        types.addItem(type_warning);
-        types.addItem(type_error);
-        types.addItem(type_tray);
-        types.setItemCaption(type_humanized, "Humanized");
-        types.setItemCaption(type_warning,   "Warning");
-        types.setItemCaption(type_error,     "Error");
-        types.setItemCaption(type_tray,      "Tray");
-        
-        Button show = new Button("Show Notification");
-        main.addComponent(show);
-        
-        show.addListener(new Button.ClickListener() {
-            public void buttonClick(ClickEvent event) {
-                String caption = "";
-                String description = "";
-                switch(((Integer)types.getValue()).intValue()) {
-                    case Window.Notification.TYPE_HUMANIZED_MESSAGE:
-                        caption = "Humanized message";
-                        description = "<br/>For minimal annoyance";
-                        break;
-                    case Window.Notification.TYPE_WARNING_MESSAGE:
-                        caption = "Warning message";
-                        description = "<br/>For notifications of medium importance";
-                        break;
-                    case Window.Notification.TYPE_ERROR_MESSAGE:
-                        caption = "Error message";
-                        description = "<br/>For important notifications";
-                        break;
-                    case Window.Notification.TYPE_TRAY_NOTIFICATION:
-                        caption = "Tray notification";
-                        description = "<br/>Stays up longer - but away";
-                }
-                // main.showNotification("The default notification");
-                Window.Notification notif = new Window.Notification(
-                        caption, description, (Integer)types.getValue());
-                //notif.setPosition(Window.Notification.POSITION_TOP_LEFT);
-                notif.setDelayMsec(-1);
-                main.showNotification(notif);
-            }
-        });
-        
-        // Notification notif = new Notification("Title");
-    }
-
-    void example_Print(final Window main, String param) {
-        if (param != null && param.equals("simple")) {
-            main
-                    .addComponent(new Label(
-                            "<input type='button' onClick='print()' value='Click to Print'/>",
-                            Label.CONTENT_XHTML));
-            return;
-        }
-
-        // A button to open the printer-friendly page.
-        Button printButton = new Button("Click to Print");
-        main.addComponent(printButton);
-        printButton.addListener(new Button.ClickListener() {
-            public void buttonClick(ClickEvent event) {
-                // Create a window that contains stuff you want to print.
-                Window printWindow = new Window("Window to Print");
-
-                // Have some content to print.
-                printWindow.addComponent(new Label(
-                        "Here's some dynamic content."));
-
-                // To execute the print() JavaScript, we need to run it
-                // from a custom layout.
-                CustomLayout scriptLayout = new CustomLayout("printpage");
-                printWindow.addComponent(scriptLayout);
-
-                // Add the printing window as an application-level window.
-                main.getApplication().addWindow(printWindow);
-
-                // Open the printing window as a new browser window
-                main.open(new ExternalResource(printWindow.getURL()), "_new");
-            }
-        });
-
-        // main.addComponent(new
-        // Label("<p>Print this!</p>\n<script type='text/javascript'>print();</script>",
-        // Label.CONTENT_XHTML));
-    }
-
-    void example_RichTextArea(final Window main, String param) {
-        main.setLayout(new HorizontalLayout());
-
-        // Create a rich text area
-        final RichTextArea rtarea = new RichTextArea();
-        rtarea.addStyleName("richtextexample");
-        // rtarea.setCaption("My Rich Text Area");
-
-        // Set initial content as HTML
-        rtarea
-                .setValue("<h1>Hello</h1>\n<p>This rich text area contains some text.</p>");
-
-        // Show the text edited in the rich text area as HTML.
-        final Button show = new Button("Show HTML");
-        final Label html = new Label((String) rtarea.getValue());
-        show.addListener(new Button.ClickListener() {
-            public void buttonClick(ClickEvent event) {
-                html.setValue(rtarea.getValue());
-            }
-        });
-
-        Panel rtPanel = new Panel("Rich Text Area");
-        rtPanel.addComponent(rtarea);
-        rtPanel.addComponent(show);
-
-        Panel valuePanel = new Panel("Value");
-        valuePanel.addComponent(html);
-
-        main.addComponent(rtPanel);
-        main.addComponent(valuePanel);
-    }
-
-    void example_QueryContainer(final Window main, String param) {
-        try {
-            // Create a database connection
-            Class.forName("org.hsqldb.jdbcDriver");
-            final Connection connection = DriverManager.getConnection(
-                    "jdbc:hsqldb:mem:qcexample", "sa", "");
-
-            // Create an example table and put some data in it.
-            Statement st = connection.createStatement();
-            st
-                    .executeQuery("CREATE TABLE Prisoners (id INTEGER, name VARCHAR)");
-            st.close();
-            for (int i = 0; i < 100; i++) {
-                st = connection.createStatement();
-                st.executeQuery("INSERT INTO Prisoners (id, name) VALUES (" + i
-                        + ",'I am number " + (i + 1) + "')");
-                st.close();
-            }
-
-            // Query the database
-            final QueryContainer qc = new QueryContainer(
-                    "SELECT id,name FROM Prisoners", connection);
-
-            // Create a component for selecting a query result item.
-            Select select = new Select("Select an item");
-
-            // The items shown in the selection component are obtained from the
-            // query.
-            select.setContainerDataSource(qc);
-
-            // The item captions are obtained from a field in the query result.
-            select.setItemCaptionMode(Select.ITEM_CAPTION_MODE_PROPERTY);
-
-            // Set the name of the field from which the item captions are
-            // obtained.
-            select.setItemCaptionPropertyId("name");
-
-            // When selection changes, display the selected item.
-            select.setImmediate(true);
-            final Label selection = new Label("Currently selected: -");
-            select.addListener(new ValueChangeListener() {
-                public void valueChange(ValueChangeEvent event) {
-                    // Get the item id of the currently selected item
-                    Integer itemId = (Integer) event.getProperty().getValue();
-
-                    // Use the item ID to get the actual row from the query
-                    // result.
-                    Item qrItem = qc.getItem(itemId);
-
-                    // Display the item ID
-                    selection.setValue("Currently selected: result row "
-                            + itemId.intValue() + " (id="
-                            + qrItem.getItemProperty("id") + ", " + "name="
-                            + qrItem.getItemProperty("name") + ")");
-                }
-            });
-
-            main.addComponent(select);
-            main.addComponent(selection);
-        } catch (SQLException e) {
-            e.printStackTrace();
-        } catch (ClassNotFoundException e) {
-            e.printStackTrace();
-        }
-    }
-
-    void example_MenuBar(final Window main, String param) {
-        // Create a menu bar
-        final MenuBar menubar = new MenuBar();
-        main.addComponent(menubar);
-
-        // A feedback component
-        final Label selection = new Label("");
-        main.addComponent(selection);
-
-        // Define a common menu command for all the menu items.
-        MenuBar.Command mycommand = new MenuBar.Command() {
-            public void menuSelected(MenuItem selectedItem) {
-                selection.setValue("Ordered a " + selectedItem.getText()
-                        + " from menu.");
-            }
-        };
-
-        // Put some items in the menu hierarchically
-        MenuBar.MenuItem beverages = menubar.addItem("Beverages", null, null);
-        MenuBar.MenuItem hot_beverages = beverages.addItem("Hot", null, null);
-        hot_beverages.addItem("Tea", null, mycommand);
-        hot_beverages.addItem("Coffee", null, mycommand);
-        MenuBar.MenuItem cold_beverages = beverages.addItem("Cold", null, null);
-        cold_beverages.addItem("Milk", null, mycommand);
-
-        // Another top-level item
-        MenuBar.MenuItem snacks = menubar.addItem("Snacks", null, null);
-        snacks.addItem("Weisswurst", null, mycommand);
-        snacks.addItem("Salami", null, mycommand);
-
-        // Yet another top-level item
-        MenuBar.MenuItem services = menubar.addItem("Services", null, null);
-        services.addItem("Car Service", null, mycommand);
-    }
+       Window main = new Window("Application window");
+
+       TheButton butts1;
+       TheButtons butts2;
+       TheButtons2 butts3;
+
+       Label mylabel1;
+       Label mylabel2;
+       Label mylabel3;
+
+       StreamResource strres;
+       VerticalLayout ol;
+       int getwincount = 0;
+
+       @Override
+       public void init() {
+               setTheme("tests-book");
+
+               setMainWindow(main);
+
+               // Demo the use of parameter and URI handlers
+               main.addParameterHandler(new MyParameterHandler());
+               main.addURIHandler(new MyURIHandler());
+
+               MyDynamicResource myresource = new MyDynamicResource();
+               main.addParameterHandler(myresource);
+               main.addURIHandler(myresource);
+
+               main.addURIHandler(new BookTestURIHandler());
+       }
+
+       class MyParameterHandler implements ParameterHandler {
+               public void handleParameters(Map parameters) {
+                       // Print out the parameters to standard output
+                       for (Iterator it = parameters.keySet().iterator(); it.hasNext();) {
+                               String key = (String) it.next();
+                               String value = ((String[]) parameters.get(key))[0];
+                               System.out.println("Key: " + key + ", value: " + value);
+                       }
+               }
+       }
+
+       class MyURIHandler implements URIHandler {
+               public DownloadStream handleURI(URL context, String relativeUri) {
+                       System.out.println("Context: " + context.toString()
+                                       + ", relative: " + relativeUri);
+                       return null; // Let the Application provide the response
+               }
+       }
+
+       class BookTestURIHandler implements URIHandler {
+               public DownloadStream handleURI(URL context, String relativeUri) {
+                       String example;
+                       String param = null;
+
+                       final int slashPos = relativeUri.indexOf("/");
+                       if (slashPos > 0) {
+                               example = relativeUri.substring(0, slashPos);
+                               param = relativeUri.substring(slashPos + 1);
+                       } else {
+                               example = relativeUri;
+                       }
+
+                       /* Remove existing components and windows. */
+                       main.removeAllComponents();
+                       final Set childwindows = main.getChildWindows();
+                       for (final Iterator cwi = childwindows.iterator(); cwi.hasNext();) {
+                               final Window child = (Window) cwi.next();
+                               main.removeWindow(child);
+                       }
+
+                       // The index is listed inside a grid layout
+                       main.setLayout(new VerticalLayout());
+                       GridLayout grid = new GridLayout(4, 4);
+                       grid.addStyleName("index");
+                       main.addComponent(grid);
+
+                       if (example.equals("index")) {
+                               final String examples[] = { "defaultbutton", "label",
+                                               "labelcontent", "tree", "embedded", "textfield",
+                                               "textfieldvalidation", "datefield", "button",
+                                               "select/select", "select/native", "select/optiongroup",
+                                               "select/twincol", "filterselect", "validator", "table",
+                                               "table/select", "table/component", "table/paging",
+                                               "table/editable", "upload", "link", "gridlayout",
+                                               "orderedlayout", "formlayout", "form", "form/simple",
+                                               "form/layout", "panel", "expandlayout",
+                                               "expandlayout/root", "tabsheet", "alignment",
+                                               "alignment/grid", "window", "window/opener",
+                                               "window/multiple", "classresource", "usererror",
+                                               "progress/window", "progress/thread", "progress",
+                                               "customlayout", "spacing", "margin", "clientinfo",
+                                               "fillinform/templates", "notification", "print",
+                                               "richtextfield", "querycontainer", "menubar" };
+                               for (int i = 0; i < examples.length; i++) {
+                                       grid.addComponent(new Label("<a href='"
+                                                       + context.toString() + examples[i] + "'>"
+                                                       + examples[i] + "</a>", Label.CONTENT_XHTML));
+                               }
+                               return null;
+                       }
+
+                       if (example.equals("defaultbutton")) {
+                               example_defaultButton(main, param);
+                       } else if (example.equals("label")) {
+                               example_Label(main, param);
+                       } else if (example.equals("labelcontent")) {
+                               example_LabelContent(main, param);
+                       } else if (example.equals("tree")) {
+                               example_Tree(main, param);
+                       } else if (example.equals("embedded")) {
+                               example_Embedded(main, param);
+                       } else if (example.equals("textfield")) {
+                               example_TextField(main, param);
+                       } else if (example.equals("textfieldvalidation")) {
+                               example_TextFieldValidation(main, param);
+                       } else if (example.equals("usererror")) {
+                               example_UserError(main, param);
+                       } else if (example.equals("datefield")) {
+                               example_DateField(main, param);
+                       } else if (example.equals("button")) {
+                               example_Button(main, param);
+                       } else if (example.equals("checkbox")) {
+                               example_CheckBox(main, param);
+                       } else if (example.equals("select")) {
+                               example_Select(main, param);
+                       } else if (example.equals("filterselect")) {
+                               example_FilterSelect(main, param);
+                       } else if (example.equals("validator")) {
+                               example_Validator(main, param);
+                       } else if (example.equals("table")) {
+                               example_Table(main, param);
+                       } else if (example.equals("upload")) {
+                               example_Upload(main, param);
+                       } else if (example.equals("link")) {
+                               example_Link(main, param);
+                       } else if (example.equals("gridlayout")) {
+                               example_GridLayout(main, param);
+                       } else if (example.equals("orderedlayout")) {
+                               example_OrderedLayout(main, param);
+                       } else if (example.equals("formlayout")) {
+                               example_FormLayout(main, param);
+                       } else if (example.equals("form")) {
+                               example_Form(main, param);
+                       } else if (example.equals("tabsheet")) {
+                               example_TabSheet(main, param);
+                       } else if (example.equals("panel")) {
+                               example_Panel(main, param);
+                       } else if (example.equals("expandlayout")) {
+                               example_ExpandLayout(main, param);
+                       } else if (example.equals("alignment")) {
+                               example_Alignment(main, param);
+                       } else if (example.equals("window")) {
+                               example_Window(main, param);
+                       } else if (example.equals("classresource")) {
+                               example_ClassResource(main, param);
+                       } else if (example.equals("progress")) {
+                               example_ProgressIndicator(main, param);
+                       } else if (example.equals("customlayout")) {
+                               example_CustomLayout(main, param);
+                       } else if (example.equals("spacing")) {
+                               example_Spacing(main, param);
+                       } else if (example.equals("margin")) {
+                               example_Margin(main, param);
+                       } else if (example.equals("clientinfo")) {
+                               example_ClientInfo(main, param);
+                       } else if (example.equals("fillinform")) {
+                               example_FillInForm(main, param);
+                       } else if (example.equals("notification")) {
+                               example_Notification(main, param);
+                       } else if (example.equals("print")) {
+                               example_Print(main, param);
+                       } else if (example.equals("richtextfield")) {
+                               example_RichTextArea(main, param);
+                       } else if (example.equals("querycontainer")) {
+                               example_QueryContainer(main, param);
+                       } else if (example.equals("menubar")) {
+                               example_MenuBar(main, param);
+                       } else {
+                               ; // main.addComponent(new
+                               // Label("Unknown test '"+example+"'."));
+                       }
+
+                       return null;
+               }
+       }
+
+       /*
+        * public Window getWindow(String name) { Window superwin =
+        * super.getWindow(name); if (superwin != null) return superwin;
+        * 
+        * main.addComponent(new Label("Request 2 for window '"+name+"'.")); if
+        * (name.equals("panel")) { Window window = new Window("Other Window " +
+        * getwincount++); example_Panel(window, null); return window; } return
+        * null; }
+        */
+       public void handleButton(Button.ClickEvent event) {
+               ol.addStyleName("myLayout2");
+       }
+
+       void example_defaultButton(Window main, String param) {
+               main.addComponent(new DefaultButtonExample());
+       }
+
+       void example_Label(Window main, String param) {
+               /* Some container for the Label. */
+               final Panel panel = new Panel("Panel Containing a Label");
+               main.addComponent(panel);
+
+               panel.addComponent(new Label(
+                               "This is a Label inside a Panel. There is enough "
+                                               + "text in the label to make the text wrap if it "
+                                               + "exceeds the width of the panel."));
+       }
+
+       void example_LabelContent(Window main, String param) {
+               final GridLayout labelgrid = new GridLayout(2, 1);
+               labelgrid.addStyleName("labelgrid");
+               labelgrid.addComponent(new Label("CONTENT_DEFAULT"));
+               labelgrid.addComponent(new Label(
+                               "This is a label in default mode: <plain text>",
+                               Label.CONTENT_DEFAULT));
+               labelgrid.addComponent(new Label("CONTENT_PREFORMATTED"));
+               labelgrid
+                               .addComponent(new Label(
+                                               "This is a preformatted label.\nThe newline character \\n breaks the line.",
+                                               Label.CONTENT_PREFORMATTED));
+               labelgrid.addComponent(new Label("CONTENT_RAW"));
+               labelgrid
+                               .addComponent(new Label(
+                                               "This is a label in raw mode.<br>It can contain, for example, unbalanced markup.",
+                                               Label.CONTENT_RAW));
+               labelgrid.addComponent(new Label("CONTENT_TEXT"));
+               labelgrid.addComponent(new Label(
+                               "This is a label in (plain) text mode", Label.CONTENT_TEXT));
+               labelgrid.addComponent(new Label("CONTENT_XHTML"));
+               labelgrid.addComponent(new Label(
+                               "<i>This</i> is an <b>XHTML<b> formatted label",
+                               Label.CONTENT_XHTML));
+               labelgrid.addComponent(new Label("CONTENT_XML"));
+               labelgrid.addComponent(new Label(
+                               "This is an <myelement>XML</myelement> formatted label",
+                               Label.CONTENT_XML));
+               main.addComponent(labelgrid);
+
+               final ClassResource labelimage = new ClassResource("smiley.jpg", this);
+               main.addComponent(new Label("Here we have an image <img src=\""
+                               + getRelativeLocation(labelimage) + "\"/> within some text.",
+                               Label.CONTENT_XHTML));
+       }
+
+       void example_Tree(Window main, String param) {
+               final Object[][] planets = new Object[][] {
+                               new Object[] { "Mercury" },
+                               new Object[] { "Venus" },
+                               new Object[] { "Earth", "The Moon" },
+                               new Object[] { "Mars", "Phobos", "Deimos" },
+                               new Object[] { "Jupiter", "Io", "Europa", "Ganymedes",
+                                               "Callisto" },
+                               new Object[] { "Saturn", "Titan", "Tethys", "Dione", "Rhea",
+                                               "Iapetus" },
+                               new Object[] { "Uranus", "Miranda", "Ariel", "Umbriel",
+                                               "Titania", "Oberon" },
+                               new Object[] { "Neptune", "Triton", "Proteus", "Nereid",
+                                               "Larissa" } };
+
+               final Tree tree = new Tree();
+
+               // Add planets as root items in the tree.
+               for (int i = 0; i < planets.length; i++) {
+                       final String planet = (String) (planets[i][0]);
+                       tree.addItem(planet);
+
+                       if (planets[i].length == 1) {
+                               // The planet has no moons so make it a leaf.
+                               tree.setChildrenAllowed(planet, false);
+                       } else {
+                               // Add children (moons) under the planets.
+                               for (int j = 1; j < planets[i].length; j++) {
+                                       final String moon = (String) planets[i][j];
+
+                                       // Add the item as a regular item.
+                                       tree.addItem(moon);
+
+                                       // Set it to be a child.
+                                       tree.setParent(moon, planet);
+
+                                       // Make the moons look like leaves.
+                                       tree.setChildrenAllowed(moon, false);
+                               }
+
+                               // Expand the subtree.
+                               tree.expandItemsRecursively(planet);
+                       }
+               }
+
+               // Horizontal layout with the tree on the left and a details panel on
+               // the right.
+               final HorizontalLayout horlayout = new HorizontalLayout();
+               horlayout.addStyleName("treeexample");
+               horlayout.setSizeFull();
+
+               final Panel treepanel = new Panel("The Planets and Major Moons");
+               treepanel.addComponent(tree);
+               horlayout.addComponent(treepanel);
+
+               final Panel detailspanel = new Panel("Details");
+               horlayout.addComponent(detailspanel);
+               horlayout.setExpandRatio(detailspanel, 1);
+
+               final VerticalLayout detailslayout = new VerticalLayout();
+               detailspanel.setLayout(detailslayout);
+
+               // Allow null selection - this is the default actually.
+               tree.setNullSelectionAllowed(true);
+
+               // When a tree item (planet or moon) is clicked, open the item in
+               // Details view.
+               tree.setImmediate(true);
+               tree.addListener(new ValueChangeListener() {
+                       String lastselected = null;
+
+                       public void valueChange(ValueChangeEvent event) {
+                               String planet = (String) tree.getValue();
+
+                               // Reselect a selected item if it is unselected by clicking it.
+                               if (planet == null) {
+                                       planet = lastselected;
+                                       tree.setValue(planet);
+                               }
+                               lastselected = planet;
+
+                               detailspanel.setCaption("Details on " + planet);
+                               detailslayout.removeAllComponents();
+
+                               // Put some stuff in the Details view.
+                               detailslayout.addComponent(new Label("Where is the cat?"));
+                               detailslayout.addComponent(new Label("The cat is in " + planet
+                                               + "."));
+
+                       }
+               });
+
+               main.setLayout(horlayout);
+       }
+
+       void example_Select(Window main, String param) {
+               final HorizontalLayout layout = new HorizontalLayout();
+               layout.addStyleName("aligntop");
+
+               if (param.equals("twincol")) {
+                       final SelectExample select1 = new SelectExample(this, param,
+                                       "Select some items", true);
+                       layout.addComponent(select1);
+               } else if (param.equals("filter")) {
+                       final SelectExample select1 = new SelectExample(this, param,
+                                       "Enter containing substring", false);
+                       layout.addComponent(select1);
+               } else {
+                       final SelectExample select1 = new SelectExample(this, param,
+                                       "Single Selection Mode", false);
+                       final SelectExample select2 = new SelectExample(this, param,
+                                       "Multiple Selection Mode", true);
+                       layout.addComponent(select1);
+                       layout.addComponent(select2);
+               }
+               main.addComponent(layout);
+       }
+
+       void example_FilterSelect(Window main, String param) {
+               final Select select = new Select("Enter containing substring");
+               main.addComponent(select);
+
+               select
+                               .setFilteringMode(AbstractSelect.Filtering.FILTERINGMODE_CONTAINS);
+
+               /* Fill the component with some items. */
+               final String[] planets = new String[] { "Mercury", "Venus", "Earth",
+                               "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" };
+
+               for (int i = 0; i < planets.length; i++) {
+                       for (int j = 0; j < planets.length; j++) {
+                               select.addItem(planets[j] + " to " + planets[i]);
+                       }
+               }
+       }
+
+       void example_TextField(Window main, String param) {
+               /* Add a single-line text field. */
+               final TextField subject = new TextField("Subject");
+               subject.setColumns(40);
+               main.addComponent(subject);
+
+               /* Add a multi-line text field. */
+               final TextField message = new TextField("Message");
+               message.setRows(7);
+               message.setColumns(40);
+               main.addComponent(message);
+       }
+
+       void example_TextFieldValidation(Window main, String param) {
+               // Create a text field with a label
+               final TextField username = new TextField("Username");
+               main.addComponent(username);
+
+               // Set visible length to 16 characters
+               username.setColumns(16);
+
+               // Set content length to minimum of 6 and maximum of 16 characters.
+               // The string also may not be null.
+               username.addValidator(new StringLengthValidator(
+                               "Must be 6 to 16 characters long", 6, 16, false));
+
+               // Setting component immediate causes a ValueChangeEvent to occur
+               // when the TextField loses focus.
+               username.setImmediate(true);
+
+               // Listen for ValueChangeEvents and handle them
+               username.addListener(new ValueChangeListener() {
+                       public void valueChange(ValueChangeEvent event) {
+                               // Get the source of the event
+                               final TextField username = (TextField) (event.getProperty());
+
+                               try {
+                                       // Validate the field value.
+                                       username.validate();
+                               } catch (final Validator.InvalidValueException e) {
+                                       // The value was not ok. The error was set.
+                               }
+                       }
+               });
+       }
+
+       void example_UserError(final Window main, String param) {
+               if (param != null) {
+                       if (param.equals("form")) {
+
+                               final FormLayout layout = new FormLayout();
+                               main.addComponent(layout);
+
+                               final TextField textfield = new TextField("Enter code");
+                               layout.addComponent(textfield);
+                               textfield.setComponentError(null);
+
+                               final Button button = new Button("Ok!");
+                               layout.addComponent(button);
+
+                               button.addListener(new Button.ClickListener() {
+                                       public void buttonClick(ClickEvent event) {
+                                               if (((String) textfield.getValue()).length() == 0) {
+                                                       textfield.setComponentError(new UserError(
+                                                                       "Must be letters and numbers."));
+                                               } else {
+                                                       textfield.setComponentError(null);
+                                               }
+                                       }
+                               });
+                       }
+               } else {
+                       main.setLayout(new HorizontalLayout());
+
+                       // Create a field.
+                       final TextField textfield = new TextField("Enter code");
+                       main.addComponent(textfield);
+
+                       // Let the component error be initially clear. (It actually is by
+                       // default.)
+                       textfield.setComponentError(null);
+
+                       // Have a button right of the field (and align it properly).
+                       final Button button = new Button("Ok!");
+                       main.addComponent(button);
+                       ((HorizontalLayout) main.getLayout()).setComponentAlignment(button,
+                                       HorizontalLayout.ALIGNMENT_LEFT,
+                                       HorizontalLayout.ALIGNMENT_BOTTOM);
+
+                       // Handle button clicks
+                       button.addListener(new Button.ClickListener() {
+                               public void buttonClick(ClickEvent event) {
+                                       // If the field value is bad, set its error.
+                                       // (Here the content must be only alphanumeric characters.)
+                                       if (!((String) textfield.getValue()).matches("^\\w*$")) {
+                                               // Put the component in error state and set the error
+                                               // message.
+                                               textfield.setComponentError(new UserError(
+                                                               "Must be letters and numbers"));
+                                       } else {
+                                               // Otherwise clear it.
+                                               textfield.setComponentError(null);
+                                       }
+                               }
+                       });
+               }
+       }
+
+       void example_DateField(Window main, String param) {
+               HorizontalLayout layout = new HorizontalLayout();
+
+               /* Create a DateField with the calendar style. */
+               final DateField popupdate = new PopupDateField("Popup calendar field");
+
+               /* Set resolution of the date/time display. */
+               popupdate.setResolution(DateField.RESOLUTION_MIN);
+
+               /* Set the date and time to present. */
+               popupdate.setValue(new java.util.Date());
+
+               /* Create a DateField with the calendar style. */
+               final DateField inlinedate = new InlineDateField(
+                               "Inline calendar field");
+
+               /* Set locale of the DateField to American English. */
+               inlinedate.setLocale(new Locale("en", "US"));
+
+               /* Set the date and time to present. */
+               inlinedate.setValue(new java.util.Date());
+
+               /* Set resolution of the date/time display. */
+               inlinedate.setResolution(DateField.RESOLUTION_MIN);
+
+               layout.addComponent(popupdate);
+               layout.addComponent(inlinedate);
+               layout.setSpacing(true);
+               main.addComponent(layout);
+       }
+
+       void example_Validator(Window main, String param) {
+               if (param != null && param.equals("required")) {
+                       Form form = new Form();
+                       form.setCaption("My Form");
+                       form.setRequired(true);
+                       main.addComponent(form);
+
+                       TextField text = new TextField("This is a required text field");
+                       text.setRequired(true);
+                       text.setImmediate(true);
+                       form.getLayout().addComponent(text);
+                       return;
+               }
+               main.addComponent(new SSNField());
+       }
+
+       class PagingTable extends Table {
+               @Override
+               public String getTag() {
+                       return "pagingtable";
+               }
+       }
+
+       void example_Table(Window main, String param) {
+               if (param != null) {
+                       if (param.equals("select")) {
+                               main.addComponent(new TableExample2());
+                       } else if (param.equals("component")) {
+                               main.addComponent(new TableExample3());
+                       } else if (param.equals("editable")) {
+                               main.addComponent(new TableEditable());
+                       } else if (param.equals("bean")) {
+                               main.addComponent(new TableEditableBean());
+                       } else if (param.equals("long")) {
+                               main.addComponent(new TableExample());
+                       } else if (param.equals("cellstyle")) {
+                               main.addComponent(new TableCellStyle());
+                       } else if (param.equals("huge")) {
+                               main.addComponent(new TableHuge());
+                       } else if (param.equals("paging")) {
+                               PagingTable table = new PagingTable();
+                               table.addContainerProperty("Column 1", String.class, null);
+                               for (int i = 0; i < 100; i++) {
+                                       table.addItem(new Object[] { "Item " + i }, new Integer(i));
+                               }
+                               main.addComponent(table);
+                       }
+               } else {
+                       main.addComponent(new TableExample1());
+               }
+       }
+
+       void example_Upload(Window main, String param) {
+               main.addComponent(new MyUploader());
+       }
+
+       void example_Link(Window main, String param) {
+
+               /* Create a link that opens the popup window. */
+               final Link alink = new Link();
+
+               /* Set the resource to be opened in the window. */
+               alink.setResource(new ExternalResource("http://www.itmill.com/"));
+
+               main.addComponent(alink);
+
+               final ClassResource mydocument = new ClassResource("mydocument.pdf",
+                               this);
+               main.addComponent(new Link("The document (pdf)", mydocument));
+               main.addComponent(new Link("link to a resource", new ExternalResource(
+                               "http://www.itmill.com/")));
+       }
+
+       void example_Button(Window main, String param) {
+               if (param != null) {
+                       if (param.equals("buttons")) {
+                               main.addComponent(new TheButton());
+                       }
+                       return;
+               }
+
+               // butts1 = new TheButton ();
+               // main.addComponent(butts1);
+
+               // butts2 = new TheButtons (main);
+               // butts3 = new TheButtons2 (main);
+
+               // Button checkbox = new Button ("This is a checkbox");
+
+               // main.addComponent(checkbox);
+               final Button button = new Button("My Button");
+               main.addComponent(button);
+       }
+
+       void example_CheckBox(Window main, String param) {
+               /* A check box with default state (not checked, i.e., false). */
+               final CheckBox checkbox1 = new CheckBox("My CheckBox");
+               checkbox1.addStyleName("mybox");
+               main.addComponent(checkbox1);
+
+               /* Another check box with explicitly set checked state. */
+               final CheckBox checkbox2 = new CheckBox("Checked CheckBox");
+               /*
+                * @TODO: Build fails here, why? checkbox2.setValue(true);
+                */
+               main.addComponent(checkbox2);
+
+               /*
+                * Make some application logic. We use anynymous listener classes here.
+                * The above references were defined as "final" to allow accessing them
+                * from inside anonymous classes.
+                */
+               checkbox1.addListener(new ValueChangeListener() {
+                       public void valueChange(ValueChangeEvent event) {
+                               /* Copy the value to the other checkbox. */
+                               checkbox2.setValue(checkbox1.getValue());
+                       }
+               });
+               checkbox2.addListener(new ValueChangeListener() {
+                       public void valueChange(ValueChangeEvent event) {
+                               /* Copy the value to the other checkbox. */
+                               checkbox1.setValue(checkbox2.getValue());
+                       }
+               });
+       }
+
+       void example_Panel(Window main, String param) {
+               // Create a panel with a caption.
+               final Panel panel = new Panel("Contact Information");
+
+               // Create a layout inside the panel
+               final FormLayout form = new FormLayout();
+
+               // Set the layout as the root layout of the panel
+               panel.setLayout(form);
+
+               // Add some components
+               form.addComponent(new TextField("Name"));
+               form.addComponent(new TextField("Email"));
+
+               // Add the panel to the main window
+               final ClassResource icon = new ClassResource("smiley.jpg", main
+                               .getApplication());
+               form.addComponent(new Embedded("Image", icon));
+               panel.setIcon(icon);
+               panel.addComponent(form);
+               main.addComponent(panel);
+       }
+
+       void example_GridLayout(Window main, String param) {
+               if (param.equals("embedded")) {
+                       final GridLayout grid = new GridLayout(3, 3);
+                       for (int i = 0; i < 3 * 3; i++) {
+                               ClassResource img = new ClassResource("smiley.jpg", main
+                                               .getApplication());
+                               Embedded embedded = new Embedded("", img);
+                               grid.addComponent(embedded);
+                       }
+                       main.addComponent(grid);
+                       return;
+               }
+               /* Create a 4 by 4 grid layout. */
+               final GridLayout grid = new GridLayout(4, 4);
+               grid.addStyleName("example-gridlayout");
+
+               /* Fill out the first row using the cursor. */
+               grid.addComponent(new Button("R/C 1"));
+               for (int i = 0; i < 3; i++) {
+                       grid.addComponent(new Button("Col " + (grid.getCursorX() + 1)));
+               }
+
+               /* Fill out the first column using coordinates. */
+               for (int i = 1; i < 4; i++) {
+                       grid.addComponent(new Button("Row " + i), 0, i);
+               }
+
+               /* Add some components of various shapes. */
+               grid.addComponent(new Button("3x1 button"), 1, 1, 3, 1);
+               grid.addComponent(new Label("1x2 cell"), 1, 2, 1, 3);
+               final InlineDateField date = new InlineDateField("A 2x2 date field");
+               date.setResolution(DateField.RESOLUTION_DAY);
+               grid.addComponent(date, 2, 2, 3, 3);
+
+               main.addComponent(grid);
+       }
+
+       void example_Alignment(Window main, String param) {
+               if (param.equals("grid")) {
+                       /* Create a 3 by 3 grid layout. */
+                       final GridLayout layout = new GridLayout(3, 3);
+                       // OrderedLayout layout = new
+                       // OrderedLayout(OrderedLayout.ORIENTATION_VERTICAL);
+                       main.setLayout(layout);
+                       layout.addStyleName("example-alignment");
+
+                       layout.setWidth(400, Sizeable.UNITS_PIXELS);
+                       layout.setHeight(400, Sizeable.UNITS_PIXELS);
+
+                       /* Define cells and their layouts to create. */
+
+                       Object cells[][] = {
+                                       { new Button("Top Left"),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_LEFT),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_TOP) },
+                                       {
+                                                       new Label("Top Center"),
+                                                       new Integer(
+                                                                       AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_TOP) },
+                                       { new Label("Top Right"),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_RIGHT),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_TOP) },
+                                       {
+                                                       new Button("Center Left"),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_LEFT),
+                                                       new Integer(
+                                                                       AlignmentHandler.ALIGNMENT_VERTICAL_CENTER) },
+                                       {
+                                                       new Button("Center Center"),
+                                                       new Integer(
+                                                                       AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER),
+                                                       new Integer(
+                                                                       AlignmentHandler.ALIGNMENT_VERTICAL_CENTER) },
+                                       {
+                                                       new Button("Center Right"),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_RIGHT),
+                                                       new Integer(
+                                                                       AlignmentHandler.ALIGNMENT_VERTICAL_CENTER) },
+                                       { new Button("Bottom Left"),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_LEFT),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_BOTTOM) },
+                                       {
+                                                       new Button("Bottom Center"),
+                                                       new Integer(
+                                                                       AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_BOTTOM) },
+                                       { new Button("Bottom Right"),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_RIGHT),
+                                                       new Integer(AlignmentHandler.ALIGNMENT_BOTTOM) } };
+
+                       for (int i = 0; i < 9; i++) {
+                               HorizontalLayout celllayout = new HorizontalLayout();
+                               celllayout.addComponent((Component) cells[i][0]);
+                               if (i == 0) {
+                                       celllayout.setExpandRatio((Component) cells[i][0], 1);
+                               }
+
+                               celllayout.setComponentAlignment((Component) cells[i][0],
+                                               ((Integer) cells[i][1]).intValue(),
+                                               ((Integer) cells[i][2]).intValue());
+                               layout.addComponent(celllayout);
+                               // layout.setComponentAlignment((Component)cells[i][0],
+                               // ((Integer)cells[i][1]).intValue(),
+                               // ((Integer)cells[i][2]).intValue());
+                       }
+               } else {
+                       final Panel panel = new Panel("A Panel with a Layout");
+                       main.addComponent(panel);
+
+                       // panel.addComponent(new )
+               }
+       }
+
+       void example_OrderedLayout(Window main, String param) {
+               final VerticalLayout layout = new VerticalLayout();
+               layout.addComponent(new TextField("Name"));
+               layout.addComponent(new TextField("Street address"));
+               layout.addComponent(new TextField("Postal code"));
+               main.addComponent(layout);
+       }
+
+       void example_FormLayout(Window main, String param) {
+               final FormLayout layout = new FormLayout();
+               layout.addComponent(new TextField("Text Field"));
+               layout.addComponent(new CheckBox("Check Box"));
+               layout.addComponent(new Select("Select"));
+               main.addComponent(layout);
+       }
+
+       void example_Form(Window main, String param) {
+               if (param != null && param.equals("simple")) {
+                       main.addComponent(new FormExample2());
+               } else if (param != null && param.equals("layout")) {
+                       Form form = new Form();
+                       form.setCaption("Form Caption");
+                       form
+                                       .setDescription("This is a description of the Form that is "
+                                                       + "displayed in the upper part of the form. You normally enter some "
+                                                       + "descriptive text about the form and its use here.");
+
+                       // Add a field directly to the layout. This field will not be bound
+                       // to
+                       // the data source Item of the form.
+                       form.getLayout().addComponent(new TextField("A Field"));
+
+                       // Add a field and bind it to an named item property.
+                       form.addField("another", new TextField("Another Field"));
+
+                       form.setComponentError(new UserError(
+                                       "This is the error indicator of the Form."));
+
+                       // Set the footer layout and add some text.
+                       form.setFooter(new VerticalLayout());
+                       form
+                                       .getFooter()
+                                       .addComponent(
+                                                       new Label(
+                                                                       "This is the footer area of the Form. "
+                                                                                       + "You can use any layout here. This is nice for buttons."));
+
+                       // Add an Ok (commit), Reset (discard), and Cancel buttons for the
+                       // form.
+                       HorizontalLayout okbar = new HorizontalLayout();
+                       okbar.setHeight("25px");
+                       Button okbutton = new Button("OK", form, "commit");
+                       okbar.addComponent(okbutton);
+                       okbar.setExpandRatio(okbutton, 1);
+                       okbar.setComponentAlignment(okbutton,
+                                       AlignmentHandler.ALIGNMENT_RIGHT,
+                                       AlignmentHandler.ALIGNMENT_TOP);
+                       okbar.addComponent(new Button("Reset", form, "discard"));
+                       okbar.addComponent(new Button("Cancel"));
+                       form.getFooter().addComponent(okbar);
+
+                       main.addComponent(form);
+               } else {
+                       main.addComponent(new FormExample());
+               }
+       }
+
+       void example_ExpandLayout(Window main, String param) {
+               if (param != null && param.equals("centered")) {
+                       Label widget = new Label("Here is text");
+
+                       HorizontalLayout layout = new HorizontalLayout();
+                       layout.addComponent(widget);
+                       layout.setExpandRatio(widget, 1);
+                       layout.setComponentAlignment(widget,
+                                       AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
+                                       AlignmentHandler.ALIGNMENT_VERTICAL_CENTER);
+                       layout.setWidth(100, Sizeable.UNITS_PERCENTAGE);
+                       layout.setHeight(100, Sizeable.UNITS_PERCENTAGE);
+
+                       main.setLayout(layout);
+
+                       return;
+               } else if (param != null && param.equals("window")) {
+                       Window window = new Window("Progress");
+                       window.setHeight(100, Sizeable.UNITS_PIXELS);
+                       window.setWidth(200, Sizeable.UNITS_PIXELS);
+                       main.addWindow(window);
+
+                       ProgressIndicator progress = new ProgressIndicator(new Float(0.4));
+                       progress.addStyleName("fullwidth");
+                       progress.setPollingInterval(1000000);
+                       progress.setIndeterminate(false);
+
+                       HorizontalLayout layout = new HorizontalLayout();
+                       layout.setHeight(100, Sizeable.UNITS_PERCENTAGE);
+                       layout.setComponentAlignment(progress,
+                                       HorizontalLayout.ALIGNMENT_HORIZONTAL_CENTER,
+                                       HorizontalLayout.ALIGNMENT_VERTICAL_CENTER);
+                       window.setLayout(layout);
+                       window.addComponent(progress);
+
+                       return;
+               } else if (param != null && param.equals("root")) {
+                       final Window mainwin = main;
+
+                       // Layout to switch to
+                       final VerticalLayout expand2 = new VerticalLayout();
+                       expand2.addComponent(new Label("I am layout too."));
+
+                       // Original layout
+                       final VerticalLayout expand1 = new VerticalLayout();
+                       Button switchButton = new Button("Switch to other layout");
+                       switchButton.addListener(new Button.ClickListener() {
+                               public void buttonClick(ClickEvent event) {
+                                       mainwin.setLayout(null);
+                                       mainwin.setLayout(expand2);
+                               }
+                       });
+                       expand1.addComponent(switchButton);
+                       main.setLayout(expand1);
+
+                       return;
+               } else if (param != null && param.equals("size")) {
+                       VerticalLayout layout = new VerticalLayout();
+                       layout.setSizeFull();
+                       main.setLayout(layout);
+
+                       Button button = new Button("This is a button in middle of nowhere");
+                       layout.addComponent(button);
+                       layout.setComponentAlignment(button,
+                                       VerticalLayout.ALIGNMENT_HORIZONTAL_CENTER,
+                                       VerticalLayout.ALIGNMENT_VERTICAL_CENTER);
+                       layout.setExpandRatio(button, 1.0f);
+                       return;
+               }
+
+               for (int w = 0; w < 2; w++) {
+                       final VerticalLayout layout = new VerticalLayout();
+
+                       /* Set the expanding layout as the root layout of a child window. */
+                       final Window window = new Window("A Child Window", layout);
+                       main.addWindow(window);
+
+                       /* Add some component above the expanding one. */
+                       layout.addComponent(new Label("Here be some component."));
+
+                       /* Create the expanding component. */
+                       final Table table = new Table("My Ever-Expanding Table");
+                       /*
+                        * FIXME Java 5 -> 1.4 for (int i=0; i<5; i++)
+                        * table.addContainerProperty("col "+(i+1), Integer.class, 0); for
+                        * (int j=0; j<20; j++) table.addItem(new Object[]{1j,2j,3j,4j,5j},
+                        * j);
+                        */
+                       layout.addComponent(table);
+
+                       /* Designate the table to be the expanding component. */
+                       layout.setExpandRatio(table, 1.0f);
+
+                       /* Set it to use all available area. */
+                       table.setSizeFull();
+
+                       /* Add some component below the expanding one. */
+                       final Button button2 = new Button("Ok");
+                       layout.addComponent(button2);
+                       layout.setComponentAlignment(button2,
+                                       AlignmentHandler.ALIGNMENT_RIGHT, 0);
+               }
+       }
+
+       void example_TabSheet(Window main, String param) {
+               if (param.equals("icon")) {
+                       final TabSheet tabsheet = new TabSheet();
+
+                       tabsheet.addTab(new Label("Contents of the first tab"),
+                                       "First Tab", new ClassResource("images/Mercury_small.png",
+                                                       main.getApplication()));
+                       tabsheet.addTab(new Label("Contents of the second tab"),
+                                       "Second Tab", new ClassResource("images/Venus_small.png",
+                                                       this));
+                       tabsheet.addTab(new Label("Contents of the third tab"),
+                                       "Third tab", new ClassResource("images/Earth_small.png",
+                                                       this));
+
+                       main.addComponent(tabsheet);
+                       // main.addComponent(new Embedded("Emb", new ClassResource
+                       // ("images/Mercury_small.png", this)));
+               } else if (param.equals("expanding")) {
+                       // Create the layout
+                       VerticalLayout expanding = new VerticalLayout();
+
+                       // It is important to set the expanding layout as the root layout
+                       // of the containing window, in this case the main window, and not
+                       // use addComponent(), which would place the layout inside the
+                       // default root layout.
+                       main.setLayout(expanding);
+
+                       // Create a tab sheet that fills the expanding layout
+                       final TabSheet tabsheet = new TabSheet();
+                       tabsheet.addTab(new Label("Contents of the first tab"),
+                                       "First Tab", null);
+                       tabsheet.addTab(new Label("Contents of the second tab"),
+                                       "Second Tab", null);
+                       tabsheet.addTab(new Label("Contents of the third tab"),
+                                       "Third tab", null);
+
+                       // Set the tabsheet to scale to full size inside its container
+                       tabsheet.setWidth(100, Sizeable.UNITS_PERCENTAGE);
+                       tabsheet.setHeight(100, Sizeable.UNITS_PERCENTAGE);
+
+                       // Add the tab sheet to the layout as usual
+                       expanding.addComponent(tabsheet);
+
+                       // Set the tab sheet to be the expanding component
+                       expanding.setExpandRatio(tabsheet, 1);
+               } else if (param.equals("ordered")) {
+                       // Create the layout
+                       VerticalLayout layout = new VerticalLayout();
+
+                       // It is important to set the expanding layout as the root layout
+                       // of the containing window, in this case the main window, and not
+                       // use addComponent(), which would place the layout inside the
+                       // default root layout.
+                       main.setLayout(layout);
+
+                       // Create a tab sheet that fills the expanding layout
+                       final TabSheet tabsheet = new TabSheet();
+                       tabsheet.addTab(new Label("Contents of the first tab"),
+                                       "First Tab", null);
+                       tabsheet.addTab(new Label("Contents of the second tab"),
+                                       "Second Tab", null);
+                       tabsheet.addTab(new Label("Contents of the third tab"),
+                                       "Third tab", null);
+
+                       // Set the tabsheet to scale to full size inside its container
+                       tabsheet.setWidth(100, Sizeable.UNITS_PERCENTAGE);
+                       // tabsheet().setHeight(100, Sizeable.UNITS_PERCENTAGE);
+
+                       // Add the tab sheet to the layout as usual
+                       layout.addComponent(tabsheet);
+               } else {
+                       main.addComponent(new TabSheetExample());
+               }
+       }
+
+       void example_Embedded(Window main, String param) {
+               final Embedded image = new Embedded("", new ClassResource("smiley.jpg",
+                               this));
+               image.addStyleName("omaimage");
+               main.addComponent(image);
+
+               final EmbeddedButton button = new EmbeddedButton(new ClassResource(
+                               "smiley.jpg", this));
+               main.addComponent(button);
+       }
+
+       void example_Window(Window main, String param) {
+               if (param != null) {
+                       if (param.equals("opener")) {
+                               main.addComponent(new WindowOpener("Window Opener", main));
+                       } else if (param.equals("multiple")) {
+                               /* Create a new window. */
+                               final Window mywindow = new Window("Second Window");
+                               mywindow.setName("mywindow");
+                               mywindow.addComponent(new Label("This is a second window."));
+
+                               /* Add the window to the application. */
+                               main.getApplication().addWindow(mywindow);
+
+                               /* Add link to the second window in the main window. */
+                               main.addComponent(new Label("Second window: <a href='"
+                                               + mywindow.getURL() + "'>middle-click to open</a>",
+                                               Label.CONTENT_XHTML));
+                               main.addComponent(new Label(
+                                               "The second window can be accessed through URL: "
+                                                               + mywindow.getURL()));
+                       }
+                       return;
+               }
+
+               /* Create a new window. */
+               final Window mywindow = new Window("My Window");
+               mywindow.setName("mywindow");
+
+               /* Add some components in the window. */
+               mywindow.addComponent(new Label("A text label in the window."));
+               final Button okbutton = new Button("OK");
+               mywindow.addComponent(okbutton);
+
+               /* Set window size. */
+               mywindow.setHeight("200px");
+               mywindow.setWidth("400px");
+
+               /* Set window position. */
+               mywindow.setPositionX(200);
+               mywindow.setPositionY(50);
+
+               /* Add the window to the Application object. */
+               main.addWindow(mywindow);
+
+       }
+
+       void example_ClassResource(Window main, String param) {
+               final DateField df = new DateField();
+               main.addComponent(df);
+               df.setIcon(new ClassResource("smiley.jpg", main.getApplication()));
+               main.addComponent(new Embedded("This is Embedded", new ClassResource(
+                               "smiley.jpg", main.getApplication())));
+       }
+
+       void example_ProgressIndicator(final Window main, String param) {
+               if (param != null) {
+                       if (param.equals("thread")) {
+
+                               // Create the indicator
+                               final ProgressIndicator indicator = new ProgressIndicator(
+                                               new Float(0.0));
+                               main.addComponent(indicator);
+
+                               // Set polling frequency to 0.5 seconds.
+                               indicator.setPollingInterval(1000);
+
+                               // indicator.addStyleName("invisible");
+                               final Label text = new Label("-- Not running --");
+                               main.addComponent(text);
+
+                               // Add a button to start the progress
+                               final Button button = new Button("Click to start");
+                               main.addComponent(button);
+
+                               // Another thread to do some work
+                               class WorkThread extends Thread {
+                                       @Override
+                                       public void run() {
+                                               double current = 0.0;
+                                               while (true) {
+                                                       // Do some "heavy work"
+                                                       try {
+                                                               sleep(50); // Sleep for 50 milliseconds
+                                                       } catch (InterruptedException e) {
+                                                       }
+
+                                                       // Grow the progress value until it reaches 1.0.
+                                                       current += 0.01;
+                                                       if (current > 1.0) {
+                                                               indicator.setValue(new Float(1.0));
+                                                       } else {
+                                                               indicator.setValue(new Float(current));
+                                                       }
+
+                                                       // After the progress is full for a while, stop.
+                                                       if (current > 1.2) {
+                                                               // Restore the state to initial.
+                                                               indicator.setValue(new Float(0.0));
+                                                               button.setVisible(true);
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Clicking the button creates and runs a work thread
+                               button.addListener(new Button.ClickListener() {
+                                       public void buttonClick(ClickEvent event) {
+                                               final WorkThread thread = new WorkThread();
+                                               thread.start();
+
+                                               // The button hides until the work is done.
+                                               button.setVisible(false);
+                                       }
+                               });
+                       } else if (param.equals("window")) {
+                               // Create a table in the main window to hold items added in the
+                               // second window
+                               final Table table = new Table();
+                               table.setPageLength(5);
+                               table.setWidth(100, Sizeable.UNITS_PERCENTAGE);
+                               table.addContainerProperty("Name", String.class, "");
+                               main.addComponent(table);
+
+                               // Create the second window
+                               final Window adderWindow = new Window("Add Items");
+                               adderWindow.setName("win-adder");
+                               main.getApplication().addWindow(adderWindow);
+
+                               // Create selection component to add items to the table
+                               final NativeSelect select = new NativeSelect(
+                                               "Select item to add");
+                               select.setImmediate(true);
+                               adderWindow.addComponent(select);
+
+                               // Add some items to the selection
+                               String items[] = new String[] { "-- Select --", "Mercury",
+                                               "Venus", "Earth", "Mars", "Jupiter", "Saturn",
+                                               "Uranus", "Neptune" };
+                               for (int i = 0; i < items.length; i++) {
+                                       select.addItem(items[i]);
+                               }
+                               select.setNullSelectionItemId(items[0]);
+
+                               // When an item is selected in the second window, add
+                               // table in the main window
+                               select.addListener(new ValueChangeListener() {
+                                       public void valueChange(ValueChangeEvent event) {
+                                               // If the selected value is something else but null
+                                               // selection item.
+                                               if (select.getValue() != null) {
+                                                       // Add the selected item to the table in the main
+                                                       // window
+                                                       table.addItem(new Object[] { select.getValue() },
+                                                                       new Integer(table.size()));
+                                               }
+                                       }
+                               });
+
+                               // Link to open the selection window
+                               Link link = new Link("Click to open second window",
+                                               new ExternalResource(adderWindow.getURL()), "_new", 50,
+                                               200, Link.TARGET_BORDER_DEFAULT);
+                               main.addComponent(link);
+
+                               // Enable polling to update the main window
+                               ProgressIndicator poller = new ProgressIndicator();
+                               poller.addStyleName("invisible");
+                               main.addComponent(poller);
+                       } else if (param.equals("centered")) {
+                               /*
+                                * GridLayout grid = new GridLayout(3,3); main.setLayout(grid);
+                                * grid().setWidth(100, Sizeable.UNITS_PERCENTAGE);
+                                * 
+                                * ExpandLayout layout2 = new
+                                * ExpandLayout(OrderedLayout.ORIENTATION_HORIZONTAL);
+                                * layout2().setWidth(50, Sizeable.UNITS_PERCENTAGE);
+                                * 
+                                * ProgressIndicator poller = new ProgressIndicator(new
+                                * Float(0.4)); poller.setPollingInterval(1000000);
+                                * poller.setIndeterminate(false); layout2.addComponent(poller);
+                                * 
+                                * grid.addComponent(layout2, 1, 1);
+                                */
+
+                               // ExpandLayout layout2 = new
+                               // ExpandLayout(OrderedLayout.ORIENTATION_HORIZONTAL);
+                               /*
+                                * ProgressIndicator poller = new ProgressIndicator(new
+                                * Float(0.4)); poller.setPollingInterval(1000000);
+                                * poller.setIndeterminate(false);
+                                */
+                               /*
+                                * layout2.addComponent(poller); layout2().setWidth(50,
+                                * Sizeable.UNITS_PERCENTAGE);
+                                */
+
+                               // layout.setComponentAlignment(poller,
+                               // AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
+                               // AlignmentHandler.ALIGNMENT_VERTICAL_CENTER);
+                               /*
+                                * GridLayout grid = new GridLayout(1,1);
+                                * grid.addComponent(layout2, 0, 0); grid().setWidth(100,
+                                * Sizeable.UNITS_PERCENTAGE);
+                                */
+
+                               /*
+                                * GridLayout layout = new GridLayout(1,1);
+                                * //OrderedLayout.ORIENTATION_HORIZONTAL);
+                                * layout.addComponent(poller); //layout.expand(poller);
+                                * layout.setComponentAlignment(poller,
+                                * AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
+                                * AlignmentHandler.ALIGNMENT_VERTICAL_CENTER);
+                                * layout().setWidth(100, Sizeable.UNITS_PERCENTAGE);
+                                * layout().setHeight(100, Sizeable.UNITS_PERCENTAGE);
+                                */
+
+                       }
+               } else {
+                       ProgressIndicator poller = new ProgressIndicator(new Float(0.0));
+                       poller.setPollingInterval(1000000);
+                       poller.setIndeterminate(true);
+                       main.addComponent(poller);
+               }
+       }
+
+       void example_CustomLayout(final Window main, String param) {
+               Window sub = new Window("Login");
+               sub.setModal(true);
+               main.addWindow(sub);
+
+               // Create the custom layout and set it as the root layout of
+               // the containing window.
+               final CustomLayout custom = new CustomLayout("layoutname");
+               sub.setLayout(custom);
+
+               // Create components and bind them to the location tags
+               // in the custom layout.
+               TextField username = new TextField();
+               custom.addComponent(username, "username");
+
+               TextField password = new TextField();
+               custom.addComponent(password, "password");
+
+               final Button ok = new Button("Login");
+               custom.addComponent(ok, "okbutton");
+
+               final Button deny = new Button("No can do!");
+
+               Button.ClickListener listener = new Button.ClickListener() {
+                       public void buttonClick(ClickEvent event) {
+                               // Switch between ok and deny
+                               if (custom.getComponent("okbutton") == ok) {
+                                       System.out.println("Changing to deny button.");
+                                       custom.addComponent(deny, "okbutton");
+                               } else {
+                                       System.out.println("Changing to ok button.");
+                                       custom.addComponent(ok, "okbutton");
+                               }
+                       }
+               };
+
+               ok.addListener(listener);
+               deny.addListener(listener);
+       }
+
+       void example_Spacing(final Window main, String param) {
+               VerticalLayout containinglayout = new VerticalLayout();
+               main.setLayout(containinglayout);
+
+               GridLayout grid = new GridLayout(4, 3);
+               grid.addStyleName("spacingexample");
+               containinglayout.addComponent(grid);
+               grid.addComponent(new Label(""), 0, 0);
+               grid.addComponent(new Label(""), 1, 0);
+
+               grid.addComponent(new Label("No spacing:"), 0, 1);
+               HorizontalLayout layout1 = new HorizontalLayout();
+               grid.addComponent(layout1, 1, 1);
+               layout1.addStyleName("spacingexample");
+               layout1.addComponent(new Button("Component 1"));
+               layout1.addComponent(new Button("Component 2"));
+               layout1.addComponent(new Button("Component 3"));
+
+               grid.addComponent(new Label("Horizontal spacing:"), 0, 2);
+               HorizontalLayout layout2 = new HorizontalLayout();
+               grid.addComponent(layout2, 1, 2);
+               layout2.addStyleName("spacingexample");
+               layout2.setSpacing(true);
+               layout2.addComponent(new Button("Component 1"));
+               layout2.addComponent(new Button("Component 2"));
+               layout2.addComponent(new Button("Component 3"));
+
+               grid.addComponent(new Label("No spacing:"), 2, 0);
+               VerticalLayout layout3 = new VerticalLayout();
+               grid.addComponent(layout3, 2, 1, 2, 2);
+               layout3.addStyleName("spacingexample");
+               layout3.addComponent(new Button("Component 1"));
+               layout3.addComponent(new Button("Component 2"));
+               layout3.addComponent(new Button("Component 3"));
+
+               grid.addComponent(new Label("Vertical spacing:"), 3, 0);
+               VerticalLayout layout4 = new VerticalLayout();
+               grid.addComponent(layout4, 3, 1, 3, 2);
+               layout4.addStyleName("spacingexample");
+               layout4.setSpacing(true);
+               layout4.addComponent(new Button("Component 1"));
+               layout4.addComponent(new Button("Component 2"));
+               layout4.addComponent(new Button("Component 3"));
+       }
+
+       void example_Margin(final Window main, String param) {
+               HorizontalLayout hor = new HorizontalLayout();
+               main.setLayout(hor);
+
+               VerticalLayout containinglayout = new VerticalLayout();
+               hor.addComponent(containinglayout);
+
+               VerticalLayout layout1 = new VerticalLayout();
+               containinglayout.addComponent(new Label("Regular layout margins:"));
+               containinglayout.addComponent(layout1);
+               layout1.addStyleName("marginexample1");
+               layout1.addComponent(new Button("Component 1"));
+               layout1.addComponent(new Button("Component 2"));
+               layout1.addComponent(new Button("Component 3"));
+
+               // Create a layout
+               VerticalLayout layout2 = new VerticalLayout();
+               containinglayout.addComponent(new Label(
+                               "Layout with a special margin element:"));
+               containinglayout.addComponent(layout2);
+
+               // Set style name for the layout to allow styling it
+               layout2.addStyleName("marginexample2");
+
+               // Have margin on all sides around the layout
+               layout2.setMargin(true);
+
+               // Put something inside the layout
+               layout2.addComponent(new Button("Component 1"));
+               layout2.addComponent(new Button("Component 2"));
+               layout2.addComponent(new Button("Component 3"));
+       }
+
+       void example_ClientInfo(final Window main, String param) {
+               // Get the client identification string
+               WebApplicationContext context2 = (WebApplicationContext) getContext();
+               String browserApplication = context2.getBrowser()
+                               .getBrowserApplication();
+
+               // Add a browser-dependent style name for the main window
+               if (browserApplication.indexOf("Firefox/2") != -1) {
+                       main.addStyleName("firefox2");
+               }
+
+               // Display the client identification string
+               main.addComponent(new Label(browserApplication));
+       }
+
+       void example_FillInForm(final Window main, String param) {
+               if (param.equals("templates")) {
+                       // Create a custom layout from the fill-in-form.html template.
+                       CustomLayout fillinlayout = new CustomLayout("fill-in-form");
+
+                       // The style will set the display to be "inline".
+                       fillinlayout.addStyleName("fillinlayout");
+
+                       // Create the fields that occur in the text.
+                       TextField field1 = new TextField();
+                       TextField field2 = new TextField();
+                       fillinlayout.addComponent(field1, "q1");
+                       fillinlayout.addComponent(field2, "q2");
+
+                       main.addComponent(fillinlayout);
+               } else {
+                       String fillintext = "The <q1> is mightier than <q2>.";
+                       int pos = 0;
+                       while (pos < fillintext.length()) {
+                               int nexttag = fillintext.indexOf("<", pos);
+                               if (nexttag == -1) {
+
+                               }
+                       }
+               }
+       }
+
+       void example_Notification(final Window main, String param) {
+               // final Window sub1 = new Window("");
+               // main.addWindow(sub1);
+               if (param.equals("example")) {
+                       main.showNotification("This is the caption",
+                                       "This is the description");
+                       return;
+               } else if (param.equals("type")) {
+                       main.showNotification("This is a warning",
+                                       "<br/>This is the <i>last</i> warning",
+                                       Window.Notification.TYPE_WARNING_MESSAGE);
+                       return;
+               } else if (param.equals("pos")) {
+                       // Create a notification with the default settings for a warning.
+                       Window.Notification notif = new Window.Notification("Be warned!",
+                                       "This message lurks in the top-left corner!",
+                                       Window.Notification.TYPE_WARNING_MESSAGE);
+
+                       // Set the position.
+                       notif.setPosition(Window.Notification.POSITION_TOP_LEFT);
+
+                       // Let it stay there until the user clicks it
+                       notif.setDelayMsec(-1);
+
+                       // Show it in the main window.
+                       main.showNotification(notif);
+                       return;
+               }
+
+               main.setLayout(new HorizontalLayout());
+
+               final Integer type_humanized = Window.Notification.TYPE_HUMANIZED_MESSAGE;
+               final Integer type_warning = Window.Notification.TYPE_WARNING_MESSAGE;
+               final Integer type_error = Window.Notification.TYPE_ERROR_MESSAGE;
+               final Integer type_tray = Window.Notification.TYPE_TRAY_NOTIFICATION;
+               final NativeSelect types = new NativeSelect();
+               main.addComponent(types);
+               types.addItem(type_humanized);
+               types.addItem(type_warning);
+               types.addItem(type_error);
+               types.addItem(type_tray);
+               types.setItemCaption(type_humanized, "Humanized");
+               types.setItemCaption(type_warning, "Warning");
+               types.setItemCaption(type_error, "Error");
+               types.setItemCaption(type_tray, "Tray");
+
+               Button show = new Button("Show Notification");
+               main.addComponent(show);
+
+               show.addListener(new Button.ClickListener() {
+                       public void buttonClick(ClickEvent event) {
+                               String caption = "";
+                               String description = "";
+                               switch (((Integer) types.getValue()).intValue()) {
+                               case Window.Notification.TYPE_HUMANIZED_MESSAGE:
+                                       caption = "Humanized message";
+                                       description = "<br/>For minimal annoyance";
+                                       break;
+                               case Window.Notification.TYPE_WARNING_MESSAGE:
+                                       caption = "Warning message";
+                                       description = "<br/>For notifications of medium importance";
+                                       break;
+                               case Window.Notification.TYPE_ERROR_MESSAGE:
+                                       caption = "Error message";
+                                       description = "<br/>For important notifications";
+                                       break;
+                               case Window.Notification.TYPE_TRAY_NOTIFICATION:
+                                       caption = "Tray notification";
+                                       description = "<br/>Stays up longer - but away";
+                               }
+                               // main.showNotification("The default notification");
+                               Window.Notification notif = new Window.Notification(caption,
+                                               description, (Integer) types.getValue());
+                               // notif.setPosition(Window.Notification.POSITION_TOP_LEFT);
+                               notif.setDelayMsec(-1);
+                               main.showNotification(notif);
+                       }
+               });
+
+               // Notification notif = new Notification("Title");
+       }
+
+       void example_Print(final Window main, String param) {
+               if (param != null && param.equals("simple")) {
+                       main
+                                       .addComponent(new Label(
+                                                       "<input type='button' onClick='print()' value='Click to Print'/>",
+                                                       Label.CONTENT_XHTML));
+                       return;
+               }
+
+               // A button to open the printer-friendly page.
+               Button printButton = new Button("Click to Print");
+               main.addComponent(printButton);
+               printButton.addListener(new Button.ClickListener() {
+                       public void buttonClick(ClickEvent event) {
+                               // Create a window that contains stuff you want to print.
+                               Window printWindow = new Window("Window to Print");
+
+                               // Have some content to print.
+                               printWindow.addComponent(new Label(
+                                               "Here's some dynamic content."));
+
+                               // To execute the print() JavaScript, we need to run it
+                               // from a custom layout.
+                               CustomLayout scriptLayout = new CustomLayout("printpage");
+                               printWindow.addComponent(scriptLayout);
+
+                               // Add the printing window as an application-level window.
+                               main.getApplication().addWindow(printWindow);
+
+                               // Open the printing window as a new browser window
+                               main.open(new ExternalResource(printWindow.getURL()), "_new");
+                       }
+               });
+
+               // main.addComponent(new
+               // Label("<p>Print this!</p>\n<script type='text/javascript'>print();</script>",
+               // Label.CONTENT_XHTML));
+       }
+
+       void example_RichTextArea(final Window main, String param) {
+               main.setLayout(new HorizontalLayout());
+
+               // Create a rich text area
+               final RichTextArea rtarea = new RichTextArea();
+               rtarea.addStyleName("richtextexample");
+               // rtarea.setCaption("My Rich Text Area");
+
+               // Set initial content as HTML
+               rtarea
+                               .setValue("<h1>Hello</h1>\n<p>This rich text area contains some text.</p>");
+
+               // Show the text edited in the rich text area as HTML.
+               final Button show = new Button("Show HTML");
+               final Label html = new Label((String) rtarea.getValue());
+               show.addListener(new Button.ClickListener() {
+                       public void buttonClick(ClickEvent event) {
+                               html.setValue(rtarea.getValue());
+                       }
+               });
+
+               Panel rtPanel = new Panel("Rich Text Area");
+               rtPanel.addComponent(rtarea);
+               rtPanel.addComponent(show);
+
+               Panel valuePanel = new Panel("Value");
+               valuePanel.addComponent(html);
+
+               main.addComponent(rtPanel);
+               main.addComponent(valuePanel);
+       }
+
+       void example_QueryContainer(final Window main, String param) {
+               try {
+                       // Create a database connection
+                       Class.forName("org.hsqldb.jdbcDriver");
+                       final Connection connection = DriverManager.getConnection(
+                                       "jdbc:hsqldb:mem:qcexample", "sa", "");
+
+                       // Create an example table and put some data in it.
+                       Statement st = connection.createStatement();
+                       st
+                                       .executeQuery("CREATE TABLE Prisoners (id INTEGER, name VARCHAR)");
+                       st.close();
+                       for (int i = 0; i < 100; i++) {
+                               st = connection.createStatement();
+                               st.executeQuery("INSERT INTO Prisoners (id, name) VALUES (" + i
+                                               + ",'I am number " + (i + 1) + "')");
+                               st.close();
+                       }
+
+                       // Query the database
+                       final QueryContainer qc = new QueryContainer(
+                                       "SELECT id,name FROM Prisoners", connection);
+
+                       // Create a component for selecting a query result item.
+                       Select select = new Select("Select an item");
+
+                       // The items shown in the selection component are obtained from the
+                       // query.
+                       select.setContainerDataSource(qc);
+
+                       // The item captions are obtained from a field in the query result.
+                       select.setItemCaptionMode(Select.ITEM_CAPTION_MODE_PROPERTY);
+
+                       // Set the name of the field from which the item captions are
+                       // obtained.
+                       select.setItemCaptionPropertyId("name");
+
+                       // When selection changes, display the selected item.
+                       select.setImmediate(true);
+                       final Label selection = new Label("Currently selected: -");
+                       select.addListener(new ValueChangeListener() {
+                               public void valueChange(ValueChangeEvent event) {
+                                       // Get the item id of the currently selected item
+                                       Integer itemId = (Integer) event.getProperty().getValue();
+
+                                       // Use the item ID to get the actual row from the query
+                                       // result.
+                                       Item qrItem = qc.getItem(itemId);
+
+                                       // Display the item ID
+                                       selection.setValue("Currently selected: result row "
+                                                       + itemId.intValue() + " (id="
+                                                       + qrItem.getItemProperty("id") + ", " + "name="
+                                                       + qrItem.getItemProperty("name") + ")");
+                               }
+                       });
+
+                       main.addComponent(select);
+                       main.addComponent(selection);
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               } catch (ClassNotFoundException e) {
+                       e.printStackTrace();
+               }
+       }
+
+       void example_MenuBar(final Window main, String param) {
+               // Create a menu bar
+               final MenuBar menubar = new MenuBar();
+               main.addComponent(menubar);
+
+               // A feedback component
+               final Label selection = new Label("");
+               main.addComponent(selection);
+
+               // Define a common menu command for all the menu items.
+               MenuBar.Command mycommand = new MenuBar.Command() {
+                       public void menuSelected(MenuItem selectedItem) {
+                               selection.setValue("Ordered a " + selectedItem.getText()
+                                               + " from menu.");
+                       }
+               };
+
+               // Put some items in the menu hierarchically
+               MenuBar.MenuItem beverages = menubar.addItem("Beverages", null, null);
+               MenuBar.MenuItem hot_beverages = beverages.addItem("Hot", null, null);
+               hot_beverages.addItem("Tea", null, mycommand);
+               hot_beverages.addItem("Coffee", null, mycommand);
+               MenuBar.MenuItem cold_beverages = beverages.addItem("Cold", null, null);
+               cold_beverages.addItem("Milk", null, mycommand);
+
+               // Another top-level item
+               MenuBar.MenuItem snacks = menubar.addItem("Snacks", null, null);
+               snacks.addItem("Weisswurst", null, mycommand);
+               snacks.addItem("Salami", null, mycommand);
+
+               // Yet another top-level item
+               MenuBar.MenuItem services = menubar.addItem("Services", null, null);
+               services.addItem("Car Service", null, mycommand);
+       }
 }
index 012070d277b71aa23097e69bbcf8d4a129fde8e5..1f340ce4d52eedcb087c12839ac030518fee0e22 100644 (file)
@@ -10,94 +10,85 @@ import com.itmill.toolkit.event.Action.Handler;
 import com.itmill.toolkit.ui.Button;
 import com.itmill.toolkit.ui.CustomComponent;
 import com.itmill.toolkit.ui.FormLayout;
+import com.itmill.toolkit.ui.HorizontalLayout;
 import com.itmill.toolkit.ui.Label;
-import com.itmill.toolkit.ui.OrderedLayout;
 import com.itmill.toolkit.ui.Panel;
 import com.itmill.toolkit.ui.TextField;
-import com.itmill.toolkit.ui.Window;
 
 public class DefaultButtonExample extends CustomComponent implements Handler {
-    // Define and create user interface components
-    Panel panel = new Panel("Login");
-    OrderedLayout formlayout = new FormLayout();
-    TextField username = new TextField("Username");
-    TextField password = new TextField("Password");
-    OrderedLayout buttons = new FormLayout();
+       // Define and create user interface components
+       Panel panel = new Panel("Login");
+       FormLayout formlayout = new FormLayout();
+       TextField username = new TextField("Username");
+       TextField password = new TextField("Password");
+       HorizontalLayout buttons = new HorizontalLayout();
 
-    // Create buttons and define their listener methods. Here we use
-    // parameterless
-    // methods so that we can use same methods for both click events and
-    // keyboard actions.
-    Button ok = new Button("OK", this, "okHandler");
-    Button cancel = new Button("Cancel", this, "cancelHandler");
+       // Create buttons and define their listener methods.
+       Button ok = new Button("OK", this, "okHandler");
+       Button cancel = new Button("Cancel", this, "cancelHandler");
 
-    // Have the unmodified Enter key cause an event
-    Action action_ok = new ShortcutAction("Default key",
-            ShortcutAction.KeyCode.ENTER, null);
+       // Have the unmodified Enter key cause an event
+       Action action_ok = new ShortcutAction("Default key",
+                       ShortcutAction.KeyCode.ENTER, null);
 
-    // Have the C key modified with Alt cause an event
-    Action action_cancel = new ShortcutAction("Alt+C",
-            ShortcutAction.KeyCode.C,
-            new int[] { ShortcutAction.ModifierKey.ALT });
+       // Have the C key modified with Alt cause an event
+       Action action_cancel = new ShortcutAction("Alt+C",
+                       ShortcutAction.KeyCode.C,
+                       new int[] { ShortcutAction.ModifierKey.ALT });
 
-    Window window = null;
+       public DefaultButtonExample() {
+               // Set up the user interface
+               setCompositionRoot(panel);
+               panel.addComponent(formlayout);
+               formlayout.addComponent(username);
+               formlayout.addComponent(password);
+               formlayout.addComponent(buttons);
+               buttons.addComponent(ok);
+               buttons.addComponent(cancel);
 
-    public DefaultButtonExample(Window win) {
-        // Set up the user interface
-        setCompositionRoot(panel);
-        panel.addComponent(formlayout);
-        formlayout.setOrientation(OrderedLayout.ORIENTATION_VERTICAL);
-        formlayout.addComponent(username);
-        formlayout.addComponent(password);
-        formlayout.addComponent(buttons);
-        buttons.setOrientation(OrderedLayout.ORIENTATION_HORIZONTAL);
-        buttons.addComponent(ok);
-        buttons.addComponent(cancel);
+               // Set focus to username
+               username.focus();
 
-        // Set focus to username
-        username.focus();
+               // Set this object as the action handler
+               System.out.println("adding ah");
+               panel.addActionHandler(this);
 
-        // Set this object as the action handler
-        System.out.println("adding ah");
-        win.addActionHandler(this);
-        window = win;
+               System.out.println("start done.");
+       }
 
-        System.out.println("start done.");
-    }
+       /**
+        * Retrieve actions for a specific component. This method will be called for
+        * each object that has a handler; in this example just for login panel. The
+        * returned action list might as well be static list.
+        */
+       public Action[] getActions(Object target, Object sender) {
+               System.out.println("getActions()");
+               return new Action[] { action_ok, action_cancel };
+       }
 
-    /**
-     * Retrieve actions for a specific component. This method will be called for
-     * each object that has a handler; in this example the Ok and Cancel
-     * buttons.
-     */
-    public Action[] getActions(Object target, Object sender) {
-        System.out.println("getActions()");
-        return new Action[] { action_ok, action_cancel };
-    }
+       /**
+        * Handle actions received from keyboard. This simply directs the actions to
+        * the same listener methods that are called with ButtonClick events.
+        */
+       public void handleAction(Action action, Object sender, Object target) {
+               if (action == action_ok) {
+                       okHandler();
+               }
+               if (action == action_cancel) {
+                       cancelHandler();
+               }
+       }
 
-    /**
-     * Handle actions received from keyboard. This simply directs the actions to
-     * the same listener methods that are called with ButtonClick events.
-     */
-    public void handleAction(Action action, Object sender, Object target) {
-        if (action == action_ok) {
-            okHandler();
-        }
-        if (action == action_cancel) {
-            cancelHandler();
-        }
-    }
+       public void okHandler() {
+               // Do something: report the click
+               formlayout.addComponent(new Label("OK clicked. " + "User="
+                               + username.getValue() + ", password=" + password.getValue()));
+               //  
+       }
 
-    public void okHandler() {
-        // Do something: report the click
-        formlayout.addComponent(new Label("OK clicked. " + "User="
-                + username.getValue() + ", password=" + password.getValue()));
-        //  
-    }
-
-    public void cancelHandler() {
-        // Do something: report the click
-        formlayout.addComponent(new Label("Cancel clicked. User="
-                + username.getValue() + ", password=" + password.getValue()));
-    }
+       public void cancelHandler() {
+               // Do something: report the click
+               formlayout.addComponent(new Label("Cancel clicked. User="
+                               + username.getValue() + ", password=" + password.getValue()));
+       }
 }
index ea788ac0b2db584978f6aaab82e3d02d65afe054..fc5b308b64e156960ce712d497efdf6ec74f0714 100644 (file)
@@ -133,7 +133,7 @@ public class ProgressIndicator extends AbstractField implements Property,
     @Override
     public Object getValue() {
         if (dataSource == null) {
-            throw new IllegalStateException("Datasource must be se");
+            throw new IllegalStateException("Datasource must be set");
         }
         return dataSource.getValue();
     }
@@ -149,7 +149,7 @@ public class ProgressIndicator extends AbstractField implements Property,
     @Override
     public void setValue(Object newValue) {
         if (dataSource == null) {
-            throw new IllegalStateException("Datasource must be se");
+            throw new IllegalStateException("Datasource must be set");
         }
         dataSource.setValue(newValue);
     }
@@ -160,7 +160,7 @@ public class ProgressIndicator extends AbstractField implements Property,
     @Override
     public String toString() {
         if (dataSource == null) {
-            throw new IllegalStateException("Datasource must be se");
+            throw new IllegalStateException("Datasource must be set");
         }
         return dataSource.toString();
     }
@@ -171,7 +171,7 @@ public class ProgressIndicator extends AbstractField implements Property,
     @Override
     public Class getType() {
         if (dataSource == null) {
-            throw new IllegalStateException("Datasource must be se");
+            throw new IllegalStateException("Datasource must be set");
         }
         return dataSource.getType();
     }
index aaefc2116357b57f22d3d570a98fc28075780713..0fb3496404a285549bd0386da47b0d57714e67d9 100644 (file)
@@ -10,7 +10,9 @@ import com.itmill.toolkit.terminal.PaintException;
 import com.itmill.toolkit.terminal.PaintTarget;\r
 \r
 /**\r
- * TODO comment\r
+ * A component for selecting a numerical value within a range. A Slider\r
+ * can have the appearance of a scroll bar or e.g. look like an Adobe Photoshop\r
+ * style of a slider.\r
  * \r
  * Example code: <code>\r
  *     class MyPlayer extends CustomComponent implements ValueChangeListener {\r
@@ -42,6 +44,7 @@ import com.itmill.toolkit.terminal.PaintTarget;
  *\r
  * </code>\r
  * \r
+ * @author IT Mill Ltd.\r
  */\r
 public class Slider extends AbstractField {\r
 \r