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)