From a9c8e66d14899796e786e643d434daf6f16cf062 Mon Sep 17 00:00:00 2001 From: Adam Wagner Date: Thu, 9 Feb 2017 07:52:15 +0100 Subject: HTML5 Drag and Drop Support (#8264) * Add DragSource Extension (#8169) * Add DropTarget Extension (#8170) * Add DragStart Event to DragSource Extension (#8171) * Make DataTransfer.dropEffect configurable (#8174) * Make DragSource.dataTransfer data configurable (#8172) * Add server-side Event for drop (#8177) * Added license headers * Extract handler methods, move DropEvent and DropListener to new file, move enums to top * Replaced LinkedHashMap with Map and added List to preserve order of data * Add API for adding a JS acceptance criteria for dragover and drop (#8178, #8179) * Make DragSource Extension extendable (#8175) * Make DropTarget Extension extendable (#8176) * Added javadoc to protected methods * Moved EffectAllowed to shared so that it could be used in shared state directly * Moved DropEffect to separate file, some review fixes and javadoc * Added list to DropTargetRpc to preserve order of data * Remove event listeners on unregister * Changed method names set/getData() to more descriptive set/getTransferData() * Add server side dragStart event (#8171) * Add style to prevent text selection to allow drag * Remove target indicator style on drop * Add client side dragend event listener for drag source * Add server side dragend listener. Attach client side listener only when server side listener added. * Add drag source information to server side dragstart and dragend events. * Fixed some issues addressed in review * Trigger server side dragstart only when there is a listener attached * Criteria script can be set as null to clear * Use Js Interop instead of JSNI for handling event listeners * Use elemental package instead of Js Interop for handling event listeners * Add missing javadoc for public methods * Add default value "uninitialized" to effectAllowed parameter * Simple test UI for HTML5 DnD functionality (#8395) * Add javadoc and other minor changes --- .../com/vaadin/shared/ui/dnd/DragSourceRpc.java | 35 ++++++++++ .../com/vaadin/shared/ui/dnd/DragSourceState.java | 55 +++++++++++++++ .../java/com/vaadin/shared/ui/dnd/DropEffect.java | 41 +++++++++++ .../com/vaadin/shared/ui/dnd/DropTargetRpc.java | 42 +++++++++++ .../com/vaadin/shared/ui/dnd/DropTargetState.java | 38 ++++++++++ .../com/vaadin/shared/ui/dnd/EffectAllowed.java | 81 ++++++++++++++++++++++ 6 files changed, 292 insertions(+) create mode 100644 shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceRpc.java create mode 100644 shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceState.java create mode 100644 shared/src/main/java/com/vaadin/shared/ui/dnd/DropEffect.java create mode 100644 shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetRpc.java create mode 100644 shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetState.java create mode 100644 shared/src/main/java/com/vaadin/shared/ui/dnd/EffectAllowed.java (limited to 'shared') diff --git a/shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceRpc.java b/shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceRpc.java new file mode 100644 index 0000000000..bbad423044 --- /dev/null +++ b/shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceRpc.java @@ -0,0 +1,35 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.shared.ui.dnd; + +import com.vaadin.shared.communication.ServerRpc; + +/** + * RPC for firing server side event when client side dragstart event happens on + * drag source. + */ +public interface DragSourceRpc extends ServerRpc { + + /** + * Called when dragsource event happens on client side. + */ + public void dragStart(); + + /** + * Called when dragend event happens on client side. + */ + public void dragEnd(); +} diff --git a/shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceState.java b/shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceState.java new file mode 100644 index 0000000000..aeb4dd816b --- /dev/null +++ b/shared/src/main/java/com/vaadin/shared/ui/dnd/DragSourceState.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.shared.ui.dnd; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.vaadin.shared.communication.SharedState; + +/** + * State class containing parameters for DragSourceExtension. + */ +public class DragSourceState extends SharedState { + + /** + * Event identifier for dragend event. + */ + public static final String EVENT_DRAGEND = "dragend"; + + /** + * Event identifier for dragstart event. + */ + public static final String EVENT_DRAGSTART = "dragstart"; + + /** + * {@code DataTransfer.effectAllowed} parameter for the drag event. + */ + public EffectAllowed effectAllowed = EffectAllowed.UNINITIALIZED; + + /** + * {@code DataTransfer.types} parameter. Used to keep track of data formats + * set for the drag event. + */ + public List types = new ArrayList<>(); + + /** + * Used to store data in the {@code DataTransfer} object for the drag event. + */ + public Map data = new HashMap<>(); +} diff --git a/shared/src/main/java/com/vaadin/shared/ui/dnd/DropEffect.java b/shared/src/main/java/com/vaadin/shared/ui/dnd/DropEffect.java new file mode 100644 index 0000000000..5056ecfd78 --- /dev/null +++ b/shared/src/main/java/com/vaadin/shared/ui/dnd/DropEffect.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.shared.ui.dnd; + +/** + * Used to specify the drop effect to use on dragenter or dragover events. + */ +public enum DropEffect { + /** + * A copy of the source item is made at the new location. + */ + COPY, + + /** + * An item is moved to a new location. + */ + MOVE, + + /** + * A link is established to the source at the new location. + */ + LINK, + + /** + * The item may not be dropped. + */ + NONE +} diff --git a/shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetRpc.java b/shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetRpc.java new file mode 100644 index 0000000000..dd21278277 --- /dev/null +++ b/shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetRpc.java @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.shared.ui.dnd; + +import java.util.List; +import java.util.Map; + +import com.vaadin.shared.communication.ServerRpc; + +/** + * RPC for firing server side drop event when client side drop event happens on + * drop target. + */ +public interface DropTargetRpc extends ServerRpc { + + /** + * Called when drop event happens on client side. + * + * @param types + * Data types that are present in {@code data} map in the same order + * as found in {@code DataTransfer.types}. + * @param data + * Contains data from {@code DataTransfer} object. + * @param dropEffect + * Drop effect set for the drop target where drop happened. + */ + public void drop(List types, Map data, + DropEffect dropEffect); +} diff --git a/shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetState.java b/shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetState.java new file mode 100644 index 0000000000..3021c0bd6b --- /dev/null +++ b/shared/src/main/java/com/vaadin/shared/ui/dnd/DropTargetState.java @@ -0,0 +1,38 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.shared.ui.dnd; + +import com.vaadin.shared.communication.SharedState; + +/** + * State class containing parameters for DropTargetExtension. + */ +public class DropTargetState extends SharedState { + /** + * {@code DataTransfer.dropEffect} parameter for the drag event + */ + public DropEffect dropEffect; + + /** + * Criteria script to allow dragOver event on the element + */ + public String dragOverCriteria; + + /** + * Criteria script to allow drop event on the element + */ + public String dropCriteria; +} diff --git a/shared/src/main/java/com/vaadin/shared/ui/dnd/EffectAllowed.java b/shared/src/main/java/com/vaadin/shared/ui/dnd/EffectAllowed.java new file mode 100644 index 0000000000..2ff9f21980 --- /dev/null +++ b/shared/src/main/java/com/vaadin/shared/ui/dnd/EffectAllowed.java @@ -0,0 +1,81 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.shared.ui.dnd; + +/** + * Used to specify the effect that is allowed for a drag operation. + */ +public enum EffectAllowed { + /** + * The item may not be dropped. + */ + NONE("none"), + + /** + * A copy of the source item may be made at the new location. + */ + COPY("copy"), + + /** + * An item may be moved to a new location. + */ + MOVE("move"), + + /** + * A link may be established to the source at the new location. + */ + LINK("link"), + + /** + * A copy or move operation is permitted. + */ + COPY_MOVE("copyMove"), + + /** + * A copy or link operation is permitted. + */ + COPY_LINK("copyLink"), + + /** + * A link or move operation is permitted. + */ + LINK_MOVE("linkMove"), + + /** + * All operations are permitted. + */ + ALL("all"), + + /** + * Default state, equivalent to ALL + */ + UNINITIALIZED("uninitialized"); + + private final String value; + + EffectAllowed(String value) { + this.value = value; + } + + /** + * Get the string value that is accepted by the client side drag event. + * + * @return String value accepted by the client side drag event. + */ + public String getValue() { + return value; + } +} -- cgit v1.2.3