desktop_drag_drop_client_win.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/dragdrop/drag_source_win.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/dragdrop/drop_target_event.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data_provider_win.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_drop_target_win.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_root_window_host_win.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/widget/drop_target_win.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace views {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DesktopDragDropClientWin::DesktopDragDropClientWin(
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    aura::RootWindow* root_window,
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    HWND window)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : drag_drop_in_progress_(false),
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      drag_operation_(0) {
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  drop_target_ = new DesktopDropTargetWin(root_window, window);
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)DesktopDragDropClientWin::~DesktopDragDropClientWin() {
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int DesktopDragDropClientWin::StartDragAndDrop(
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const ui::OSExchangeData& data,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    aura::RootWindow* root_window,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    aura::Window* source_window,
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Point& root_location,
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    int operation,
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DragDropTypes::DragEventSource source) {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_drop_in_progress_ = true;
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_operation_ = operation;
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_source_ = new ui::DragSourceWin;
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DWORD effect;
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  HRESULT result = DoDragDrop(
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ui::OSExchangeDataProviderWin::GetIDataObject(data),
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      drag_source_,
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ui::DragDropTypes::DragOperationToDropEffect(operation),
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      &effect);
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_drop_in_progress_ = false;
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (result != DRAGDROP_S_DROP)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    effect = DROPEFFECT_NONE;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return ui::DragDropTypes::DropEffectToDragOperation(effect);
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void DesktopDragDropClientWin::DragUpdate(aura::Window* target,
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                          const ui::LocatedEvent& event) {
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DesktopDragDropClientWin::Drop(aura::Window* target,
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    const ui::LocatedEvent& event) {
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void DesktopDragDropClientWin::DragCancel() {
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_source_->CancelDrag();
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_operation_ = 0;
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool DesktopDragDropClientWin::IsDragDropInProgress() {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return drag_drop_in_progress_;
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DesktopDragDropClientWin::OnNativeWidgetDestroying(HWND window) {
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (drop_target_.get()) {
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RevokeDragDrop(window);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    drop_target_ = NULL;
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace views
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)