summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/build.xml50
-rw-r--r--build/maven/pom-template.xml2
-rw-r--r--src/com/vaadin/data/validator/AbstractValidator.java7
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java60
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VTextArea.java6
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VUpload.java6
-rw-r--r--src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java2
-rw-r--r--src/com/vaadin/ui/AbstractTextField.java48
-rw-r--r--tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.html132
-rw-r--r--tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.java142
10 files changed, 395 insertions, 60 deletions
diff --git a/build/build.xml b/build/build.xml
index ad90bc083b..d6bdfa6dd1 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -117,6 +117,8 @@
<property file="build/GWT-VERSION.properties" />
<property file="build/html-style.properties" />
+ <property name="snapshot.repository.url" value="http://oss.sonatype.org/content/repositories/vaadin-snapshots" />
+
<!-- Current timestamp in different formats. -->
<tstamp>
<format property="build.date" pattern="yyyy-MM-dd"/>
@@ -985,6 +987,40 @@
<echo>##teamcity[publishArtifacts '${result-path}/differences.txt']</echo>
</target>
+
+ <!-- ================================================================== -->
+ <!-- Custom build. -->
+ <!-- ================================================================== -->
+
+ <!-- Main target for the custom build. -->
+ <target name="custom-build" depends="clean-result, custom-build-init, nightly-init, package-init, init, compile-server-side, compile-client-side, vaadin.jar, vaadin-sources.jar">
+ </target>
+
+
+ <!-- Initialize a custom build. -->
+ <target name="custom-build-init">
+ <echo>Preparing a custom build with properties file: ${build.properties.file}</echo>
+
+ <!-- Custom build support -->
+ <antcontrib:if>
+ <isset property="build.properties.file"/>
+ <then>
+ <tstamp>
+ <format property="build.date.compact" pattern="yyyyMMdd"/>
+ </tstamp>
+ <property file="${build.properties.file}" />
+ <property name="version" value="${vaadin.version}"/>
+ <property name="version.full" value="${version}.custom-${build.date.compact}"/>
+ <property name="compile.only.default-widgetset" value="1"/>
+ </then>
+ <!-- Otherwise version and snapshot.repository.url come from target "init" -->
+ </antcontrib:if>
+ </target>
+
+ <target name="custom-build-maven-publish">
+ <antcall target="nightly-maven-publish" />
+ </target>
+
<!-- ================================================================== -->
<!-- Nightly build. -->
@@ -1078,13 +1114,12 @@
<target name="nightly-maven-pom.xml">
<echo>Creating pom.xml for nightly build</echo>
- <fail unless="version.major" message="Major version must be defined in version.major"/>
- <fail unless="version.minor" message="Major version must be defined in version.minor"/>
+ <property name="vaadin.version.maven" value="${version.major}.${version.minor}-SNAPSHOT" />
<copy tofile="build/maven/pom.xml">
<filterchain>
<expandproperties />
<replacetokens begintoken="@" endtoken="@">
- <token key="VERSION-MAJOR.MINOR" value="${version.major}.${version.minor}" />
+ <token key="MAVEN-VERSION" value="${vaadin.version.maven}" />
</replacetokens>
</filterchain>
<fileset file="build/maven/pom-template.xml"/>
@@ -1102,7 +1137,7 @@
<sysproperty key="file" value="../${result-path}/${lib-javadoc-jar-name}" />
<sysproperty key="pomFile" value="maven/pom.xml" />
<sysproperty key="repositoryId" value="vaadin-snapshots" />
- <sysproperty key="url" value="http://oss.sonatype.org/content/repositories/vaadin-snapshots" />
+ <sysproperty key="url" value="${snapshot.repository.url}" />
<sysproperty key="classifier" value="javadoc" />
<sysproperty key="uniqueVersion" value="false" />
<sysproperty key="gpg.passphrase" value="${gpg.passphrase}" />
@@ -1114,7 +1149,7 @@
<sysproperty key="file" value="../${result-path}/${lib-sources-jar-name}" />
<sysproperty key="pomFile" value="maven/pom.xml" />
<sysproperty key="repositoryId" value="vaadin-snapshots" />
- <sysproperty key="url" value="http://oss.sonatype.org/content/repositories/vaadin-snapshots" />
+ <sysproperty key="url" value="${snapshot.repository.url}" />
<sysproperty key="classifier" value="sources" />
<sysproperty key="uniqueVersion" value="false" />
<sysproperty key="gpg.passphrase" value="${gpg.passphrase}" />
@@ -1129,7 +1164,7 @@
<sysproperty key="file" value="../${output-dir}/WebContent/${lib-jar-name}" />
<sysproperty key="pomFile" value="maven/pom.xml" />
<sysproperty key="repositoryId" value="vaadin-snapshots" />
- <sysproperty key="url" value="http://oss.sonatype.org/content/repositories/vaadin-snapshots" />
+ <sysproperty key="url" value="${snapshot.repository.url}" />
<sysproperty key="gpg.passphrase" value="${gpg.passphrase}" />
</artifact:mvn>
</target>
@@ -1138,11 +1173,12 @@
<echo>Creating pom.xml for local test build</echo>
<fail unless="version.major" message="Major version must be defined in version.major"/>
<fail unless="version.minor" message="Major version must be defined in version.minor"/>
+ <property name="vaadin.version.maven" value="${version.major}.${version.minor}" />
<copy tofile="build/maven/pom.xml">
<filterchain>
<expandproperties />
<replacetokens begintoken="@" endtoken="@">
- <token key="VERSION-MAJOR.MINOR" value="${version.major}.${version.minor}" />
+ <token key="MAVEN-VERSION" value="${vaadin.version.maven}" />
</replacetokens>
</filterchain>
<fileset file="build/maven/pom-template.xml"/>
diff --git a/build/maven/pom-template.xml b/build/maven/pom-template.xml
index 5c2cb1a727..851642dd3c 100644
--- a/build/maven/pom-template.xml
+++ b/build/maven/pom-template.xml
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.vaadin</groupId>
<artifactId>vaadin</artifactId>
- <version>@VERSION-MAJOR.MINOR@-SNAPSHOT</version>
+ <version>@MAVEN-VERSION@</version>
<name>Vaadin</name>
<organization>
<name>Oy IT Mill Ltd</name>
diff --git a/src/com/vaadin/data/validator/AbstractValidator.java b/src/com/vaadin/data/validator/AbstractValidator.java
index 6ea2cae880..7d4f1c3a0d 100644
--- a/src/com/vaadin/data/validator/AbstractValidator.java
+++ b/src/com/vaadin/data/validator/AbstractValidator.java
@@ -43,12 +43,7 @@ public abstract class AbstractValidator implements Validator {
public void validate(Object value) throws InvalidValueException {
if (!isValid(value)) {
- String message;
- if (value == null) {
- message = errorMessage.replace("{0}", "null");
- } else {
- message = errorMessage.replace("{0}", value.toString());
- }
+ String message = errorMessage.replace("{0}", String.valueOf(value));
throw new InvalidValueException(message);
}
}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
index cdf130d792..63e6cc8415 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
@@ -4766,54 +4766,40 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
* target is this element or a child of it)
*/
private Element getEventTargetTdOrTr(Event event) {
- Element targetTdOrTr = null;
-
- final Element eventTarget = DOM.eventGetTarget(event);
- final Element eventTargetParent = DOM.getParent(eventTarget);
- final Element eventTargetGrandParent = DOM
- .getParent(eventTargetParent);
-
+ final Element eventTarget = event.getEventTarget().cast();
+ Widget widget = Util.findWidget(eventTarget, null);
final Element thisTrElement = getElement();
- if (eventTarget == thisTrElement) {
- // This was a click on the TR element
- targetTdOrTr = eventTarget;
- // rowTarget = true;
- } else if (thisTrElement == eventTargetParent) {
- // Target parent is the TR, so the actual target is the TD
- targetTdOrTr = eventTarget;
- } else if (thisTrElement == eventTargetGrandParent) {
- // Target grand parent is the TR, so the parent is the TD
- targetTdOrTr = eventTargetParent;
- } else {
+ if (widget != this) {
/*
* This is a workaround to make Labels, read only TextFields
* and Embedded in a Table clickable (see #2688). It is
* really not a fix as it does not work with a custom read
* only components (not extending VLabel/VEmbedded).
*/
- Widget widget = Util.findWidget(eventTarget, null);
- if (widget != this) {
- while (widget != null && widget.getParent() != this) {
- widget = widget.getParent();
- }
- if (widget != null) {
- // widget is now the closest widget to this row
- if (widget instanceof VLabel
- || widget instanceof VEmbedded
- || (widget instanceof VTextField && ((VTextField) widget)
- .isReadOnly())) {
- Element tdElement = eventTargetParent;
- while (DOM.getParent(tdElement) != thisTrElement) {
- tdElement = DOM.getParent(tdElement);
- }
- targetTdOrTr = tdElement;
- }
- }
+ while (widget != null && widget.getParent() != this) {
+ widget = widget.getParent();
+ }
+
+ if (!(widget instanceof VLabel)
+ && !(widget instanceof VEmbedded)
+ && !(widget instanceof VTextField && ((VTextField) widget)
+ .isReadOnly())) {
+ return null;
}
}
+ if (eventTarget == thisTrElement) {
+ // This was a click on the TR element
+ return thisTrElement;
+ }
- return targetTdOrTr;
+ // Iterate upwards until we find the TR element
+ Element element = eventTarget;
+ while (element != null
+ && element.getParentElement().cast() != thisTrElement) {
+ element = element.getParentElement().cast();
+ }
+ return element;
}
public void showContextMenu(Event event) {
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTextArea.java b/src/com/vaadin/terminal/gwt/client/ui/VTextArea.java
index 3e4724102d..842be7ce05 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VTextArea.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VTextArea.java
@@ -1,4 +1,4 @@
-/*
+/*
@ITMillApache2LicenseForJavaFiles@
*/
@@ -39,7 +39,7 @@ public class VTextArea extends VTextField {
}
if (getMaxLength() >= 0) {
- sinkEvents(Event.ONKEYPRESS);
+ sinkEvents(Event.ONKEYUP);
}
}
@@ -57,7 +57,7 @@ public class VTextArea extends VTextField {
@Override
public void onBrowserEvent(Event event) {
- if (getMaxLength() >= 0 && event.getTypeInt() == Event.ONKEYPRESS) {
+ if (getMaxLength() >= 0 && event.getTypeInt() == Event.ONKEYUP) {
Scheduler.get().scheduleDeferred(new Command() {
public void execute() {
if (getText().length() > getMaxLength()) {
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VUpload.java b/src/com/vaadin/terminal/gwt/client/ui/VUpload.java
index 206b89eb82..a49450e086 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VUpload.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VUpload.java
@@ -1,4 +1,4 @@
-/*
+/*
@ITMillApache2LicenseForJavaFiles@
*/
@@ -22,6 +22,7 @@ import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
+import com.vaadin.terminal.gwt.client.BrowserInfo;
import com.vaadin.terminal.gwt.client.Paintable;
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.VConsole;
@@ -44,7 +45,8 @@ public class VUpload extends SimplePanel implements Paintable {
&& !"".equals(fu.getFilename())) {
submit();
}
- } else if (event.getTypeInt() == Event.ONFOCUS) {
+ } else if (BrowserInfo.get().isIE()
+ && event.getTypeInt() == Event.ONFOCUS) {
// IE and user has clicked on hidden textarea part of upload
// field. Manually open file selector, other browsers do it by
// default.
diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java
index e3dd014dec..3a8ff9096f 100644
--- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java
+++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java
@@ -2192,7 +2192,7 @@ public abstract class AbstractCommunicationManager implements
public SimpleMultiPartInputStream(InputStream realInputStream,
String boundaryString) {
- boundary = (CRLF + DASHDASH + boundaryString + DASHDASH)
+ boundary = (CRLF + DASHDASH + boundaryString)
.toCharArray();
this.realInputStream = realInputStream;
}
diff --git a/src/com/vaadin/ui/AbstractTextField.java b/src/com/vaadin/ui/AbstractTextField.java
index 4ed76d367b..622b8d18d9 100644
--- a/src/com/vaadin/ui/AbstractTextField.java
+++ b/src/com/vaadin/ui/AbstractTextField.java
@@ -1,4 +1,4 @@
-/*
+/*
@ITMillApache2LicenseForJavaFiles@
*/
@@ -123,7 +123,20 @@ public abstract class AbstractTextField extends AbstractField implements
throw new IllegalStateException(
"Null values are not allowed if the null-representation is null");
}
- target.addVariable(this, "text", value);
+
+ if (requestRepaintInTextChangeEvent && !valueChangeInTextChangeEvent) {
+ /*
+ * If the repaint occurred in a text change event then we do not
+ * want to send back the old value since it will just overwrite the
+ * typed value so we send the last known value instead which is
+ * updated by the text change event.
+ */
+ target.addVariable(this, "text", lastKnownTextContent);
+ } else {
+ target.addVariable(this, "text", value);
+ }
+ requestRepaintInTextChangeEvent = false;
+ valueChangeInTextChangeEvent = false;
if (selectionPosition != -1) {
target.addAttribute("selpos", selectionPosition);
@@ -171,6 +184,22 @@ public abstract class AbstractTextField extends AbstractField implements
}
}
+ /**
+ * Flag for monitoring if a repaint gets requested in a text change event
+ */
+ private boolean requestRepaintInTextChangeEvent = false;
+
+ @Override
+ public void requestRepaint() {
+ if (textChangeEventPending) {
+ /*
+ * Textchange event listener triggered this repaint
+ */
+ requestRepaintInTextChangeEvent = true;
+ }
+ super.requestRepaint();
+ }
+
@Override
public void changeVariables(Object source, Map<String, Object> variables) {
changingVariables = true;
@@ -438,13 +467,26 @@ public abstract class AbstractTextField extends AbstractField implements
private void firePendingTextChangeEvent() {
if (textChangeEventPending) {
- textChangeEventPending = false;
fireEvent(new TextChangeEventImpl(this));
+ textChangeEventPending = false;
}
}
+ /**
+ * Flag for monitoring if the value got changed in a TextChangeEvent
+ * listener
+ */
+ protected boolean valueChangeInTextChangeEvent = false;
+
@Override
protected void setInternalValue(Object newValue) {
+ if (textChangeEventPending) {
+ /*
+ * Value changed in a TextChangeEvent listener
+ */
+ valueChangeInTextChangeEvent = true;
+ }
+
if (changingVariables && !textChangeEventPending) {
/*
* Fire a "simulated" text change event before value change event if
diff --git a/tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.html b/tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.html
new file mode 100644
index 0000000000..7ad0873c0f
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.html
@@ -0,0 +1,132 @@
+<?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="" />
+<title>TableClickAndDragOnIconAndComponents</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">TableClickAndDragOnIconAndComponents</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.table.TableClickAndDragOnIconAndComponents?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertNotCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[1]/domChild[1]/domChild[0]</td>
+ <td>38,13</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>assertNotCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[2]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0]</td>
+ <td>1,1</td>
+</tr>
+<tr>
+ <td>assertNotCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[2]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VLabel[0]</td>
+ <td>30,9</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>assertNotCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[2]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VTextField[0]</td>
+ <td>71,11</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>assertNotCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[2]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[2]/VTextField[1]</td>
+ <td>34,9</td>
+</tr>
+<tr>
+ <td>assertNotCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[2]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VEmbedded[0]/domChild[0]</td>
+ <td>9,8</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>assertNotCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[2]</td>
+ <td>v-selected</td>
+</tr>
+<tr>
+ <td>drag</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[4]/domChild[1]</td>
+ <td>2,16</td>
+</tr>
+<tr>
+ <td>drop</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[2]/domChild[1]/domChild[0]</td>
+ <td>22,18</td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableClickAndDragOnIconAndComponents::PID_Stestable-table/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[3]/domChild[1]/domChild[0]</td>
+ <td>foo 4foo</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.java b/tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.java
new file mode 100644
index 0000000000..ee04813ce6
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/table/TableClickAndDragOnIconAndComponents.java
@@ -0,0 +1,142 @@
+package com.vaadin.tests.components.table;
+
+import com.vaadin.data.Item;
+import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.event.DataBoundTransferable;
+import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.event.dd.DropHandler;
+import com.vaadin.event.dd.acceptcriteria.AcceptAll;
+import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
+import com.vaadin.terminal.Resource;
+import com.vaadin.terminal.ThemeResource;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Embedded;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.Table.ColumnGenerator;
+import com.vaadin.ui.Table.TableDragMode;
+import com.vaadin.ui.TextField;
+
+public class TableClickAndDragOnIconAndComponents extends TestBase {
+
+ private static final long serialVersionUID = -2534880024131980135L;
+ private Table table;
+
+ @Override
+ protected void setup() {
+ table = new Table();
+ table.addContainerProperty("foo", String.class, "foo");
+ table.addContainerProperty("red", String.class, "red");
+ table.addContainerProperty("icon", Resource.class, null);
+ table.setSelectable(true);
+ table.setRowHeaderMode(Table.ROW_HEADER_MODE_ICON_ONLY);
+ table.setItemIconPropertyId("icon");
+ table.setDebugId("testable-table");
+ addComponent(table);
+ for (int i = 0; i < 5; i++) {
+ addItemAfter(i + "foo", null);
+ }
+
+ table.addGeneratedColumn("Label", new ColumnGenerator() {
+
+ private static final long serialVersionUID = -5042109683675242407L;
+
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ Item item = source.getItem(itemId);
+ return new Label("" + item.getItemProperty("foo").getValue());
+ }
+ });
+ table.addGeneratedColumn("textField", new ColumnGenerator() {
+
+ private static final long serialVersionUID = -5042109683675242407L;
+
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ Item item = source.getItem(itemId);
+ TextField textfield = new TextField();
+ textfield.setValue(String.valueOf(item.getItemProperty("foo")
+ .getValue()));
+ return textfield;
+ }
+ });
+ table.addGeneratedColumn("readOnlyTextField", new ColumnGenerator() {
+
+ private static final long serialVersionUID = -5042109683675242407L;
+
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ Item item = source.getItem(itemId);
+ TextField textfield = new TextField();
+ textfield.setValue(String.valueOf(item.getItemProperty("foo")
+ .getValue()));
+ textfield.setReadOnly(true);
+ return textfield;
+ }
+ });
+ table.addGeneratedColumn("embedded", new ColumnGenerator() {
+
+ private static final long serialVersionUID = -5042109683675242407L;
+
+ public Component generateCell(Table source, Object itemId,
+ Object columnId) {
+ Embedded embedded = new Embedded(null, new ThemeResource(
+ "../runo/icons/16/ok.png"));
+ return embedded;
+ }
+ });
+
+ table.setDragMode(TableDragMode.ROW);
+ table.setDropHandler(new DropHandler() {
+
+ public AcceptCriterion getAcceptCriterion() {
+ return AcceptAll.get();
+ }
+
+ public void drop(DragAndDropEvent event) {
+ DataBoundTransferable t = (DataBoundTransferable) event
+ .getTransferable();
+ Object dragged = t.getItemId();
+
+ AbstractSelectTargetDetails dropData = ((AbstractSelectTargetDetails) event
+ .getTargetDetails());
+ Object target = dropData.getItemIdOver();
+
+ if (dragged == target || target == null) {
+ return;
+ }
+
+ IndexedContainer container = (IndexedContainer) table
+ .getContainerDataSource();
+ container.removeItem(dragged);
+ addItemAfter(dragged, target);
+ }
+ });
+ }
+
+ private void addItemAfter(Object itemId, Object afterItemId) {
+ Item item;
+ if (afterItemId != null) {
+ item = table.addItemAfter(afterItemId, itemId);
+ } else {
+ item = table.addItem(itemId);
+ }
+ item.getItemProperty("foo").setValue("foo " + itemId);
+ item.getItemProperty("red").setValue("red " + itemId);
+ item.getItemProperty("icon").setValue(
+ new ThemeResource("../runo/icons/16/ok.png"));
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Tests that you can click on a row icon in a table to select the row, or to drag the row. Verifies also that the table doesn't capture the click events meant for components inside the table";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 7026;
+ }
+
+}