Change-Id: Ief653c3f15d18fdd076f0fb80f8a91ae429a54d3tags/7.1.14
package com.vaadin.client.ui; | package com.vaadin.client.ui; | ||||
import com.google.gwt.core.client.Scheduler; | 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.Overflow; | ||||
import com.google.gwt.dom.client.Style.WhiteSpace; | import com.google.gwt.dom.client.Style.WhiteSpace; | ||||
import com.google.gwt.dom.client.TextAreaElement; | import com.google.gwt.dom.client.TextAreaElement; | ||||
import com.google.gwt.user.client.Event; | import com.google.gwt.user.client.Event; | ||||
import com.vaadin.client.BrowserInfo; | import com.vaadin.client.BrowserInfo; | ||||
import com.vaadin.client.Util; | import com.vaadin.client.Util; | ||||
import com.vaadin.client.ui.dd.VDragCloneAware; | |||||
/** | /** | ||||
* This class represents a multiline textfield (textarea). | * This class represents a multiline textfield (textarea). | ||||
* @author Vaadin Ltd. | * @author Vaadin Ltd. | ||||
* | * | ||||
*/ | */ | ||||
public class VTextArea extends VTextField { | |||||
public class VTextArea extends VTextField implements VDragCloneAware { | |||||
public static final String CLASSNAME = "v-textarea"; | public static final String CLASSNAME = "v-textarea"; | ||||
private boolean wordwrap = true; | private boolean wordwrap = true; | ||||
private MaxLengthHandler maxLengthHandler = new MaxLengthHandler(); | private MaxLengthHandler maxLengthHandler = new MaxLengthHandler(); | ||||
// class instead of directly each other. | // 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); | |||||
} | |||||
} | |||||
} | } |
/* | |||||
* 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); | |||||
} |
import com.google.gwt.dom.client.Document; | import com.google.gwt.dom.client.Document; | ||||
import com.google.gwt.dom.client.NativeEvent; | 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.Style.Unit; | ||||
import com.google.gwt.dom.client.TableElement; | import com.google.gwt.dom.client.TableElement; | ||||
import com.google.gwt.dom.client.TableSectionElement; | import com.google.gwt.dom.client.TableSectionElement; | ||||
import com.google.gwt.event.dom.client.MouseOverEvent; | import com.google.gwt.event.dom.client.MouseOverEvent; | ||||
import com.google.gwt.user.client.Element; | 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.BrowserInfo; | ||||
import com.vaadin.client.Util; | import com.vaadin.client.Util; | ||||
cloneNode = table.cast(); | cloneNode = table.cast(); | ||||
} | } | ||||
} | } | ||||
syncContent(element, cloneNode); | |||||
if (alignImageToEvent) { | if (alignImageToEvent) { | ||||
int absoluteTop = element.getAbsoluteTop(); | int absoluteTop = element.getAbsoluteTop(); | ||||
int absoluteLeft = element.getAbsoluteLeft(); | int absoluteLeft = element.getAbsoluteLeft(); | ||||
} | } | ||||
/** | |||||
* 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); | |||||
} | |||||
} | |||||
} | } |
/* | |||||
* 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; | |||||
} | |||||
} |
/* | |||||
* 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); | |||||
} | |||||
} |