15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_export.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/animation_delegate.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/drag_drop_client.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace gfx { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LinearAnimation; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DragDropTracker; 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DragDropTrackerDelegate; 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DragImageView; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DragDropControllerTest; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ASH_EXPORT DragDropController 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public aura::client::DragDropClient, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ui::EventHandler, 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public gfx::AnimationDelegate, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public aura::WindowObserver { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragDropController(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DragDropController(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_block_during_drag_drop(bool should_block_during_drag_drop) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_block_during_drag_drop_ = should_block_during_drag_drop; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from aura::client::DragDropClient: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int StartDragAndDrop( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::OSExchangeData& data, 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* source_window, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& root_location, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int operation, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DragEventSource source) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DragUpdate(aura::Window* target, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::LocatedEvent& event) OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Drop(aura::Window* target, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::LocatedEvent& event) OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DragCancel() OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsDragDropInProgress() OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler: 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from aura::WindowObserver. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper method to create a LinearAnimation object that will run the drag 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // cancel animation. Caller take ownership of the returned object. Protected 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for testing. 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual gfx::LinearAnimation* CreateCancelAnimation( 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int duration, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int frame_rate, 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::AnimationDelegate* delegate); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Actual implementation of |DragCancel()|. protected for testing. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DoDragCancel(int drag_cancel_animation_duration_ms); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ash::test::DragDropControllerTest; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Overridden from gfx::AnimationDelegate: 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE; 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to start drag widget flying back animation. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartCanceledAnimation(int animation_duration_ms); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper method to forward |pending_log_tap_| event to |drag_source_window_|. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ForwardPendingLongTap(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to reset everything. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Cleanup(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DragImageView> drag_image_; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Vector2d drag_image_offset_; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::OSExchangeData* drag_data_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drag_operation_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window that is currently under the drag cursor. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* drag_window_; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starting and final bounds for the drag image for the drag cancel animation. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect drag_image_initial_bounds_for_cancel_animation_; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect drag_image_final_bounds_for_cancel_animation_; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<gfx::LinearAnimation> cancel_animation_; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Window that started the drag. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* drag_source_window_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates whether the caller should be blocked on a drag/drop session. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only be used for tests. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_block_during_drag_drop_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closure for quitting nested message loop. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure quit_closure_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<ash::DragDropTracker> drag_drop_tracker_; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DragDropTrackerDelegate> drag_drop_window_delegate_; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DragDropTypes::DragEventSource current_drag_event_source_; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Holds a synthetic long tap event to be sent to the |drag_source_window_|. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See comment in OnGestureEvent() on why we need this. 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::GestureEvent> pending_long_tap_; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<DragDropController> weak_factory_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DragDropController); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_ 139