1// Copyright (c) 2012 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 <Cocoa/Cocoa.h>
6
7#include "base/memory/scoped_ptr.h"
8#include "base/strings/string16.h"
9#include "content/common/content_export.h"
10#include "content/public/common/drop_data.h"
11
12namespace content {
13class RenderViewHost;
14class WebContentsImpl;
15class WebDragDestDelegate;
16}
17
18// A typedef for a RenderViewHost used for comparison purposes only.
19typedef content::RenderViewHost* RenderViewHostIdentifier;
20
21// A class that handles tracking and event processing for a drag and drop
22// over the content area. Assumes something else initiates the drag, this is
23// only for processing during a drag.
24CONTENT_EXPORT
25@interface WebDragDest : NSObject {
26 @private
27  // Our associated WebContentsImpl. Weak reference.
28  content::WebContentsImpl* webContents_;
29
30  // Delegate; weak.
31  content::WebDragDestDelegate* delegate_;
32
33  // Updated asynchronously during a drag to tell us whether or not we should
34  // allow the drop.
35  NSDragOperation currentOperation_;
36
37  // Keep track of the render view host we're dragging over.  If it changes
38  // during a drag, we need to re-send the DragEnter message.
39  RenderViewHostIdentifier currentRVH_;
40
41  // The data for the current drag, or NULL if none is in progress.
42  scoped_ptr<content::DropData> dropData_;
43
44  // True if the drag has been canceled.
45  bool canceled_;
46}
47
48// |contents| is the WebContentsImpl representing this tab, used to communicate
49// drag&drop messages to WebCore and handle navigation on a successful drop
50// (if necessary).
51- (id)initWithWebContentsImpl:(content::WebContentsImpl*)contents;
52
53- (content::DropData*)currentDropData;
54
55- (void)setDragDelegate:(content::WebDragDestDelegate*)delegate;
56
57// Sets the current operation negotiated by the source and destination,
58// which determines whether or not we should allow the drop. Takes effect the
59// next time |-draggingUpdated:| is called.
60- (void)setCurrentOperation:(NSDragOperation)operation;
61
62// Messages to send during the tracking of a drag, ususally upon receiving
63// calls from the view system. Communicates the drag messages to WebCore.
64- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info
65                              view:(NSView*)view;
66- (void)draggingExited:(id<NSDraggingInfo>)info;
67- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info
68                              view:(NSView*)view;
69- (BOOL)performDragOperation:(id<NSDraggingInfo>)info
70                              view:(NSView*)view;
71
72@end
73
74// Public use only for unit tests.
75@interface WebDragDest(Testing)
76// Given |data|, which should not be nil, fill it in using the contents of the
77// given pasteboard.
78- (void)populateDropData:(content::DropData*)data
79             fromPasteboard:(NSPasteboard*)pboard;
80// Given a point in window coordinates and a view in that window, return a
81// flipped point in the coordinate system of |view|.
82- (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint
83                            view:(NSView*)view;
84// Given a point in window coordinates and a view in that window, return a
85// flipped point in screen coordinates.
86- (NSPoint)flipWindowPointToScreen:(const NSPoint&)windowPoint
87                              view:(NSView*)view;
88@end
89