// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_ #define ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_ #include "ash/ash_export.h" #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "ui/aura/window_observer.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/events/event_constants.h" #include "ui/events/event_handler.h" #include "ui/gfx/animation/animation_delegate.h" #include "ui/gfx/rect.h" #include "ui/wm/public/drag_drop_client.h" namespace gfx { class LinearAnimation; } namespace ash { class DragDropTracker; class DragDropTrackerDelegate; class DragImageView; namespace test { class DragDropControllerTest; } class ASH_EXPORT DragDropController : public aura::client::DragDropClient, public ui::EventHandler, public gfx::AnimationDelegate, public aura::WindowObserver { public: DragDropController(); virtual ~DragDropController(); void set_should_block_during_drag_drop(bool should_block_during_drag_drop) { should_block_during_drag_drop_ = should_block_during_drag_drop; } // Overridden from aura::client::DragDropClient: virtual int StartDragAndDrop( const ui::OSExchangeData& data, aura::Window* root_window, aura::Window* source_window, const gfx::Point& root_location, int operation, ui::DragDropTypes::DragEventSource source) OVERRIDE; virtual void DragUpdate(aura::Window* target, const ui::LocatedEvent& event) OVERRIDE; virtual void Drop(aura::Window* target, const ui::LocatedEvent& event) OVERRIDE; virtual void DragCancel() OVERRIDE; virtual bool IsDragDropInProgress() OVERRIDE; // Overridden from ui::EventHandler: virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; // Overridden from aura::WindowObserver. virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; protected: // Helper method to create a LinearAnimation object that will run the drag // cancel animation. Caller take ownership of the returned object. Protected // for testing. virtual gfx::LinearAnimation* CreateCancelAnimation( int duration, int frame_rate, gfx::AnimationDelegate* delegate); // Actual implementation of |DragCancel()|. protected for testing. virtual void DoDragCancel(int drag_cancel_animation_duration_ms); private: friend class ash::test::DragDropControllerTest; // Overridden from gfx::AnimationDelegate: virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE; virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE; // Helper method to start drag widget flying back animation. void StartCanceledAnimation(int animation_duration_ms); // Helper method to forward |pending_log_tap_| event to |drag_source_window_|. void ForwardPendingLongTap(); // Helper method to reset everything. void Cleanup(); scoped_ptr drag_image_; gfx::Vector2d drag_image_offset_; const ui::OSExchangeData* drag_data_; int drag_operation_; // Window that is currently under the drag cursor. aura::Window* drag_window_; // Starting and final bounds for the drag image for the drag cancel animation. gfx::Rect drag_image_initial_bounds_for_cancel_animation_; gfx::Rect drag_image_final_bounds_for_cancel_animation_; scoped_ptr cancel_animation_; // Window that started the drag. aura::Window* drag_source_window_; // Indicates whether the caller should be blocked on a drag/drop session. // Only be used for tests. bool should_block_during_drag_drop_; // Closure for quitting nested message loop. base::Closure quit_closure_; scoped_ptr drag_drop_tracker_; scoped_ptr drag_drop_window_delegate_; ui::DragDropTypes::DragEventSource current_drag_event_source_; // Holds a synthetic long tap event to be sent to the |drag_source_window_|. // See comment in OnGestureEvent() on why we need this. scoped_ptr pending_long_tap_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(DragDropController); }; } // namespace ash #endif // ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_