diff options
author | Denis Anisimov <denis@vaadin.com> | 2014-04-05 15:14:59 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-04-10 11:27:24 +0000 |
commit | f227f0c1068f17e5491bd399d9f5bde16a0c8272 (patch) | |
tree | 651e84a8ecccaa87ae33f6c9caddb07dc689d534 /client | |
parent | 5057c59a02b6570f6a314dee3379688f0a48981b (diff) | |
download | vaadin-framework-f227f0c1068f17e5491bd399d9f5bde16a0c8272.tar.gz vaadin-framework-f227f0c1068f17e5491bd399d9f5bde16a0c8272.zip |
Drag image for text-area should contain text of text-area (#13557).
Change-Id: Ief653c3f15d18fdd076f0fb80f8a91ae429a54d3
Diffstat (limited to 'client')
-rw-r--r-- | client/src/com/vaadin/client/ui/VTextArea.java | 15 | ||||
-rw-r--r-- | client/src/com/vaadin/client/ui/dd/VDragCloneAware.java | 40 | ||||
-rw-r--r-- | client/src/com/vaadin/client/ui/dd/VDragEvent.java | 31 |
3 files changed, 85 insertions, 1 deletions
diff --git a/client/src/com/vaadin/client/ui/VTextArea.java b/client/src/com/vaadin/client/ui/VTextArea.java index 2a697969df..627d14a058 100644 --- a/client/src/com/vaadin/client/ui/VTextArea.java +++ b/client/src/com/vaadin/client/ui/VTextArea.java @@ -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); + } + } + } diff --git a/client/src/com/vaadin/client/ui/dd/VDragCloneAware.java b/client/src/com/vaadin/client/ui/dd/VDragCloneAware.java new file mode 100644 index 0000000000..546ca88a9f --- /dev/null +++ b/client/src/com/vaadin/client/ui/dd/VDragCloneAware.java @@ -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); +} diff --git a/client/src/com/vaadin/client/ui/dd/VDragEvent.java b/client/src/com/vaadin/client/ui/dd/VDragEvent.java index a4667e57f3..0f0e1ecdad 100644 --- a/client/src/com/vaadin/client/ui/dd/VDragEvent.java +++ b/client/src/com/vaadin/client/ui/dd/VDragEvent.java @@ -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); + } + } + } |