1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#import "chrome/browser/ui/cocoa/url_drop_target.h" 6 7#include "base/basictypes.h" 8#import "third_party/mozilla/NSPasteboard+Utils.h" 9 10@interface URLDropTargetHandler(Private) 11 12// Gets the appropriate drag operation given the |NSDraggingInfo|. 13- (NSDragOperation)getDragOperation:(id<NSDraggingInfo>)sender; 14 15// Tell the window controller to hide the drop indicator. 16- (void)hideIndicator; 17 18@end // @interface URLDropTargetHandler(Private) 19 20@implementation URLDropTargetHandler 21 22+ (NSArray*)handledDragTypes { 23 return [NSArray arrayWithObjects:kWebURLsWithTitlesPboardType, 24 NSURLPboardType, 25 NSStringPboardType, 26 NSFilenamesPboardType, 27 nil]; 28} 29 30- (id)initWithView:(NSView<URLDropTarget>*)view { 31 if ((self = [super init])) { 32 view_ = view; 33 [view_ registerForDraggedTypes:[URLDropTargetHandler handledDragTypes]]; 34 } 35 return self; 36} 37 38// The following four methods implement parts of the |NSDraggingDestination| 39// protocol, which the owner should "forward" to its |URLDropTargetHandler| 40// (us). 41 42- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender { 43 return [self getDragOperation:sender]; 44} 45 46- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender { 47 NSDragOperation dragOp = [self getDragOperation:sender]; 48 if (dragOp == NSDragOperationCopy) { 49 // Just tell the window controller to update the indicator. 50 NSPoint hoverPoint = [view_ convertPoint:[sender draggingLocation] 51 fromView:nil]; 52 [[view_ urlDropController] indicateDropURLsInView:view_ at:hoverPoint]; 53 } 54 return dragOp; 55} 56 57- (void)draggingExited:(id<NSDraggingInfo>)sender { 58 [self hideIndicator]; 59} 60 61- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { 62 [self hideIndicator]; 63 64 NSPasteboard* pboard = [sender draggingPasteboard]; 65 NSArray* supportedTypes = [NSArray arrayWithObjects:NSStringPboardType, nil]; 66 NSString* bestType = [pboard availableTypeFromArray:supportedTypes]; 67 68 NSPoint dropPoint = 69 [view_ convertPoint:[sender draggingLocation] fromView:nil]; 70 // Tell the window controller about the dropped URL(s). 71 if ([pboard containsURLData]) { 72 NSArray* urls = nil; 73 NSArray* titles; // discarded 74 [pboard getURLs:&urls andTitles:&titles convertingFilenames:YES]; 75 76 if ([urls count]) { 77 [[view_ urlDropController] dropURLs:urls inView:view_ at:dropPoint]; 78 return YES; 79 } 80 } else if (NSString* text = [pboard stringForType:bestType]) { 81 // This does not include any URLs, so treat it as plain text if we can 82 // get NSString. 83 [[view_ urlDropController] dropText:text inView:view_ at:dropPoint]; 84 return YES; 85 } 86 87 return NO; 88} 89 90@end // @implementation URLDropTargetHandler 91 92@implementation URLDropTargetHandler(Private) 93 94- (NSDragOperation)getDragOperation:(id<NSDraggingInfo>)sender { 95 NSPasteboard* pboard = [sender draggingPasteboard]; 96 NSArray *supportedTypes = [NSArray arrayWithObjects:NSStringPboardType, nil]; 97 NSString *bestType = [pboard availableTypeFromArray:supportedTypes]; 98 if (![pboard containsURLData] && ![pboard stringForType:bestType]) 99 return NSDragOperationNone; 100 101 // Only allow the copy operation. 102 return [sender draggingSourceOperationMask] & NSDragOperationCopy; 103} 104 105- (void)hideIndicator { 106 [[view_ urlDropController] hideDropURLsIndicatorInView:view_]; 107} 108 109@end // @implementation URLDropTargetHandler(Private) 110