OLD | NEW |
| (Empty) |
1 // Copyright 2016 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 #include "ui/views/mus/drop_target_mus.h" | |
6 | |
7 #include <map> | |
8 #include <string> | |
9 #include <utility> | |
10 #include <vector> | |
11 | |
12 #include "base/memory/ptr_util.h" | |
13 #include "services/ui/public/interfaces/window_tree_constants.mojom.h" | |
14 #include "ui/aura/client/drag_drop_client.h" | |
15 #include "ui/aura/client/drag_drop_delegate.h" | |
16 #include "ui/aura/mus/os_exchange_data_provider_mus.h" | |
17 #include "ui/aura/window.h" | |
18 #include "ui/aura/window_tree_host.h" | |
19 #include "ui/base/dragdrop/drag_drop_types.h" | |
20 #include "ui/base/dragdrop/drop_target_event.h" | |
21 | |
22 namespace views { | |
23 | |
24 static_assert(ui::DragDropTypes::DRAG_NONE == ui::mojom::kDropEffectNone, | |
25 "Drag constants must be the same"); | |
26 static_assert(ui::DragDropTypes::DRAG_MOVE == ui::mojom::kDropEffectMove, | |
27 "Drag constants must be the same"); | |
28 static_assert(ui::DragDropTypes::DRAG_COPY == ui::mojom::kDropEffectCopy, | |
29 "Drag constants must be the same"); | |
30 static_assert(ui::DragDropTypes::DRAG_LINK == ui::mojom::kDropEffectLink, | |
31 "Drag constants must be the same"); | |
32 | |
33 DropTargetMus::DropTargetMus(aura::Window* root_window) | |
34 : root_window_(root_window), target_window_(nullptr) {} | |
35 | |
36 DropTargetMus::~DropTargetMus() {} | |
37 | |
38 void DropTargetMus::Translate(uint32_t key_state, | |
39 const gfx::Point& screen_location, | |
40 uint32_t effect, | |
41 std::unique_ptr<ui::DropTargetEvent>* event, | |
42 aura::client::DragDropDelegate** delegate) { | |
43 gfx::Point location = screen_location; | |
44 gfx::Point root_location = location; | |
45 root_window_->GetHost()->ConvertScreenInPixelsToDIP(&root_location); | |
46 aura::Window* target_window = | |
47 root_window_->GetEventHandlerForPoint(root_location); | |
48 bool target_window_changed = false; | |
49 if (target_window != target_window_) { | |
50 if (target_window_) | |
51 NotifyDragExited(); | |
52 target_window_ = target_window; | |
53 if (target_window_) | |
54 target_window_->AddObserver(this); | |
55 target_window_changed = true; | |
56 } | |
57 *delegate = nullptr; | |
58 if (!target_window_) | |
59 return; | |
60 *delegate = aura::client::GetDragDropDelegate(target_window_); | |
61 if (!*delegate) | |
62 return; | |
63 | |
64 location = root_location; | |
65 aura::Window::ConvertPointToTarget(root_window_, target_window_, &location); | |
66 *event = base::MakeUnique<ui::DropTargetEvent>( | |
67 *(os_exchange_data_.get()), location, root_location, effect); | |
68 (*event)->set_flags(key_state); | |
69 if (target_window_changed) | |
70 (*delegate)->OnDragEntered(*event->get()); | |
71 } | |
72 | |
73 void DropTargetMus::NotifyDragExited() { | |
74 if (!target_window_) | |
75 return; | |
76 | |
77 aura::client::DragDropDelegate* delegate = | |
78 aura::client::GetDragDropDelegate(target_window_); | |
79 if (delegate) | |
80 delegate->OnDragExited(); | |
81 | |
82 target_window_->RemoveObserver(this); | |
83 target_window_ = nullptr; | |
84 } | |
85 | |
86 void DropTargetMus::OnDragDropStart( | |
87 std::map<std::string, std::vector<uint8_t>> mime_data) { | |
88 // We store the mime data here because we need to access it during each phase | |
89 // of the drag, but we also don't move the data cross-process multiple times. | |
90 os_exchange_data_ = base::MakeUnique<ui::OSExchangeData>( | |
91 base::MakeUnique<aura::OSExchangeDataProviderMus>(std::move(mime_data))); | |
92 } | |
93 | |
94 uint32_t DropTargetMus::OnDragEnter(uint32_t key_state, | |
95 const gfx::Point& position, | |
96 uint32_t effect_bitmask) { | |
97 std::unique_ptr<ui::DropTargetEvent> event; | |
98 aura::client::DragDropDelegate* delegate = nullptr; | |
99 // Translate will call OnDragEntered. | |
100 Translate(key_state, position, effect_bitmask, &event, &delegate); | |
101 return ui::mojom::kDropEffectNone; | |
102 } | |
103 | |
104 uint32_t DropTargetMus::OnDragOver(uint32_t key_state, | |
105 const gfx::Point& position, | |
106 uint32_t effect) { | |
107 int drag_operation = ui::DragDropTypes::DRAG_NONE; | |
108 std::unique_ptr<ui::DropTargetEvent> event; | |
109 aura::client::DragDropDelegate* delegate = nullptr; | |
110 | |
111 Translate(key_state, position, effect, &event, &delegate); | |
112 if (delegate) | |
113 drag_operation = delegate->OnDragUpdated(*event); | |
114 return drag_operation; | |
115 } | |
116 | |
117 void DropTargetMus::OnDragLeave() { | |
118 NotifyDragExited(); | |
119 } | |
120 | |
121 uint32_t DropTargetMus::OnCompleteDrop(uint32_t key_state, | |
122 const gfx::Point& position, | |
123 uint32_t effect) { | |
124 int drag_operation = ui::DragDropTypes::DRAG_NONE; | |
125 std::unique_ptr<ui::DropTargetEvent> event; | |
126 aura::client::DragDropDelegate* delegate = nullptr; | |
127 Translate(key_state, position, effect, &event, &delegate); | |
128 if (delegate) | |
129 drag_operation = delegate->OnPerformDrop(*event); | |
130 if (target_window_) { | |
131 target_window_->RemoveObserver(this); | |
132 target_window_ = nullptr; | |
133 } | |
134 | |
135 return drag_operation; | |
136 } | |
137 | |
138 void DropTargetMus::OnDragDropDone() { | |
139 os_exchange_data_.reset(); | |
140 } | |
141 | |
142 void DropTargetMus::OnWindowDestroyed(aura::Window* window) { | |
143 DCHECK_EQ(window, target_window_); | |
144 target_window_ = nullptr; | |
145 } | |
146 | |
147 } // namespace views | |
OLD | NEW |