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