OLD | NEW |
| (Empty) |
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 #ifndef APP_WIN_DROP_TARGET_H_ | |
6 #define APP_WIN_DROP_TARGET_H_ | |
7 #pragma once | |
8 | |
9 #include <objidl.h> | |
10 | |
11 #include "base/ref_counted.h" | |
12 | |
13 // Windows interface. | |
14 struct IDropTargetHelper; | |
15 | |
16 namespace app { | |
17 namespace win { | |
18 | |
19 // A DropTarget implementation that takes care of the nitty gritty | |
20 // of dnd. While this class is concrete, subclasses will most likely | |
21 // want to override various OnXXX methods. | |
22 // | |
23 // Because DropTarget is ref counted you shouldn't delete it directly, | |
24 // rather wrap it in a scoped_refptr. Be sure and invoke RevokeDragDrop(m_hWnd) | |
25 // before the HWND is deleted too. | |
26 // | |
27 // This class is meant to be used in a STA and is not multithread-safe. | |
28 class DropTarget : public IDropTarget { | |
29 public: | |
30 // Create a new DropTarget associating it with the given HWND. | |
31 explicit DropTarget(HWND hwnd); | |
32 virtual ~DropTarget(); | |
33 | |
34 // When suspended is set to |true|, the drop target does not receive drops | |
35 // from drags initiated within the owning HWND. | |
36 bool suspended() const { return suspended_; } | |
37 void set_suspended(bool suspended) { suspended_ = suspended; } | |
38 | |
39 // IDropTarget implementation: | |
40 HRESULT __stdcall DragEnter(IDataObject* data_object, | |
41 DWORD key_state, | |
42 POINTL cursor_position, | |
43 DWORD* effect); | |
44 HRESULT __stdcall DragOver(DWORD key_state, | |
45 POINTL cursor_position, | |
46 DWORD* effect); | |
47 HRESULT __stdcall DragLeave(); | |
48 HRESULT __stdcall Drop(IDataObject* data_object, | |
49 DWORD key_state, | |
50 POINTL cursor_position, | |
51 DWORD* effect); | |
52 | |
53 // IUnknown implementation: | |
54 HRESULT __stdcall QueryInterface(const IID& iid, void** object); | |
55 ULONG __stdcall AddRef(); | |
56 ULONG __stdcall Release(); | |
57 | |
58 protected: | |
59 // Returns the hosting HWND. | |
60 HWND GetHWND() { return hwnd_; } | |
61 | |
62 // Invoked when the cursor first moves over the hwnd during a dnd session. | |
63 // This should return a bitmask of the supported drop operations: | |
64 // DROPEFFECT_NONE, DROPEFFECT_COPY, DROPEFFECT_LINK and/or | |
65 // DROPEFFECT_MOVE. | |
66 virtual DWORD OnDragEnter(IDataObject* data_object, | |
67 DWORD key_state, | |
68 POINT cursor_position, | |
69 DWORD effect); | |
70 | |
71 // Invoked when the cursor moves over the window during a dnd session. | |
72 // This should return a bitmask of the supported drop operations: | |
73 // DROPEFFECT_NONE, DROPEFFECT_COPY, DROPEFFECT_LINK and/or | |
74 // DROPEFFECT_MOVE. | |
75 virtual DWORD OnDragOver(IDataObject* data_object, | |
76 DWORD key_state, | |
77 POINT cursor_position, | |
78 DWORD effect); | |
79 | |
80 // Invoked when the cursor moves outside the bounds of the hwnd during a | |
81 // dnd session. | |
82 virtual void OnDragLeave(IDataObject* data_object); | |
83 | |
84 // Invoked when the drop ends on the window. This should return the operation | |
85 // that was taken. | |
86 virtual DWORD OnDrop(IDataObject* data_object, | |
87 DWORD key_state, | |
88 POINT cursor_position, | |
89 DWORD effect); | |
90 | |
91 // Return the drag identity. | |
92 static int32 GetDragIdentity() { return drag_identity_; } | |
93 | |
94 private: | |
95 // Returns the cached drop helper, creating one if necessary. The returned | |
96 // object is not addrefed. May return NULL if the object couldn't be created. | |
97 static IDropTargetHelper* DropHelper(); | |
98 | |
99 // The data object currently being dragged over this drop target. | |
100 scoped_refptr<IDataObject> current_data_object_; | |
101 | |
102 // A helper object that is used to provide drag image support while the mouse | |
103 // is dragging over the content area. | |
104 // | |
105 // DO NOT ACCESS DIRECTLY! Use DropHelper() instead, which will lazily create | |
106 // this if it doesn't exist yet. This object can take tens of milliseconds to | |
107 // create, and we don't want to block any window opening for this, especially | |
108 // since often, DnD will never be used. Instead, we force this penalty to the | |
109 // first time it is actually used. | |
110 static IDropTargetHelper* cached_drop_target_helper_; | |
111 | |
112 // The drag identity (id). An up-counter that increases when the cursor first | |
113 // moves over the HWND in a DnD session (OnDragEnter). 0 is reserved to mean | |
114 // the "no/unknown" identity, and is used for initialization. The identity is | |
115 // sent to the renderer in drag enter notifications. Note: the identity value | |
116 // is passed over the renderer NPAPI interface to gears, so use int32 instead | |
117 // of int here. | |
118 static int32 drag_identity_; | |
119 | |
120 // The HWND of the source. This HWND is used to determine coordinates for | |
121 // mouse events that are sent to the renderer notifying various drag states. | |
122 HWND hwnd_; | |
123 | |
124 // Whether or not we are currently processing drag notifications for drags | |
125 // initiated in this window. | |
126 bool suspended_; | |
127 | |
128 LONG ref_count_; | |
129 | |
130 DISALLOW_COPY_AND_ASSIGN(DropTarget); | |
131 }; | |
132 | |
133 } // namespace win | |
134 } // namespace app | |
135 | |
136 #endif // APP_WIN_DROP_TARGET_H_ | |
OLD | NEW |