def doDrag(self, event, x, y): self.dragBusy = True #self.dragDataStore.dropEffect = 'none' drag_event = self.fireDNDEvent('drag', None, self.dragWidget) # drag event was not canceled if not isCanceled(drag_event): target = None widget = None # Find the most specific element under the cursor and the widget # with the drop listener for it. for widget in self.dropTargets: target = getElementUnderMouse(widget, x, y) if target is not None: break if target: drop_widget = widget drop_element = target if (not self.currentTargetElement or not DOM.compare( drop_element, self.currentTargetElement)): # enter_event = self.makeDragEvent(event,'dragenter', # drop_element) enter_event = self.fireDNDEvent('dragenter', drop_element, drop_widget) # drop_widget.onDragEnter(enter_event) # self.finalize(enter_event) if isCanceled(enter_event): self.currentTargetElement = drop_element self.currentDropWidget = drop_widget if self.currentTargetElement is not None: # disable dropping if over event is not canceled # over_event = self.makeDragEvent(event, 'dragover', # drop_element) over_event = self.fireDNDEvent('dragover', drop_element, self.currentDropWidget) # self.currentDropWidget.onDragOver(over_event) # self.finalize(over_event) if isCanceled(over_event): self.updateDragOperation(over_event) else: self.currentDragOperation = 'none' self.draggingImage.updateCursor(self.currentDragOperation) else: self.currentTargetElement = None else: self.currentDragOperation = 'none' self.dragBusy = False
def doDrag(self, event, x, y): self.dragBusy = True #self.dragDataStore.dropEffect = 'none' drag_event = self.fireDNDEvent('drag', None, self.dragWidget) # drag event was not canceled if not isCanceled(drag_event): target = None widget = None # Find the most specific element under the cursor and the widget # with the drop listener for it. for widget in self.dropTargets: target = getElementUnderMouse(widget, x, y) if target is not None: break if target: drop_widget = widget drop_element = target if (not self.currentTargetElement or not DOM.compare(drop_element, self.currentTargetElement)): # enter_event = self.makeDragEvent(event,'dragenter', # drop_element) enter_event = self.fireDNDEvent('dragenter', drop_element, drop_widget) # drop_widget.onDragEnter(enter_event) # self.finalize(enter_event) if isCanceled(enter_event): self.currentTargetElement = drop_element self.currentDropWidget = drop_widget if self.currentTargetElement is not None: # disable dropping if over event is not canceled # over_event = self.makeDragEvent(event, 'dragover', # drop_element) over_event = self.fireDNDEvent('dragover', drop_element, self.currentDropWidget) # self.currentDropWidget.onDragOver(over_event) # self.finalize(over_event) if isCanceled(over_event): self.updateDragOperation(over_event) else: self.currentDragOperation = 'none' self.draggingImage.updateCursor(self.currentDragOperation) else: self.currentTargetElement = None else: self.currentDragOperation = 'none' self.dragBusy = False
def onMouseUp(self, sender, x, y): # event = DOM.eventGetCurrentEvent() self.dragging = NOT_DRAGGING if self.draggingImage: GlassWidget.hide() if (self.currentDragOperation == 'none' or not self.currentTargetElement): if self.currentTargetElement: # leave_event = self.makeDragEvent(event, 'dragleave', # self.currentTargetElement) self.fireDNDEvent('dragleave', self.currentTargetElement, self.currentDropWidget) # self.currentDropWidget.onDragLeave(leave_event) # self.finalize(leave_event) else: self.currentDragOperation = 'none' self.returnDrag() else: # self.dragDataStore.mode = READ_ONLY # drop_event = self.makeDragEvent(event, 'drop', # self.currentTargetElement) drop_event = self.fireDNDEvent('drop', self.currentTargetElement, self.currentDropWidget) #self.dropEffect = self.currentDragOperation # self.currentDropWidget.onDrop(drop_event) # self.finalize(drop_event) if isCanceled(drop_event): self.currentDragOperation = drop_event.dataTransfer.dropEffect else: self.currentDragOperation = 'none' self.zapDragImage() #self.dropEffect = self.currentDragOperation self.fireDNDEvent('dragend', None, self.dragWidget)
def onMouseMove(self, sender, x, y): event = DOM.eventGetCurrentEvent() self.mouseEvent = event button = DOM.eventGetButton(event) if not button == Event.BUTTON_LEFT: return ## The following commented code lets the native dnd happen in IE. sucks. ## But it may enable dragging our widgets out of IE into other apps. # else: # try: # self.dragWidget.getElement().dragDrop() # return # except: # pass # Adjust x and y to absolute coordinates. x, y = eventCoordinates(event) if self.dragging == DRAGGING_NO_MOVEMENT_YET: self.origMouseX = x self.origMouseY = y self.currentDragOperation = 'none' fromElement = self.dragWidget.getElement() # Is the widget itself draggable? try: draggable = fromElement.draggable except: draggable = False # if not, find the draggable element at (x, y) in the widget if not draggable: fromElement = findDraggable(sender.getElement(), self.origMouseX, self.origMouseY) # Nothing draggable found. return. if fromElement is None: self.dragging = NOT_DRAGGING return # Get the location for the dragging widget #self.absParent = None #self.absParent = self.dragWidget.getParent() #self.absLeft = DOM.getStyleAttribute(fromElement, 'left') #print self.absLeft #self.absTop = DOM.getStyleAttribute(fromElement, 'top') #print self.absTop #self.origTop = DOM.getAbsoluteTop(fromElement) + parent.getAbsoluteTop() #self.origLeft = DOM.getAbsoluteLeft(fromElement) + parent.getAbsoluteLeft() self.origTop = DOM.getAbsoluteTop(fromElement) self.origLeft = DOM.getAbsoluteLeft(fromElement) #self.glassTop = DOM.getAbsoluteTop(fromElement.offsetParent) #self.glassLeft = DOM.getAbsoluteTop(fromElement.offsetParent) position_absolute = DOM.getStyleAttribute(fromElement, 'position') == 'absolute' if position_absolute: self.dragLeftOffset = ( self.origMouseX - DOM.getAbsoluteLeft(fromElement.offsetParent)) self.dragTopOffset = ( self.origMouseY - DOM.getAbsoluteTop(fromElement.offsetParent)) else: self.dragLeftOffset = self.origMouseX - self.origLeft self.dragTopOffset = self.origMouseY - self.origTop # self.setDragImage(fromElement, # self.origMouseX - self.origLeft, # self.origMouseY - self.origTop) self.dragDataStore.elements = [fromElement] dragStartEvent = self.fireDNDEvent('dragstart', None, self.dragWidget) if not isCanceled(dragStartEvent): self.initFeedbackImage() RootPanel().add(self.draggingImage) self.setDragImageLocation(x, y) self.dragging = ACTIVELY_DRAGGING GlassWidget.show(self) elif self.dragging == ACTIVELY_DRAGGING: try: doc().selection.empty() except: wnd().getSelection().removeAllRanges() self.setDragImageLocation(x, y) # If we are still working on the previous iteration, or if we have # done this recently, we'll wait for the next event. if self.dragBusy or time.time() - self.drag_time < 0.25: return self.doDrag(event, x, y) self.drag_time = time.time()
def onMouseMove(self, sender, x, y): event = DOM.eventGetCurrentEvent() self.mouseEvent = event button = DOM.eventGetButton(event) if not button == Event.BUTTON_LEFT: return ## The following commented code lets the native dnd happen in IE. sucks. ## But it may enable dragging our widgets out of IE into other apps. # else: # try: # self.dragWidget.getElement().dragDrop() # return # except: # pass # Adjust x and y to absolute coordinates. x, y = eventCoordinates(event) if self.dragging == DRAGGING_NO_MOVEMENT_YET: self.origMouseX = x self.origMouseY = y self.currentDragOperation = 'none' fromElement = self.dragWidget.getElement() # Is the widget itself draggable? try: draggable = fromElement.draggable except: draggable = False # if not, find the draggable element at (x, y) in the widget if not draggable: fromElement = findDraggable(sender.getElement(), self.origMouseX, self.origMouseY) # Nothing draggable found. return. if fromElement is None: self.dragging = NOT_DRAGGING return # Get the location for the dragging widget #self.absParent = None #self.absParent = self.dragWidget.getParent() #self.absLeft = DOM.getStyleAttribute(fromElement, 'left') #print self.absLeft #self.absTop = DOM.getStyleAttribute(fromElement, 'top') #print self.absTop #self.origTop = DOM.getAbsoluteTop(fromElement) + parent.getAbsoluteTop() #self.origLeft = DOM.getAbsoluteLeft(fromElement) + parent.getAbsoluteLeft() self.origTop = DOM.getAbsoluteTop(fromElement) self.origLeft = DOM.getAbsoluteLeft(fromElement) #self.glassTop = DOM.getAbsoluteTop(fromElement.offsetParent) #self.glassLeft = DOM.getAbsoluteTop(fromElement.offsetParent) position_absolute = DOM.getStyleAttribute(fromElement, 'position') == 'absolute' if position_absolute: self.dragLeftOffset = (self.origMouseX - DOM.getAbsoluteLeft(fromElement.offsetParent)) self.dragTopOffset = (self.origMouseY - DOM.getAbsoluteTop(fromElement.offsetParent)) else: self.dragLeftOffset = self.origMouseX - self.origLeft self.dragTopOffset = self.origMouseY - self.origTop # self.setDragImage(fromElement, # self.origMouseX - self.origLeft, # self.origMouseY - self.origTop) self.dragDataStore.elements = [fromElement] dragStartEvent = self.fireDNDEvent('dragstart', None, self.dragWidget) if not isCanceled(dragStartEvent): self.initFeedbackImage() RootPanel().add(self.draggingImage) self.setDragImageLocation(x, y) self.dragging = ACTIVELY_DRAGGING GlassWidget.show(self) elif self.dragging == ACTIVELY_DRAGGING: try: doc().selection.empty() except: wnd().getSelection().removeAllRanges() self.setDragImageLocation(x, y) # If we are still working on the previous iteration, or if we have # done this recently, we'll wait for the next event. if self.dragBusy or time.time() - self.drag_time < 0.25: return self.doDrag(event, x, y) self.drag_time = time.time()