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.
5 #ifndef ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
6 #define ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
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"
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 {
34 explicit PhantomWindowController(aura::Window* window);
35 virtual ~PhantomWindowController();
37 // Bounds last passed to Show().
38 const gfx::Rect& bounds_in_screen() const { return bounds_in_screen_; }
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);
50 // Returns true if the phantom is showing.
51 bool IsShowing() const;
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;
59 // gfx::AnimationDelegate overrides:
60 virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
63 FRIEND_TEST_ALL_PREFIXES(WorkspaceWindowResizerTest, PhantomWindowShow);
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);
70 // Window the phantom is placed beneath.
71 aura::Window* window_;
73 // If set, the phantom window should get stacked below this window.
74 aura::Window* phantom_below_window_;
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_;
82 // Target bounds of the animation in screen coordinates.
83 gfx::Rect bounds_in_screen_;
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_;
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_;
94 // Used to transition the bounds.
95 scoped_ptr<gfx::SlideAnimation> animation_;
97 DISALLOW_COPY_AND_ASSIGN(PhantomWindowController);
100 } // namespace internal
103 #endif // ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_