web_contents_drag_source.mm revision dc0f95d653279beabeb9817299e2902918ba123e
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/tab_contents/web_contents_drag_source.h"
6
7#include "app/mac/nsimage_cache.h"
8#include "base/string_util.h"
9#include "base/sys_string_conversions.h"
10#include "chrome/browser/tab_contents/tab_contents_view_mac.h"
11#include "content/browser/renderer_host/render_view_host.h"
12#include "content/browser/tab_contents/tab_contents.h"
13
14namespace {
15
16// Make a drag image from the drop data.
17// TODO(feldstein): Make this work
18NSImage* MakeDragImage() {
19  // TODO(feldstein): Just a stub for now. Make it do something (see, e.g.,
20  // WebKit/WebKit/mac/Misc/WebNSViewExtras.m: |-_web_DragImageForElement:...|).
21
22  // Default to returning a generic image.
23  return app::mac::GetCachedImageWithName(@"nav.pdf");
24}
25
26// Flips screen and point coordinates over the y axis to work with webkit
27// coordinate systems.
28void FlipPointCoordinates(NSPoint& screenPoint,
29                          NSPoint& localPoint,
30                          NSView* view) {
31  NSRect viewFrame = [view frame];
32  localPoint.y = NSHeight(viewFrame) - localPoint.y;
33  // Flip |screenPoint|.
34  NSRect screenFrame = [[[view window] screen] frame];
35  screenPoint.y = NSHeight(screenFrame) - screenPoint.y;
36}
37
38}  // namespace
39
40
41@implementation WebContentsDragSource
42
43- (id)initWithContentsView:(TabContentsViewCocoa*)contentsView
44                pasteboard:(NSPasteboard*)pboard
45         dragOperationMask:(NSDragOperation)dragOperationMask {
46  if ((self = [super init])) {
47    contentsView_ = contentsView;
48    DCHECK(contentsView_);
49
50    pasteboard_.reset([pboard retain]);
51    DCHECK(pasteboard_.get());
52
53    dragOperationMask_ = dragOperationMask;
54  }
55
56  return self;
57}
58
59- (NSImage*)dragImage {
60  return MakeDragImage();
61}
62
63- (void)fillPasteboard {
64  NOTIMPLEMENTED() << "Subclasses should implement fillPasteboard";
65}
66
67- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal {
68  return dragOperationMask_;
69}
70
71- (void)startDrag {
72  [self fillPasteboard];
73  NSEvent* currentEvent = [NSApp currentEvent];
74
75  // Synthesize an event for dragging, since we can't be sure that
76  // [NSApp currentEvent] will return a valid dragging event.
77  NSWindow* window = [contentsView_ window];
78  NSPoint position = [window mouseLocationOutsideOfEventStream];
79  NSTimeInterval eventTime = [currentEvent timestamp];
80  NSEvent* dragEvent = [NSEvent mouseEventWithType:NSLeftMouseDragged
81                                          location:position
82                                     modifierFlags:NSLeftMouseDraggedMask
83                                         timestamp:eventTime
84                                      windowNumber:[window windowNumber]
85                                           context:nil
86                                       eventNumber:0
87                                        clickCount:1
88                                          pressure:1.0];
89  [window dragImage:[self dragImage]
90                 at:position
91             offset:NSZeroSize
92              event:dragEvent
93         pasteboard:pasteboard_
94             source:self
95          slideBack:YES];
96}
97
98- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint
99  operation:(NSDragOperation)operation {
100}
101
102- (void)endDragAt:(NSPoint)screenPoint
103        operation:(NSDragOperation)operation {
104  [contentsView_ tabContents]->SystemDragEnded();
105
106  RenderViewHost* rvh = [contentsView_ tabContents]->render_view_host();
107  if (rvh) {
108    NSPoint localPoint = [contentsView_ convertPoint:screenPoint fromView: nil];
109    FlipPointCoordinates(screenPoint, localPoint, contentsView_);
110    rvh->DragSourceEndedAt(localPoint.x, localPoint.y,
111                           screenPoint.x, screenPoint.y,
112                           static_cast<WebKit::WebDragOperation>(operation));
113  }
114
115  // Make sure the pasteboard owner isn't us.
116  [pasteboard_ declareTypes:[NSArray array] owner:nil];
117}
118
119- (void)moveDragTo:(NSPoint)screenPoint {
120  RenderViewHost* rvh = [contentsView_ tabContents]->render_view_host();
121  if (rvh) {
122    NSPoint localPoint = [contentsView_ convertPoint:screenPoint fromView:nil];
123    FlipPointCoordinates(screenPoint, localPoint, contentsView_);
124    rvh->DragSourceMovedTo(localPoint.x, localPoint.y,
125                           screenPoint.x, screenPoint.y);
126  }
127}
128
129@end  // @implementation WebContentsDragSource
130
131