pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow, void *handlerRefCon, DragReference theDrag) { MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon; if ( trackingGlobals->m_currentTarget ) { Point mouse,localMouse ; int localx,localy ; trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; GetDragMouse(theDrag, &mouse, 0L); localMouse = mouse; GlobalToLocal(&localMouse); localx = localMouse.h ; localy = localMouse.v ; //TODO : should we use client coordinates if ( trackingGlobals->m_currentTargetWindow ) trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx , &localy ) ; if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) ) { KeyMap keymap; GetKeys(keymap); bool optionDown = keymap[1] & 4; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ; } } return(noErr); }
static PyObject *DragObj_GetDragMouse(DragObjObject *_self, PyObject *_args) { PyObject *_res = NULL; OSErr _err; Point mouse; Point globalPinnedMouse; #ifndef GetDragMouse PyMac_PRECHECK(GetDragMouse); #endif if (!PyArg_ParseTuple(_args, "")) return NULL; _err = GetDragMouse(_self->ob_itself, &mouse, &globalPinnedMouse); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&O&", PyMac_BuildPoint, mouse, PyMac_BuildPoint, globalPinnedMouse); return _res; }
pascal OSErr wxMacWindowDragReceiveHandler( WindowPtr theWindow, void *handlerRefCon, DragReference theDrag) { MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*)handlerRefCon; if ( trackingGlobals->m_currentTarget ) { Point mouse, localMouse; int localx, localy; PasteboardRef pasteboard = 0; GetDragPasteboard( theDrag, &pasteboard ); trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); GetDragMouse( theDrag, &mouse, 0L ); localMouse = mouse; localx = localMouse.h; localy = localMouse.v; wxNonOwnedWindow* tlw = wxNonOwnedWindow::GetFromWXWindow((WXWindow) theWindow); if ( tlw ) tlw->GetNonOwnedPeer()->ScreenToWindow( &localx, &localy ); // TODO : should we use client coordinates? if ( trackingGlobals->m_currentTargetWindow ) trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx, &localy ); if ( trackingGlobals->m_currentTarget->OnDrop( localx, localy ) ) { // the option key indicates copy in Mac UI, if it's not pressed do // move by default if it's allowed at all wxDragResult result = !(trackingGlobals->m_flags & wxDrag_AllowMove) || (GetCurrentKeyModifiers() & optionKey) ? wxDragCopy : wxDragMove; trackingGlobals->m_result = trackingGlobals->m_currentTarget->OnData( localx, localy, result ); } } return noErr; }
pascal OSErr wxMacWindowDragTrackingHandler( DragTrackingMessage theMessage, WindowPtr theWindow, void *handlerRefCon, DragReference theDrag ) { MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon; Point mouse, localMouse; DragAttributes attributes; GetDragAttributes( theDrag, &attributes ); PasteboardRef pasteboard = 0; GetDragPasteboard( theDrag, &pasteboard ); wxNonOwnedWindow* toplevel = wxNonOwnedWindow::GetFromWXWindow( (WXWindow) theWindow ); bool optionDown = GetCurrentKeyModifiers() & optionKey; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; switch (theMessage) { case kDragTrackingEnterHandler: case kDragTrackingLeaveHandler: break; case kDragTrackingEnterWindow: if (trackingGlobals != NULL) { trackingGlobals->m_currentTargetWindow = NULL; trackingGlobals->m_currentTarget = NULL; } break; case kDragTrackingInWindow: if (trackingGlobals == NULL) break; if (toplevel == NULL) break; GetDragMouse( theDrag, &mouse, 0L ); { int x = mouse.h ; int y = mouse.v ; toplevel->GetNonOwnedPeer()->ScreenToWindow( &x, &y ); localMouse.h = x; localMouse.v = y; { wxWindow *win = NULL; ControlPartCode controlPart; ControlRef control = FindControlUnderMouse( localMouse, theWindow, &controlPart ); if ( control ) win = wxFindWindowFromWXWidget( (WXWidget) control ); else win = toplevel; int localx, localy; localx = localMouse.h; localy = localMouse.v; if ( win ) win->MacRootWindowToWindow( &localx, &localy ); if ( win != trackingGlobals->m_currentTargetWindow ) { if ( trackingGlobals->m_currentTargetWindow ) { // this window is left if ( trackingGlobals->m_currentTarget ) { HideDragHilite( theDrag ); trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); trackingGlobals->m_currentTarget->OnLeave(); trackingGlobals->m_currentTarget = NULL; trackingGlobals->m_currentTargetWindow = NULL; } } if ( win ) { // this window is entered trackingGlobals->m_currentTargetWindow = win; trackingGlobals->m_currentTarget = win->GetDropTarget(); { if ( trackingGlobals->m_currentTarget ) { trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); result = trackingGlobals->m_currentTarget->OnEnter( localx, localy, result ); } if ( result != wxDragNone ) { int x, y; x = y = 0; win->MacWindowToRootWindow( &x, &y ); RgnHandle hiliteRgn = NewRgn(); Rect r = { y, x, y + win->GetSize().y, x + win->GetSize().x }; RectRgn( hiliteRgn, &r ); ShowDragHilite( theDrag, hiliteRgn, true ); DisposeRgn( hiliteRgn ); } } } } else { if ( trackingGlobals->m_currentTarget ) { trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); result = trackingGlobals->m_currentTarget->OnDragOver( localx, localy, result ); } } // set cursor for OnEnter and OnDragOver if ( trackingGlobals->m_currentSource && !trackingGlobals->m_currentSource->GiveFeedback( result ) ) { if ( !trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) ) { wxStockCursor cursorID = wxCURSOR_NONE; switch (result) { case wxDragCopy: cursorID = wxCURSOR_COPY_ARROW; break; case wxDragMove: cursorID = wxCURSOR_ARROW; break; case wxDragNone: cursorID = wxCURSOR_NO_ENTRY; break; case wxDragError: case wxDragLink: case wxDragCancel: default: // put these here to make gcc happy ; } if (cursorID != wxCURSOR_NONE) { wxCursor cursor( cursorID ); cursor.MacInstall(); } } } } } break; case kDragTrackingLeaveWindow: if (trackingGlobals == NULL) break; if (trackingGlobals->m_currentTarget) { trackingGlobals->m_currentTarget->SetCurrentDragPasteboard( pasteboard ); trackingGlobals->m_currentTarget->OnLeave(); HideDragHilite( theDrag ); trackingGlobals->m_currentTarget = NULL; } trackingGlobals->m_currentTargetWindow = NULL; break; default: break; } return noErr; }
pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow, void *handlerRefCon, DragReference theDrag) { MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon; Point mouse, localMouse; DragAttributes attributes; GetDragAttributes(theDrag, &attributes); wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( (WXWindow) theWindow ) ; KeyMap keymap; GetKeys(keymap); bool optionDown = keymap[1] & 4; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; switch(theMessage) { case kDragTrackingEnterHandler: break; case kDragTrackingLeaveHandler: break; case kDragTrackingEnterWindow: trackingGlobals->m_currentTargetWindow = NULL ; trackingGlobals->m_currentTarget = NULL ; break; case kDragTrackingInWindow: if (toplevel == NULL) break; GetDragMouse(theDrag, &mouse, 0L); localMouse = mouse; GlobalToLocal(&localMouse); // if (attributes & kDragHasLeftSenderWindow) { wxPoint point(localMouse.h , localMouse.v) ; wxWindow *win = NULL ; toplevel->MacGetWindowFromPointSub( point , &win ) ; int localx , localy ; localx = localMouse.h ; localy = localMouse.v ; //TODO : should we use client coordinates if ( win ) win->MacRootWindowToWindow( &localx , &localy ) ; if ( win != trackingGlobals->m_currentTargetWindow ) { if ( trackingGlobals->m_currentTargetWindow ) { // this window is left if ( trackingGlobals->m_currentTarget ) { HideDragHilite(theDrag); trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; trackingGlobals->m_currentTarget->OnLeave() ; trackingGlobals->m_currentTarget = NULL; trackingGlobals->m_currentTargetWindow = NULL ; } } if ( win ) { // this window is entered trackingGlobals->m_currentTargetWindow = win ; trackingGlobals->m_currentTarget = win->GetDropTarget() ; { if ( trackingGlobals->m_currentTarget ) { trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; result = trackingGlobals->m_currentTarget->OnEnter( localx , localy , result ) ; } if ( result != wxDragNone ) { int x , y ; x = y = 0 ; win->MacWindowToRootWindow( &x , &y ) ; RgnHandle hiliteRgn = NewRgn() ; SetRectRgn( hiliteRgn , x , y , x+win->GetSize().x ,y+win->GetSize().y) ; ShowDragHilite(theDrag, hiliteRgn, true); DisposeRgn( hiliteRgn ) ; } } } } else { if( trackingGlobals->m_currentTarget ) { trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; trackingGlobals->m_currentTarget->OnDragOver( localx , localy , result ) ; } } // set cursor for OnEnter and OnDragOver if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE ) { if ( trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) == FALSE ) { switch( result ) { case wxDragCopy : { wxCursor cursor(wxCURSOR_COPY_ARROW) ; cursor.MacInstall() ; } break ; case wxDragMove : { wxCursor cursor(wxCURSOR_ARROW) ; cursor.MacInstall() ; } break ; case wxDragNone : { wxCursor cursor(wxCURSOR_NO_ENTRY) ; cursor.MacInstall() ; } break ; case wxDragError: case wxDragLink: case wxDragCancel: // put these here to make gcc happy ; } } } } // MyTrackItemUnderMouse(localMouse, theWindow); break; case kDragTrackingLeaveWindow: if (trackingGlobals->m_currentTarget) { trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; trackingGlobals->m_currentTarget->OnLeave() ; HideDragHilite(theDrag); trackingGlobals->m_currentTarget = NULL ; } trackingGlobals->m_currentTargetWindow = NULL ; break; } return(noErr); }
pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow, void *handlerRefCon, DragReference theDrag) { MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon; Point mouse, localMouse; DragAttributes attributes; GetDragAttributes(theDrag, &attributes); wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ; bool optionDown = GetCurrentKeyModifiers() & optionKey ; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; switch(theMessage) { case kDragTrackingEnterHandler: break; case kDragTrackingLeaveHandler: break; case kDragTrackingEnterWindow: trackingGlobals->m_currentTargetWindow = NULL ; trackingGlobals->m_currentTarget = NULL ; break; case kDragTrackingInWindow: if (toplevel == NULL) break; GetDragMouse(theDrag, &mouse, 0L); localMouse = mouse; GlobalToLocal(&localMouse); { wxWindow *win = NULL ; ControlPartCode controlPart ; ControlRef control = wxMacFindControlUnderMouse( toplevel , localMouse , theWindow , &controlPart ) ; if ( control ) win = wxFindControlFromMacControl( control ) ; else win = toplevel ; int localx , localy ; localx = localMouse.h ; localy = localMouse.v ; if ( win ) win->MacRootWindowToWindow( &localx , &localy ) ; if ( win != trackingGlobals->m_currentTargetWindow ) { if ( trackingGlobals->m_currentTargetWindow ) { // this window is left if ( trackingGlobals->m_currentTarget ) { HideDragHilite(theDrag); trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; trackingGlobals->m_currentTarget->OnLeave() ; trackingGlobals->m_currentTarget = NULL; trackingGlobals->m_currentTargetWindow = NULL ; } } if ( win ) { // this window is entered trackingGlobals->m_currentTargetWindow = win ; trackingGlobals->m_currentTarget = win->GetDropTarget() ; { if ( trackingGlobals->m_currentTarget ) { trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; result = trackingGlobals->m_currentTarget->OnEnter( localx , localy , result ) ; } if ( result != wxDragNone ) { int x , y ; x = y = 0 ; win->MacWindowToRootWindow( &x , &y ) ; RgnHandle hiliteRgn = NewRgn() ; Rect r = { y , x , y+win->GetSize().y , x+win->GetSize().x } ; RectRgn( hiliteRgn , &r ) ; ShowDragHilite(theDrag, hiliteRgn, true); DisposeRgn( hiliteRgn ) ; } } } } else { if( trackingGlobals->m_currentTarget ) { trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; trackingGlobals->m_currentTarget->OnDragOver( localx , localy , result ) ; } } // set cursor for OnEnter and OnDragOver if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE ) { if ( trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) == FALSE ) { switch( result ) { case wxDragCopy : { wxCursor cursor(wxCURSOR_COPY_ARROW) ; cursor.MacInstall() ; } break ; case wxDragMove : { wxCursor cursor(wxCURSOR_ARROW) ; cursor.MacInstall() ; } break ; case wxDragNone : { wxCursor cursor(wxCURSOR_NO_ENTRY) ; cursor.MacInstall() ; } break ; case wxDragError: case wxDragLink: case wxDragCancel: // put these here to make gcc happy ; } } } } break; case kDragTrackingLeaveWindow: if (trackingGlobals->m_currentTarget) { trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; trackingGlobals->m_currentTarget->OnLeave() ; HideDragHilite(theDrag); trackingGlobals->m_currentTarget = NULL ; } trackingGlobals->m_currentTargetWindow = NULL ; break; } return(noErr); }