diff options
author | Denis Anisimov <denis@vaadin.com> | 2014-04-14 20:59:25 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-04-15 11:13:43 +0000 |
commit | cfbcaaf213ba2cc48e9af5ee56ab3f79ce24ce6b (patch) | |
tree | ef28bf7657a5a17e7ca7ea575f680fd885b9b59e /client | |
parent | 0cb1704336a10653bde82aa0470c25c49539f38b (diff) | |
download | vaadin-framework-cfbcaaf213ba2cc48e9af5ee56ab3f79ce24ce6b.tar.gz vaadin-framework-cfbcaaf213ba2cc48e9af5ee56ab3f79ce24ce6b.zip |
Drag image for text-area should contain text of text-area (#13557).
Change-Id: I4c3da88e80b5516bc8f6dc0eb8020ca4dcdf43fc
Diffstat (limited to 'client')
-rw-r--r-- | client/src/com/vaadin/client/ui/VTextArea.java | 14 | ||||
-rw-r--r-- | client/src/com/vaadin/client/ui/dd/VDragCloneAware.java | 39 | ||||
-rw-r--r-- | client/src/com/vaadin/client/ui/dd/VDragEvent.java | 31 |
3 files changed, 83 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..5150ab2544 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,14 @@ 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..53bc206588 --- /dev/null +++ b/client/src/com/vaadin/client/ui/dd/VDragCloneAware.java @@ -0,0 +1,39 @@ +/* + * 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.3 + * @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. + * + * @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 9b592cfcbd..d3fe402cee 100644 --- a/client/src/com/vaadin/client/ui/dd/VDragEvent.java +++ b/client/src/com/vaadin/client/ui/dd/VDragEvent.java @@ -21,11 +21,14 @@ import java.util.Map; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; 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.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.EventListener; import com.vaadin.client.BrowserInfo; import com.vaadin.client.Util; @@ -241,6 +244,7 @@ public class VDragEvent { public void createDragImage(com.google.gwt.user.client.Element element, boolean alignImageToEvent) { Element cloneNode = (Element) element.cloneNode(true); + syncContent(element, cloneNode); if (BrowserInfo.get().isIE()) { if (cloneNode.getTagName().toLowerCase().equals("tr")) { TableElement table = Document.get().createTableElement(); @@ -277,4 +281,31 @@ public class VDragEvent { createDragImage(DOM.asOld(element), alignImageToEvent); } + /** + * Do additional content sync between <code>original</code> element and its + * <code>copy</code> if needed. + * + * @since 7.3 + * @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); + } + } + } |