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