def onEnter(self, context): super.onEnter(context) assert draggableList.size() == 0 dropTargetClientWidth = DOMUtil.getClientWidth(dropTarget.getElement()) dropTargetClientHeight = DOMUtil.getClientHeight(dropTarget.getElement()) WidgetLocation dropTargetLocation = WidgetLocation(dropTarget, None) dropTargetOffsetX = dropTargetLocation.getLeft() + DOMUtil.getBorderLeft(dropTarget.getElement()) dropTargetOffsetY = dropTargetLocation.getTop() + DOMUtil.getBorderTop(dropTarget.getElement()) int draggableAbsoluteLeft = context.draggable.getAbsoluteLeft() int draggableAbsoluteTop = context.draggable.getAbsoluteTop() for Iterator iterator = context.selectedWidgets.iterator(); iterator.hasNext();:
def makePositioner(self, reference): # Use two widgets so that setPixelSize() consistently affects dimensions # excluding positioner border in quirks and strict modes SimplePanel outer = SimplePanel() outer.addStyleName(CSS_DRAGDROP_POSITIONER) DOM.setStyleAttribute(outer.getElement(), "margin", "0px") # place off screen for border calculation RootPanel.get().add(outer, -500, -500) # Ensure IE quirks mode returns valid outer.offsetHeight, and thus valid # DOMUtil.getVerticalBorders(outer) outer.setWidget(DUMMY_LABEL_IE_QUIRKS_MODE_OFFSET_HEIGHT) SimplePanel inner = SimplePanel() DOM.setStyleAttribute(inner.getElement(), "margin", "0px") DOM.setStyleAttribute(inner.getElement(), "border", "none") int offsetWidth = reference.getOffsetWidth() - DOMUtil.getHorizontalBorders(outer) int offsetHeight = reference.getOffsetHeight() - DOMUtil.getVerticalBorders(outer) inner.setPixelSize(offsetWidth, offsetHeight) outer.setWidget(inner) return outer
def onMove(self, context): super.onMove(context) int targetIndex = DOMUtil.findIntersect(dropTarget, CoordinateLocation(context.mouseX, context.mouseY), getLocationWidgetComparator()) # check that positioner not already in the correct location int positionerIndex = dropTarget.getWidgetIndex(positioner) if positionerIndex != targetIndex and (positionerIndex != targetIndex - 1 or targetIndex == 0): if positionerIndex == 0 and dropTarget.getWidgetCount() == 1: # do nothing, the positioner is the only widget elif targetIndex == -1: # outside drop target, so remove positioner to indicate a drop will not happen positioner.removeFromParent() else: insert(positioner, targetIndex)
# Ensure IE quirks mode returns valid outer.offsetHeight, and thus valid # DOMUtil.getVerticalBorders(outer) outer.setWidget(DUMMY_LABEL_IE_QUIRKS_MODE_OFFSET_HEIGHT) int width = 0 int height = 0 if dropTarget instanceof HorizontalPanel: for Iterator iterator = context.selectedWidgets.iterator(); iterator.hasNext();: Widget widget = (Widget) iterator.next() width += widget.getOffsetWidth() height = Math.max(height, widget.getOffsetHeight()) else: for Iterator iterator = context.selectedWidgets.iterator(); iterator.hasNext();: Widget widget = (Widget) iterator.next() width = Math.max(width, widget.getOffsetWidth()) height += widget.getOffsetHeight() SimplePanel inner = SimplePanel() inner.setPixelSize(width - DOMUtil.getHorizontalBorders(outer), height - DOMUtil.getVerticalBorders(outer)) outer.setWidget(inner) return outer
movablePanel.removeFromParent() movablePanel = None super.dragEnd() def dragMove(self): int desiredLeft = context.desiredDraggableX - boundaryOffsetX int desiredTop = context.desiredDraggableY - boundaryOffsetY if getBehaviorConstrainedToBoundaryPanel(): desiredLeft = Math.max(0, Math.min(desiredLeft, dropTargetClientWidth - context.draggable.getOffsetWidth())) desiredTop = Math.max(0, Math.min(desiredTop, dropTargetClientHeight - context.draggable.getOffsetHeight())) DOMUtil.fastSetElementPosition(movablePanel.getElement(), desiredLeft, desiredTop) DropController newDropController = getIntersectDropController(context.mouseX, context.mouseY) if context.dropController != newDropController: if context.dropController is not None: context.dropController.onLeave(context) context.dropController = newDropController if context.dropController is not None: context.dropController.onEnter(context) if context.dropController is not None: context.dropController.onMove(context)
* Cache a list of eligible drop controllers, sorted by relative DOM positions * of their respective drop targets. Called at the beginning of each drag operation, * or whenever drop target eligibility has changed while dragging. * * @param boundaryPanel boundary area for drop target eligibility considerations * @param context the current drag context """ def resetCache(self, boundaryPanel, context): ArrayList list = ArrayList() if context.draggable is not None: WidgetArea boundaryArea = WidgetArea(boundaryPanel, None) for Iterator iterator = dropControllerList.iterator(); iterator.hasNext();: DropController dropController = (DropController) iterator.next() Candidate candidate = Candidate(dropController) if DOMUtil.isOrContains(context.draggable.getElement(), candidate.getDropTarget().getElement())) { continue if candidate.getTargetArea().intersects(boundaryArea): list.add(candidate) sortedCandidates = (Candidate[]) list.toArray(Candidate[list.size()]) Arrays.sort(sortedCandidates)