Change-Id: Iacd167ad7075620dae59ff2c7789efaf32521c59tags/7.0.7
@@ -80,7 +80,8 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
@Override | |||
public void onMouseDown(MouseDownEvent event) { | |||
if (startDrag(event.getNativeEvent())) { | |||
if (getConnector().isEnabled() | |||
&& startDrag(event.getNativeEvent())) { | |||
event.preventDefault(); // prevent text selection | |||
} | |||
} | |||
@@ -90,7 +91,8 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
@Override | |||
public void onTouchStart(TouchStartEvent event) { | |||
if (startDrag(event.getNativeEvent())) { | |||
if (getConnector().isEnabled() | |||
&& startDrag(event.getNativeEvent())) { | |||
/* | |||
* Dont let eg. panel start scrolling. | |||
*/ | |||
@@ -112,8 +114,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
private boolean startDrag(NativeEvent event) { | |||
if (dragStartMode == WRAPPER || dragStartMode == COMPONENT) { | |||
VTransferable transferable = new VTransferable(); | |||
transferable.setDragSource(ConnectorMap.get(client).getConnector( | |||
VDragAndDropWrapper.this)); | |||
transferable.setDragSource(getConnector()); | |||
ComponentConnector paintable = Util.findPaintable(client, | |||
(Element) event.getEventTarget().cast()); | |||
@@ -187,7 +188,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
private boolean uploading; | |||
private ReadyStateChangeHandler readyStateChangeHandler = new ReadyStateChangeHandler() { | |||
private final ReadyStateChangeHandler readyStateChangeHandler = new ReadyStateChangeHandler() { | |||
@Override | |||
public void onReadyStateChange(XMLHttpRequest xhr) { | |||
@@ -261,8 +262,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
} | |||
if (VDragAndDropManager.get().getCurrentDropHandler() != getDropHandler()) { | |||
VTransferable transferable = new VTransferable(); | |||
transferable.setDragSource(ConnectorMap.get(client) | |||
.getConnector(this)); | |||
transferable.setDragSource(getConnector()); | |||
vaadinDragEvent = VDragAndDropManager.get().startDrag( | |||
transferable, event, false); | |||
@@ -458,6 +458,9 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
@Override | |||
public void dragEnter(VDragEvent drag) { | |||
if (!getConnector().isEnabled()) { | |||
return; | |||
} | |||
updateDropDetails(drag); | |||
currentlyValid = false; | |||
super.dragEnter(drag); | |||
@@ -471,6 +474,9 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
@Override | |||
public void dragOver(final VDragEvent drag) { | |||
if (!getConnector().isEnabled()) { | |||
return; | |||
} | |||
boolean detailsChanged = updateDropDetails(drag); | |||
if (detailsChanged) { | |||
currentlyValid = false; | |||
@@ -486,6 +492,9 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
@Override | |||
public boolean drop(VDragEvent drag) { | |||
if (!getConnector().isEnabled()) { | |||
return false; | |||
} | |||
deEmphasis(true); | |||
Map<String, Object> dd = drag.getDropDetails(); | |||
@@ -511,14 +520,16 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
@Override | |||
protected void dragAccepted(VDragEvent drag) { | |||
if (!getConnector().isEnabled()) { | |||
return; | |||
} | |||
currentlyValid = true; | |||
emphasis(drag); | |||
} | |||
@Override | |||
public ComponentConnector getConnector() { | |||
return ConnectorMap.get(client).getConnector( | |||
VDragAndDropWrapper.this); | |||
return VDragAndDropWrapper.this.getConnector(); | |||
} | |||
@Override | |||
@@ -528,6 +539,10 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
} | |||
public ComponentConnector getConnector() { | |||
return ConnectorMap.get(client).getConnector(this); | |||
} | |||
protected native void hookHtml5DragStart(Element el) | |||
/*-{ | |||
var me = this; | |||
@@ -594,8 +609,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
} | |||
private void notifySizePotentiallyChanged() { | |||
LayoutManager.get(client).setNeedsMeasure( | |||
ConnectorMap.get(client).getConnector(getElement())); | |||
LayoutManager.get(client).setNeedsMeasure(getConnector()); | |||
} | |||
protected void emphasis(VDragEvent drag) { |
@@ -287,7 +287,7 @@ public class VDragAndDropManager { | |||
protected VDragAndDropManager() { | |||
} | |||
private NativePreviewHandler defaultDragAndDropEventHandler = new DefaultDragAndDropEventHandler(); | |||
private final NativePreviewHandler defaultDragAndDropEventHandler = new DefaultDragAndDropEventHandler(); | |||
/** | |||
* Flag to indicate if drag operation has really started or not. Null check | |||
@@ -469,7 +469,8 @@ public class VDragAndDropManager { | |||
if (w == null) { | |||
return null; | |||
} | |||
while (!(w instanceof VHasDropHandler)) { | |||
while (!(w instanceof VHasDropHandler) | |||
|| !isDropEnabled((VHasDropHandler) w)) { | |||
w = w.getParent(); | |||
if (w == null) { | |||
break; | |||
@@ -491,6 +492,15 @@ public class VDragAndDropManager { | |||
} | |||
/** | |||
* Checks if the given {@link VHasDropHandler} really is able to accept | |||
* drops. | |||
*/ | |||
private static boolean isDropEnabled(VHasDropHandler target) { | |||
VDropHandler dh = target.getDropHandler(); | |||
return dh != null && dh.getConnector().isEnabled(); | |||
} | |||
/** | |||
* Drag is ended (drop happened) on current drop handler. Calls drop method | |||
* on current drop handler and does appropriate cleanup. |
@@ -64,6 +64,16 @@ public class DragAndDropService implements VariableOwner, ClientConnector { | |||
public void changeVariables(Object source, Map<String, Object> variables) { | |||
Object owner = variables.get("dhowner"); | |||
final Component sourceComponent = (Component) variables | |||
.get("component"); | |||
if (sourceComponent != null && !sourceComponent.isEnabled()) { | |||
// source component not supposed to be enabled | |||
getLogger().warning( | |||
"Client dropped from " + sourceComponent | |||
+ " even though it's disabled"); | |||
return; | |||
} | |||
// Validate drop handler owner | |||
if (!(owner instanceof DropTarget)) { | |||
getLogger() | |||
@@ -74,6 +84,15 @@ public class DragAndDropService implements VariableOwner, ClientConnector { | |||
// owner cannot be null here | |||
DropTarget dropTarget = (DropTarget) owner; | |||
if (!dropTarget.isEnabled()) { | |||
getLogger() | |||
.warning( | |||
"Client dropped on " + owner | |||
+ " even though it's disabled"); | |||
return; | |||
} | |||
lastVisitId = (Integer) variables.get("visitId"); | |||
// request may be dropRequest or request during drag operation (commonly |
@@ -0,0 +1,77 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | |||
<head profile="http://selenium-ide.openqa.org/profiles/test-case"> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | |||
<link rel="selenium.base" href="http://localhost:8888/" /> | |||
<title>DragAndDropDisable</title> | |||
</head> | |||
<body> | |||
<table cellpadding="1" cellspacing="1" border="1"> | |||
<thead> | |||
<tr><td rowspan="1" colspan="3">DragAndDropDisable</td></tr> | |||
</thead><tbody> | |||
<tr> | |||
<td>open</td> | |||
<td>/run/DragAndDropDisable?restartApplication</td> | |||
<td></td> | |||
</tr> | |||
<tr> | |||
<td>drag</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]</td> | |||
<td>18,25</td> | |||
</tr> | |||
<tr> | |||
<td>drop</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]</td> | |||
<td>34,51</td> | |||
</tr> | |||
<tr> | |||
<td>mouseClick</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VCheckBox[0]/domChild[0]</td> | |||
<td>7,4</td> | |||
</tr> | |||
<tr> | |||
<td>drag</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]</td> | |||
<td>20,32</td> | |||
</tr> | |||
<tr> | |||
<td>drop</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]</td> | |||
<td>37,59</td> | |||
</tr> | |||
<tr> | |||
<td>drag</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]/VLabel[0]</td> | |||
<td>59,10</td> | |||
</tr> | |||
<tr> | |||
<td>drop</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]</td> | |||
<td>68,15</td> | |||
</tr> | |||
<tr> | |||
<td>mouseClick</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]/VLabel[0]</td> | |||
<td>68,160</td> | |||
</tr> | |||
<tr> | |||
<td>drag</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[0]/domChild[0]</td> | |||
<td>82,9</td> | |||
</tr> | |||
<tr> | |||
<td>drop</td> | |||
<td>vaadin=runDragAndDropDisable::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VPanel[0]/VDragAndDropWrapper[0]/VCssLayout[0]</td> | |||
<td>118,50</td> | |||
</tr> | |||
<tr> | |||
<td>screenCapture</td> | |||
<td></td> | |||
<td></td> | |||
</tr> | |||
</tbody></table> | |||
</body> | |||
</html> |
@@ -0,0 +1,142 @@ | |||
package com.vaadin.tests.components.draganddropwrapper; | |||
import com.vaadin.data.Property.ValueChangeEvent; | |||
import com.vaadin.data.Property.ValueChangeListener; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.event.dd.DropHandler; | |||
import com.vaadin.event.dd.acceptcriteria.AcceptAll; | |||
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; | |||
import com.vaadin.server.VaadinRequest; | |||
import com.vaadin.tests.components.AbstractTestUI; | |||
import com.vaadin.ui.CheckBox; | |||
import com.vaadin.ui.CssLayout; | |||
import com.vaadin.ui.DragAndDropWrapper; | |||
import com.vaadin.ui.DragAndDropWrapper.DragStartMode; | |||
import com.vaadin.ui.Label; | |||
import com.vaadin.ui.Panel; | |||
import com.vaadin.ui.Table; | |||
import com.vaadin.ui.Table.TableDragMode; | |||
public class DragAndDropDisable extends AbstractTestUI { | |||
@Override | |||
protected Integer getTicketNumber() { | |||
return 11801; | |||
} | |||
@Override | |||
protected void setup(VaadinRequest request) { | |||
{ | |||
final Panel p = new Panel("Drag here"); | |||
addComponent(p); | |||
final CssLayout layout = new CssLayout(); | |||
layout.setHeight("100px"); | |||
final DragAndDropWrapper dnd = new DragAndDropWrapper(layout); | |||
p.setContent(dnd); | |||
final CheckBox enabled = new CheckBox("Enabled", true); | |||
addComponent(enabled); | |||
enabled.setImmediate(true); | |||
enabled.addListener(new ValueChangeListener() { | |||
@Override | |||
public void valueChange(ValueChangeEvent event) { | |||
dnd.setEnabled(enabled.booleanValue()); | |||
} | |||
}); | |||
dnd.setDropHandler(new DropHandler() { | |||
@Override | |||
public AcceptCriterion getAcceptCriterion() { | |||
return AcceptAll.get(); | |||
} | |||
@Override | |||
public void drop(DragAndDropEvent event) { | |||
layout.addComponent(new Label("You dropped something!")); | |||
} | |||
}); | |||
dnd.setDragStartMode(DragStartMode.COMPONENT); | |||
} | |||
{ | |||
final Panel p = new Panel("Drag here"); | |||
addComponent(p); | |||
final CssLayout layout = new CssLayout(); | |||
layout.setHeight("100px"); | |||
final DragAndDropWrapper dnd = new DragAndDropWrapper(layout); | |||
p.setContent(dnd); | |||
final CheckBox enabled = new CheckBox("Enabled", true); | |||
addComponent(enabled); | |||
enabled.setImmediate(true); | |||
enabled.addListener(new ValueChangeListener() { | |||
@Override | |||
public void valueChange(ValueChangeEvent event) { | |||
dnd.setEnabled(enabled.booleanValue()); | |||
} | |||
}); | |||
dnd.setDropHandler(new DropHandler() { | |||
@Override | |||
public AcceptCriterion getAcceptCriterion() { | |||
return AcceptAll.get(); | |||
} | |||
@Override | |||
public void drop(DragAndDropEvent event) { | |||
layout.addComponent(new Label("You dropped something!")); | |||
} | |||
}); | |||
dnd.setDragStartMode(DragStartMode.COMPONENT); | |||
} | |||
{ | |||
final Table tbl = new Table(); | |||
tbl.addContainerProperty("column", String.class, | |||
"drag/drop to/from here"); | |||
for (int i = 0; i < 5; i++) { | |||
tbl.addItem(); | |||
} | |||
addComponent(tbl); | |||
tbl.setDragMode(TableDragMode.ROW); | |||
tbl.setDropHandler(new DropHandler() { | |||
@Override | |||
public AcceptCriterion getAcceptCriterion() { | |||
return AcceptAll.get(); | |||
} | |||
@Override | |||
public void drop(DragAndDropEvent event) { | |||
tbl.getItem(tbl.addItem()).getItemProperty("column") | |||
.setValue("You dropped something"); | |||
} | |||
}); | |||
final CheckBox enabled = new CheckBox("Enabled", true); | |||
addComponent(enabled); | |||
enabled.setImmediate(true); | |||
enabled.addListener(new ValueChangeListener() { | |||
@Override | |||
public void valueChange(ValueChangeEvent event) { | |||
tbl.setEnabled(enabled.booleanValue()); | |||
} | |||
}); | |||
} | |||
} | |||
@Override | |||
protected String getTestDescription() { | |||
return "DragAndDropWrapper must be disableable"; | |||
} | |||
} |