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)#ifndef UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTIOP_DROP_TARGET_WIN_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTIOP_DROP_TARGET_WIN_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drop_target_win.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace aura { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace client { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DragDropDelegate; 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DropTargetEvent; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OSExchangeData; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DesktopDropTargetWin takes care of managing drag and drop for 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin. It converts Windows OLE drop messages into 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// aura::client::DragDropDelegate calls. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DesktopDropTargetWin : public ui::DropTargetWin, 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public aura::WindowObserver { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DesktopDropTargetWin(aura::Window* root_window, HWND window); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DesktopDropTargetWin(); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ui::DropTargetWin implementation: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual DWORD OnDragEnter(IDataObject* data_object, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD key_state, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) POINT position, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD effect) OVERRIDE; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual DWORD OnDragOver(IDataObject* data_object, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD key_state, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) POINT position, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD effect) OVERRIDE; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDragLeave(IDataObject* data_object) OVERRIDE; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual DWORD OnDrop(IDataObject* data_object, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD key_state, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) POINT position, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD effect) OVERRIDE; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // aura::WindowObserver implementation: 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Common functionality for the ui::DropTargetWin methods to translate from 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // COM data types to Aura ones. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Translate(IDataObject* data_object, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD key_state, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) POINT cursor_position, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD effect, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::OSExchangeData>* data, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::DropTargetEvent>* event, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::DragDropDelegate** delegate); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void NotifyDragLeave(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The root window associated with this drop target. 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window_; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The Aura window that is currently under the cursor. We need to manually 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // keep track of this because Windows will only call our drag enter method 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // once when the user enters the associated HWND. But inside that HWND there 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // could be multiple aura windows, so we need to generate drag enter events 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for them. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target_window_; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DesktopDropTargetWin); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace views 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTIOP_DROP_TARGET_WIN_H_ 81