git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63412 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
185 lines
4.7 KiB
Plaintext
185 lines
4.7 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/osx/cocoa/dnd.mm
|
|
// Purpose: wxDropTarget, wxDropSource implementations
|
|
// Author: Stefan Csomor
|
|
// Modified by:
|
|
// Created: 1998-01-01
|
|
// RCS-ID: $Id: dnd.cpp 61724 2009-08-21 10:41:26Z VZ $
|
|
// Copyright: (c) 1998 Stefan Csomor
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#if wxUSE_DRAG_AND_DROP
|
|
|
|
#include "wx/dnd.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/app.h"
|
|
#include "wx/evtloop.h"
|
|
#include "wx/toplevel.h"
|
|
#include "wx/gdicmn.h"
|
|
#include "wx/wx.h"
|
|
#endif // WX_PRECOMP
|
|
|
|
#include <AppKit/AppKit.h>
|
|
#include "wx/osx/private.h"
|
|
|
|
wxDropSource* gCurrentSource = NULL;
|
|
|
|
wxDragResult NSDragOperationToWxDragResult(NSDragOperation code)
|
|
{
|
|
switch (code)
|
|
{
|
|
case NSDragOperationCopy:
|
|
return wxDragCopy;
|
|
case NSDragOperationMove:
|
|
return wxDragMove;
|
|
case NSDragOperationLink:
|
|
return wxDragLink;
|
|
case NSDragOperationNone:
|
|
return wxDragNone;
|
|
default:
|
|
wxFAIL_MSG("Unexpected result code");
|
|
}
|
|
}
|
|
|
|
@interface DropSourceDelegate : NSObject
|
|
{
|
|
BOOL dragFinished;
|
|
int resultCode;
|
|
wxDropSource* impl;
|
|
}
|
|
|
|
- (void)setImplementation: (wxDropSource *)dropSource;
|
|
- (BOOL)finished;
|
|
- (NSDragOperation)code;
|
|
- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation;
|
|
@end
|
|
|
|
@implementation DropSourceDelegate
|
|
|
|
- (id)init
|
|
{
|
|
[super init];
|
|
dragFinished = NO;
|
|
resultCode = NSDragOperationNone;
|
|
impl = 0;
|
|
return self;
|
|
}
|
|
|
|
- (void)setImplementation: (wxDropSource *)dropSource
|
|
{
|
|
impl = dropSource;
|
|
}
|
|
|
|
- (BOOL)finished
|
|
{
|
|
return dragFinished;
|
|
}
|
|
|
|
- (NSDragOperation)code
|
|
{
|
|
return resultCode;
|
|
}
|
|
|
|
- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
|
|
{
|
|
resultCode = operation;
|
|
dragFinished = YES;
|
|
}
|
|
|
|
@end
|
|
|
|
wxDropTarget::wxDropTarget( wxDataObject *data )
|
|
: wxDropTargetBase( data )
|
|
{
|
|
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// wxDropSource
|
|
//-------------------------------------------------------------------------
|
|
|
|
wxDropSource::wxDropSource(wxWindow *win,
|
|
const wxCursor &cursorCopy,
|
|
const wxCursor &cursorMove,
|
|
const wxCursor &cursorStop)
|
|
: wxDropSourceBase(cursorCopy, cursorMove, cursorStop)
|
|
{
|
|
m_window = win;
|
|
}
|
|
|
|
wxDropSource::wxDropSource(wxDataObject& data,
|
|
wxWindow *win,
|
|
const wxCursor &cursorCopy,
|
|
const wxCursor &cursorMove,
|
|
const wxCursor &cursorStop)
|
|
: wxDropSourceBase(cursorCopy, cursorMove, cursorStop)
|
|
{
|
|
SetData( data );
|
|
m_window = win;
|
|
}
|
|
|
|
wxDropSource* wxDropSource::GetCurrentDropSource()
|
|
{
|
|
return gCurrentSource;
|
|
}
|
|
|
|
wxDragResult wxDropSource::DoDragDrop(int flags)
|
|
{
|
|
wxASSERT_MSG( m_data, wxT("Drop source: no data") );
|
|
|
|
wxDragResult result = wxDragNone;
|
|
if ((m_data == NULL) || (m_data->GetFormatCount() == 0))
|
|
return result;
|
|
|
|
NSView* view = m_window->GetPeer()->GetWXWidget();
|
|
if (view)
|
|
{
|
|
NSPasteboard *pboard;
|
|
|
|
pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
|
|
|
|
OSStatus err = noErr;
|
|
PasteboardRef pboardRef;
|
|
PasteboardCreate((CFStringRef)[pboard name], &pboardRef);
|
|
|
|
err = PasteboardClear( pboardRef );
|
|
if ( err != noErr )
|
|
{
|
|
CFRelease( pboardRef );
|
|
return wxDragNone;
|
|
}
|
|
PasteboardSynchronize( pboardRef );
|
|
|
|
m_data->AddToPasteboard( pboardRef, 1 );
|
|
|
|
NSEvent* theEvent = (NSEvent*)wxTheApp->MacGetCurrentEvent();
|
|
wxASSERT_MSG(theEvent, "DoDragDrop must be called in response to a mouse down or drag event.");
|
|
|
|
gCurrentSource = this;
|
|
NSImage* image = [[NSImage alloc] initWithSize: NSMakeSize(16,16)];
|
|
DropSourceDelegate* delegate = [[DropSourceDelegate alloc] init];
|
|
[delegate setImplementation: this];
|
|
[view dragImage:image at:NSMakePoint(0.0, 16.0) offset:NSMakeSize(0.0,0.0)
|
|
event: theEvent pasteboard: pboard source:delegate slideBack: NO];
|
|
|
|
wxEventLoopBase * const loop = wxEventLoop::GetActive();
|
|
while ( ![delegate finished] )
|
|
loop->Dispatch();
|
|
|
|
result = NSDragOperationToWxDragResult([delegate code]);
|
|
[delegate release];
|
|
[image release];
|
|
gCurrentSource = NULL;
|
|
}
|
|
|
|
|
|
return result;
|
|
}
|
|
|
|
#endif // wxUSE_DRAG_AND_DROP
|
|
|