From da804130ba446bd9dcc81a843b8bb1dd1c662e52 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sun, 2 Mar 2003 22:48:38 +0000 Subject: [PATCH] GiveFeedback support, Cursor Extension git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19439 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/mac/carbon/dnd.cpp | 84 +++++++++++++++++++++++++++++++++--------- src/mac/dnd.cpp | 84 +++++++++++++++++++++++++++++++++--------- 2 files changed, 134 insertions(+), 34 deletions(-) diff --git a/src/mac/carbon/dnd.cpp b/src/mac/carbon/dnd.cpp index b9df2ac004..2ea8ae7c90 100644 --- a/src/mac/carbon/dnd.cpp +++ b/src/mac/carbon/dnd.cpp @@ -246,9 +246,10 @@ bool wxDropTarget::GetData() // drag request wxDropSource::wxDropSource(wxWindow *win, - const wxIcon &iconCopy, - const wxIcon &iconMove, - const wxIcon &iconNone) + const wxCursor &cursorCopy, + const wxCursor &cursorMove, + const wxCursor &cursorStop) + : wxDropSourceBase(cursorCopy, cursorMove, cursorStop) { wxMacEnsureTrackingHandlersInstalled() ; m_window = win; @@ -256,9 +257,10 @@ wxDropSource::wxDropSource(wxWindow *win, wxDropSource::wxDropSource(wxDataObject& data, wxWindow *win, - const wxIcon &iconCopy, - const wxIcon &iconMove, - const wxIcon &iconNone) + const wxCursor &cursorCopy, + const wxCursor &cursorMove, + const wxCursor &cursorStop) + : wxDropSourceBase(cursorCopy, cursorMove, cursorStop) { wxMacEnsureTrackingHandlersInstalled() ; SetData( data ); @@ -383,6 +385,21 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) return wxDragCopy ; } +bool wxDropSource::MacInstallDefaultCursor(wxDragResult effect) +{ + const wxCursor& cursor = GetCursor(effect); + if ( cursor.Ok() ) + { + cursor.MacInstall() ; + + return TRUE; + } + else + { + return FALSE; + } +} + bool gTrackingGlobalsInstalled = false ; // passing the globals via refcon is not needed by the CFM and later architectures anymore @@ -464,19 +481,52 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind // this window is entered trackingGlobals->m_currentTargetWindow = win ; trackingGlobals->m_currentTarget = win->GetDropTarget() ; - if ( trackingGlobals->m_currentTarget ) { - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; - if ( trackingGlobals->m_currentTarget->OnEnter( - localx , localy , wxDragCopy ) != wxDragNone ) + wxDragResult result = wxDragNone ; + if ( trackingGlobals->m_currentTarget ) + { + trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; + result = trackingGlobals->m_currentTarget->OnEnter( + localx , localy , wxDragCopy ) ; + } + + if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE ) { - 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 ) ; + 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 ; + } + } + } + + 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 ) ; } } } diff --git a/src/mac/dnd.cpp b/src/mac/dnd.cpp index b9df2ac004..2ea8ae7c90 100644 --- a/src/mac/dnd.cpp +++ b/src/mac/dnd.cpp @@ -246,9 +246,10 @@ bool wxDropTarget::GetData() // drag request wxDropSource::wxDropSource(wxWindow *win, - const wxIcon &iconCopy, - const wxIcon &iconMove, - const wxIcon &iconNone) + const wxCursor &cursorCopy, + const wxCursor &cursorMove, + const wxCursor &cursorStop) + : wxDropSourceBase(cursorCopy, cursorMove, cursorStop) { wxMacEnsureTrackingHandlersInstalled() ; m_window = win; @@ -256,9 +257,10 @@ wxDropSource::wxDropSource(wxWindow *win, wxDropSource::wxDropSource(wxDataObject& data, wxWindow *win, - const wxIcon &iconCopy, - const wxIcon &iconMove, - const wxIcon &iconNone) + const wxCursor &cursorCopy, + const wxCursor &cursorMove, + const wxCursor &cursorStop) + : wxDropSourceBase(cursorCopy, cursorMove, cursorStop) { wxMacEnsureTrackingHandlersInstalled() ; SetData( data ); @@ -383,6 +385,21 @@ wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) return wxDragCopy ; } +bool wxDropSource::MacInstallDefaultCursor(wxDragResult effect) +{ + const wxCursor& cursor = GetCursor(effect); + if ( cursor.Ok() ) + { + cursor.MacInstall() ; + + return TRUE; + } + else + { + return FALSE; + } +} + bool gTrackingGlobalsInstalled = false ; // passing the globals via refcon is not needed by the CFM and later architectures anymore @@ -464,19 +481,52 @@ pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, Wind // this window is entered trackingGlobals->m_currentTargetWindow = win ; trackingGlobals->m_currentTarget = win->GetDropTarget() ; - if ( trackingGlobals->m_currentTarget ) { - trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; - if ( trackingGlobals->m_currentTarget->OnEnter( - localx , localy , wxDragCopy ) != wxDragNone ) + wxDragResult result = wxDragNone ; + if ( trackingGlobals->m_currentTarget ) + { + trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ; + result = trackingGlobals->m_currentTarget->OnEnter( + localx , localy , wxDragCopy ) ; + } + + if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE ) { - 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 ) ; + 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 ; + } + } + } + + 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 ) ; } } }