]> source.dussan.org Git - vaadin-framework.git/commitdiff
some preliminary drag and drop stuff
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 28 Jan 2010 17:46:50 +0000 (17:46 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 28 Jan 2010 17:46:50 +0000 (17:46 +0000)
svn changeset:11052/svn branch:6.3_dd

31 files changed:
WebContent/VAADIN/readme.txt
WebContent/VAADIN/themes/base/button/button.css
WebContent/VAADIN/themes/base/styles.css
WebContent/VAADIN/themes/reindeer/button/button-link-style.css
WebContent/VAADIN/themes/reindeer/styles.css
WebContent/VAADIN/themes/runo/styles.css
WebContent/WEB-INF/web.xml
WebContent/index.html
WebContent/multiapp.html
WebContent/release-notes.html
src/com/vaadin/data/util/ContainerHierarchicalWrapper.java
src/com/vaadin/data/util/HierarchicalContainer.java
src/com/vaadin/data/util/IndexedContainer.java
src/com/vaadin/launcher/DevelopmentServerLauncher.java
src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml
src/com/vaadin/terminal/gwt/client/ApplicationConnection.java
src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java
src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java
src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
src/com/vaadin/terminal/gwt/client/ui/VTree.java
src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java
src/com/vaadin/ui/AbsoluteLayout.java
src/com/vaadin/ui/CustomLayout.java
src/com/vaadin/ui/Select.java
src/com/vaadin/ui/Table.java
src/com/vaadin/ui/Tree.java
tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.html
tests/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.html
tests/src/com/vaadin/tests/layouts/GridLayoutNPE.java [new file with mode: 0644]
tests/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.html [deleted file]
tests/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java [deleted file]

index 672862a35c909263a80c8e989f9fc43085ae2fa3..926bc01a9ec98bd92409eb06f1295fb1dc167706 100644 (file)
@@ -29,7 +29,8 @@ Vaadin Development
 When developing the Vaadin Library itself, change to "build" directory and
 run "ant widgetsets" to compile all widgetsets or "ant widgetset-default",
 "ant-widgetset-reserver", or "ant widgetset-colorpicker" to compile individual
-widgetsets. You must have GWT installed under build/gwt.
+widgetsets. You must have GWT installed under build/gwt, under the proper
+platform directory.
 
 See http://dev.vaadin.com/wiki/DevDocs/StartingDevelopment for instructions for
 installing GWT and compiling widgetsets for Vaadin development.
index aacc05bbb700232c22e6a7655ea106ab949f587e..9d4bec0fe42d7a98237e85f7205d1249b3233ec1 100644 (file)
        -moz-box-sizing: border-box;\r
        -ms-box-sizing: border-box;\r
        box-sizing: border-box;\r
-       }\r
+}\r
+\r
+.v-button.v-disabled {\r
+       cursor: default;\r
+}\r
 \r
 .v-ie6 .v-button {\r
        display: inline;\r
index f1840c6bf2f7b3f0c3175a745a89eda41b21face..28d412536e66acc45572e480b9df472ad7ac8b4b 100644 (file)
        -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
        box-sizing: border-box;
-       }
+}
+
+.v-button.v-disabled {
+       cursor: default;
+}
 
 .v-ie6 .v-button {
        display: inline;
index 14530c8dff1505ca7c2d9c488cf32356d5c5c8ac..f4ba80b3cdc354660f3360e1c445f81dcca74186 100644 (file)
        cursor: pointer;
        line-height: inherit;
        }
+
+.v-button.v-button-link.v-disabled,
+.v-button.v-button-link.v-disabled .v-button-wrap {
+       cursor: default;
+       }
        
 .v-button-link .v-button-caption,
 .v-nativebutton-link .v-nativebutton-caption {
index afb15e49a8cfce15d92f66744218e79e3409d563..c4d29c78cede31977f411f7daca6102232ebf8b7 100644 (file)
@@ -1,5 +1,5 @@
-.v-theme-version:after {content:"6_2_0_dev-20091229";}
-.v-theme-version-6_2_0_dev-20091229 {display: none;}
+.v-theme-version:after {content:"9_9_9_INTERNAL-DEBUG-BUILD";}
+.v-theme-version-9_9_9_INTERNAL-DEBUG-BUILD {display: none;}
 /* Automatically compiled css file from subdirectories. */
 
 .v-absolutelayout-wrapper {
        -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
        box-sizing: border-box;
-       }
+}
+
+.v-button.v-disabled {
+       cursor: default;
+}
 
 .v-ie6 .v-button {
        display: inline;
@@ -2177,6 +2181,11 @@ div.v-window-header {
        cursor: pointer;
        line-height: inherit;
        }
+
+.v-button.v-button-link.v-disabled,
+.v-button.v-button-link.v-disabled .v-button-wrap {
+       cursor: default;
+       }
        
 .v-button-link .v-button-caption,
 .v-nativebutton-link .v-nativebutton-caption {
index 06bce5dfa9b391c25f36d9d257ca440d74074a82..7e14ce6d40c5de6a86f0e1d7058ba679d463126c 100644 (file)
        -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
        box-sizing: border-box;
-       }
+}
+
+.v-button.v-disabled {
+       cursor: default;
+}
 
 .v-ie6 .v-button {
        display: inline;
index 2e2c1b680e825760771261e8ef35133fba969622..584c9805bd10ebdac797406e1e3ecdc16fc0659a 100644 (file)
@@ -24,7 +24,7 @@
                <servlet-name>VaadinApplicationRunner</servlet-name>\r
                <servlet-class>com.vaadin.terminal.gwt.server.ApplicationRunnerServlet</servlet-class>\r
                <init-param><param-name>defaultPackages</param-name>\r
-               <param-value>com.vaadin.tests,com.vaadin.demo,com.vaadin.tests.tickets,com.vaadin.tests.components,com.vaadin.tests.components.layouts,com.vaadin.tests.components.panel,com.vaadin.tests.components.combobox,com.vaadin.tests.components.popupview,com.vaadin.tests.components.datefield,com.vaadin.tests.components.richtextarea,com.vaadin.tests.components.absolutelayout,com.vaadin.tests.components.embedded,com.vaadin.tests.components.splitpanel,com.vaadin.tests.components.abstractfield,com.vaadin.tests.components.form,com.vaadin.tests.components.table,com.vaadin.tests.components.accordion,com.vaadin.tests.components.label,com.vaadin.tests.components.tabsheet,com.vaadin.tests.components.beanitemcontainer,com.vaadin.tests.components.link,com.vaadin.tests.components.textfield,com.vaadin.tests.components.button,com.vaadin.tests.components.optiongroup,com.vaadin.tests.components.tree,com.vaadin.tests.components.caption,com.vaadin.tests.components.orderedlayout,com.vaadin.tests.components.window</param-value></init-param>\r
+               <param-value>com.vaadin.tests,com.vaadin.demo,com.vaadin.tests.tickets,com.vaadin.tests.components,com.vaadin.tests.components.layouts,com.vaadin.tests.components.panel,com.vaadin.tests.components.combobox,com.vaadin.tests.components.popupview,com.vaadin.tests.components.datefield,com.vaadin.tests.components.richtextarea,com.vaadin.tests.components.absolutelayout,com.vaadin.tests.components.embedded,com.vaadin.tests.components.splitpanel,com.vaadin.tests.components.abstractfield,com.vaadin.tests.components.form,com.vaadin.tests.components.table,com.vaadin.tests.components.accordion,com.vaadin.tests.components.label,com.vaadin.tests.components.tabsheet,com.vaadin.tests.components.beanitemcontainer,com.vaadin.tests.components.link,com.vaadin.tests.components.textfield,com.vaadin.tests.components.button,com.vaadin.tests.components.optiongroup,com.vaadin.tests.components.tree,com.vaadin.tests.components.caption,com.vaadin.tests.components.orderedlayout,com.vaadin.tests.components.window,com.vaadin.tests.dd</param-value></init-param>\r
        </servlet>\r
 
 
index 46bc8846fd602f5cf3324fa094e678f5c8e9105f..f7c4fe9c32b54e1c994084bd8ba74e28d5733202 100644 (file)
@@ -10,7 +10,7 @@
                <script type="text/javascript">
                window.onload = function() {
                        try {
-                               if(window.location.search && (window.location.search.indexOf('gwt.hosted') != -1 || window.location.search.indexOf('gwt.codesvr') != -1)) {
+                               if(window.location.search && -1 != window.location.search.indexOf('gwt.hosted')) {
                                        var hostedParam = window.location.search;
                                        var demolinks = document.getElementsByTagName("a");
                                        for (var k = 0; k < demolinks.length; k++) {
index ddde191d2833973150ef1f46380678ebca7e7d3b..0bee11e5bbfbdc15bb8de9178be7f5711345a5ff 100644 (file)
@@ -28,7 +28,7 @@
                }};
 </script>
 <script language='javascript' src='/VAADIN/widgetsets/com.vaadin.terminal.gwt.DefaultWidgetSet/com.vaadin.terminal.gwt.DefaultWidgetSet.nocache.js'></script>
-<link rel="stylesheet" type="text/css" href="/VAADIN/themes/example/styles.css"/>
+<link REL="stylesheet" TYPE="text/css" HREF="/VAADIN/themes/example/styles.css">
 </head>
 <body>
        <iframe id="__gwt_historyFrame" style="width:0;height:0;border:0;overflow:hidden" src="javascript:false"></iframe>
index 0de559fda82782626e8bd53ae89389211f5f31a9..398e93d97c7db55e22cf2e37e4ee988a91e40dc5 100644 (file)
   <li><a href="#requirements">Requirements</a></li>
 </ul>
 
-<p>Vaadin @version@ is an update release for Vaadin 6. In addition to various fixes, it
-contains a number of significant enhancements.</p>
+<p>Vaadin @version@ is a maintenance release for Vaadin 6.2,
+containing a number of important fixes. The fixes are listed in the <a
+href="#changelog">Change Log</a> below.</p>
 
-<ul>
-    <li>Widget set definition and component-to-widget mapping has been redesigned</li>
-    <ul>
-        <li>Reuse of widgets is now much easier, as it is easier to package and use widget
-        set JARs and otherwise combine widget sets.</li>
-
-        <li>A widget set definition class is no longer used. The Java
-               code needed for widget instantiation and client-server mapping is now
-               automatically generated by the GWT compiler. For the basic Vaadin
-               user, a widget set is now defined only in a GWT module definition file
-               (<tt>.gwt.xml</tt>).</li>
-  
-        <li>Server-side component is mapped to a client-side widget with an annotation:
-            <pre>@ClientWidget(com.vaadin.demo.colorpicker.gwt.client.ui.VColorPicker.class)
-public class ColorPicker extends AbstractField {</pre>
-        </li>
-
-        <li>The <tt>getTag()</tt> method is no longer needed</li>
-
-        <li>The Vaadin Plugin for Eclipse can create new widget stubs, define the mapping,
-        and create widget set definition files (<tt>.gwt.xml</tt>).</li>
-
-        <li>See <tt>WebContent/docs/example-source/build-widgetset.xml</tt> for an example
-        on how you can compile widget sets and widget set JARs with Ant.</li>
-
-        <li>A widget set builder allows automatic generation and maintenance of widget
-        configurations, making use of widget set JARs easier.</li>
-
-        <li>See <a href="#widgetupgrade">notes below</a> for upgrading widget set
-        definitions and widget mappings from earlier version of Vaadin 6.</li>
-    </ul>
-    <li>Other enhancements to development of new components</li>
-    <ul>
-           <li>On the server-side:</li>
-           <ul>
-               <li>Listeners for custom client side events are now easier to implement with
-               <tt>ReflectTools.findMethod()</tt> and <tt>addListener(String eventIdentifier,
-               Class&lt;?&gt; eventType, Object target, Method method)</tt> methods. The latter
-                   automatically informs the client-side that a listener is registered on server side)</li>
-               </ul>
-        <li>On the client-side:</li>
-        <ul>
-            <li>Ability to check if a listener is registered on the server-side</li>
-            <li>Typed arrays and maps can now be sent to server with <tt>updateVariable()</tt>
-                               <ul>
-                               <li><b>Note!</b> This change affects existing custom components that send object arrays to the server. 
-                               Previously, an <tt>Object[]</tt> sent from client to server was converted into <tt>String[]</tt> on the server-side. 
-                               This invalid behavior is now fixed and an <tt>Object[]</tt> sent from client-side is an
-                               <tt>Object[]</tt> on the server-side.</li>
-                               </ul>
-            </li>
-        </ul>
-    </ul>
-    <li>Portlet 2.0 (JSR 268) support</li>
-    <ul>
-       <li>A separate servlet for each portlet is no longer needed. 
-        (no separate servlet, no session problems, portlet-to-portlet communication, etc)</li>
-    </ul> 
-    <li>OSGi support</li>
-    <ul>
-       <li>Vaadin now works as a OSGi bundle.</li>
-    </ul>
-    <li>Enhanced sorting of <b>IndexedContainer</b> and <b>BeanItemContainer</b></li>
-    <ul>
-              <li>Custom sort methods can now be used to sort container contents.</li>
-       </ul>
-    <li>Improved event support</li>
-    <ul>
-       <li>Client-side events are sent to the server only when a listener has been registered for the event</li>
-       <li>All built-in layouts (<b>AbsoluteLayout</b>, <b>CssLayout</b>, <b>HorizontalLayout</b>, <b>GridLayout</b>, and <b>VerticalLayout</b>) now support click listeners.</li>
-       <li>Click events for <b>Panel</b> and <b>Embedded</b>.</li>
-        <li>Focus and blur events for <b>DateField</b>, <b>TextField</b>, and <b>Select</b></li>
-    </ul>
-    <li>JavaScript execution with <tt>Window.excecuteJavaScript()</tt></li>
-    <ul>
-           <li>You can execute JavaScript directly from the server-side with the new <tt>excecuteJavaScript()</tt> method. You can use it, for example, for integration with other systems or for implementing print functionality (<tt>window.print()</tt>). </li>
-    </ul>
-    <li>Additional Maven archetypes</li>
-    <ul>
-        <li><b>vaadin-archetype-clean</b> with a dependency to Vaadin and a minimal application skeleton, no client-side widgets</li>
-        <li><b>vaadin-archetype-widget</b> for creation of Vaadin 6.2 widget packages</li>
-        <li><b>vaadin-archetype-sample</b> has been updated for Vaadin 6.2 - use version 1.0.x for earlier versions of Vaadin</li>
-    </ul>
-    <li>Maven Vaadin plugin</li>
-    <ul>
-        <li><b>vaadin-maven-plugin</b> can automatically update Vaadin 6.2 widget sets based on Maven dependencies using the goal <tt>update-widgetset</tt></li>
-    </ul>
-    <li><b>HttpServletRequestListener</b></li>
-    <ul>
-       <li>Similar to <b>TransactionListener</b>, but only related to a single Application. Called before and after every servlet request and provides access to <b>HttpServletRequest</b> and <b>HttpServletResponse</b>.</li>
-    </ul>
-    <li><b>PortletRequestListener</b>
-    <ul>
-       <li>Similar to <b>HttpServletRequestListener</b>, but for portlets. Called before and after every portlet request and provides access to <b>PortletRequest</b> and <b>PortletResponse</b>.</li>
-    </ul>
-    <li>Enhancements for the Portlet 2.0 support (<a href="http://dev.vaadin.com/ticket/3918">#3918</a>)</li>
-    <ul>
-      <li>Support for the edit and help modes</li>
-      <li>Support for custom modes and changing modes programmatically</li>
-      <li>See <a href="http://dev.vaadin.com/browser/versions/6.2/demo/src/com/vaadin/demo/portlet/PortletModeExample.java"><tt>com/vaadin/demo/portlet/PortletModeExample.java</tt></a> in the demo source code in the installation package for an example</li>
-    </ul>
-    <li>Enhancements to various components:</li>
-    <ul>
-         <li><b>Window</b>: Additional control over a sub-window: close and drag prevention.</li>
-      <li><b>Tree</b>: Item style generator enabling styling of individual tree items. Rendering optimizations.</li> 
-      <li><b>Tabsheet</b>: Tabs can be marked as closable. The new <b>CloseHandler</b> can be used to ask for confirmation, prevent closing etc.</li>
-      <li><b>SplitPanel</b>: Double-clicking the splitter sends an event which can be handled on server-side.</li>
-      <li><b>MenuBar</b>: Many enhancements: individual items can be styled, support for separators, disabling of items, visibility of items.</li>
-      <li><b>DateField</b>: Support for lenient/non-lenient mode. A <b>DateField</b> is now by default in non-lenient mode (only accepts valid dates). </li>
-    </ul>
-    <li>Automatic integration tests</li>
-    <ul>
-       <li>All Vaadin builds are now automatically tested on all supported servers.</li>
-    </ul>
-    <li>Dozens of other small enhancements and bug fixes</li> 
-</ul>
+<p>For recent major enhancements, see the <a
+href="http://vaadin.com/download/release/6.2/6.2.0/release-notes.html">Release
+Notes for Vaadin 6.2.0</a>.</p>
 
 <p>Problem fixes and enhancements planned for upcoming releases can be found from the <a
 href="http://dev.vaadin.com/roadmap">Vaadin Roadmap</a> in Vaadin Trac.</p>
@@ -162,6 +50,26 @@ widget sets and refresh your project in Eclipse. If you are upgrading from earli
 6.2.0, notice that Vaadin 6.2 uses GWT 1.7.0 (included in the installation package). See
 <a href="#upgrading">General Upgrade Notes</a> for more details on upgrading.</p>
 
+<h2><a name="changelog">Change Log</a></h2>
+
+<p>The following closed issues have been included in this release:</p>
+       
+<ul>
+  <li><a href="http://dev.vaadin.com/ticket/3804">#3804</a>: SPAN-tag inside a disabled button class has cursor: pointer</li>
+  <li><a href="http://dev.vaadin.com/ticket/3976">#3976</a>: LoginForm should use POST and not GET to avoid storing passwords in logs</li>
+  <li><a href="http://dev.vaadin.com/ticket/4010">#4010</a>: Widgets with variables of type array with value null causes 'Internal Error' in Vaadin</li>
+  <li><a href="http://dev.vaadin.com/ticket/4017">#4017</a>: Document UriFragmentUtility</li>
+  <li><a href="http://dev.vaadin.com/ticket/4019">#4019</a>: VGridLayout throws an NPE when moving component to where another was removed</li>
+  <li><a href="http://dev.vaadin.com/ticket/4025">#4025</a>: "ClassPathExplorer should ignore empty ""Vaadin-Widgetsets"" attribute"</li>
+  <li><a href="http://dev.vaadin.com/ticket/4036">#4036</a>: Defined width DateField clips in a layout with undefined size</li>
+  <li><a href="http://dev.vaadin.com/ticket/4064">#4064</a>: FileTypeResolver should ignore query parameters when determining file type</li>
+  <li><a href="http://dev.vaadin.com/ticket/4067">#4067</a>: SplitPanel in modal window freezes application (Gecko+Webkit)</li>
+  <li><a href="http://dev.vaadin.com/ticket/4086">#4086</a>: Include an Index at the end of the Book</li>
+  <li><a href="http://dev.vaadin.com/ticket/4099">#4099</a>: UriFragmentUtility does not work in Opera</li>
+  <li><a href="http://dev.vaadin.com/ticket/4100">#4100</a>: ClassCastException in ClassPathExplorer</li>
+  <li><a href="http://dev.vaadin.com/ticket/4103">#4103</a>: Empty required Select shows error indicator while other fields don't</li>
+</ul>
+
 <h2><a name="widgetupgrade">Upgrading from an Earlier Version of Vaadin 6</a></h2>
 
 <p>
@@ -376,101 +284,6 @@ sets with the regular Vaadin package for your platform.</p>
 <p>For other known problems, see open tickets at developer site <a
        href="http://dev.vaadin.com/">dev.vaadin.com</a>.</p>
 
-<h2><a name="changelog">Change Log</a></h2>
-
-<p>The following closed issues have been included in this release:</p>
-       
-<ul>
-<li><a href="http://dev.vaadin.com/ticket/1595">#1595</a>: Close button on TabSheet control</li>
-<li><a href="http://dev.vaadin.com/ticket/2594">#2594</a>: Add support for native JSON evaluation in UIDL parsing</li>
-<li><a href="http://dev.vaadin.com/ticket/2632">#2632</a>: Notifications should not be wider than the screen</li>
-<li><a href="http://dev.vaadin.com/ticket/2821">#2821</a>: Sumbenu icon is not aligned with the menu item's text</li>
-<li><a href="http://dev.vaadin.com/ticket/2849">#2849</a>: Deprecate MenuBar.setSubmenuIcon method, and provide the same functionality via CSS</li>
-<li><a href="http://dev.vaadin.com/ticket/2854">#2854</a>: Paintable should be an appropriate variable type</li>
-<li><a href="http://dev.vaadin.com/ticket/2918">#2918</a>: Same application is loaded in different portlet instances</li>
-<li><a href="http://dev.vaadin.com/ticket/3070">#3070</a>: Tree's Items should be easily styled</li>
-<li><a href="http://dev.vaadin.com/ticket/3088">#3088</a>: ComboBox, If only one item is listed, pressing Enter should choose it, not discard</li>
-<li><a href="http://dev.vaadin.com/ticket/3117">#3117</a>: Portlet 2.0 (JSR-286) support</li>
-<li><a href="http://dev.vaadin.com/ticket/3120">#3120</a>: Window.setClosable(boolean)</li>
-<li><a href="http://dev.vaadin.com/ticket/3133">#3133</a>: Window draggability disabling feature</li>
-<li><a href="http://dev.vaadin.com/ticket/3175">#3175</a>: Date Field "too big" date handling</li>
-<li><a href="http://dev.vaadin.com/ticket/3185">#3185</a>: Add possibility to specify application CSS class name (Patch to make it easier to use Vaadin with Jython)</li>
-<li><a href="http://dev.vaadin.com/ticket/3230">#3230</a>: Sub window should not be dragged or resized when the cursor is outside the browser window</li>
-<li><a href="http://dev.vaadin.com/ticket/3234">#3234</a>: Component Event Listener Framework for all widgets/components</li>
-<li><a href="http://dev.vaadin.com/ticket/3259">#3259</a>: Removing all action handlers</li>
-<li><a href="http://dev.vaadin.com/ticket/3277">#3277</a>: MenuBar.MenuItem could have setVisible() method</li>
-<li><a href="http://dev.vaadin.com/ticket/3298">#3298</a>: Split sources to several folders</li>
-<li><a href="http://dev.vaadin.com/ticket/3332">#3332</a>: Redesign how widgets are packaged and how the widgetset is built</li>
-<li><a href="http://dev.vaadin.com/ticket/3338">#3338</a>: Create a Maven archetype for creating a widget project</li>
-<li><a href="http://dev.vaadin.com/ticket/3367">#3367</a>: It should be possible to specify parameters for embedded flash</li>
-<li><a href="http://dev.vaadin.com/ticket/3416">#3416</a>: Theme should contain Vaadin version</li>
-<li><a href="http://dev.vaadin.com/ticket/3433">#3433</a>: BeanItemContainer's sort is not overridable</li>
-<li><a href="http://dev.vaadin.com/ticket/3434">#3434</a>: IndexedContainer's compare is not overridable</li>
-<li><a href="http://dev.vaadin.com/ticket/3451">#3451</a>: ComboBox causes internal error when changing page too fast</li>
-<li><a href="http://dev.vaadin.com/ticket/3472">#3472</a>: Give better error message if widgetset can not be loaded</li>
-<li><a href="http://dev.vaadin.com/ticket/3473">#3473</a>: Detect if UIDL request returns 404 and show an error message</li>
-<li><a href="http://dev.vaadin.com/ticket/3479">#3479</a>: Embedded applications should not change the page title</li>
-<li><a href="http://dev.vaadin.com/ticket/3483">#3483</a>: PopupView rendering style inside a layout is unspecified</li>
-<li><a href="http://dev.vaadin.com/ticket/3498">#3498</a>: Window doesn't get focus correctly</li>
-<li><a href="http://dev.vaadin.com/ticket/3499">#3499</a>: PopupView CSS style is broken</li>
-<li><a href="http://dev.vaadin.com/ticket/3526">#3526</a>: SplitPanel collapse and expand with doubleclick</li>
-<li><a href="http://dev.vaadin.com/ticket/3541">#3541</a>: VerticalLayout//HorizontalLayout/GridLayout/AbsoluteLayout/CSSLayout should support click events</li>
-<li><a href="http://dev.vaadin.com/ticket/3544">#3544</a>: Implement support for focus/blur events in TextField</li>
-<li><a href="http://dev.vaadin.com/ticket/3565">#3565</a>: CommunicationManager is not serializable</li>
-<li><a href="http://dev.vaadin.com/ticket/3580">#3580</a>: MenuBar stylenames aren't added to the submenu overlays</li>
-<li><a href="http://dev.vaadin.com/ticket/3589">#3589</a>: Window.executeJavaScript()</li>
-<li><a href="http://dev.vaadin.com/ticket/3603">#3603</a>: No DTD in generated GWT descriptor</li>
-<li><a href="http://dev.vaadin.com/ticket/3605">#3605</a>: Patch to avoid concurrent modification exceptions in EventRouter</li>
-<li><a href="http://dev.vaadin.com/ticket/3631">#3631</a>: LoginForm login button is too wide in IE6/IE7</li>
-<li><a href="http://dev.vaadin.com/ticket/3654">#3654</a>: Decide on final PaintTarget.paintReference(Paintable, String) API</li>
-<li><a href="http://dev.vaadin.com/ticket/3655">#3655</a>: ApplicationRunner logs unnecessary java.lang.ClassNotFoundExceptions</li>
-<li><a href="http://dev.vaadin.com/ticket/3678">#3678</a>: MenuBar needs a separator item</li>
-<li><a href="http://dev.vaadin.com/ticket/3683">#3683</a>: TextField.setRows() API needs reworking</li>
-<li><a href="http://dev.vaadin.com/ticket/3688">#3688</a>: ContainerHierarchicalWrapper should stay ordered by the wrapped container</li>
-<li><a href="http://dev.vaadin.com/ticket/3715">#3715</a>: Sub windows are shown as VView in debug console</li>
-<li><a href="http://dev.vaadin.com/ticket/3717">#3717</a>: Parameterize BeanItem and ComponentContainer.getComponentIterator</li>
-<li><a href="http://dev.vaadin.com/ticket/3721">#3721</a>: ComboBox can insert only new item without losing its focus</li>
-<li><a href="http://dev.vaadin.com/ticket/3731">#3731</a>: Implement a simpler alternative to ApplicationContext.TransactionListener</li>
-<li><a href="http://dev.vaadin.com/ticket/3740">#3740</a>: Tabsheet no longer fully serializable, doesn't work in GAE</li>
-<li><a href="http://dev.vaadin.com/ticket/3754">#3754</a>: Add data.util.TextFileProperty</li>
-<li><a href="http://dev.vaadin.com/ticket/3755">#3755</a>: Select throws IllegalArgumentException when browsing pages quickly</li>
-<li><a href="http://dev.vaadin.com/ticket/3756">#3756</a>: Add support for passing a typed Object[] from client to server</li>
-<li><a href="http://dev.vaadin.com/ticket/3757">#3757</a>: Add support for passing a typed map from client to server</li>
-<li><a href="http://dev.vaadin.com/ticket/3759">#3759</a>: Cannot scroll to the last tab in a Tabsheet</li>
-<li><a href="http://dev.vaadin.com/ticket/3760">#3760</a>: Scrollbars are missing in Safari/Chrome</li>
-<li><a href="http://dev.vaadin.com/ticket/3761">#3761</a>: MenuBar breaks the application completely</li>
-<li><a href="http://dev.vaadin.com/ticket/3762">#3762</a>: Dependency to javax/portlet/PortletRequest, won't work with GAE</li>
-<li><a href="http://dev.vaadin.com/ticket/3763">#3763</a>: Add javadoc to public methods in ApplicationConnection</li>
-<li><a href="http://dev.vaadin.com/ticket/3772">#3772</a>: Add notifier interfaces for focus and blur events</li>
-<li><a href="http://dev.vaadin.com/ticket/3775">#3775</a>: Optimize Tree rendering</li>
-<li><a href="http://dev.vaadin.com/ticket/3782">#3782</a>: ClassCastException when adding Window via addComponent</li>
-<li><a href="http://dev.vaadin.com/ticket/3783">#3783</a>: ClickListener in Panel does not work</li>
-<li><a href="http://dev.vaadin.com/ticket/3784">#3784</a>: Panel.setScrollTop does not work with invalid values</li>
-<li><a href="http://dev.vaadin.com/ticket/3785">#3785</a>: Style names for MenuBar.MenuItem</li>
-<li><a href="http://dev.vaadin.com/ticket/3786">#3786</a>: Add focus and blur events to Select/VFilterSelect and DateField/VTextualDate</li>
-<li><a href="http://dev.vaadin.com/ticket/3788">#3788</a>: Typo in setWriteThrough's parameter name</li>
-<li><a href="http://dev.vaadin.com/ticket/3807">#3807</a>: LoginForm doesn't work when multiple windows are used for the same application</li>
-<li><a href="http://dev.vaadin.com/ticket/3817">#3817</a>: Upload: Browsers send different filenames</li>
-<li><a href="http://dev.vaadin.com/ticket/3819">#3819</a>: Document that widgetset compiler loads classes</li>
-<li><a href="http://dev.vaadin.com/ticket/3820">#3820</a>: DefaultItemSorter is not serializable</li>
-<li><a href="http://dev.vaadin.com/ticket/3824">#3824</a>: Make sure build generates theme version</li>
-<li><a href="http://dev.vaadin.com/ticket/3825">#3825</a>: AbstractComponentThrows NPE when both visible and enable is set to false</li>
-<li><a href="http://dev.vaadin.com/ticket/3828">#3828</a>: TextField inside a layout inside a Table is clipped</li>
-<li><a href="http://dev.vaadin.com/ticket/3835">#3835</a>: Portlet 2.0 does not support the "style" parameter</li>
-<li><a href="http://dev.vaadin.com/ticket/3843">#3843</a>: Form caption is blue in IE</li>
-<li><a href="http://dev.vaadin.com/ticket/3845">#3845</a>: Twincol select buttons are missing right border in IE6</li>
-<li><a href="http://dev.vaadin.com/ticket/3849">#3849</a>: Undefined wide menubar is 100% wide in IE6</li>
-<li><a href="http://dev.vaadin.com/ticket/3850">#3850</a>: Submenu icon is placed outside the menu in IE7</li>
-<li><a href="http://dev.vaadin.com/ticket/3859">#3859</a>: Application contains mysterious deprecated methods</li>
-<li><a href="http://dev.vaadin.com/ticket/3874">#3874</a>: Two click events is sent for a middle click in a layout</li>
-<li><a href="http://dev.vaadin.com/ticket/3879">#3879</a>: Removing portlet leaks memory</li>
-<li><a href="http://dev.vaadin.com/ticket/3881">#3881</a>: MenuBar collapsing slightly broken with Reindeer theme</li>
-<li><a href="http://dev.vaadin.com/ticket/3883">#3883</a>: Extra white space at top when navigating in sampler with IE8</li>
-<li><a href="http://dev.vaadin.com/ticket/3884">#3884</a>: Menubar with collapsed menus does not handle resize events properly</li>
-<li><a href="http://dev.vaadin.com/ticket/3885">#3885</a>: Menubar with collapsed menus does not show arrow for showing collapsed items</li>
-<li><a href="http://dev.vaadin.com/ticket/3886">#3886</a>: InputPrompt of TextField/Combobox does not change until refresh</li>
-</ul>
-
 <h2><a name="requirements">Requirements</a></h2>
 
 <p>Vaadin is available for the following operating systems:</p>
index 6420aaf8381db5671dbba1545e7914ca58926012..d516c870a266dd856089d5b59ece39fedbc4dcd7 100644 (file)
@@ -129,16 +129,6 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
                         return 0;
                     }
                 };
-                Object[] array = roots.toArray();
-                Arrays.sort(array, basedOnOrderFromWrappedContainer);
-                roots = new LinkedHashSet<Object>();
-                for (int i = 0; i < array.length; i++) {
-                    roots.add(array[i]);
-                }
-                for (Object object : children.keySet()) {
-                    LinkedList<Object> object2 = children.get(object);
-                    Collections.sort(object2, basedOnOrderFromWrappedContainer);
-                }
 
                 // Calculate the set of all items in the hierarchy
                 final HashSet<Object> s = new HashSet<Object>();
@@ -163,6 +153,18 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
                         s.add(id);
                     }
                 }
+
+                Object[] array = roots.toArray();
+                Arrays.sort(array, basedOnOrderFromWrappedContainer);
+                roots = new LinkedHashSet<Object>();
+                for (int i = 0; i < array.length; i++) {
+                    roots.add(array[i]);
+                }
+                for (Object object : children.keySet()) {
+                    LinkedList<Object> object2 = children.get(object);
+                    Collections.sort(object2, basedOnOrderFromWrappedContainer);
+                }
+
             }
         }
     }
@@ -204,6 +206,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
      */
     private void addToHierarchyWrapper(Object itemId) {
         roots.add(itemId);
+
     }
 
     /*
index f5b65f1dad9fb0f2bd9ee8e6f5072db671d90c35..2b5519e6514e583f7351fcba088cde314b498f83 100644 (file)
@@ -139,6 +139,25 @@ public class HierarchicalContainer extends IndexedContainer implements
         return true;
     }
 
+    @Override
+    public Item addItemAt(int index, Object newItemId) {
+        Item retval = super.addItemAt(index, newItemId);
+        if (getParent(newItemId) == null) {
+            int refIndex = roots.size() - 1;
+            int indexOfId = indexOfId(roots.get(refIndex));
+            while (indexOfId > index) {
+                refIndex--;
+                if (refIndex < 0) {
+                    // inserts as first
+                    break;
+                }
+                indexOfId = indexOfId(roots.get(refIndex));
+            }
+            roots.add(refIndex + 1, newItemId);
+        }
+        return retval;
+    }
+
     /**
      * <p>
      * Sets the parent of an Item. The new parent item must exist and be able to
@@ -293,7 +312,12 @@ public class HierarchicalContainer extends IndexedContainer implements
             if (isRoot(itemId)) {
                 roots.remove(itemId);
             }
-            children.remove(itemId);
+            LinkedList<Object> remove = children.remove(itemId);
+            if (remove != null) {
+                for (Object object : remove) {
+                    removeItem(object);
+                }
+            }
             final Object p = parent.get(itemId);
             if (p != null) {
                 final LinkedList c = children.get(p);
index f5dddf5e2326e65234776f9bf3a6f0580c271c69..d6d6d9e77c4e2ec5c05ec42beeab3e1b3c98d726 100644 (file)
@@ -557,6 +557,9 @@ public class IndexedContainer implements Container.Indexed,
                 return null;
             }
         }
+        if (index < 0) {
+            index = 0;
+        }
 
         return addItemAt(index, newItemId);
     }
index 1ba7e69da0d1b735bbbd737452be8131d0dc9467..68470937b35b5d5c7a99e847df50162368b3574d 100644 (file)
@@ -12,8 +12,6 @@ import org.mortbay.jetty.Server;
 import org.mortbay.jetty.nio.SelectChannelConnector;\r
 import org.mortbay.jetty.webapp.WebAppContext;\r
 \r
-import com.vaadin.launcher.util.BrowserLauncher;\r
-\r
 /**\r
  * Class for running Jetty servlet container within Eclipse project.\r
  * \r
@@ -42,7 +40,7 @@ public class DevelopmentServerLauncher {
         // Start Browser\r
         System.out.println("Starting Web Browser.");\r
         if (url != null) {\r
-            BrowserLauncher.openBrowser(url);\r
+            // BrowserLauncher.openBrowser(url);\r
         }\r
 \r
     }\r
index d7cf1ca4d0965c1cd1fc61cd01f9ff626ea714f2..3aaf2e5d1b77eb4f947373a8511c1456c81d3bb2 100644 (file)
        <inherits name="com.google.gwt.user.User" />
 
        <inherits name="com.google.gwt.http.HTTP" />
-
-       <inherits name="com.google.gwt.xml.XML" />
-
-       <inherits name="com.google.gwt.json.JSON" />
        
        <source path="client" />
        
                <when-property-is name="user.agent" value="ie6"/>
        </replace-with>
 
+       <!-- Opera needs a different implementation due to GWT issue 3956 (#4099) -->
+       <replace-with class="com.google.gwt.user.client.impl.HistoryImplTimer">
+               <when-type-is class="com.google.gwt.user.client.impl.HistoryImpl" />
+               <when-property-is name="user.agent" value="opera" />
+       </replace-with>
+
        <generate-with class="com.vaadin.terminal.gwt.widgetsetutils.WidgetMapGenerator">
                <when-type-is class="com.vaadin.terminal.gwt.client.WidgetMap"/>
        </generate-with>
        
        <entry-point class="com.vaadin.terminal.gwt.client.DefaultWidgetSet" />
        
+       <set-property name="user.agent" value="safari,gecko1_8"/>
+       
 </module>
index 1c3128dbdfe5bea69c9a80c312eceb8094b79fb8..bd35acddd7fc8a3ed449c65d67128177d03a8920 100755 (executable)
@@ -40,6 +40,7 @@ import com.vaadin.terminal.gwt.client.ui.VContextMenu;
 import com.vaadin.terminal.gwt.client.ui.VNotification;
 import com.vaadin.terminal.gwt.client.ui.VView;
 import com.vaadin.terminal.gwt.client.ui.VNotification.HideEvent;
+import com.vaadin.terminal.gwt.client.ui.dd.DragAndDropManager;
 import com.vaadin.terminal.gwt.server.AbstractCommunicationManager;
 
 /**
@@ -596,7 +597,7 @@ public class ApplicationConnection {
         for (int i = 1; i < variableBurst.size(); i += 2) {
             String id = variableBurst.get(i);
             id = id.substring(0, id.indexOf(VAR_FIELD_SEPARATOR));
-            if (!idToPaintableDetail.containsKey(id)) {
+            if (!idToPaintableDetail.containsKey(id) && !id.startsWith("DD")) {
                 // variable owner does not exist anymore
                 variableBurst.remove(i - 1);
                 variableBurst.remove(i - 1);
@@ -805,6 +806,12 @@ public class ApplicationConnection {
             }
         }
 
+        if (json.containsKey("dd")) {
+            // response contains data for drag and drop service
+            DragAndDropManager.get().handleServerResponse(
+                    json.getValueMap("dd"));
+        }
+
         // Check which widgets' size has been updated
         Set<Paintable> sizeUpdatedWidgets = new HashSet<Paintable>();
 
index 2a7ee079a9c60c09d757aab9ca597837005a3e49..8e423523ab92007c1d1d5b383813f4fa921eae46 100644 (file)
@@ -158,9 +158,12 @@ public class VAbsoluteLayout extends ComplexPanel implements Container {
         for (Iterator<Object> childIterator = uidl.getChildIterator(); childIterator
                 .hasNext();) {
             UIDL cc = (UIDL) childIterator.next();
-            UIDL componentUIDL = cc.getChildUIDL(0);
-            unrenderedPids.remove(componentUIDL.getId());
-            getWrapper(client, componentUIDL).updateFromUIDL(cc);
+            // skip the last one (support for VDragDropPane
+            if (childIterator.hasNext()) {
+                UIDL componentUIDL = cc.getChildUIDL(0);
+                unrenderedPids.remove(componentUIDL.getId());
+                getWrapper(client, componentUIDL).updateFromUIDL(cc);
+            }
         }
 
         for (String pid : unrenderedPids) {
index 1c2fcf5b6ffb0c022a4ca93568a82f317212bf1e..416455c1620dba8c9e4824840c0e7b65c4c281a7 100644 (file)
@@ -191,6 +191,7 @@ public class VGridLayout extends SimplePanel implements Paintable, Container {
         renderRemainingComponents(pendingCells);
 
         for (Cell cell : relativeHeighted) {
+            // rendering done above so cell.cc should not be null
             Widget widget2 = cell.cc.getWidget();
             client.handleComponentRelativeSize(widget2);
             cell.cc.updateWidgetSize();
@@ -685,19 +686,20 @@ public class VGridLayout extends SimplePanel implements Paintable, Container {
             Cell cell = paintableToCell.get(paintable);
             if (!cell.hasRelativeHeight() || !cell.hasRelativeWidth()) {
                 // cell sizes will only stay still if only relatively
-                // sized
-                // components
+                // sized components
                 // check if changed child affects min col widths
-                cell.cc.setWidth("");
-                cell.cc.setHeight("");
+                if (cell.cc != null) {
+                    cell.cc.setWidth("");
+                    cell.cc.setHeight("");
 
-                cell.cc.updateWidgetSize();
+                    cell.cc.updateWidgetSize();
 
-                /*
-                 * If this is the result of an caption icon onload event the
-                 * caption size may have changed
-                 */
-                cell.cc.updateCaptionSize();
+                    /*
+                     * If this is the result of an caption icon onload event the
+                     * caption size may have changed
+                     */
+                    cell.cc.updateCaptionSize();
+                }
 
                 int width = cell.getWidth();
                 int allocated = columnWidths[cell.col];
@@ -853,9 +855,16 @@ public class VGridLayout extends SimplePanel implements Paintable, Container {
         }
 
         public RenderSpace getAllocatedSpace() {
-            return new RenderSpace(getAvailableWidth()
-                    - cc.getCaptionWidthAfterComponent(), getAvailableHeight()
-                    - cc.getCaptionHeightAboveComponent());
+            if (cc != null) {
+                return new RenderSpace(getAvailableWidth()
+                        - cc.getCaptionWidthAfterComponent(),
+                        getAvailableHeight()
+                                - cc.getCaptionHeightAboveComponent());
+            } else {
+                // this should not happen normally
+                return new RenderSpace(getAvailableWidth(),
+                        getAvailableHeight());
+            }
         }
 
         public boolean hasContent() {
@@ -965,6 +974,8 @@ public class VGridLayout extends SimplePanel implements Paintable, Container {
         int rowspan = 1;
         UIDL childUidl;
         int alignment;
+        // may be null after setUidl() if content has vanished or changed, set
+        // in render()
         ChildComponentContainer cc;
 
         public void setUidl(UIDL c) {
@@ -986,21 +997,21 @@ public class VGridLayout extends SimplePanel implements Paintable, Container {
             if (childUidl != null) {
                 if (c == null) {
                     // content has vanished, old content will be removed from
-                    // canvas
-                    // later durin render phase
+                    // canvas later during the render phase
                     cc = null;
                 } else if (cc != null
                         && cc.getWidget() != client.getPaintable(c)) {
                     // content has changed
-                    cc = null;
-                    if (widgetToComponentContainer.containsKey(client
-                            .getPaintable(c))) {
-                        // cc exist for this component (moved) use that for this
-                        // cell
-                        cc = widgetToComponentContainer.get(client
-                                .getPaintable(c));
+                    Paintable newPaintable = client.getPaintable(c);
+                    if (widgetToComponentContainer.containsKey(newPaintable)) {
+                        // if a key in the map, newPaintable must be a widget
+                        replaceChildComponent(cc.getWidget(),
+                                (Widget) newPaintable);
+                        cc = widgetToComponentContainer.get(newPaintable);
                         cc.setWidth("");
                         cc.setHeight("");
+                    } else {
+                        cc = null;
                     }
                 }
             }
index 8520e52eeca62992d1934e915eeddbd463726ffc..a680835126eff16aff9b308b2207106c5adbc9a8 100644 (file)
@@ -40,6 +40,8 @@ import com.vaadin.terminal.gwt.client.RenderSpace;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.ui.VScrollTable.VScrollTableBody.VScrollTableRow;
+import com.vaadin.terminal.gwt.client.ui.dd.DragAndDropManager;
+import com.vaadin.terminal.gwt.client.ui.dd.Transferable;
 
 /**
  * VScrollTable
@@ -148,6 +150,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler {
     private String height;
     private String width = "";
     private boolean rendering = false;
+    private int dragmode;
 
     public VScrollTable() {
         bodyContainer.addScrollHandler(this);
@@ -190,6 +193,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler {
             totalRows = newTotalRows;
         }
 
+        dragmode = uidl.hasAttribute("dragmode") ? uidl
+                .getIntAttribute("dragmode") : 0;
+
         setCacheRate(uidl.hasAttribute("cr") ? uidl.getDoubleAttribute("cr")
                 : CACHE_RATE_DEFAULT);
 
@@ -2228,13 +2234,14 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler {
 
             private String[] actionKeys = null;
             private final TableRowElement rowElement;
+            private boolean mDown;
 
             private VScrollTableRow(int rowKey) {
                 this.rowKey = rowKey;
                 rowElement = Document.get().createTRElement();
                 setElement(rowElement);
-                DOM.sinkEvents(getElement(), Event.ONMOUSEUP | Event.ONDBLCLICK
-                        | Event.ONCONTEXTMENU);
+                DOM.sinkEvents(getElement(), Event.MOUSEEVENTS
+                        | Event.ONDBLCLICK | Event.ONCONTEXTMENU);
             }
 
             private void paintComponent(Paintable p, UIDL uidl) {
@@ -2458,6 +2465,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler {
                             handleClickEvent(event, targetTdOrTr);
                             break;
                         case Event.ONMOUSEUP:
+                            mDown = false;
                             handleClickEvent(event, targetTdOrTr);
                             if (event.getButton() == Event.BUTTON_LEFT
                                     && selectMode > Table.SELECT_MODE_NONE) {
@@ -2479,6 +2487,31 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler {
                         case Event.ONCONTEXTMENU:
                             showContextMenu(event);
                             break;
+                        case Event.ONMOUSEDOWN:
+                            if (dragmode != 0) {
+                                mDown = true;
+                                event.preventDefault();
+                            }
+                            break;
+                        case Event.ONMOUSEOUT:
+                            mDown = false;
+                            break;
+                        case Event.ONMOUSEMOVE:
+                            if (mDown && dragmode != 0) {
+                                Transferable transferable = new Transferable();
+                                transferable.setComponent(VScrollTable.this);
+                                transferable.setItemId("" + rowKey);
+
+                                // TODO propertyId
+                                com.vaadin.terminal.gwt.client.ui.dd.DragEvent ev = DragAndDropManager
+                                        .get().startDrag(transferable, event,
+                                                true);
+                                Element cloneNode = (Element) getElement()
+                                        .cloneNode(true);
+                                cloneNode.getStyle().setOpacity(0.4);
+                                ev.setDragImage(cloneNode);
+                                mDown = false;
+                            }
                         default:
                             break;
                         }
index 3394821efba82240691ec1a15c24b56ee931b9a3..f3fa28c6565be99717224b0518ae634b62cc154c 100644 (file)
@@ -9,7 +9,11 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.dom.client.Style;
+import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.Window;
@@ -22,11 +26,20 @@ import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
+import com.vaadin.terminal.gwt.client.ValueMap;
+import com.vaadin.terminal.gwt.client.ui.dd.AbstractDropHandler;
+import com.vaadin.terminal.gwt.client.ui.dd.AcceptCallback;
+import com.vaadin.terminal.gwt.client.ui.dd.DragAndDropManager;
+import com.vaadin.terminal.gwt.client.ui.dd.DragEvent;
+import com.vaadin.terminal.gwt.client.ui.dd.DropHandler;
+import com.vaadin.terminal.gwt.client.ui.dd.HasDropHandler;
+import com.vaadin.terminal.gwt.client.ui.dd.Transferable;
+import com.vaadin.terminal.gwt.client.ui.dd.DragAndDropManager.DragEventType;
 
 /**
  * 
  */
-public class VTree extends FlowPanel implements Paintable {
+public class VTree extends FlowPanel implements Paintable, HasDropHandler {
 
     public static final String CLASSNAME = "v-tree";
 
@@ -37,6 +50,7 @@ public class VTree extends FlowPanel implements Paintable {
     private String paintableId;
     private boolean selectable;
     private boolean isMultiselect;
+    private String currentMouseOverKey;
 
     private final HashMap<String, TreeNode> keyToNode = new HashMap<String, TreeNode>();
 
@@ -56,6 +70,10 @@ public class VTree extends FlowPanel implements Paintable {
 
     private boolean rendering;
 
+    private int dragModes;
+
+    private AbstractDropHandler dropHandler;
+
     public VTree() {
         super();
         setStyleName(CLASSNAME);
@@ -116,6 +134,9 @@ public class VTree extends FlowPanel implements Paintable {
             if ("actions".equals(childUidl.getTag())) {
                 updateActionMap(childUidl);
                 continue;
+            } else if ("dh".equals(childUidl.getTag())) {
+                updateDropHandler(childUidl);
+                continue;
             }
             final TreeNode childTree = new TreeNode();
             if (childTree.ie6compatnode != null) {
@@ -132,10 +153,161 @@ public class VTree extends FlowPanel implements Paintable {
 
         selectedIds = uidl.getStringArrayVariableAsSet("selected");
 
+        if (uidl.hasAttribute("dragModes")) {
+            dragModes = uidl.getIntAttribute("dragModes");
+        }
+
         rendering = false;
 
     }
 
+    private void updateTreeRelatedTransferData(DragEvent drag) {
+        drag.getTransferrable().setData("itemIdOver", currentMouseOverKey);
+
+        if (currentMouseOverKey != null) {
+            String detail = getDropDetail(drag.getCurrentGwtEvent());
+            Boolean overTreeNode = null;
+            if (!keyToNode.get(currentMouseOverKey).isLeaf()
+                    && "Center".equals(detail)) {
+                overTreeNode = true;
+            }
+            drag.getTransferrable().setData("itemIdOverIsNode", overTreeNode);
+
+            drag.getTransferrable().setData("detail", detail);
+
+        }
+    }
+
+    private void updateDropHandler(UIDL childUidl) {
+        if (dropHandler == null) {
+            dropHandler = new AbstractDropHandler() {
+
+                @Override
+                public void dragEnter(DragEvent drag) {
+                    updateTreeRelatedTransferData(drag);
+                    super.dragEnter(drag);
+                }
+
+                @Override
+                protected void dragAccepted(final DragEvent drag) {
+                }
+
+                @Override
+                public void dragOver(final DragEvent currentDrag) {
+                    final Object oldIdOver = currentDrag.getTransferrable()
+                            .getData("itemIdOver");
+                    final String oldDetail = (String) currentDrag
+                            .getTransferrable().getData("detail");
+                    /*
+                     * Using deferred command, so event bubbles to TreeNode
+                     * event listener. Currently here via preview
+                     */
+                    DeferredCommand.addCommand(new Command() {
+                        public void execute() {
+                            final String detail = getDropDetail(currentDrag
+                                    .getCurrentGwtEvent());
+                            boolean nodeHasChanged = (currentMouseOverKey != null && currentMouseOverKey != oldIdOver)
+                                    || (oldIdOver != null);
+                            boolean detailHasChanded = !detail
+                                    .equals(oldIdOver);
+
+                            if (nodeHasChanged || detailHasChanded) {
+                                ApplicationConnection.getConsole().log(
+                                        "Change in Transferable "
+                                                + currentMouseOverKey + " "
+                                                + detail);
+
+                                updateTreeRelatedTransferData(currentDrag);
+                                AcceptCallback accpectedCb = new AcceptCallback() {
+                                    public void handleResponse(
+                                            ValueMap responseData) {
+                                        if (responseData == null // via client
+                                                // side
+                                                // validation
+                                                || responseData
+                                                        .containsKey("accepted")) {
+                                            keyToNode.get(currentMouseOverKey)
+                                                    .emphasis(detail);
+                                        }
+                                    }
+                                };
+                                if (validateOnServer()) {
+                                    DragAndDropManager.get().visitServer(
+                                            DragEventType.OVER, accpectedCb);
+
+                                } else {
+                                    if (validates(currentDrag
+                                            .getTransferrable())) {
+                                        accpectedCb.handleResponse(null);
+                                    } else {
+                                        keyToNode.get(currentMouseOverKey)
+                                                .emphasis(null);
+                                    }
+                                    if (oldIdOver != null
+                                            && oldIdOver != currentMouseOverKey) {
+                                        keyToNode.get(oldIdOver).emphasis(null);
+                                    }
+                                }
+                            }
+
+                        }
+                    });
+                }
+
+                @Override
+                public void dragLeave(DragEvent drag) {
+                    cleanUp();
+                }
+
+                private void cleanUp() {
+                    if (currentMouseOverKey != null) {
+                        keyToNode.get(currentMouseOverKey).emphasis(null);
+                        currentMouseOverKey = null;
+                    }
+                }
+
+                @Override
+                public boolean drop(DragEvent drag) {
+                    cleanUp();
+                    return super.drop(drag);
+                }
+
+                @Override
+                public Paintable getPaintable() {
+                    return VTree.this;
+                }
+
+                public ApplicationConnection getApplicationConnection() {
+                    return client;
+                }
+
+            };
+        }
+        dropHandler.updateRules(childUidl);
+    }
+
+    public String getDropDetail(NativeEvent event) {
+        TreeNode treeNode = keyToNode.get(currentMouseOverKey);
+        // TODO no scroll support
+        int offsetHeight = treeNode.nodeCaptionDiv.getOffsetHeight();
+        int absoluteTop = treeNode.getAbsoluteTop();
+        int clientY = event.getClientY();
+        int fromTop = clientY - absoluteTop;
+
+        String detail;
+        float percentageFromTop = (fromTop / (float) offsetHeight);
+        if (percentageFromTop < 0.2) {
+            detail = "Top";
+        } else if (percentageFromTop > 0.8) {
+            detail = "Bottom";
+        } else {
+            detail = "Center";
+        }
+
+        return detail;
+
+    }
+
     private void handleUpdate(UIDL uidl) {
         final TreeNode rootNode = keyToNode.get(uidl
                 .getStringAttribute("rootKey"));
@@ -204,12 +376,27 @@ public class VTree extends FlowPanel implements Paintable {
 
         private Element ie6compatnode;
 
+        private Event mouseDownEvent;
+
         public TreeNode() {
             constructDom();
-            sinkEvents(Event.ONCLICK | Event.ONDBLCLICK | Event.ONMOUSEUP
+            sinkEvents(Event.ONCLICK | Event.ONDBLCLICK | Event.MOUSEEVENTS
                     | Event.ONCONTEXTMENU);
         }
 
+        public void emphasis(String string) {
+            // ApplicationConnection.getConsole().log("OUTLINE" + string);
+            Style style = nodeCaptionDiv.getStyle();
+            String top = "Top".equals(string) ? "2px solid green" : null;
+            String bottom = "Bottom".equals(string) ? "2px solid green" : null;
+            String bg = "Center".equals(string) ? "green" : null;
+
+            style.setProperty("borderTop", top);
+            style.setProperty("borderBottom", bottom);
+            style.setBackgroundColor(bg);
+
+        }
+
         @Override
         public void onBrowserEvent(Event event) {
             super.onBrowserEvent(event);
@@ -235,6 +422,45 @@ public class VTree extends FlowPanel implements Paintable {
             } else if (type == Event.ONCONTEXTMENU) {
                 showContextMenu(event);
             }
+
+            if (dragModes != 0 || dropHandler != null) {
+                if (type == Event.ONMOUSEDOWN) {
+                    if (nodeCaptionDiv.isOrHasChild(event.getTarget())) {
+                        ApplicationConnection.getConsole().log(
+                                "TreeNode m down");
+                        event.preventDefault(); // prevent text selection
+                        mouseDownEvent = event;
+                    }
+                } else if (type == Event.ONMOUSEMOVE
+                        || type == Event.ONMOUSEOUT) {
+
+                    if (mouseDownEvent != null) {
+                        ApplicationConnection.getConsole().log(
+                                "TreeNode drag start " + event.getType());
+                        // start actual drag on slight move when mouse is down
+                        Transferable t = new Transferable();
+                        t.setComponent(VTree.this);
+                        t.setItemId(key);
+                        DragEvent drag = DragAndDropManager.get().startDrag(t,
+                                mouseDownEvent, true);
+                        Element node = (Element) nodeCaptionDiv.cloneNode(true);
+                        node.getStyle().setOpacity(0.4);
+                        node.getStyle().setBackgroundColor("#999");
+                        drag.setDragImage(node);
+                        event.stopPropagation();
+
+                        mouseDownEvent = null;
+                    }
+                } else if (type == Event.ONMOUSEUP) {
+                    mouseDownEvent = null;
+                }
+                if (type == Event.ONMOUSEOVER) {
+                    mouseDownEvent = null;
+                    currentMouseOverKey = key;
+                    event.stopPropagation();
+                }
+
+            }
         }
 
         private void fireClick(Event evt) {
@@ -344,6 +570,10 @@ public class VTree extends FlowPanel implements Paintable {
             }
         }
 
+        public boolean isLeaf() {
+            return getStyleName().contains("leaf");
+        }
+
         private void setState(boolean state, boolean notifyServer) {
             if (open == state) {
                 return;
@@ -484,4 +714,8 @@ public class VTree extends FlowPanel implements Paintable {
             }
         }
     }
+
+    public DropHandler getDropHandler() {
+        return dropHandler;
+    }
 }
index 2bc10b4cc09a9914ba5397d18df2449be9a8bb86..d6fa230f3cbc39d9b8cf8e3f45add8dbba028c3f 100644 (file)
@@ -316,6 +316,8 @@ public abstract class AbstractCommunicationManager implements
 
     private int timeoutInterval = -1;
 
+    private DragAndDropService dragAndDropService;
+
     /**
      * TODO New constructor - document me!
      * 
@@ -939,6 +941,10 @@ public abstract class AbstractCommunicationManager implements
             // add any pending locale definitions requested by the client
             printLocaleDeclarations(outWriter);
 
+            if (dragAndDropService != null) {
+                dragAndDropService.printJSONResponse(outWriter);
+            }
+
             outWriter.print("}]");
         }
         outWriter.flush();
@@ -1006,8 +1012,7 @@ public abstract class AbstractCommunicationManager implements
                     if (i + 1 < variableRecords.length) {
                         nextVariable = variableRecords[i + 1];
                     }
-                    final VariableOwner owner = (VariableOwner) idPaintableMap
-                            .get(variable[VAR_PID]);
+                    final VariableOwner owner = getVariableOwner(variable[VAR_PID]);
                     if (owner != null && owner.isEnabled()) {
                         // TODO this should be Map<String, Object>, but the
                         // VariableOwner API does not guarantee the key is a
@@ -1058,8 +1063,13 @@ public abstract class AbstractCommunicationManager implements
                                 }
                             }
                         } catch (Exception e) {
-                            handleChangeVariablesError(application2,
-                                    (Component) owner, e, m);
+                            if (owner instanceof Component) {
+                                handleChangeVariablesError(application2,
+                                        (Component) owner, e, m);
+                            } else {
+                                // TODO DragDropService error handling
+                                throw new RuntimeException(e);
+                            }
                         }
                     } else {
 
@@ -1112,6 +1122,21 @@ public abstract class AbstractCommunicationManager implements
         return success;
     }
 
+    private VariableOwner getVariableOwner(String string) {
+        VariableOwner owner = (VariableOwner) idPaintableMap.get(string);
+        if (owner == null && string.startsWith("DD")) {
+            return getDragAndDropService();
+        }
+        return owner;
+    }
+
+    private VariableOwner getDragAndDropService() {
+        if (dragAndDropService == null) {
+            dragAndDropService = new DragAndDropService();
+        }
+        return dragAndDropService;
+    }
+
     /**
      * Reads the request data from the Request and returns it converted to an
      * UTF-8 string.
index 406ee9072df60e1c139d3f760d245c3d79ab70cb..e8a6ae5a9d6efaad710e6f12699ae1594a802be7 100644 (file)
@@ -50,6 +50,7 @@ public class AbsoluteLayout extends AbstractLayout {
     public void addComponent(Component c) {
         components.add(c);
         super.addComponent(c);
+        requestRepaint();
     }
 
     @Override
index 26495a3715f9ec80e5767e60501c1992ce7fbea3..0baa0dd4682816e9192ae77f897750e2331e3523 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/* 
 @ITMillApache2LicenseForJavaFiles@
  */
 
@@ -37,8 +37,6 @@ import com.vaadin.terminal.gwt.client.ui.VCustomLayout;
  * </p>
  * 
  * @author IT Mill Ltd.
- * @author Duy B. Vo (<a
- *         href="mailto:devduy@gmail.com?subject=Vaadin">devduy@gmail.com</a>)
  * @version
  * @VERSION@
  * @since 3.0
@@ -58,14 +56,6 @@ public class CustomLayout extends AbstractLayout {
 
     private String templateName = null;
 
-    /**
-     * Default constructor only used by subclasses because the subclasses are
-     * responsible for setting the appropriate fields.
-     */
-    protected CustomLayout() {
-        setWidth(100, UNITS_PERCENTAGE);
-    }
-
     /**
      * Constructs a custom layout with the template given in the stream.
      * 
@@ -78,24 +68,10 @@ public class CustomLayout extends AbstractLayout {
      * @throws IOException
      */
     public CustomLayout(InputStream templateStream) throws IOException {
-        this();
-        initTemplateContentsFromInputStream(templateStream);
-    }
-
-    /**
-     * Constructor for custom layout with given template name. Template file is
-     * fetched from "<theme>/layout/<templateName>".
-     */
-    public CustomLayout(String template) {
-        this();
-        templateName = template;
-    }
 
-    protected void initTemplateContentsFromInputStream(
-            InputStream templateStream) throws IOException {
         InputStreamReader reader = new InputStreamReader(templateStream,
                 "UTF-8");
-        StringBuilder b = new StringBuilder(BUFFER_SIZE);
+        StringBuffer b = new StringBuffer(BUFFER_SIZE);
 
         char[] cbuf = new char[BUFFER_SIZE];
         int offset = 0;
@@ -109,6 +85,16 @@ public class CustomLayout extends AbstractLayout {
         }
 
         templateContents = b.toString();
+        setWidth(100, UNITS_PERCENTAGE);
+    }
+
+    /**
+     * Constructor for custom layout with given template name. Template file is
+     * fetched from "<theme>/layout/<templateName>".
+     */
+    public CustomLayout(String template) {
+        templateName = template;
+        setWidth(100, UNITS_PERCENTAGE);
     }
 
     /**
@@ -260,9 +246,7 @@ public class CustomLayout extends AbstractLayout {
      * 
      * @param name
      *            template name
-     * @deprecated Use {@link #setTemplateName(String)} instead
      */
-    @Deprecated
     @Override
     public void setStyle(String name) {
         setTemplateName(name);
@@ -273,11 +257,6 @@ public class CustomLayout extends AbstractLayout {
         return templateName;
     }
 
-    /** Get the contents of the template */
-    public String getTemplateContents() {
-        return templateContents;
-    }
-
     /**
      * Set the name of the template used to draw custom layout.
      * 
@@ -293,17 +272,6 @@ public class CustomLayout extends AbstractLayout {
         requestRepaint();
     }
 
-    /**
-     * Set the contents of the template used to draw the custom layout.
-     * 
-     * @param templateContents
-     */
-    public void setTemplateContents(String templateContents) {
-        this.templateContents = templateContents;
-        templateName = null;
-        requestRepaint();
-    }
-
     /**
      * Although most layouts support margins, CustomLayout does not. The
      * behaviour of this layout is determined almost completely by the actual
index e8e0dfebaab94a7220fb4a9143b404d6cf75ef1d..4174001d8739112c08c39a27c30494550ead1731 100644 (file)
@@ -234,6 +234,12 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering,
         currentPage = -1; // current page is always set by client
 
         optionRequest = true;
+
+        // Hide the error indicator if needed
+        if (isRequired() && isEmpty() && getComponentError() == null
+                && getErrorMessage() != null) {
+            target.addAttribute("hideErrors", true);
+        }
     }
 
     /**
index 0563756d40e869b829feba5674184b5da6528329..5b99f614f1f4d39b1d54e921e35eaee991c0d193 100644 (file)
@@ -23,7 +23,9 @@ import com.vaadin.data.Property;
 import com.vaadin.data.util.ContainerOrderedWrapper;
 import com.vaadin.data.util.IndexedContainer;
 import com.vaadin.event.Action;
+import com.vaadin.event.DataBindedTransferrable;
 import com.vaadin.event.ItemClickEvent;
+import com.vaadin.event.Transferable;
 import com.vaadin.event.Action.Handler;
 import com.vaadin.event.ItemClickEvent.ItemClickListener;
 import com.vaadin.event.ItemClickEvent.ItemClickSource;
@@ -31,6 +33,7 @@ import com.vaadin.terminal.KeyMapper;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
+import com.vaadin.terminal.TransferTranslator;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.VScrollTable;
 
@@ -54,7 +57,15 @@ import com.vaadin.terminal.gwt.client.ui.VScrollTable;
 @SuppressWarnings("serial")
 @ClientWidget(VScrollTable.class)
 public class Table extends AbstractSelect implements Action.Container,
-        Container.Ordered, Container.Sortable, ItemClickSource {
+        Container.Ordered, Container.Sortable, ItemClickSource,
+        TransferTranslator {
+
+    /**
+     * Modes that Table support as drag sourse.
+     */
+    public enum DragModes {
+        NONE, ROWS, CELLS
+    }
 
     private static final int CELL_KEY = 0;
 
@@ -327,6 +338,8 @@ public class Table extends AbstractSelect implements Action.Container,
 
     private double cacheRate = CACHE_RATE_DEFAULT;
 
+    private DragModes dragMode = DragModes.NONE;
+
     /* Table constructors */
 
     /**
@@ -2014,6 +2027,10 @@ public class Table extends AbstractSelect implements Action.Container,
             target.addAttribute("tabindex", getTabIndex());
         }
 
+        if (dragMode != DragModes.NONE) {
+            target.addAttribute("dragmode", dragMode.ordinal());
+        }
+
         // Initialize temps
         final Object[] colids = getVisibleColumns();
         final int cols = colids.length;
@@ -3299,4 +3316,61 @@ public class Table extends AbstractSelect implements Action.Container,
             }
         }
     }
+
+    public void setDragMode(DragModes newDragMode) {
+        dragMode = newDragMode;
+        requestRepaint();
+    }
+
+    class TableTransferrable implements DataBindedTransferrable {
+
+        private final HashMap<String, Object> data = new HashMap<String, Object>();
+
+        public Object getItemId() {
+            return data.get("itemId");
+        }
+
+        public Object getPropertyId() {
+            return getItemCaptionPropertyId();
+        }
+
+        public Component getSourceComponent() {
+            return Table.this;
+        }
+
+        public Object getData(String dataFlawor) {
+            return data.get(dataFlawor);
+        }
+
+        public Collection<String> getDataFlawors() {
+            return data.keySet();
+        }
+
+        public void setData(String dataFlawor, Object value) {
+            data.put(dataFlawor, value);
+        }
+
+    }
+
+    private void updateTransferrable(Map<String, Object> rawVariables,
+            Transferable tr, boolean isDropTarget) {
+        Map<String, Object> payload = (Map<String, Object>) rawVariables
+                .get("payload");
+        if (!isDropTarget) {
+            Object object = payload.get("itemId");
+            if (object != null) {
+                tr.setData("itemId", itemIdMapper.get((String) object));
+                payload.remove("itemId");
+            }
+        }
+    }
+
+    public Transferable getTransferrable(Transferable transferable,
+            Map<String, Object> rawVariables, boolean isDropTarget) {
+        if (transferable == null) {
+            transferable = new TableTransferrable();
+        }
+        updateTransferrable(rawVariables, transferable, isDropTarget);
+        return transferable;
+    }
 }
index 28a410fa137f851ff715f53339def3161c09c461..8e5cd8aca7203d9343023db0aa37a17335a8f6ba 100644 (file)
@@ -22,14 +22,20 @@ import com.vaadin.data.Container;
 import com.vaadin.data.Item;
 import com.vaadin.data.util.ContainerHierarchicalWrapper;
 import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.event.AbstractDropHandler;
 import com.vaadin.event.Action;
+import com.vaadin.event.DataBindedTransferrable;
+import com.vaadin.event.DropHandler;
+import com.vaadin.event.HasDropHandler;
 import com.vaadin.event.ItemClickEvent;
+import com.vaadin.event.Transferable;
 import com.vaadin.event.ItemClickEvent.ItemClickListener;
 import com.vaadin.event.ItemClickEvent.ItemClickSource;
 import com.vaadin.terminal.KeyMapper;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
+import com.vaadin.terminal.TransferTranslator;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.VTree;
 
@@ -45,7 +51,7 @@ import com.vaadin.terminal.gwt.client.ui.VTree;
 @SuppressWarnings("serial")
 @ClientWidget(VTree.class)
 public class Tree extends AbstractSelect implements Container.Hierarchical,
-        Action.Container, ItemClickSource {
+        Action.Container, ItemClickSource, TransferTranslator, HasDropHandler {
 
     private static final Method EXPAND_METHOD;
 
@@ -102,6 +108,68 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
      */
     private boolean initialPaint = true;
 
+    // TODO sort DD members and methods
+    public static int DRAG_SORTABLE = 1;
+    public static int DRAG_OUT = 2;
+    public static int DRAG_NONE = 0;
+
+    private int itemDragModes = DRAG_OUT;
+
+    class TreeTransferrable implements DataBindedTransferrable {
+
+        private final HashMap<String, Object> data = new HashMap<String, Object>();
+
+        public Object getItemId() {
+            return data.get("itemId");
+        }
+
+        public Object getPropertyId() {
+            return getItemCaptionPropertyId();
+        }
+
+        public Component getSourceComponent() {
+            return Tree.this;
+        }
+
+        public Object getData(String dataFlawor) {
+            return data.get(dataFlawor);
+        }
+
+        public Collection<String> getDataFlawors() {
+            return data.keySet();
+        }
+
+        public void setData(String dataFlawor, Object value) {
+            data.put(dataFlawor, value);
+        }
+    }
+
+    public Transferable getTransferrable(Transferable transferable,
+            Map<String, Object> rawVariables, boolean isDropTarget) {
+        if (transferable == null) {
+            transferable = new TreeTransferrable();
+        }
+        Map<String, Object> payload = (Map<String, Object>) rawVariables
+                .get("payload");
+        if (isDropTarget) {
+            // updating drag target variables
+            Object object = payload.get("itemIdOver");
+            Object object2 = itemIdMapper.get((String) object);
+            transferable.setData("itemIdOver", object2);
+            payload.remove("itemIdOver");
+        } else {
+            // updating drag source variables
+            Object object = payload.get("itemId");
+            if (object != null) {
+                transferable.setData("itemId", itemIdMapper
+                        .get((String) object));
+            }
+            payload.remove("itemId");
+        }
+
+        return transferable;
+    }
+
     /* Tree constructors */
 
     /**
@@ -435,6 +503,10 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
                 target.addAttribute("nullselect", true);
             }
 
+            if (itemDragModes != 0) {
+                target.addAttribute("dragModes", itemDragModes);
+            }
+
         }
 
         // Initialize variables
@@ -579,6 +651,11 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
 
             // New items
             target.addVariable(this, "newitem", new String[] {});
+
+            if (abstractDropHandler != null) {
+                abstractDropHandler.paint(target);
+            }
+
         }
     }
 
@@ -1019,6 +1096,8 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
 
     private ItemStyleGenerator itemStyleGenerator;
 
+    private AbstractDropHandler abstractDropHandler;
+
     public void addListener(ItemClickListener listener) {
         addListener(VTree.ITEM_CLICK_EVENT_ID, ItemClickEvent.class, listener,
                 ItemClickEvent.ITEM_CLICK_METHOD);
@@ -1075,4 +1154,12 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
         return super.removeItem(itemId);
     }
 
+    public DropHandler getDropHandler() {
+        return abstractDropHandler;
+    }
+
+    public void setDropHandler(AbstractDropHandler abstractDropHandler) {
+        this.abstractDropHandler = abstractDropHandler;
+    }
+
 }
index 40e27920a85b38ba713abf65f4f773c59a1bc5b3..ef2c784e152a18cbd24bdb1ac83161ef4d15e8de 100644 (file)
        <td></td>
        <td></td>
 </tr>
-<tr>
-       <td>focus</td>
-       <td>vaadin=runcomvaadintestscomponentsabstractfieldAbstractFieldCommitWithInvalidValues::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
-       <td></td>
-</tr>
 <tr>
        <td>click</td>
        <td>vaadin=runcomvaadintestscomponentsabstractfieldAbstractFieldCommitWithInvalidValues::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]</td>
index 0d5b435609ef9a38e59c905ee848b79dd35eb87b..b0305e60dcf12710bf849a95557a12f9fa80a785 100644 (file)
        <td></td>
        <td></td>
 </tr>
-<tr>
-       <td>focus</td>
-       <td>vaadin=runcomvaadintestscomponentsformFormCommitWithInvalidValues::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]</td>
-       <td></td>
-</tr>
 <tr>
        <td>click</td>
        <td>vaadin=runcomvaadintestscomponentsformFormCommitWithInvalidValues::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]</td>
diff --git a/tests/src/com/vaadin/tests/layouts/GridLayoutNPE.java b/tests/src/com/vaadin/tests/layouts/GridLayoutNPE.java
new file mode 100644 (file)
index 0000000..5f67aa1
--- /dev/null
@@ -0,0 +1,72 @@
+package com.vaadin.tests.layouts;\r
+\r
+import com.vaadin.tests.components.TestBase;\r
+import com.vaadin.ui.Button;\r
+import com.vaadin.ui.GridLayout;\r
+import com.vaadin.ui.Label;\r
+import com.vaadin.ui.VerticalLayout;\r
+import com.vaadin.ui.Button.ClickEvent;\r
+\r
+public class GridLayoutNPE extends TestBase {\r
+\r
+    @Override\r
+    protected void setup() {\r
+        final VerticalLayout lo = new VerticalLayout();\r
+\r
+        final GridLayout gl = new GridLayout(2, 1);\r
+        gl.setSpacing(true);\r
+\r
+        final Label toRemove = new Label("First");\r
+        gl.addComponent(toRemove);\r
+        final Label toEdit = new Label("Second");\r
+        gl.addComponent(toEdit);\r
+\r
+        final Button b = new Button("remove 'First'");\r
+        final Button b2 = new Button("edit 'Second'");\r
+        b2.setVisible(false);\r
+\r
+        lo.addComponent(gl);\r
+        lo.addComponent(b);\r
+        lo.addComponent(b2);\r
+\r
+        b.addListener(new Button.ClickListener() {\r
+\r
+            public void buttonClick(Button.ClickEvent event) {\r
+                gl.removeComponent(toRemove);\r
+\r
+                // move another component to where the first was removed\r
+                // before rendering to the client\r
+                gl.removeComponent(toEdit);\r
+                // this could also be the result of removeAllComponents()\r
+                // followed by a loop of addComponent(c)\r
+                gl.addComponent(toEdit, 0, 0);\r
+\r
+                b.setVisible(false);\r
+                b2.setVisible(true);\r
+\r
+            }\r
+\r
+        });\r
+\r
+        b2.addListener(new Button.ClickListener() {\r
+\r
+            public void buttonClick(ClickEvent event) {\r
+                toEdit.setValue("Second (edited)");\r
+            }\r
+\r
+        });\r
+\r
+        addComponent(lo);\r
+    }\r
+\r
+    @Override\r
+    protected String getDescription() {\r
+        return "VGridLayout throws an NPE, causing client side to crash";\r
+    }\r
+\r
+    @Override\r
+    protected Integer getTicketNumber() {\r
+        return 4019;\r
+    }\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.html b/tests/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.html
deleted file mode 100644 (file)
index 3d5f70f..0000000
+++ /dev/null
@@ -1,402 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8080/run/com.vaadin.tests.validation.EmptyFieldErrorIndicators?restartApplication" />
-<title>EmptyFieldErrorIndicators</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">EmptyFieldErrorIndicators</td></tr>
-</thead><tbody>
-<tr>
-       <td>open</td>
-       <td>/run/com.vaadin.tests.validation.EmptyFieldErrorIndicators?restartApplication</td>
-       <td></td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>screenCapture</td>
-       <td></td>
-       <td>initial</td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VDateFieldCalendar[0]/domChild[0]/domChild[1]/domChild[2]/domChild[0]/domChild[0]/domChild[4]</td>
-       <td>168</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>click</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
-       <td></td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>click</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
-       <td></td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>screenCapture</td>
-       <td></td>
-       <td>emptyValidated</td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VTextField[0]</td>
-       <td>22,15</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>enterCharacter</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VTextField[0]</td>
-       <td>a</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VPopupCalendar[0]/domChild[1]</td>
-       <td>15,10</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[3]</td>
-       <td>312</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[2]/td/table/tbody/tr[3]/td[1]/span</td>
-       <td>12,8</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[4]</td>
-       <td>5980</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VDateFieldCalendar[0]/domChild[0]/domChild[1]/domChild[1]/domChild[0]/domChild[0]/domChild[1]/domChild[2]/domChild[0]/domChild[0]</td>
-       <td>17,11</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VDateFieldCalendar[0]/domChild[0]/domChild[1]/domChild[2]/domChild[0]/domChild[0]/domChild[6]</td>
-       <td>6496</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VPopupCalendar[1]/domChild[1]</td>
-       <td>11,12</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[3]</td>
-       <td>364</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[2]/td/table/tbody/tr[3]/td[1]/span</td>
-       <td>19,9</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[4]</td>
-       <td>9919</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VFilterSelect[1]/domChild[1]</td>
-       <td>11,11</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>//div[@id='VAADIN_COMBOBOX_OPTIONLIST']/div/div[2]/table/tbody/tr[2]/td</td>
-       <td>55,0</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VOptionGroup[0]/domChild[0]/domChild[0]</td>
-       <td>9,3</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VOptionGroup[1]/domChild[0]/domChild[0]</td>
-       <td>11,7</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VTextField[0]</td>
-       <td>32,14</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>enterCharacter</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VTextField[0]</td>
-       <td>a</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VPopupCalendar[0]/domChild[1]</td>
-       <td>12,9</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[3]</td>
-       <td>520</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[2]/td/table/tbody/tr[3]/td[1]/span</td>
-       <td>12,12</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[4]</td>
-       <td>689</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VDateFieldCalendar[0]/domChild[0]/domChild[1]/domChild[1]/domChild[0]/domChild[0]/domChild[1]/domChild[2]/domChild[0]/domChild[0]</td>
-       <td>19,15</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VDateFieldCalendar[0]/domChild[0]/domChild[1]/domChild[2]/domChild[0]/domChild[0]/domChild[6]</td>
-       <td>798</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VPopupCalendar[1]/domChild[1]</td>
-       <td>11,15</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[2]</td>
-       <td>91</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[2]/td/table/tbody/tr[3]/td[1]/span</td>
-       <td>22,12</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>scroll</td>
-       <td>//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[4]</td>
-       <td>4303</td>
-</tr>
-<tr>
-       <td>pause</td>
-       <td>300</td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VFilterSelect[1]/domChild[1]</td>
-       <td>9,13</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>//div[@id='VAADIN_COMBOBOX_OPTIONLIST']/div/div[2]/table/tbody/tr[2]/td/span</td>
-       <td>23,9</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VOptionGroup[0]/domChild[0]/domChild[0]</td>
-       <td>5,6</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>mouseClick</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VOptionGroup[1]/domChild[0]/domChild[0]</td>
-       <td>7,7</td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>click</td>
-       <td>vaadin=runcomvaadintestsvalidationEmptyFieldErrorIndicators::PID_SvalidatedFieldPart/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
-       <td></td>
-</tr>
-<tr>
-       <td>waitForVaadin</td>
-       <td></td>
-       <td></td>
-</tr>
-<tr>
-       <td>screenCapture</td>
-       <td></td>
-       <td>filledValidated</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/tests/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java b/tests/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java
deleted file mode 100644 (file)
index 9ea28f6..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-package com.vaadin.tests.validation;\r
-\r
-import com.vaadin.data.Validator.InvalidValueException;\r
-import com.vaadin.data.validator.AbstractValidator;\r
-import com.vaadin.tests.components.TestBase;\r
-import com.vaadin.ui.Button;\r
-import com.vaadin.ui.ComponentContainer;\r
-import com.vaadin.ui.DateField;\r
-import com.vaadin.ui.Field;\r
-import com.vaadin.ui.Form;\r
-import com.vaadin.ui.HorizontalLayout;\r
-import com.vaadin.ui.InlineDateField;\r
-import com.vaadin.ui.NativeSelect;\r
-import com.vaadin.ui.OptionGroup;\r
-import com.vaadin.ui.Panel;\r
-import com.vaadin.ui.PopupDateField;\r
-import com.vaadin.ui.Select;\r
-import com.vaadin.ui.TextField;\r
-import com.vaadin.ui.VerticalLayout;\r
-import com.vaadin.ui.Button.ClickEvent;\r
-import com.vaadin.ui.Button.ClickListener;\r
-\r
-public class EmptyFieldErrorIndicators extends TestBase {\r
-\r
-    @Override\r
-    protected void setup() {\r
-        getLayout().setSizeFull();\r
-\r
-        HorizontalLayout hl = new HorizontalLayout();\r
-        hl.setSizeFull();\r
-        hl.setSpacing(true);\r
-\r
-        ComponentContainer part1 = createPart(\r
-                "Empty required fields validation", true, false);\r
-        part1.setDebugId("emptyFieldPart");\r
-        hl.addComponent(part1);\r
-\r
-        ComponentContainer part2 = createPart(\r
-                "Empty required fields with failing validator", true, true);\r
-        part1.setDebugId("validatedFieldPart");\r
-        hl.addComponent(part2);\r
-\r
-        Panel panel = new Panel();\r
-        panel.setSizeFull();\r
-        panel.setStyleName(Panel.STYLE_LIGHT);\r
-        panel.addComponent(hl);\r
-        panel.setScrollable(true);\r
-        addComponent(panel);\r
-    }\r
-\r
-    private ComponentContainer createPart(String caption, boolean required,\r
-            boolean failValidator) {\r
-        VerticalLayout part = new VerticalLayout();\r
-        part.setMargin(true);\r
-\r
-        final Form form = createForm(required, failValidator);\r
-        part.addComponent(form);\r
-\r
-        Button validate = new Button("Validate fields");\r
-        validate.addListener(new ClickListener() {\r
-            public void buttonClick(ClickEvent event) {\r
-                try {\r
-                    form.validate();\r
-                } catch (InvalidValueException e) {\r
-                }\r
-            }\r
-        });\r
-        part.addComponent(validate);\r
-\r
-        Panel panel = new Panel(caption, part);\r
-        panel.setHeight("100%");\r
-        return panel;\r
-    }\r
-\r
-    private Form createForm(final boolean required, final boolean failValidator) {\r
-        // hand-crafted form, not using form field factory\r
-        Form form = new Form() {\r
-            @Override\r
-            public void addField(Object propertyId, Field field) {\r
-                super.addField(propertyId, field);\r
-                field.setRequired(required);\r
-                field.setRequiredError("Missing required value!");\r
-                if (failValidator) {\r
-                    field\r
-                            .addValidator(new AbstractValidator(\r
-                                    "Validation error") {\r
-                                public boolean isValid(Object value) {\r
-                                    return false;\r
-                                }\r
-                            });\r
-                }\r
-            }\r
-        };\r
-        \r
-        form.addField("Field", new TextField("Text"));\r
-        form.addField("Date", new DateField("Date"));\r
-        form.addField("Inline Date", new InlineDateField("Date"));\r
-        form.addField("Popup Date", new PopupDateField("Date"));\r
-\r
-        form.addField("Native Select", new NativeSelect("NativeSelect"));\r
-\r
-        // in #4103, the Select component was behaving differently from others\r
-        form.addField("Select", new Select("Select"));\r
-\r
-        Select select2 = new Select("Select 2");\r
-        select2.addItem("Value 1");\r
-        form.addField("Select 2", select2);\r
-\r
-        OptionGroup optionGroup = new OptionGroup("OptionGroup");\r
-        optionGroup.setMultiSelect(false);\r
-        optionGroup.addItem("Option 1");\r
-        optionGroup.addItem("Option 2");\r
-        form.addField("Option Group 1", optionGroup);\r
-\r
-        OptionGroup optionGroup2 = new OptionGroup("OptionGroup");\r
-        optionGroup2.setMultiSelect(true);\r
-        optionGroup2.addItem("Option 1");\r
-        optionGroup2.addItem("Option 2");\r
-        form.addField("Option Group 2", optionGroup2);\r
-\r
-        // TODO could add more different fields\r
-\r
-        return form;\r
-    }\r
-\r
-    @Override\r
-    protected String getDescription() {\r
-        return "Fields on a form should not show the error indicator if required and empty";\r
-    }\r
-\r
-    @Override\r
-    protected Integer getTicketNumber() {\r
-        return 4013;\r
-    }\r
-\r
-}\r