Home | History | Annotate | Download | only in wm
      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