summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/url_drop_target.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/cocoa/url_drop_target.mm')
-rw-r--r--chrome/browser/cocoa/url_drop_target.mm92
1 files changed, 92 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/url_drop_target.mm b/chrome/browser/cocoa/url_drop_target.mm
new file mode 100644
index 0000000..f0cf1fd
--- /dev/null
+++ b/chrome/browser/cocoa/url_drop_target.mm
@@ -0,0 +1,92 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/cocoa/url_drop_target.h"
+
+#include "base/logging.h"
+#import "third_party/mozilla/NSPasteboard+Utils.h"
+
+@interface URLDropTargetHandler(Private)
+
+// Gets the appropriate drag operation given the |NSDraggingInfo|.
+- (NSDragOperation)getDragOperation:(id<NSDraggingInfo>)sender;
+
+// Tell the window controller to hide the drop indicator.
+- (void)hideIndicator;
+
+@end // @interface URLDropTargetHandler(Private)
+
+@implementation URLDropTargetHandler
+
+- (id)initWithView:(NSView<URLDropTarget>*)view {
+ if ((self = [super init])) {
+ view_ = view;
+ [view_ registerForDraggedTypes:
+ [NSArray arrayWithObjects:kWebURLsWithTitlesPboardType,
+ NSURLPboardType,
+ NSStringPboardType,
+ NSFilenamesPboardType,
+ nil]];
+ }
+ return self;
+}
+
+// The following four methods implement parts of the |NSDraggingDestination|
+// protocol, which the owner should "forward" to its |URLDropTargetHandler|
+// (us).
+
+- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
+ return [self getDragOperation:sender];
+}
+
+- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender {
+ NSDragOperation dragOp = [self getDragOperation:sender];
+ if (dragOp == NSDragOperationCopy) {
+ // Just tell the window controller to update the indicator.
+ NSPoint hoverPoint = [view_ convertPoint:[sender draggingLocation]
+ fromView:nil];
+ [[view_ urlDropController] indicateDropURLsInView:view_ at:hoverPoint];
+ }
+ return dragOp;
+}
+
+- (void)draggingExited:(id<NSDraggingInfo>)sender {
+ [self hideIndicator];
+}
+
+- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
+ [self hideIndicator];
+
+ NSPasteboard* pboard = [sender draggingPasteboard];
+ if ([pboard containsURLData]) {
+ NSArray* urls = nil;
+ NSArray* titles; // discarded
+ [pboard getURLs:&urls andTitles:&titles convertingFilenames:YES];
+
+ if ([urls count]) {
+ // Tell the window controller about the dropped URL(s).
+ NSPoint dropPoint =
+ [view_ convertPoint:[sender draggingLocation] fromView:nil];
+ [[view_ urlDropController] dropURLs:urls inView:view_ at:dropPoint];
+ return YES;
+ }
+ }
+
+ return NO;
+}
+
+@end // @implementation URLDropTargetHandler
+
+@implementation URLDropTargetHandler(Private)
+
+- (NSDragOperation)getDragOperation:(id<NSDraggingInfo>)sender {
+ // Only allow the copy operation.
+ return [sender draggingSourceOperationMask] & NSDragOperationCopy;
+}
+
+- (void)hideIndicator {
+ [[view_ urlDropController] hideDropURLsIndicatorInView:view_];
+}
+
+@end // @implementation URLDropTargetHandler(Private)