diff options
Diffstat (limited to 'cocoa/ScintillaCocoa.mm')
| -rw-r--r-- | cocoa/ScintillaCocoa.mm | 84 | 
1 files changed, 76 insertions, 8 deletions
| diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index ced7be3d6..be5ec9445 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -1242,6 +1242,60 @@ void ScintillaCocoa::DragScroll()  } +//----------------- DragProviderSource ------------------------------------------------------- + +@interface DragProviderSource : NSObject <NSPasteboardItemDataProvider> +{ +  SelectionText selectedText; +} + +@end + +@implementation DragProviderSource + +- (id)initWithSelectedText:(const SelectionText *)other +{ +  self = [super init]; +   +  if (self) { +    selectedText.Copy(*other); +  } +   +  return self; +} + +- (void)pasteboard:(NSPasteboard *)pasteboard item:(NSPasteboardItem *)item provideDataForType:(NSString *)type +{ +  if (selectedText.Length() == 0) +    return; + +  if (([type compare: NSPasteboardTypeString] != NSOrderedSame) && +    ([type compare: ScintillaRecPboardType] != NSOrderedSame)) +    return; + +  CFStringEncoding encoding = EncodingFromCharacterSet(selectedText.codePage == SC_CP_UTF8, +                                                       selectedText.characterSet); +  CFStringRef cfsVal = CFStringCreateWithBytes(kCFAllocatorDefault, +                                               reinterpret_cast<const UInt8 *>(selectedText.Data()), +                                               selectedText.Length(), encoding, false); +   +  if ([type compare: NSPasteboardTypeString] == NSOrderedSame) +  { +    [pasteboard setString:(NSString *)cfsVal forType: NSStringPboardType]; +  } +  else if ([type compare: ScintillaRecPboardType] == NSOrderedSame) +  { +    // This is specific to scintilla, allows us to drag rectangular selections around the document. +    if (selectedText.rectangular) +      [pasteboard setString:(NSString *)cfsVal forType: ScintillaRecPboardType]; +  } + +  if (cfsVal) +    CFRelease(cfsVal);   +} + +@end +  //--------------------------------------------------------------------------------------------------  /** @@ -1335,7 +1389,7 @@ void ScintillaCocoa::StartDrag()    // Prepare drag image.    NSRect selectionRectangle = PRectangleToNSRect(rcSel); -  NSView* content = ContentView(); +  SCIContentView* content = ContentView();    // To get a bitmap of the text we're dragging, we just use Paint on a pixmap surface.    SurfaceImpl *sw = new SurfaceImpl(); @@ -1401,13 +1455,27 @@ void ScintillaCocoa::StartDrag()    NSPoint startPoint;    startPoint.x = selectionRectangle.origin.x + client.left;    startPoint.y = selectionRectangle.origin.y + selectionRectangle.size.height + client.top; -  [content dragImage: dragImage -                  at: startPoint -              offset: NSZeroSize -               event: lastMouseEvent // Set in MouseMove. -          pasteboard: pasteboard -              source: content -           slideBack: YES]; +   +  NSPasteboardItem *pbItem = [NSPasteboardItem new]; +  DragProviderSource *dps = [[[DragProviderSource alloc] initWithSelectedText:&selectedText] autorelease]; +   +  NSArray *pbTypes = selectedText.rectangular ? +  @[NSPasteboardTypeString, ScintillaRecPboardType] : +  @[NSPasteboardTypeString]; +  [pbItem setDataProvider:dps forTypes:pbTypes]; +  NSDraggingItem *dragItem = [[NSDraggingItem alloc ]initWithPasteboardWriter:pbItem]; +  [pbItem release]; +   +  NSScrollView *scrollContainer = ScrollContainer(); +  NSRect contentRect = [[scrollContainer contentView] bounds]; +  NSRect draggingRect = NSOffsetRect(selectionRectangle, contentRect.origin.x, contentRect.origin.y); +  [dragItem setDraggingFrame:draggingRect contents:dragImage]; +  NSDraggingSession *dragSession = +  [content beginDraggingSessionWithItems:@[[dragItem autorelease]] +                                   event:lastMouseEvent +                                  source:content]; +  dragSession.animatesToStartingPositionsOnCancelOrFail = YES; +  dragSession.draggingFormation = NSDraggingFormationNone;  }  //-------------------------------------------------------------------------------------------------- | 
