You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DragSourceExtensionConnector.java 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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.client.extensions;
  17. import java.util.List;
  18. import java.util.Map;
  19. import com.google.gwt.dom.client.DataTransfer;
  20. import com.google.gwt.dom.client.Element;
  21. import com.google.gwt.dom.client.NativeEvent;
  22. import com.vaadin.client.ComponentConnector;
  23. import com.vaadin.client.ServerConnector;
  24. import com.vaadin.event.dnd.DragSourceExtension;
  25. import com.vaadin.shared.ui.Connect;
  26. import com.vaadin.shared.ui.dnd.DragSourceRpc;
  27. import com.vaadin.shared.ui.dnd.DragSourceState;
  28. import elemental.events.Event;
  29. import elemental.events.EventListener;
  30. import elemental.events.EventTarget;
  31. /**
  32. * Extension to add drag source functionality to a widget for using HTML5 drag
  33. * and drop. Client side counterpart of {@link DragSourceExtension}.
  34. */
  35. @Connect(DragSourceExtension.class)
  36. public class DragSourceExtensionConnector extends AbstractExtensionConnector {
  37. private static final String CLASS_DRAGGABLE = "v-draggable";
  38. // Create event listeners
  39. private final EventListener dragStartListener = this::onDragStart;
  40. private final EventListener dragEndListener = this::onDragEnd;
  41. @Override
  42. protected void extend(ServerConnector target) {
  43. Element dragSourceElement = getDraggableElement();
  44. dragSourceElement.setDraggable(Element.DRAGGABLE_TRUE);
  45. dragSourceElement.addClassName(CLASS_DRAGGABLE);
  46. EventTarget dragSource = dragSourceElement.cast();
  47. // dragstart
  48. dragSource.addEventListener(Event.DRAGSTART, dragStartListener);
  49. // dragend
  50. dragSource.addEventListener(Event.DRAGEND, dragEndListener);
  51. }
  52. @Override
  53. public void onUnregister() {
  54. super.onUnregister();
  55. EventTarget dragSource = (EventTarget) getDraggableElement();
  56. // Remove listeners
  57. dragSource.removeEventListener(Event.DRAGSTART, dragStartListener);
  58. dragSource.removeEventListener(Event.DRAGEND, dragEndListener);
  59. }
  60. /**
  61. * Event handler for the {@code dragstart} event. Called when {@code
  62. * dragstart} event occurs.
  63. *
  64. * @param event
  65. * browser event to be handled
  66. */
  67. protected void onDragStart(Event event) {
  68. // Convert elemental event to have access to dataTransfer
  69. NativeEvent nativeEvent = (NativeEvent) event;
  70. // Set effectAllowed parameter
  71. if (getState().effectAllowed != null) {
  72. setEffectAllowed(nativeEvent.getDataTransfer(),
  73. getState().effectAllowed.getValue());
  74. }
  75. // Set data parameter
  76. List<String> types = getState().types;
  77. Map<String, String> data = getState().data;
  78. for (String format : types) {
  79. nativeEvent.getDataTransfer().setData(format, data.get(format));
  80. }
  81. // Initiate firing server side dragstart event when there is a
  82. // DragStartListener attached on the server side
  83. if (hasEventListener(DragSourceState.EVENT_DRAGSTART)) {
  84. getRpcProxy(DragSourceRpc.class).dragStart();
  85. }
  86. }
  87. /**
  88. * Event handler for the {@code dragend} event. Called when {@code dragend}
  89. * event occurs.
  90. *
  91. * @param event
  92. */
  93. protected void onDragEnd(Event event) {
  94. // Initiate server start dragend event when there is a DragEndListener
  95. // attached on the server side
  96. if (hasEventListener(DragSourceState.EVENT_DRAGEND)) {
  97. getRpcProxy(DragSourceRpc.class).dragEnd();
  98. }
  99. }
  100. /**
  101. * Finds the draggable element within the widget. By default, returns the
  102. * topmost element.
  103. *
  104. * @return the draggable element in the parent widget.
  105. */
  106. protected Element getDraggableElement() {
  107. return ((ComponentConnector) getParent()).getWidget().getElement();
  108. }
  109. private native void setEffectAllowed(DataTransfer dataTransfer,
  110. String effectAllowed)/*-{
  111. dataTransfer.effectAllowed = effectAllowed;
  112. }-*/;
  113. @Override
  114. public DragSourceState getState() {
  115. return (DragSourceState) super.getState();
  116. }
  117. }