diff options
author | Adam Wagner <wbadam@users.noreply.github.com> | 2017-05-16 14:25:26 +0300 |
---|---|---|
committer | Pekka Hyvönen <pekka@vaadin.com> | 2017-05-16 14:25:26 +0300 |
commit | 76a0e04cb056fe2c6e2ad62f6d0972b2347a0fcf (patch) | |
tree | 44920ce9ef58ac71e7d30aafb86874b84a572798 /client | |
parent | 37c4af2b27effe0de5f3f2e301a7d4179e7012f2 (diff) | |
download | vaadin-framework-76a0e04cb056fe2c6e2ad62f6d0972b2347a0fcf.tar.gz vaadin-framework-76a0e04cb056fe2c6e2ad62f6d0972b2347a0fcf.zip |
Add API for multiple drag data generators (#9321)
* Add ability to set multiple drag data generators for any drag data type
and change default to be accepted by spreadsheet applications such as Excel
Diffstat (limited to 'client')
-rw-r--r-- | client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java | 67 | ||||
-rw-r--r-- | client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java | 53 |
2 files changed, 68 insertions, 52 deletions
diff --git a/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java b/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java index 175383af87..1a96c1ea66 100644 --- a/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java +++ b/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java @@ -16,7 +16,11 @@ package com.vaadin.client.connectors.grid; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; import com.google.gwt.animation.client.AnimationScheduler; @@ -35,6 +39,7 @@ import com.vaadin.client.widget.escalator.RowContainer; import com.vaadin.client.widget.grid.selection.SelectionModel; import com.vaadin.client.widgets.Escalator; import com.vaadin.client.widgets.Grid; +import com.vaadin.server.SerializableFunction; import com.vaadin.shared.Range; import com.vaadin.shared.ui.Connect; import com.vaadin.shared.ui.dnd.DragSourceState; @@ -45,8 +50,6 @@ import com.vaadin.shared.ui.grid.GridState; import com.vaadin.ui.components.grid.GridDragSource; import elemental.events.Event; -import elemental.json.Json; -import elemental.json.JsonArray; import elemental.json.JsonObject; /** @@ -199,10 +202,26 @@ public class GridDragSourceConnector extends DragSourceExtensionConnector { } @Override - protected String createDataTransferText(NativeEvent dragStartEvent) { - JsonArray dragData = toJsonArray(getDraggedRows(dragStartEvent).stream() - .map(this::getDragData).collect(Collectors.toList())); - return dragData.toJson(); + protected Map<String, String> createDataTransferData( + NativeEvent dragStartEvent) { + Map<String, String> dataMap = super + .createDataTransferData(dragStartEvent); + + // Add data provided by the generator functions + getDraggedRows(dragStartEvent).forEach(row -> { + Map<String, String> rowDragData = getRowDragData(row); + rowDragData.forEach((type, data) -> { + if (dataMap.containsKey(type)) { + dataMap.put(type, data); + } else { + // Separate data with new line character when multiple rows + // are dragged + dataMap.put(type, dataMap.get(type) + "\n" + data); + } + }); + }); + + return dataMap; } @Override @@ -309,31 +328,25 @@ public class GridDragSourceConnector extends DragSourceExtensionConnector { } /** - * Converts a list of {@link JsonObject}s to a {@link JsonArray}. + * Gets drag data provided by the generator functions. * - * @param objects - * List of json objects. - * @return Json array containing all json objects. + * @param row + * The row data. + * @return The generated drag data type mapped to the corresponding drag + * data. If there are no generator functions, returns an empty map. */ - private JsonArray toJsonArray(List<JsonObject> objects) { - JsonArray array = Json.createArray(); - for (int i = 0; i < objects.size(); i++) { - array.set(i, objects.get(i)); + private Map<String, String> getRowDragData(JsonObject row) { + // Collect a map of data types and data that is provided by the + // generator functions set for this drag source + if (row.hasKey(GridDragSourceState.JSONKEY_DRAG_DATA)) { + JsonObject dragData = row + .getObject(GridDragSourceState.JSONKEY_DRAG_DATA); + return Arrays.stream(dragData.keys()).collect( + Collectors.toMap(Function.identity(), dragData::get)); } - return array; - } - /** - * Gets drag data from the row data if exists or returns complete row data - * otherwise. - * - * @param row - * Row data. - * @return Drag data if present or row data otherwise. - */ - private JsonObject getDragData(JsonObject row) { - return row.hasKey(GridDragSourceState.JSONKEY_DRAG_DATA) - ? row.getObject(GridDragSourceState.JSONKEY_DRAG_DATA) : row; + // Otherwise return empty map + return Collections.emptyMap(); } @Override diff --git a/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java b/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java index 552ff151cd..7d79fb74dc 100644 --- a/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java +++ b/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java @@ -15,7 +15,7 @@ */ package com.vaadin.client.extensions; -import java.util.List; +import java.util.LinkedHashMap; import java.util.Map; import com.google.gwt.animation.client.AnimationScheduler; @@ -185,27 +185,25 @@ public class DragSourceExtensionConnector extends AbstractExtensionConnector { // Set drag image setDragImage(nativeEvent); - // Set data parameters - List<String> types = getState().types; - Map<String, String> data = getState().data; - for (String type : types) { - nativeEvent.getDataTransfer().setData(type, data.get(type)); - } + // Create drag data + Map<String, String> dataMap = createDataTransferData(nativeEvent); - // Always set something as the text data, or DnD won't work in FF ! - String dataTransferText = createDataTransferText(nativeEvent); - if (dataTransferText == null) { - dataTransferText = ""; - } + if (dataMap != null) { + // Always set something as the text data, or DnD won't work in FF ! + dataMap.putIfAbsent(DragSourceState.DATA_TYPE_TEXT, ""); - // Override data type "text" when storing special data is needed - nativeEvent.getDataTransfer() - .setData(DragSourceState.DATA_TYPE_TEXT, dataTransferText); + // Set data to the event's data transfer + dataMap.forEach((type, data) -> nativeEvent.getDataTransfer() + .setData(type, data)); - // Initiate firing server side dragstart event when there is a - // DragStartListener attached on the server side - if (hasEventListener(DragSourceState.EVENT_DRAGSTART)) { - sendDragStartEventToServer(nativeEvent); + // Initiate firing server side dragstart event when there is a + // DragStartListener attached on the server side + if (hasEventListener(DragSourceState.EVENT_DRAGSTART)) { + sendDragStartEventToServer(nativeEvent); + } + } else { + // If returned data map is null, cancel drag event + nativeEvent.preventDefault(); } // Stop event bubbling @@ -255,15 +253,20 @@ public class DragSourceExtensionConnector extends AbstractExtensionConnector { } /** - * Creates data of type {@code "text"} for the {@code DataTransfer} object - * of the given event. + * Creates the data map to be set as the {@code DataTransfer} object's data. * * @param dragStartEvent - * Event to set the data for. - * @return Textual data to be set for the event or {@literal null}. + * The drag start event + * @return The map from type to data, or {@code null} for not setting any + * data. Returning {@code null} will cancel the drag start. */ - protected String createDataTransferText(NativeEvent dragStartEvent) { - return getState().data.get(DragSourceState.DATA_TYPE_TEXT); + protected Map<String, String> createDataTransferData( + NativeEvent dragStartEvent) { + Map<String, String> orderedData = new LinkedHashMap<>(); + for (String type : getState().types) { + orderedData.put(type, getState().data.get(type)); + } + return orderedData; } /** |