Change-Id: Ief653c3f15d18fdd076f0fb80f8a91ae429a54d3tags/7.1.14
@@ -17,6 +17,7 @@ | |||
package com.vaadin.client.ui; | |||
import com.google.gwt.core.client.Scheduler; | |||
import com.google.gwt.dom.client.Element; | |||
import com.google.gwt.dom.client.Style.Overflow; | |||
import com.google.gwt.dom.client.Style.WhiteSpace; | |||
import com.google.gwt.dom.client.TextAreaElement; | |||
@@ -30,6 +31,7 @@ import com.google.gwt.user.client.DOM; | |||
import com.google.gwt.user.client.Event; | |||
import com.vaadin.client.BrowserInfo; | |||
import com.vaadin.client.Util; | |||
import com.vaadin.client.ui.dd.VDragCloneAware; | |||
/** | |||
* This class represents a multiline textfield (textarea). | |||
@@ -40,7 +42,7 @@ import com.vaadin.client.Util; | |||
* @author Vaadin Ltd. | |||
* | |||
*/ | |||
public class VTextArea extends VTextField { | |||
public class VTextArea extends VTextField implements VDragCloneAware { | |||
public static final String CLASSNAME = "v-textarea"; | |||
private boolean wordwrap = true; | |||
private MaxLengthHandler maxLengthHandler = new MaxLengthHandler(); | |||
@@ -294,4 +296,15 @@ public class VTextArea extends VTextField { | |||
// class instead of directly each other. | |||
} | |||
@Override | |||
public void initDragImageCopy(Element element) { | |||
// Fix for #13557 - drag image doesn't show original text area text. | |||
// It happens because "value" property is not copied into the cloned | |||
// element | |||
String value = getElement().getPropertyString("value"); | |||
if (value != null) { | |||
element.setPropertyString("value", value); | |||
} | |||
} | |||
} |
@@ -0,0 +1,40 @@ | |||
/* | |||
* Copyright 2000-2013 Vaadin Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not | |||
* use this file except in compliance with the License. You may obtain a copy of | |||
* the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |||
* License for the specific language governing permissions and limitations under | |||
* the License. | |||
*/ | |||
package com.vaadin.client.ui.dd; | |||
import com.google.gwt.dom.client.Element; | |||
/** | |||
* Widget could implement this interface if drag image requires additional | |||
* initialization/configuration. Method {@link #initDragImageCopy(Element)} | |||
* allows to change/correct drag image element when element is dragged via DnD. | |||
* | |||
* @since 7.1 | |||
* @author Vaadin Ltd | |||
*/ | |||
public interface VDragCloneAware { | |||
/** | |||
* This method is called for cloned <code>element</code> which corresponds | |||
* to the widget element. One could modify/correct this <code>element</code> | |||
* for drag image. | |||
* | |||
* @since 7.1 | |||
* @param element | |||
* cloned element of drag image | |||
*/ | |||
void initDragImageCopy(Element element); | |||
} |
@@ -20,11 +20,14 @@ import java.util.Map; | |||
import com.google.gwt.dom.client.Document; | |||
import com.google.gwt.dom.client.NativeEvent; | |||
import com.google.gwt.dom.client.Node; | |||
import com.google.gwt.dom.client.Style.Unit; | |||
import com.google.gwt.dom.client.TableElement; | |||
import com.google.gwt.dom.client.TableSectionElement; | |||
import com.google.gwt.event.dom.client.MouseOverEvent; | |||
import com.google.gwt.user.client.Element; | |||
import com.google.gwt.user.client.Event; | |||
import com.google.gwt.user.client.EventListener; | |||
import com.vaadin.client.BrowserInfo; | |||
import com.vaadin.client.Util; | |||
@@ -184,6 +187,7 @@ public class VDragEvent { | |||
cloneNode = table.cast(); | |||
} | |||
} | |||
syncContent(element, cloneNode); | |||
if (alignImageToEvent) { | |||
int absoluteTop = element.getAbsoluteTop(); | |||
int absoluteLeft = element.getAbsoluteLeft(); | |||
@@ -198,4 +202,31 @@ public class VDragEvent { | |||
} | |||
/** | |||
* Do additional content sync between <code>original</code> element and its | |||
* <code>copy</code> if needed. | |||
* | |||
* @since 7.1 | |||
* @param original | |||
* original element | |||
* @param copy | |||
* copy of original element | |||
*/ | |||
protected void syncContent(Element original, Element copy) { | |||
for (int i = 0; i < original.getChildCount(); i++) { | |||
Node child = original.getChild(i); | |||
if (child instanceof Element) { | |||
syncContent((Element) child, (Element) copy.getChild(i)); | |||
} | |||
} | |||
doSyncContent(original, copy); | |||
} | |||
private void doSyncContent(Element original, Element copy) { | |||
EventListener eventListener = Event.getEventListener(original); | |||
if (eventListener instanceof VDragCloneAware) { | |||
((VDragCloneAware) eventListener).initDragImageCopy(copy); | |||
} | |||
} | |||
} |
@@ -0,0 +1,56 @@ | |||
/* | |||
* Copyright 2000-2013 Vaadin Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not | |||
* use this file except in compliance with the License. You may obtain a copy of | |||
* the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |||
* License for the specific language governing permissions and limitations under | |||
* the License. | |||
*/ | |||
package com.vaadin.tests.components.draganddropwrapper; | |||
import com.vaadin.server.VaadinRequest; | |||
import com.vaadin.tests.components.AbstractTestUI; | |||
import com.vaadin.ui.DragAndDropWrapper; | |||
import com.vaadin.ui.DragAndDropWrapper.DragStartMode; | |||
import com.vaadin.ui.TextArea; | |||
import com.vaadin.ui.VerticalLayout; | |||
/** | |||
* Test UI for text area: drag image should contain text-area text. | |||
* | |||
* @since 7.1 | |||
* @author Vaadin Ltd | |||
*/ | |||
public class DragAndDropTextArea extends AbstractTestUI { | |||
@Override | |||
protected void setup(VaadinRequest request) { | |||
VerticalLayout dndLayout = new VerticalLayout(); | |||
TextArea area = new TextArea(); | |||
area.setValue("text"); | |||
dndLayout.addComponent(area); | |||
DragAndDropWrapper wrapper = new DragAndDropWrapper(dndLayout); | |||
wrapper.setDragStartMode(DragStartMode.WRAPPER); | |||
addComponent(wrapper); | |||
} | |||
@Override | |||
protected String getTestDescription() { | |||
return "Drag image for textarea should contain text-area text"; | |||
} | |||
@Override | |||
protected Integer getTicketNumber() { | |||
return 13557; | |||
} | |||
} |
@@ -0,0 +1,61 @@ | |||
/* | |||
* Copyright 2000-2013 Vaadin Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not | |||
* use this file except in compliance with the License. You may obtain a copy of | |||
* the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |||
* License for the specific language governing permissions and limitations under | |||
* the License. | |||
*/ | |||
package com.vaadin.tests.components.draganddropwrapper; | |||
import java.util.List; | |||
import org.junit.Assert; | |||
import org.junit.Test; | |||
import org.openqa.selenium.WebElement; | |||
import org.openqa.selenium.interactions.Actions; | |||
import com.vaadin.testbench.By; | |||
import com.vaadin.tests.tb3.MultiBrowserTest; | |||
/** | |||
* Test for drag image of text area which should contain text-area text. | |||
* | |||
* @since 7.1 | |||
* @author Vaadin Ltd | |||
*/ | |||
public class DragAndDropTextAreaTest extends MultiBrowserTest { | |||
@Test | |||
public void testTextAreaDndImage() { | |||
openTestURL(); | |||
WebElement wrapper = driver.findElement(By | |||
.className("v-verticallayout")); | |||
Actions actions = new Actions(driver); | |||
actions.clickAndHold(wrapper); | |||
actions.moveByOffset(50, 50); | |||
actions.perform(); | |||
WebElement dragElement = driver.findElement(By | |||
.className("v-drag-element")); | |||
List<WebElement> children = dragElement.findElements(By.xpath(".//*")); | |||
boolean found = false; | |||
for (WebElement child : children) { | |||
if ("text".equals(child.getAttribute("value"))) { | |||
found = true; | |||
} | |||
} | |||
Assert.assertTrue( | |||
"Text value is not found in the DnD image of text area", found); | |||
} | |||
} |