class DragTargetView extends View { /** * Called by the dragged movable object. * Checks all drag target views if they're underneath the object at position x, y. If so, their onDragOver() function is called. * You must speficy the draggableType (a string) of the draggedObject. * The sourceView is the view where the object was taken from. */ static dragObject(draggedObject, draggableType, sourceView, x, y) { if (!DragTargetView.dragTargetViews) { return; } DragTargetView.sourceView = sourceView; var dragTarget = null; var validTarget = false; for (var i = 0; i < DragTargetView.dragTargetViews.length; i++) { var dragTargetView = DragTargetView.dragTargetViews[i]; var rect = dragTargetView.element.getBoundingClientRect(); if (x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height) { validTarget = dragTargetView.acceptsType(draggableType); dragTargetView.onDragOver(draggedObject, validTarget, sourceView, x, y); if (validTarget) { dragTarget = dragTargetView; break; } } } if (DragTargetView.currentDragTarget != dragTarget) { if (DragTargetView.currentDragTarget) { DragTargetView.currentDragTarget.onDragExit(sourceView); } if (dragTarget) { dragTarget.onDragEnter(draggedObject, validTarget, sourceView); } } DragTargetView.currentDragTarget = dragTarget; } /** * Called by the movable object when it's released. * Checks if there is a droppable target. If there is one, the onDrop function of the target is called. * Returns true if the object was dropped somewhere. False if not. */ static dropObject(droppedObject, x, y) { if (!DragTargetView.currentDragTarget) { return false; } DragTargetView.currentDragTarget.onDrop(droppedObject, DragTargetView.sourceView, x, y); DragTargetView.currentDragTarget.onDragEnd(); DragTargetView.sourceView = null; DragTargetView.currentDragTarget = null; return true; } constructor(element) { super(element); if (!DragTargetView.dragTargetViews) { DragTargetView.dragTargetViews = [ ]; } DragTargetView.dragTargetViews.push(this); } onDragOver(draggedObject, validType, sourceView, x, y) { } onDragEnter(draggedObject, validType, sourceView) { } onDragExit() { } onDragEnd() { } onDrop(droppedObject, sourceView) { } /** * Override this in your drag target view to specify which draggable object types it accepts. * Return true or false depending on whether you want to accept the given draggableType or not. */ acceptsType(draggableType) { return true; } }