Home | History | Annotate | Download | only in workspace
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
      6 #define ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
      7 
      8 #include "ash/ash_export.h"
      9 #include "base/basictypes.h"
     10 #include "base/gtest_prod_util.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "ui/gfx/animation/animation_delegate.h"
     13 #include "ui/gfx/rect.h"
     14 
     15 namespace aura {
     16 class Window;
     17 }
     18 
     19 namespace gfx {
     20 class SlideAnimation;
     21 }
     22 
     23 namespace views {
     24 class Widget;
     25 }
     26 
     27 namespace ash {
     28 namespace internal {
     29 
     30 // PhantomWindowController is responsible for showing a phantom representation
     31 // of a window. It's used used during dragging a window to show a snap location.
     32 class ASH_EXPORT PhantomWindowController : public gfx::AnimationDelegate {
     33  public:
     34   explicit PhantomWindowController(aura::Window* window);
     35   virtual ~PhantomWindowController();
     36 
     37   // Bounds last passed to Show().
     38   const gfx::Rect& bounds_in_screen() const { return bounds_in_screen_; }
     39 
     40   // Animates the phantom window towards |bounds_in_screen|.
     41   // Creates two (if start bounds intersect any root window other than the
     42   // root window that matches the target bounds) or one (otherwise) phantom
     43   // widgets to display animated rectangle in each root.
     44   // This does not immediately show the window.
     45   void Show(const gfx::Rect& bounds_in_screen);
     46 
     47   // Hides the phantom.
     48   void Hide();
     49 
     50   // Returns true if the phantom is showing.
     51   bool IsShowing() const;
     52 
     53   // If set, the phantom window is stacked below this window, otherwise it
     54   // is stacked above the window passed to the constructor.
     55   void set_phantom_below_window(aura::Window* phantom_below_window) {
     56     phantom_below_window_ = phantom_below_window;
     57   }
     58 
     59   // gfx::AnimationDelegate overrides:
     60   virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
     61 
     62  private:
     63   FRIEND_TEST_ALL_PREFIXES(WorkspaceWindowResizerTest, PhantomWindowShow);
     64 
     65   // Creates, shows and returns a phantom widget at |bounds|
     66   // with kShellWindowId_ShelfContainer in |root_window| as a parent.
     67   views::Widget* CreatePhantomWidget(aura::Window* root_window,
     68                                      const gfx::Rect& bounds_in_screen);
     69 
     70   // Window the phantom is placed beneath.
     71   aura::Window* window_;
     72 
     73   // If set, the phantom window should get stacked below this window.
     74   aura::Window* phantom_below_window_;
     75 
     76   // Initially the bounds of |window_| (in screen coordinates).
     77   // Each time Show() is invoked |start_bounds_| is then reset to the bounds of
     78   // |phantom_widget_| and |bounds_| is set to the value passed into Show().
     79   // The animation animates between these two values.
     80   gfx::Rect start_bounds_;
     81 
     82   // Target bounds of the animation in screen coordinates.
     83   gfx::Rect bounds_in_screen_;
     84 
     85   // The primary phantom representation of the window. It is parented by the
     86   // root window matching the target bounds.
     87   views::Widget* phantom_widget_;
     88 
     89   // If the animation starts on another display, this is the secondary phantom
     90   // representation of the window used on the initial display, otherwise this is
     91   // NULL. This allows animation to progress from one display into the other.
     92   views::Widget* phantom_widget_start_;
     93 
     94   // Used to transition the bounds.
     95   scoped_ptr<gfx::SlideAnimation> animation_;
     96 
     97   DISALLOW_COPY_AND_ASSIGN(PhantomWindowController);
     98 };
     99 
    100 }  // namespace internal
    101 }  // namespace ash
    102 
    103 #endif  // ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
    104