Browse Source

Add API support for setting server side drag data (#8915)

* Add API support for setting server side drag data

* Fix javadocs

* Add server side drag data API to ASCII doc

* Fix some javadocs and documentation details
tags/8.1.0.alpha3
Adam Wagner 7 years ago
parent
commit
b32d7b0e45

+ 15
- 0
documentation/advanced/advanced-dragndrop.asciidoc View File

@@ -50,6 +50,18 @@ dragSource.addDragEndListener(event ->
);
----

It is possible to transfer any Object as server side data to the drop target if both the drag source and drop target are placed in the same UI. This data is available in the drop event via the `DropEvent.getDragData()` method.

[source, java]
----
dragSource.addDragStartListener(event ->
dragSource.setDragData(myObject);
);
dragSource.addDragEndListener(event ->
dragSource.setDragData(null);
};
----

[NOTE]
====
The browsers allow the user to select and drag and drop text, which may cause some issues when trying to drag a component that has text. You can fix this by setting the following style rule to the drag source component to prevent dragging of the text instead of the whole component.
@@ -89,6 +101,9 @@ dropTarget.addDropListener(event -> {
// get possible transfer data
String message = event.getDataTransferText();
Notification.show("DropEvent with data transfer: "+ message);

// handle possible server side drag data, if the drag source was in the same UI
event.getDragData().ifPresent(data -> handleMyDragData((MyObject) data));
}
});
----

+ 29
- 0
server/src/main/java/com/vaadin/event/dnd/DragSourceExtension.java View File

@@ -39,6 +39,12 @@ public class DragSourceExtension<T extends AbstractComponent> extends
private Registration dragStartListenerHandle;
private Registration dragEndListenerHandle;

/**
* Stores the server side drag data that is available for the drop target if
* it is in the same UI.
*/
private Object dragData;

/**
* Extends {@code target} component and makes it a drag source.
*
@@ -145,6 +151,29 @@ public class DragSourceExtension<T extends AbstractComponent> extends
getState().dataTransferText = null;
}

/**
* Set server side drag data. This data is available in the drop event and
* can be used to transfer data between drag source and drop target if they
* are in the same UI.
*
* @param data
* Data to transfer to drop event.
*/
public void setDragData(Object data) {
dragData = data;
}

/**
* Get server side drag data. This data is available in the drop event and
* can be used to transfer data between drag source and drop target if they
* are in the same UI.
*
* @return Server side drag data if set, otherwise {@literal null}.
*/
public Object getDragData() {
return dragData;
}

/**
* Attaches dragstart listener for the current drag source. {@link
* DragStartListener#dragStart(DragStartEvent)} is called when dragstart

+ 13
- 0
server/src/main/java/com/vaadin/event/dnd/DropEvent.java View File

@@ -105,6 +105,19 @@ public class DropEvent<T extends AbstractComponent> extends Component.Event {
return Optional.ofNullable(dragSourceExtension);
}

/**
* Gets the server side drag data. This data can be set during the drag
* start event on the server side and can be used to transfer data between
* drag source and drop target when they are in the same UI.
*
* @return Optional server side drag data if set and the drag source and the
* drop target are in the same UI, otherwise empty {@code Optional}.
* @see DragSourceExtension#setDragData(Object)
*/
public Optional<Object> getDragData() {
return getDragSourceExtension().map(DragSourceExtension::getDragData);
}

/**
* Returns the drop target component where the drop event occurred.
*

Loading…
Cancel
Save