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 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());
     37   }
     38 #endif
     39   return device_scale_factor;
     40 }
     41 
     42 namespace views {
     43 
     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);
     56   }
     57 #elif defined(OS_WIN)
     58   scoped_refptr<ui::DragSourceWin> drag_source(new ui::DragSourceWin);
     59   DWORD effects;
     60   DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data),
     61              drag_source,
     62              ui::DragDropTypes::DragOperationToDropEffect(operation),
     63              &effects);
     64 #endif
     65 }
     66 
     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);
     72 }
     73 
     74 }  // namespace views
     75