Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

DragSourceExtension.java 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*
  2. * Copyright 2000-2016 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.event.dnd;
  17. import java.util.Objects;
  18. import com.vaadin.server.AbstractExtension;
  19. import com.vaadin.server.Resource;
  20. import com.vaadin.shared.Registration;
  21. import com.vaadin.shared.ui.dnd.DragSourceRpc;
  22. import com.vaadin.shared.ui.dnd.DragSourceState;
  23. import com.vaadin.shared.ui.dnd.DropEffect;
  24. import com.vaadin.shared.ui.dnd.EffectAllowed;
  25. import com.vaadin.ui.AbstractComponent;
  26. /**
  27. * Extension to make a component drag source for HTML5 drag and drop
  28. * functionality.
  29. *
  30. * @param <T>
  31. * Type of the component to be extended.
  32. * @author Vaadin Ltd
  33. * @since 8.1
  34. */
  35. public class DragSourceExtension<T extends AbstractComponent> extends
  36. AbstractExtension {
  37. private Registration dragStartListenerHandle;
  38. private Registration dragEndListenerHandle;
  39. /**
  40. * Stores the server side drag data that is available for the drop target if
  41. * it is in the same UI.
  42. */
  43. private Object dragData;
  44. /**
  45. * Extends {@code target} component and makes it a drag source.
  46. *
  47. * @param target
  48. * Component to be extended.
  49. */
  50. public DragSourceExtension(T target) {
  51. registerDragSourceRpc(target);
  52. super.extend(target);
  53. initListeners();
  54. }
  55. /**
  56. * Initializes the event listeners this drag source is using.
  57. */
  58. protected void initListeners() {
  59. // Set current extension as active drag source in the UI
  60. dragStartListenerHandle = addDragStartListener(
  61. event -> getUI().setActiveDragSource(this));
  62. // Remove current extension as active drag source from the UI
  63. dragEndListenerHandle = addDragEndListener(
  64. event -> getUI().setActiveDragSource(null));
  65. }
  66. /**
  67. * Register server RPC.
  68. *
  69. * @param target
  70. * Extended component.
  71. */
  72. protected void registerDragSourceRpc(T target) {
  73. registerRpc(new DragSourceRpc() {
  74. @Override
  75. public void dragStart() {
  76. DragStartEvent<T> event = new DragStartEvent<>(target,
  77. getState(false).effectAllowed);
  78. fireEvent(event);
  79. }
  80. @Override
  81. public void dragEnd(DropEffect dropEffect) {
  82. DragEndEvent<T> event = new DragEndEvent<>(target, dropEffect);
  83. fireEvent(event);
  84. }
  85. });
  86. }
  87. @Override
  88. public void remove() {
  89. super.remove();
  90. // Remove listeners attached on construction
  91. dragStartListenerHandle.remove();
  92. dragEndListenerHandle.remove();
  93. }
  94. /**
  95. * Sets the allowed effects for the current drag source element. Used for
  96. * setting client side {@code DataTransfer.effectAllowed} parameter for the
  97. * drag event.
  98. * <p>
  99. * By default the value is {@link EffectAllowed#UNINITIALIZED} which is
  100. * equivalent to {@link EffectAllowed#ALL}.
  101. *
  102. * @param effect
  103. * Effects to allow for this draggable element. Cannot be {@code
  104. * null}.
  105. */
  106. public void setEffectAllowed(EffectAllowed effect) {
  107. if (effect == null) {
  108. throw new IllegalArgumentException("Allowed effect cannot be null");
  109. }
  110. if (!Objects.equals(getState(false).effectAllowed, effect)) {
  111. getState().effectAllowed = effect;
  112. }
  113. }
  114. /**
  115. * Returns the allowed effects for the current drag source element. Used to
  116. * set client side {@code DataTransfer.effectAllowed} parameter for the drag
  117. * event.
  118. *
  119. * @return Effects that are allowed for this draggable element.
  120. */
  121. public EffectAllowed getEffectAllowed() {
  122. return getState(false).effectAllowed;
  123. }
  124. /**
  125. * Sets data for this drag source element. The data is set for the client
  126. * side draggable element using the {@code DataTransfer.setData("text",
  127. * data)} method.
  128. *
  129. * @param data
  130. * Data to be set for the client side draggable element.
  131. */
  132. public void setDataTransferText(String data) {
  133. getState().dataTransferText = data;
  134. }
  135. /**
  136. * Returns the data stored with type {@code "text"} in this drag source
  137. * element.
  138. *
  139. * @return Data of type {@code "text"} stored in this drag source element.
  140. */
  141. public String getDataTransferText() {
  142. return getState(false).dataTransferText;
  143. }
  144. /**
  145. * Clears data of type {@code "text"} in this drag source element.
  146. */
  147. public void clearDataTransferText() {
  148. getState().dataTransferText = null;
  149. }
  150. /**
  151. * Set server side drag data. This data is available in the drop event and
  152. * can be used to transfer data between drag source and drop target if they
  153. * are in the same UI.
  154. *
  155. * @param data
  156. * Data to transfer to drop event.
  157. */
  158. public void setDragData(Object data) {
  159. dragData = data;
  160. }
  161. /**
  162. * Get server side drag data. This data is available in the drop event and
  163. * can be used to transfer data between drag source and drop target if they
  164. * are in the same UI.
  165. *
  166. * @return Server side drag data if set, otherwise {@literal null}.
  167. */
  168. public Object getDragData() {
  169. return dragData;
  170. }
  171. /**
  172. * Attaches dragstart listener for the current drag source. {@link
  173. * DragStartListener#dragStart(DragStartEvent)} is called when dragstart
  174. * event happens on the client side.
  175. *
  176. * @param listener
  177. * Listener to handle dragstart event.
  178. * @return Handle to be used to remove this listener.
  179. */
  180. public Registration addDragStartListener(DragStartListener<T> listener) {
  181. return addListener(DragSourceState.EVENT_DRAGSTART,
  182. DragStartEvent.class, listener,
  183. DragStartListener.DRAGSTART_METHOD);
  184. }
  185. /**
  186. * Attaches dragend listener for the current drag source. {@link
  187. * DragEndListener#dragEnd(DragEndEvent)} is called when dragend
  188. * event happens on the client side.
  189. *
  190. * @param listener
  191. * Listener to handle dragend event.
  192. * @return Handle to be used to remove this listener.
  193. */
  194. public Registration addDragEndListener(DragEndListener<T> listener) {
  195. return addListener(DragSourceState.EVENT_DRAGEND, DragEndEvent.class,
  196. listener, DragEndListener.DRAGEND_METHOD);
  197. }
  198. /**
  199. * Set a custom drag image for the current drag source.
  200. *
  201. * @param imageResource
  202. * Resource of the image to be displayed as drag image.
  203. */
  204. public void setDragImage(Resource imageResource) {
  205. setResource(DragSourceState.RESOURCE_DRAG_IMAGE, imageResource);
  206. }
  207. @Override
  208. protected DragSourceState getState() {
  209. return (DragSourceState) super.getState();
  210. }
  211. @Override
  212. protected DragSourceState getState(boolean markAsDirty) {
  213. return (DragSourceState) super.getState(markAsDirty);
  214. }
  215. /**
  216. * Returns the component this extension is attached to.
  217. *
  218. * @return Extended component.
  219. */
  220. @Override
  221. @SuppressWarnings("unchecked")
  222. public T getParent() {
  223. return (T) super.getParent();
  224. }
  225. }