From cc8392514714645deed146ff3d5ebb3b6a9b39f6 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Fri, 13 Jul 2018 20:17:02 +0200 Subject: [PATCH] Factoring out common code, applying patch Applying drag/drop result codes patch by dkulp see #18166, factoring out common code and adding proper setting of drop data in event. --- src/osx/cocoa/dataview.mm | 253 ++++++++++++++------------------------ 1 file changed, 92 insertions(+), 161 deletions(-) diff --git a/src/osx/cocoa/dataview.mm b/src/osx/cocoa/dataview.mm index de561b8b4e..3583ec9369 100644 --- a/src/osx/cocoa/dataview.mm +++ b/src/osx/cocoa/dataview.mm @@ -541,116 +541,7 @@ outlineView:(NSOutlineView*)outlineView wxUnusedVar(outlineView); wxUnusedVar(index); - NSArray* supportedTypes( - [NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil] - ); - - NSPasteboard* pasteboard([info draggingPasteboard]); - - NSString* bestType([pasteboard availableTypeFromArray:supportedTypes]); - - if ( bestType == nil ) - return FALSE; - - wxDataViewCtrl * const dvc(implementation->GetDataViewCtrl()); - - wxCHECK_MSG( dvc, false, - "Pointer to data view control not set correctly." ); - wxCHECK_MSG( dvc->GetModel(), false, - "Pointer to model not set correctly." ); - - wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_DROP, dvc, wxDataViewItemFromItem(item)); - - BOOL dragSuccessful = false; - if ( [bestType compare:DataViewPboardType] == NSOrderedSame ) - { - NSArray* dataArray((NSArray*) - [pasteboard propertyListForType:DataViewPboardType]); - NSUInteger indexDraggedItem, noOfDraggedItems([dataArray count]); - - indexDraggedItem = 0; - while (indexDraggedItem < noOfDraggedItems) - { - wxDataObjectComposite* dataObjects( - implementation->GetDnDDataObjects((NSData*) - [dataArray objectAtIndex:indexDraggedItem])); - - if (dataObjects && (dataObjects->GetFormatCount() > 0)) - { - wxMemoryBuffer buffer; - - // copy data into data object: - event.SetDataObject(dataObjects); - event.SetDataFormat( - implementation->GetDnDDataFormat(dataObjects)); - // copy data into buffer: - dataObjects->GetDataHere( - event.GetDataFormat().GetType(), - buffer.GetWriteBuf(event.GetDataSize())); - buffer.UngetWriteBuf(event.GetDataSize()); - event.SetDataBuffer(buffer.GetData()); - // finally, send event: - if (dvc->HandleWindowEvent(event) && event.IsAllowed()) - { - dragSuccessful = true; - ++indexDraggedItem; - } - else - { - dragSuccessful = true; - indexDraggedItem = noOfDraggedItems; // stop loop - } - } - else - { - dragSuccessful = false; - indexDraggedItem = noOfDraggedItems; // stop loop - } - // clean-up: - delete dataObjects; - } - } - else - { - // needed to convert internally used UTF-16 representation to a UTF-8 - // representation - CFDataRef osxData; - wxDataObjectComposite* dataObjects (new wxDataObjectComposite()); - wxTextDataObject* textDataObject(new wxTextDataObject()); - - osxData = ::CFStringCreateExternalRepresentation - ( - kCFAllocatorDefault, - (CFStringRef)[pasteboard stringForType:NSStringPboardType], -#if defined(wxNEEDS_UTF16_FOR_TEXT_DATAOBJ) - kCFStringEncodingUTF16, -#else - kCFStringEncodingUTF8, -#endif - 32 - ); - if (textDataObject->SetData(::CFDataGetLength(osxData), - ::CFDataGetBytePtr(osxData))) - dataObjects->Add(textDataObject); - else - delete textDataObject; - // send event if data could be copied: - if (dataObjects->GetFormatCount() > 0) - { - event.SetDataObject(dataObjects); - event.SetDataFormat(implementation->GetDnDDataFormat(dataObjects)); - if (dvc->HandleWindowEvent(event) && event.IsAllowed()) - dragSuccessful = true; - else - dragSuccessful = false; - } - else - dragSuccessful = false; - // clean up: - ::CFRelease(osxData); - delete dataObjects; - } - return dragSuccessful; + return [self setupAndCallDataViewEvents:wxEVT_DATAVIEW_ITEM_DROP dropInfo:info item:item] != NSDragOperationNone; } -(id) outlineView:(NSOutlineView*)outlineView @@ -789,59 +680,107 @@ outlineView:(NSOutlineView*)outlineView wxUnusedVar(outlineView); wxUnusedVar(index); - NSArray* supportedTypes([NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil]); - - NSPasteboard* pasteboard([info draggingPasteboard]); - - NSString* bestType([pasteboard availableTypeFromArray:supportedTypes]); - if (bestType == nil) - return NSDragOperationNone; + return [self setupAndCallDataViewEvents:wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE dropInfo:info item:item]; +} +-(NSDragOperation) callDataViewEvents:(wxEventType)eventType dataObjects:(wxDataObjectComposite*)dataObjects item:(id)item +{ NSDragOperation dragOperation = NSDragOperationNone; wxDataViewCtrl* const dvc(implementation->GetDataViewCtrl()); + wxDataViewEvent event(eventType, dvc, wxDataViewItemFromItem(item)); + if (dataObjects && (dataObjects->GetFormatCount() > 0)) + { + // copy data into data object: + event.SetDataObject(dataObjects); + event.SetDataFormat(implementation->GetDnDDataFormat(dataObjects)); + event.SetDropEffect(wxDragCopy); + wxDataFormatId formatId = event.GetDataFormat().GetType(); + wxMemoryBuffer buffer; + + // copy data into buffer: + if ( formatId != wxDF_INVALID) + { + size_t size = dataObjects->GetDataSize(formatId); + + event.SetDataSize(size); + dataObjects->GetDataHere(formatId,buffer.GetWriteBuf(size)); + buffer.UngetWriteBuf(size); + event.SetDataBuffer(buffer.GetData()); + } + + // finally, send event: + if (dvc->HandleWindowEvent(event) && event.IsAllowed()) + { + switch (event.GetDropEffect()) + { + case wxDragCopy: + dragOperation = NSDragOperationCopy; + break; + case wxDragMove: + dragOperation = NSDragOperationMove; + break; + case wxDragLink: + dragOperation = NSDragOperationLink; + break; + case wxDragNone: + case wxDragCancel: + case wxDragError: + dragOperation = NSDragOperationNone; + break; + default: + dragOperation = NSDragOperationEvery; + } + } + else + { + dragOperation = NSDragOperationNone; + } + } + else + { + dragOperation = NSDragOperationNone; + } + return dragOperation; +} + +-(NSDragOperation) setupAndCallDataViewEvents:(wxEventType)eventType dropInfo:(id)info item:(id)item +{ + NSArray* supportedTypes( + [NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil] + ); + + NSPasteboard* pasteboard([info draggingPasteboard]); + + NSString* bestType([pasteboard availableTypeFromArray:supportedTypes]); + + if ( bestType == nil ) + return NSDragOperationNone; + + NSDragOperation dragOperation = NSDragOperationNone; + wxDataViewCtrl* const dvc(implementation->GetDataViewCtrl()); + wxCHECK_MSG(dvc, false, "Pointer to data view control not set correctly."); wxCHECK_MSG(dvc->GetModel(), false, "Pointer to model not set correctly."); - - wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, dvc, wxDataViewItemFromItem(item)); + + // wxDataViewEvent event(eventType, dvc, wxDataViewItemFromItem(item)); if ([bestType compare:DataViewPboardType] == NSOrderedSame) { NSArray* dataArray((NSArray*)[pasteboard propertyListForType:DataViewPboardType]); NSUInteger indexDraggedItem, noOfDraggedItems([dataArray count]); - + indexDraggedItem = 0; while (indexDraggedItem < noOfDraggedItems) { wxDataObjectComposite* dataObjects(implementation->GetDnDDataObjects((NSData*)[dataArray objectAtIndex:indexDraggedItem])); - - if (dataObjects && (dataObjects->GetFormatCount() > 0)) - { - wxMemoryBuffer buffer; - - // copy data into data object: - event.SetDataObject(dataObjects); - event.SetDataFormat(implementation->GetDnDDataFormat(dataObjects)); - // copy data into buffer: - dataObjects->GetDataHere(event.GetDataFormat().GetType(),buffer.GetWriteBuf(event.GetDataSize())); - buffer.UngetWriteBuf(event.GetDataSize()); - event.SetDataBuffer(buffer.GetData()); - // finally, send event: - if (dvc->HandleWindowEvent(event) && event.IsAllowed()) - { - dragOperation = NSDragOperationEvery; - ++indexDraggedItem; - } - else - { - dragOperation = NSDragOperationNone; - indexDraggedItem = noOfDraggedItems; // stop loop - } - } + + dragOperation = [self callDataViewEvents:eventType dataObjects:dataObjects item:item]; + + if ( dragOperation != NSDragOperationNone ) + ++indexDraggedItem; else - { - dragOperation = NSDragOperationNone; - indexDraggedItem = noOfDraggedItems; // stop loop - } + indexDraggedItem = noOfDraggedItems; + // clean-up: delete dataObjects; } @@ -853,7 +792,7 @@ outlineView:(NSOutlineView*)outlineView CFDataRef osxData; wxDataObjectComposite* dataObjects (new wxDataObjectComposite()); wxTextDataObject* textDataObject(new wxTextDataObject()); - + osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,(CFStringRef)[pasteboard stringForType:NSStringPboardType], #if defined(wxNEEDS_UTF16_FOR_TEXT_DATAOBJ) kCFStringEncodingUTF16, @@ -866,22 +805,14 @@ outlineView:(NSOutlineView*)outlineView else delete textDataObject; // send event if data could be copied: - if (dataObjects->GetFormatCount() > 0) - { - event.SetDataObject(dataObjects); - event.SetDataFormat(implementation->GetDnDDataFormat(dataObjects)); - if (dvc->HandleWindowEvent(event) && event.IsAllowed()) - dragOperation = NSDragOperationEvery; - else - dragOperation = NSDragOperationNone; - } - else - dragOperation = NSDragOperationNone; + + dragOperation = [self callDataViewEvents:eventType dataObjects:dataObjects item:item]; + // clean up: ::CFRelease(osxData); delete dataObjects; } - + return dragOperation; }