desktop_drag_drop_client_win.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer// Copyright (c) 2012 The Chromium Authors. All rights reserved.
27a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell// Use of this source code is governed by a BSD-style license that can be
37a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell// found in the LICENSE file.
47a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
57a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h"
67a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
77a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/base/dragdrop/drag_drop_types.h"
87a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/base/dragdrop/drag_source_win.h"
97a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/base/dragdrop/drop_target_event.h"
107a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/base/dragdrop/os_exchange_data_provider_win.h"
117a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/views/widget/desktop_aura/desktop_drop_target_win.h"
127a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/views/widget/desktop_aura/desktop_root_window_host_win.h"
137a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/views/widget/drop_target_win.h"
147a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
157a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswellnamespace views {
167a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
177a73b80b9052136c8cd2234eb3433a07df7cf38eJohn CriswellDesktopDragDropClientWin::DesktopDragDropClientWin(
188c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    aura::Window* root_window,
198c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    HWND window)
208c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    : drag_drop_in_progress_(false),
218c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer      drag_operation_(0) {
228c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  drop_target_ = new DesktopDropTargetWin(root_window, window);
238c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}
248c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
258c8af327b83a210aed30634c908bb4b39f41eedbReid SpencerDesktopDragDropClientWin::~DesktopDragDropClientWin() {
268c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}
278c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
288c8af327b83a210aed30634c908bb4b39f41eedbReid Spencerint DesktopDragDropClientWin::StartDragAndDrop(
298c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    const ui::OSExchangeData& data,
308c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    aura::Window* root_window,
318c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    aura::Window* source_window,
328c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    const gfx::Point& root_location,
338c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    int operation,
348c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    ui::DragDropTypes::DragEventSource source) {
358c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  drag_drop_in_progress_ = true;
368c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  drag_operation_ = operation;
378c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
388c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  drag_source_ = new ui::DragSourceWin;
390c803894985f80e894b36ad4de58ea4c2e906b07Brian Gaeke  DWORD effect;
400c803894985f80e894b36ad4de58ea4c2e906b07Brian Gaeke  HRESULT result = DoDragDrop(
410c803894985f80e894b36ad4de58ea4c2e906b07Brian Gaeke      ui::OSExchangeDataProviderWin::GetIDataObject(data),
428c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer      drag_source_,
438c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer      ui::DragDropTypes::DragOperationToDropEffect(operation),
448c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer      &effect);
454046846d2cb36a6281b853c73776584063cca19dJohn Criswell
464046846d2cb36a6281b853c73776584063cca19dJohn Criswell  drag_drop_in_progress_ = false;
474046846d2cb36a6281b853c73776584063cca19dJohn Criswell
488c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  if (result != DRAGDROP_S_DROP)
498c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    effect = DROPEFFECT_NONE;
508c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
518c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  return ui::DragDropTypes::DropEffectToDragOperation(effect);
528c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}
538c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
548c8af327b83a210aed30634c908bb4b39f41eedbReid Spencervoid DesktopDragDropClientWin::DragUpdate(aura::Window* target,
558c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer                                          const ui::LocatedEvent& event) {
568c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}
578c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
588c8af327b83a210aed30634c908bb4b39f41eedbReid Spencervoid DesktopDragDropClientWin::Drop(aura::Window* target,
598c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer                                    const ui::LocatedEvent& event) {
608c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}
618c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
628c8af327b83a210aed30634c908bb4b39f41eedbReid Spencervoid DesktopDragDropClientWin::DragCancel() {
638c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  drag_source_->CancelDrag();
648c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  drag_operation_ = 0;
658c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}
66394855a87d52d71b702cfbf0ec1a223bda9163d4Reid Spencer
67cbeedf73d403ca0b65b3d4151b5630c5e335055bBrian Gaekebool DesktopDragDropClientWin::IsDragDropInProgress() {
68cbeedf73d403ca0b65b3d4151b5630c5e335055bBrian Gaeke  return drag_drop_in_progress_;
69cbeedf73d403ca0b65b3d4151b5630c5e335055bBrian Gaeke}
70cbeedf73d403ca0b65b3d4151b5630c5e335055bBrian Gaeke
71cbeedf73d403ca0b65b3d4151b5630c5e335055bBrian Gaekevoid DesktopDragDropClientWin::OnNativeWidgetDestroying(HWND window) {
72cbeedf73d403ca0b65b3d4151b5630c5e335055bBrian Gaeke  if (drop_target_.get()) {
738c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    RevokeDragDrop(window);
748c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer    drop_target_ = NULL;
758c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer  }
768c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}
778c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer
788c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer}  // namespace views
798c8af327b83a210aed30634c908bb4b39f41eedbReid Spencer