From 0b6f851f4ac593595c59f0e4ecf1caa48c572564 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Mon, 21 Jun 2010 10:14:57 +0000 Subject: [PATCH] storing current event for dnd support, adding default data-drag image, fixes #12065 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64663 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/osx/cocoa/dnd.mm | 37 ++++++++++++++++++++++++++++++++---- src/osx/cocoa/evtloop.mm | 6 ++++++ src/osx/cocoa/nonownedwnd.mm | 11 +++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/osx/cocoa/dnd.mm b/src/osx/cocoa/dnd.mm index 6c9e4e418d..ae860ad50e 100644 --- a/src/osx/cocoa/dnd.mm +++ b/src/osx/cocoa/dnd.mm @@ -87,6 +87,9 @@ wxDragResult NSDragOperationToWxDragResult(NSDragOperation code) - (void)draggedImage:(NSImage *)anImage movedTo:(NSPoint)aPoint { + wxUnusedVar( anImage ); + wxUnusedVar( aPoint ); + bool optionDown = GetCurrentKeyModifiers() & optionKey; wxDragResult result = optionDown ? wxDragCopy : wxDragMove; @@ -120,8 +123,12 @@ wxDragResult NSDragOperationToWxDragResult(NSDragOperation code) if (cursorID != wxCURSOR_NONE) { + // TODO under 10.6 the os itself deals with the cursor, remove if things + // work properly everywhere +#if 0 wxCursor cursor( cursorID ); cursor.MacInstall(); +#endif } } } @@ -129,6 +136,9 @@ wxDragResult NSDragOperationToWxDragResult(NSDragOperation code) - (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation { + wxUnusedVar( anImage ); + wxUnusedVar( aPoint ); + resultCode = operation; dragFinished = YES; } @@ -170,7 +180,7 @@ wxDropSource* wxDropSource::GetCurrentDropSource() return gCurrentSource; } -wxDragResult wxDropSource::DoDragDrop(int flags) +wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)) { wxASSERT_MSG( m_data, wxT("Drop source: no data") ); @@ -201,12 +211,31 @@ wxDragResult wxDropSource::DoDragDrop(int flags) NSEvent* theEvent = (NSEvent*)wxTheApp->MacGetCurrentEvent(); wxASSERT_MSG(theEvent, "DoDragDrop must be called in response to a mouse down or drag event."); - + + NSPoint down = [theEvent locationInWindow]; + NSPoint p = [view convertPoint:down toView:nil]; + gCurrentSource = this; - NSImage* image = [[NSImage alloc] initWithSize: NSMakeSize(16,16)]; + + // add a dummy square as dragged image for the moment, + // TODO: proper drag image for data + NSSize sz = NSMakeSize(16,16); + NSRect fillRect = NSMakeRect(0, 0, 16, 16); + NSImage* image = [[NSImage alloc] initWithSize: sz]; + + [image lockFocus]; + + [[[NSColor whiteColor] colorWithAlphaComponent:0.8] set]; + NSRectFill(fillRect); + [[NSColor blackColor] set]; + NSFrameRectWithWidthUsingOperation(fillRect,1.0f,NSCompositeDestinationOver); + + [image unlockFocus]; + + DropSourceDelegate* delegate = [[DropSourceDelegate alloc] init]; [delegate setImplementation: this]; - [view dragImage:image at:NSMakePoint(0.0, 16.0) offset:NSMakeSize(0.0,0.0) + [view dragImage:image at:p offset:NSMakeSize(0.0,0.0) event: theEvent pasteboard: pboard source:delegate slideBack: NO]; wxEventLoopBase * const loop = wxEventLoop::GetActive(); diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index ed35319658..11e9d21129 100644 --- a/src/osx/cocoa/evtloop.mm +++ b/src/osx/cocoa/evtloop.mm @@ -118,10 +118,16 @@ bool wxGUIEventLoop::Dispatch() inMode:NSDefaultRunLoopMode dequeue: YES]) { + WXEVENTREF formerEvent = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEvent(); + WXEVENTHANDLERCALLREF formerHandler = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEventHandlerCallRef(); + if (wxTheApp) wxTheApp->MacSetCurrentEvent(event, NULL); m_sleepTime = 0.0; [NSApp sendEvent: event]; + + if (wxTheApp) + wxTheApp->MacSetCurrentEvent(formerEvent , formerHandler); } else { diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index b6be2e1702..235cc8111b 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -134,7 +134,18 @@ bool shouldHandleSelector(SEL selector) - (void)sendEvent:(NSEvent *) event { if ( ![self WX_filterSendEvent: event] ) + { + WXEVENTREF formerEvent = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEvent(); + WXEVENTHANDLERCALLREF formerHandler = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEventHandlerCallRef(); + + if (wxTheApp) + wxTheApp->MacSetCurrentEvent(event, NULL); + [super sendEvent: event]; + + if (wxTheApp) + wxTheApp->MacSetCurrentEvent(formerEvent , formerHandler); + } } // The default implementation always moves the window back onto the screen, -- 2.45.2