Home | History | Annotate | Download | only in cocoa
      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