/** @return a {@link BooleanProperty} of whether {@code draggable} is current being dragged over. */ public static BooleanProperty draggingOver(HasAllDragAndDropHandlers draggable) { BooleanProperty over = booleanProperty("over"); // for ignoring drag enters when we're selected draggable.addDragStartHandler(e -> currentDraggable = draggable); // Technically if the draggable element is removed from the DOM (say because the // current drag's drop logic moves it somewhere else), we will not get the dragend // event. So we can set it null here, but we rely on the static currentDraggable // being reset by the next dragstart to handle the "removed from DOM" case. draggable.addDragEndHandler(e -> currentDraggable = null); // our children will bubble up dragEnters/dragLeaves as well, so keep track // of the "last" drag enter, which will be ours, and ignore them until then int[] count = { 0 }; draggable.addDragEnterHandler(e -> { if (currentDraggable != draggable && ++count[0] == 1) { over.set(true); } }); draggable.addDragLeaveHandler(e -> { if (over.isTrue() && --count[0] == 0) { over.set(false); } }); draggable.addDropHandler(e -> { over.set(false); count[0] = 0; }); return over; }
private void initListeners(HasAllDragAndDropHandlers dropZoneWidget) { removePreviousHandlers(dropZoneWidget); // final Handlers handlers = new Handlers(); rememberHandlerRegistration(dropZoneWidget, dropZoneWidget.addDropHandler(handlers)); rememberHandlerRegistration(dropZoneWidget, dropZoneWidget.addDragOverHandler(handlers)); rememberHandlerRegistration(dropZoneWidget, dropZoneWidget.addDragHandler(handlers)); rememberHandlerRegistration(dropZoneWidget, dropZoneWidget.addDragEndHandler(handlers)); rememberHandlerRegistration(dropZoneWidget, dropZoneWidget.addDragEnterHandler(handlers)); rememberHandlerRegistration(dropZoneWidget, dropZoneWidget.addDragLeaveHandler(handlers)); rememberHandlerRegistration(dropZoneWidget, dropZoneWidget.addDragStartHandler(handlers)); // to clean up on drop zone detach: if (dropZoneWidget instanceof HasAttachHandlers) { ((HasAttachHandlers) dropZoneWidget).addAttachHandler(handlers); } }
private <T extends HasAllDragAndDropHandlers & IsWidget> void set(String type, IsFlowPanel root, Property<T> current, T a) { // just to see one of them not be draggable if (a != view.a4() && a != view.l4()) { a.getIsElement().setAttribute("draggable", "true"); } binder.when(draggingOver(a)).is(true).set(view.style().bold()).on(a); binder.when(dragging(a)).is(true).set(current).to(a); a.addDragStartHandler(e -> e.setData("text", type)); a.addDragOverHandler(e -> e.preventDefault()); a.addDropHandler(e -> { if (type.equals(e.getData("text")) && current.get() != a) { GWT.log("Dropped " + current + " onto " + a); root.remove(current.get()); root.insert(current.get(), root.getWidgetIndex(a)); } e.preventDefault(); }); }