import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.dnd.DragSourceRpc;
import com.vaadin.shared.ui.dnd.DragSourceState;
+import com.vaadin.shared.ui.dnd.DropEffect;
import elemental.events.Event;
import elemental.events.EventListener;
* event occurs.
*
* @param event
+ * browser event to be handled
*/
protected void onDragEnd(Event event) {
// Initiate server start dragend event when there is a DragEndListener
// attached on the server side
if (hasEventListener(DragSourceState.EVENT_DRAGEND)) {
- getRpcProxy(DragSourceRpc.class).dragEnd();
+ String dropEffect = getDropEffect(
+ ((NativeEvent) event).getDataTransfer());
+
+ assert dropEffect != null : "Drop effect should never be null";
+
+ getRpcProxy(DragSourceRpc.class)
+ .dragEnd(DropEffect.valueOf(dropEffect.toUpperCase()));
}
}
dataTransfer.effectAllowed = effectAllowed;
}-*/;
+ private native String getDropEffect(DataTransfer dataTransfer)/*-{
+ return dataTransfer.dropEffect;
+ }-*/;
+
@Override
public DragSourceState getState() {
return (DragSourceState) super.getState();
String dataTransferText = nativeEvent.getDataTransfer().getData(
DragSourceState.DATA_TYPE_TEXT);
- getRpcProxy(DropTargetRpc.class)
- .drop(dataTransferText, getState().dropEffect);
+ getRpcProxy(DropTargetRpc.class).drop(dataTransferText);
}
removeTargetIndicator(getDropTargetElement());
*/
package com.vaadin.event.dnd;
-import com.vaadin.shared.ui.dnd.EffectAllowed;
+import com.vaadin.shared.ui.dnd.DropEffect;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Component;
*/
public class DragEndEvent<T extends AbstractComponent> extends Component.Event {
private final String dataTransferText;
- private final EffectAllowed effectAllowed;
+ private final DropEffect dropEffect;
/**
* Creates a server side dragend event.
* @param dataTransferText
* Data of type {@code "text"} from the {@code DataTransfer}
* object.
- * @param effectAllowed
- * Allowed effects from {@code DataTransfer.effectAllowed} object.
+ * @param dropEffect
+ * Drop effect from {@code DataTransfer.dropEffect} object.
*/
public DragEndEvent(T source, String dataTransferText,
- EffectAllowed effectAllowed) {
+ DropEffect dropEffect) {
super(source);
this.dataTransferText = dataTransferText;
- this.effectAllowed = effectAllowed;
+ this.dropEffect = dropEffect;
}
/**
}
/**
- * Returns the {@code effectAllowed} parameter of this event.
+ * Get drop effect of the dragend event.
*
- * @return This event's {@code effectAllowed} parameter.
+ * @return The {@code DataTransfer.dropEffect} parameter of the client side
+ * dragend event.
*/
- public EffectAllowed getEffectAllowed() {
- return effectAllowed;
+ public DropEffect getDropEffect() {
+ return dropEffect;
}
/**
import com.vaadin.shared.Registration;
import com.vaadin.shared.ui.dnd.DragSourceRpc;
import com.vaadin.shared.ui.dnd.DragSourceState;
+import com.vaadin.shared.ui.dnd.DropEffect;
import com.vaadin.shared.ui.dnd.EffectAllowed;
import com.vaadin.ui.AbstractComponent;
}
@Override
- public void dragEnd() {
+ public void dragEnd(DropEffect dropEffect) {
DragEndEvent<T> event = new DragEndEvent<>(target,
- getState(false).dataTransferText,
- getState(false).effectAllowed);
+ getState(false).dataTransferText, dropEffect);
fireEvent(event);
}
});
*/
public class DropEvent<T extends AbstractComponent> extends Component.Event {
private final String dataTransferText;
- private final DropEffect dropEffect;
private final DragSourceExtension<? extends AbstractComponent> dragSourceExtension;
private final AbstractComponent dragSource;
* @param dataTransferText
* Data of type {@code "text"} from the {@code DataTransfer}
* object.
- * @param dropEffect
- * Drop effect from {@code DataTransfer.dropEffect} object.
* @param dragSourceExtension
* Drag source extension of the component that initiated the drop
* event.
*/
- public DropEvent(T target, String dataTransferText, DropEffect dropEffect,
+ public DropEvent(T target, String dataTransferText,
DragSourceExtension<? extends AbstractComponent> dragSourceExtension) {
super(target);
this.dataTransferText = dataTransferText;
- this.dropEffect = dropEffect;
-
this.dragSourceExtension = dragSourceExtension;
this.dragSource = Optional.ofNullable(dragSourceExtension)
.map(DragSourceExtension::getParent).orElse(null);
return dataTransferText;
}
- /**
- * Get drop effect set for the current drop target.
- *
- * @return {@code dropEffect} parameter set for the current drop target.
- */
- public DropEffect getDropEffect() {
- return dropEffect;
- }
-
/**
* Returns the drag source component if the drag originated from a
* component in the same UI as the drop target component, or an empty
* Component to be extended.
*/
public DropTargetExtension(T target) {
- registerRpc((DropTargetRpc) (dataTransferText, dropEffect) -> {
+ registerRpc((DropTargetRpc) dataTransferText -> {
DropEvent<T> event = new DropEvent<>(target, dataTransferText,
- dropEffect, getUI().getActiveDragSource());
+ getUI().getActiveDragSource());
fireEvent(event);
});
/**
* Called when dragend event happens on client side.
+ *
+ * @param dropEffect
+ * Drop effect of the dragend event, extracted from {@code
+ * DataTransfer.dropEffect} parameter.
*/
- public void dragEnd();
+ public void dragEnd(DropEffect dropEffect);
}
* @param dataTransferText
* Data of type {@code "text"} from the {@code DataTransfer}
* object.
- * @param dropEffect
- * Drop effect set for the drop target where drop happened.
*/
- public void drop(String dataTransferText, DropEffect dropEffect);
+ public void drop(String dataTransferText);
}
import com.vaadin.event.dnd.DropTargetExtension;
import com.vaadin.server.Page;
import com.vaadin.server.VaadinRequest;
-import com.vaadin.shared.ui.dnd.DropEffect;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
dragSource.addDragEndListener(event -> {
event.getComponent().removeStyleName("dragged");
- log(event.getComponent().getValue() + " dragend");
+ log(event.getComponent().getValue() + " dragend, dropEffect="
+ + event.getDropEffect());
});
}
DropTargetExtension<Label> dropTarget = new DropTargetExtension<>(
target);
- dropTarget.setDropEffect(DropEffect.MOVE);
-
// Add listener
dropTarget.addDropListener(event -> {
event.getDragSourceExtension().ifPresent(dragSource -> {