• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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_SOLO_WINDOW_TRACKER_H_
6 #define ASH_WM_SOLO_WINDOW_TRACKER_H_
7 
8 #include <vector>
9 
10 #include "ash/ash_export.h"
11 #include "ash/wm/dock/docked_window_layout_manager_observer.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "ui/aura/window_observer.h"
15 #include "ui/gfx/rect.h"
16 
17 namespace aura {
18 class RootWindow;
19 class Window;
20 }
21 
22 namespace ash {
23 
24 // Class which keeps track of the window (if any) which should use the solo
25 // window header. The solo window header is very transparent and is used when
26 // there is only one visible window and the window is not maximized or
27 // fullscreen. The solo window header is not used for either panels or docked
28 // windows.
29 class ASH_EXPORT SoloWindowTracker
30     : public aura::WindowObserver,
31       public internal::DockedWindowLayoutManagerObserver {
32  public:
33   explicit SoloWindowTracker(aura::RootWindow* root_window);
34   virtual ~SoloWindowTracker();
35 
36   // Enable/Disable solo headers.
37   static void SetSoloHeaderEnabled(bool enabled);
38 
39   // Returns the window, if any, which should use the solo window header.
40   aura::Window* GetWindowWithSoloHeader();
41 
42  private:
43   // Updates the window which would use the solo header if the window were not
44   // maximized or fullscreen. If |ignore_window| is not NULL, it is ignored for
45   // counting valid candidates. This is useful when there is a window which is
46   // about to be moved to a different root window or about to be closed.
47   void UpdateSoloWindow(aura::Window* ignore_window);
48 
49   // Returns true if there is a visible docked window.
50   bool AnyVisibleWindowDocked() const;
51 
52   // aura::WindowObserver overrides:
53   virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE;
54   virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE;
55   virtual void OnWindowVisibilityChanged(aura::Window* window,
56                                          bool visible) OVERRIDE;
57 
58   // ash::internal::DockedWindowLayoutManagerObserver override:
59   virtual void OnDockBoundsChanging(const gfx::Rect& new_bounds,
60                                     Reason reason) OVERRIDE;
61 
62   // The containers whose children can use the solo header.
63   std::vector<aura::Window*> containers_;
64 
65   // The dock's bounds.
66   gfx::Rect dock_bounds_;
67 
68   // The window which would use the solo header if it were not maximized or
69   // fullscreen.
70   aura::Window* solo_window_;
71 
72   // Class which observes changes in |solo_window_|'s show type.
73   class SoloWindowObserver;
74   scoped_ptr<SoloWindowObserver> solo_window_observer_;
75 
76   DISALLOW_COPY_AND_ASSIGN(SoloWindowTracker);
77 };
78 
79 }  // namespace ash
80 
81 #endif // ASH_WM_SOLO_WINDOW_TRACKER_H_
82