Home | History | Annotate | Download | only in drag_drop
      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 "ash/drag_drop/drag_drop_tracker.h"
      6 
      7 #include "ash/shell.h"
      8 #include "ash/shell_window_ids.h"
      9 #include "ash/wm/coordinate_conversion.h"
     10 #include "ui/aura/client/window_tree_client.h"
     11 #include "ui/aura/root_window.h"
     12 #include "ui/aura/window.h"
     13 #include "ui/events/event.h"
     14 #include "ui/gfx/screen.h"
     15 
     16 namespace ash {
     17 namespace internal {
     18 
     19 namespace {
     20 
     21 // Creates a window for capturing drag events.
     22 aura::Window* CreateCaptureWindow(aura::Window* context_root,
     23                                   aura::WindowDelegate* delegate) {
     24   aura::Window* window = new aura::Window(delegate);
     25   window->SetType(aura::client::WINDOW_TYPE_NORMAL);
     26   window->Init(ui::LAYER_NOT_DRAWN);
     27   aura::client::ParentWindowWithContext(window, context_root, gfx::Rect());
     28   window->Show();
     29   DCHECK(window->bounds().size().IsEmpty());
     30   return window;
     31 }
     32 
     33 }  // namespace
     34 
     35 DragDropTracker::DragDropTracker(aura::Window* context_root,
     36                                  aura::WindowDelegate* delegate)
     37     : capture_window_(CreateCaptureWindow(context_root, delegate)) {
     38 }
     39 
     40 DragDropTracker::~DragDropTracker()  {
     41   capture_window_->ReleaseCapture();
     42 }
     43 
     44 void DragDropTracker::TakeCapture() {
     45   capture_window_->SetCapture();
     46 }
     47 
     48 aura::Window* DragDropTracker::GetTarget(const ui::LocatedEvent& event) {
     49   DCHECK(capture_window_.get());
     50   gfx::Point location_in_screen = event.location();
     51   wm::ConvertPointToScreen(capture_window_.get(),
     52                            &location_in_screen);
     53   aura::Window* root_window_at_point =
     54       wm::GetRootWindowAt(location_in_screen);
     55   gfx::Point location_in_root = location_in_screen;
     56   wm::ConvertPointFromScreen(root_window_at_point, &location_in_root);
     57   return root_window_at_point->GetEventHandlerForPoint(location_in_root);
     58 }
     59 
     60 ui::LocatedEvent* DragDropTracker::ConvertEvent(
     61     aura::Window* target,
     62     const ui::LocatedEvent& event) {
     63   DCHECK(capture_window_.get());
     64   gfx::Point target_location = event.location();
     65   aura::Window::ConvertPointToTarget(capture_window_.get(), target,
     66                                      &target_location);
     67   gfx::Point location_in_screen = event.location();
     68   ash::wm::ConvertPointToScreen(capture_window_.get(), &location_in_screen);
     69   gfx::Point target_root_location = event.root_location();
     70   aura::Window::ConvertPointToTarget(
     71       capture_window_->GetRootWindow(),
     72       ash::wm::GetRootWindowAt(location_in_screen),
     73       &target_root_location);
     74   return new ui::MouseEvent(event.type(),
     75                             target_location,
     76                             target_root_location,
     77                             event.flags());
     78 }
     79 
     80 }  // namespace internal
     81 }  // namespace ash
     82