Browse Source

Disable drag&drop when source or target component is disabled, re-implementation of 6.8 fix for #11801

Change-Id: Iacd167ad7075620dae59ff2c7789efaf32521c59
tags/7.0.7
Marc Englund 11 years ago
parent
commit
08ba394b11

+ 25
- 11
client/src/com/vaadin/client/ui/VDragAndDropWrapper.java View File

@@ -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) {

+ 12
- 2
client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java View File

@@ -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.

+ 19
- 0
server/src/com/vaadin/server/DragAndDropService.java View File

@@ -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

+ 77
- 0
uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropDisable.html View File

@@ -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>

+ 142
- 0
uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropDisable.java View File

@@ -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";
}
}

Loading…
Cancel
Save