12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_source_win.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/dragdrop/drop_target_event.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data_provider_win.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_drop_target_win.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopDragDropClientWin::DesktopDragDropClientWin(
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::Window* root_window,
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HWND window)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : drag_drop_in_progress_(false),
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      drag_operation_(0) {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drop_target_ = new DesktopDropTargetWin(root_window, window);
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopDragDropClientWin::~DesktopDragDropClientWin() {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DesktopDragDropClientWin::StartDragAndDrop(
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::OSExchangeData& data,
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::Window* root_window,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* source_window,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Point& root_location,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int operation,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::DragDropTypes::DragEventSource source) {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_drop_in_progress_ = true;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_operation_ = operation;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_source_ = new ui::DragSourceWin;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DWORD effect;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HRESULT result = DoDragDrop(
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ui::OSExchangeDataProviderWin::GetIDataObject(data),
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      drag_source_,
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ui::DragDropTypes::DragOperationToDropEffect(operation),
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &effect);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_drop_in_progress_ = false;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (result != DRAGDROP_S_DROP)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    effect = DROPEFFECT_NONE;
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ui::DragDropTypes::DropEffectToDragOperation(effect);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::DragUpdate(aura::Window* target,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const ui::LocatedEvent& event) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::Drop(aura::Window* target,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const ui::LocatedEvent& event) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::DragCancel() {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_source_->CancelDrag();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_operation_ = 0;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DesktopDragDropClientWin::IsDragDropInProgress() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return drag_drop_in_progress_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::OnNativeWidgetDestroying(HWND window) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (drop_target_.get()) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RevokeDragDrop(window);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    drop_target_ = NULL;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
78