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"
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"
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"
25 ui::ScaleFactor
GetDeviceScaleFactorForNativeView(views::Widget
* widget
) {
26 ui::ScaleFactor device_scale_factor
= ui::SCALE_FACTOR_100P
;
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());
39 return device_scale_factor
;
44 void RunShellDrag(gfx::NativeView view
,
45 const ui::OSExchangeData
& data
,
46 const gfx::Point
& location
,
48 ui::DragDropTypes::DragEventSource source
) {
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
);
58 scoped_refptr
<ui::DragSource
> drag_source(new ui::DragSource
);
60 DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data
),
62 ui::DragDropTypes::DragOperationToDropEffect(operation
),
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);