diff options
author | Matti Tahvonen <matti.tahvonen@itmill.com> | 2011-04-13 15:34:05 +0000 |
---|---|---|
committer | Matti Tahvonen <matti.tahvonen@itmill.com> | 2011-04-13 15:34:05 +0000 |
commit | f14a066a287c81a1cc1aa2bf101538e2258d8df9 (patch) | |
tree | f8a284094ee97ae241b36f80052388a445ef4544 | |
parent | 381a16680ff50232f59047bc4a6f30f78c6b9d1e (diff) | |
download | vaadin-framework-f14a066a287c81a1cc1aa2bf101538e2258d8df9.tar.gz vaadin-framework-f14a066a287c81a1cc1aa2bf101538e2258d8df9.zip |
#6813: VDragAndDropManager now marks the source Paintable with a class name during a drag and drop procedure
svn changeset:18275/svn branch:6.6
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java index 9c5bffc877..842c3fd0e1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java @@ -3,6 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui.dd; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.RepeatingCommand; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.EventTarget; import com.google.gwt.dom.client.NativeEvent; @@ -39,6 +41,8 @@ import com.vaadin.terminal.gwt.client.ValueMap; */ public class VDragAndDropManager { + public static final String ACTIVE_DRAG_SOURCE_STYLENAME = "v-active-drag-source"; + private final class DefaultDragAndDropEventHandler implements NativePreviewHandler { @@ -297,6 +301,7 @@ public class VDragAndDropManager { public void execute() { isStarted = true; + addActiveDragSourceStyleName(); VDropHandler dh = null; if (startEvent != null) { dh = findDragTarget(Element.as(currentDrag @@ -323,6 +328,13 @@ public class VDragAndDropManager { // just capture something to prevent text selection in IE Event.setCapture(RootPanel.getBodyElement()); } + + private void addActiveDragSourceStyleName() { + Paintable dragSource = currentDrag.getTransferable() + .getDragSource(); + ((Widget) dragSource) + .addStyleName(ACTIVE_DRAG_SOURCE_STYLENAME); + } }; final int eventType = Event.as(startEvent).getTypeInt(); @@ -471,13 +483,33 @@ public class VDragAndDropManager { handlerRegistration.removeHandler(); handlerRegistration = null; } + boolean sendTransferableToServer = false; if (currentDropHandler != null) { if (doDrop) { // we have dropped on a drop target - boolean sendTransferableToServer = currentDropHandler - .drop(currentDrag); + sendTransferableToServer = currentDropHandler.drop(currentDrag); if (sendTransferableToServer) { doRequest(DragEventType.DROP); + /* + * Clean active source class name deferred until response is + * handled. E.g. hidden on start, removed in drophandler -> + * would flicker in case removed eagerly. + */ + final Paintable dragSource = currentDrag.getTransferable() + .getDragSource(); + final ApplicationConnection client = currentDropHandler + .getApplicationConnection(); + Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { + public boolean execute() { + if (!client.hasActiveRequest()) { + removeActiveSourceClassname(dragSource); + return false; + } + return true; + } + + }, 30); + } } else { currentDrag.setCurrentGwtEvent(null); @@ -488,6 +520,16 @@ public class VDragAndDropManager { visitId = 0; // reset to ignore ongoing server check } + /* + * Remove class name indicating drag source when server visit is done + * iff server visit was not initiated. Otherwise it will be removed once + * the server visit is done. + */ + if (!sendTransferableToServer && currentDrag != null) { + removeActiveSourceClassname(currentDrag.getTransferable() + .getDragSource()); + } + currentDrag = null; clearDragElement(); @@ -497,6 +539,10 @@ public class VDragAndDropManager { } + private void removeActiveSourceClassname(Paintable dragSource) { + ((Widget) dragSource).removeStyleName(ACTIVE_DRAG_SOURCE_STYLENAME); + } + private void clearDragElement() { if (dragElement != null) { if (dragElement.getParentElement() != null) { |