public static BooleanProperty dragging(HasAllDragAndDropHandlers draggable) { BooleanProperty dragging = booleanProperty("dragging"); draggable.addDragStartHandler(e -> dragging.set(true)); draggable.addDragEndHandler(e -> dragging.set(false)); return dragging; }
/** @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); } }