diff options
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; + } + +} |