desktop_drag_drop_client_win.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_root_window_host_win.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/drop_target_win.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopDragDropClientWin::DesktopDragDropClientWin(
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::RootWindow* root_window,
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HWND window)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : drag_drop_in_progress_(false),
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      drag_operation_(0) {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drop_target_ = new DesktopDropTargetWin(root_window, window);
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopDragDropClientWin::~DesktopDragDropClientWin() {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DesktopDragDropClientWin::StartDragAndDrop(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::OSExchangeData& data,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::RootWindow* root_window,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* source_window,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Point& root_location,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int operation,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::DragDropTypes::DragEventSource source) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_drop_in_progress_ = true;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_operation_ = operation;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_source_ = new ui::DragSourceWin;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DWORD effect;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HRESULT result = DoDragDrop(
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ui::OSExchangeDataProviderWin::GetIDataObject(data),
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      drag_source_,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ui::DragDropTypes::DragOperationToDropEffect(operation),
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &effect);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_drop_in_progress_ = false;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (result != DRAGDROP_S_DROP)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    effect = DROPEFFECT_NONE;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ui::DragDropTypes::DropEffectToDragOperation(effect);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::DragUpdate(aura::Window* target,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const ui::LocatedEvent& event) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::Drop(aura::Window* target,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const ui::LocatedEvent& event) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::DragCancel() {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_source_->CancelDrag();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_operation_ = 0;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DesktopDragDropClientWin::IsDragDropInProgress() {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return drag_drop_in_progress_;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopDragDropClientWin::OnNativeWidgetDestroying(HWND window) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (drop_target_.get()) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RevokeDragDrop(window);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    drop_target_ = NULL;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
79