• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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().
bounds_in_screen()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.
set_phantom_below_window(aura::Window * phantom_below_window)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