Fix cookie searchbox bug.
[chromium-blink-merge.git] / ui / views / drag_utils.cc
blobc011339662fc70281aae434d6ec7770b6d97138b
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.
5 #include "ui/views/drag_utils.h"
7 #include "ui/gfx/canvas.h"
8 #include "ui/gfx/size.h"
10 #if defined(USE_AURA)
11 #include "ui/aura/client/drag_drop_client.h"
12 #include "ui/aura/root_window.h"
13 #include "ui/aura/window.h"
14 #include "ui/gfx/display.h"
15 #include "ui/gfx/screen.h"
16 #include "ui/views/widget/widget.h"
17 #elif defined(OS_WIN)
18 #include "ui/base/dragdrop/drag_drop_types.h"
19 #include "ui/base/dragdrop/drag_source.h"
20 #include "ui/base/dragdrop/os_exchange_data_provider_win.h"
21 #else
22 #error
23 #endif
25 ui::ScaleFactor GetDeviceScaleFactorForNativeView(views::Widget* widget) {
26 ui::ScaleFactor device_scale_factor = ui::SCALE_FACTOR_100P;
27 #if defined(USE_AURA)
28 // The following code should work on other platforms as well. But we do not
29 // yet care about device scale factor on other platforms. So to keep drag and
30 // drop behavior on other platforms un-touched, we wrap this in the #if guard.
31 if (widget && widget->GetNativeView()) {
32 gfx::NativeView view = widget->GetNativeView();
33 gfx::Display display = gfx::Screen::GetScreenFor(view)->
34 GetDisplayNearestWindow(view);
35 device_scale_factor = ui::GetScaleFactorFromScale(
36 display.device_scale_factor());
38 #endif
39 return device_scale_factor;
42 namespace views {
44 void RunShellDrag(gfx::NativeView view,
45 const ui::OSExchangeData& data,
46 const gfx::Point& location,
47 int operation,
48 ui::DragDropTypes::DragEventSource source) {
49 #if defined(USE_AURA)
50 gfx::Point root_location(location);
51 aura::RootWindow* root_window = view->GetRootWindow();
52 aura::Window::ConvertPointToTarget(view, root_window, &root_location);
53 if (aura::client::GetDragDropClient(root_window)) {
54 aura::client::GetDragDropClient(root_window)->StartDragAndDrop(
55 data, root_window, view, root_location, operation, source);
57 #elif defined(OS_WIN)
58 scoped_refptr<ui::DragSource> drag_source(new ui::DragSource);
59 DWORD effects;
60 DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data),
61 drag_source,
62 ui::DragDropTypes::DragOperationToDropEffect(operation),
63 &effects);
64 #endif
67 gfx::Canvas* GetCanvasForDragImage(views::Widget* widget,
68 const gfx::Size& canvas_size) {
69 ui::ScaleFactor device_scale_factor =
70 GetDeviceScaleFactorForNativeView(widget);
71 return new gfx::Canvas(canvas_size, device_scale_factor, false);
74 } // namespace views