Home | History | Annotate | Download | only in views
      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 #include "ui/views/drag_utils.h"
      6 
      7 #include "ui/gfx/canvas.h"
      8 #include "ui/gfx/size.h"
      9 
     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_win.h"
     20 #include "ui/base/dragdrop/os_exchange_data_provider_win.h"
     21 #else
     22 #error
     23 #endif
     24 
     25 float GetDeviceScaleForNativeView(views::Widget* widget) {
     26   float device_scale = 1.0f;
     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 = display.device_scale_factor();
     36   }
     37 #endif
     38   return device_scale;
     39 }
     40 
     41 namespace views {
     42 
     43 void RunShellDrag(gfx::NativeView view,
     44                   const ui::OSExchangeData& data,
     45                   const gfx::Point& location,
     46                   int operation,
     47                   ui::DragDropTypes::DragEventSource source) {
     48 #if defined(USE_AURA)
     49   gfx::Point root_location(location);
     50   aura::Window* root_window = view->GetRootWindow();
     51   aura::Window::ConvertPointToTarget(view, root_window, &root_location);
     52   if (aura::client::GetDragDropClient(root_window)) {
     53     aura::client::GetDragDropClient(root_window)->StartDragAndDrop(
     54         data, root_window, view, root_location, operation, source);
     55   }
     56 #elif defined(OS_WIN)
     57   scoped_refptr<ui::DragSourceWin> drag_source(new ui::DragSourceWin);
     58   DWORD effects;
     59   DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data),
     60              drag_source,
     61              ui::DragDropTypes::DragOperationToDropEffect(operation),
     62              &effects);
     63 #endif
     64 }
     65 
     66 gfx::Canvas* GetCanvasForDragImage(views::Widget* widget,
     67                                    const gfx::Size& canvas_size) {
     68   float device_scale = GetDeviceScaleForNativeView(widget);
     69   return new gfx::Canvas(canvas_size, device_scale, false);
     70 }
     71 
     72 }  // namespace views
     73