Home | History | Annotate | Download | only in aura
      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 UI_AURA_WINDOW_OBSERVER_H_
      6 #define UI_AURA_WINDOW_OBSERVER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/strings/string16.h"
     10 #include "ui/aura/aura_export.h"
     11 
     12 namespace gfx {
     13 class Rect;
     14 }  // namespace gfx
     15 
     16 namespace aura {
     17 
     18 class Window;
     19 
     20 class AURA_EXPORT WindowObserver {
     21  public:
     22   struct HierarchyChangeParams {
     23     enum HierarchyChangePhase {
     24       HIERARCHY_CHANGING,
     25       HIERARCHY_CHANGED
     26     };
     27 
     28     Window* target;     // The window that was added or removed.
     29     Window* new_parent;
     30     Window* old_parent;
     31     HierarchyChangePhase phase;
     32     Window* receiver;   // The window receiving the notification.
     33   };
     34 
     35   WindowObserver();
     36 
     37   // Called when a window is added or removed. Notifications are sent to the
     38   // following hierarchies in this order:
     39   // 1. |target|.
     40   // 2. |target|'s child hierarchy.
     41   // 3. |target|'s parent hierarchy in its |old_parent|
     42   //        (only for Changing notifications).
     43   // 3. |target|'s parent hierarchy in its |new_parent|.
     44   //        (only for Changed notifications).
     45   // This sequence is performed via the Changing and Changed notifications below
     46   // before and after the change is committed.
     47   virtual void OnWindowHierarchyChanging(const HierarchyChangeParams& params) {}
     48   virtual void OnWindowHierarchyChanged(const HierarchyChangeParams& params) {}
     49 
     50   // Invoked when |new_window| has been added as a child of this window.
     51   virtual void OnWindowAdded(Window* new_window) {}
     52 
     53   // Invoked prior to removing |window| as a child of this window.
     54   virtual void OnWillRemoveWindow(Window* window) {}
     55 
     56   // Invoked when this window's parent window changes.  |parent| may be NULL.
     57   virtual void OnWindowParentChanged(Window* window, Window* parent) {}
     58 
     59   // Invoked when SetProperty(), ClearProperty(), or
     60   // NativeWidgetAura::SetNativeWindowProperty() is called on the window.
     61   // |key| is either a WindowProperty<T>* (SetProperty, ClearProperty)
     62   // or a const char* (SetNativeWindowProperty). Either way, it can simply be
     63   // compared for equality with the property constant. |old| is the old property
     64   // value, which must be cast to the appropriate type before use.
     65   virtual void OnWindowPropertyChanged(Window* window,
     66                                        const void* key,
     67                                        intptr_t old) {}
     68 
     69   // Invoked when SetVisible() is invoked on a window. |visible| is the
     70   // value supplied to SetVisible(). If |visible| is true, window->IsVisible()
     71   // may still return false. See description in Window::IsVisible() for details.
     72   virtual void OnWindowVisibilityChanging(Window* window, bool visible) {}
     73   virtual void OnWindowVisibilityChanged(Window* window, bool visible) {}
     74 
     75   // Invoked when SetBounds() is invoked on |window|. |old_bounds| and
     76   // |new_bounds| are in parent coordinates.
     77   virtual void OnWindowBoundsChanged(Window* window,
     78                                      const gfx::Rect& old_bounds,
     79                                      const gfx::Rect& new_bounds) {}
     80 
     81   // Invoked when SetTransform() is invoked on |window|.
     82   virtual void OnWindowTransforming(Window* window) {}
     83   virtual void OnWindowTransformed(Window* window) {}
     84 
     85   // Invoked when SetTransform() is invoked on an ancestor of the window being
     86   // observed (including the window itself).
     87   virtual void OnAncestorWindowTransformed(Window* source, Window* window) {}
     88 
     89   // Invoked when |window|'s position among its siblings in the stacking order
     90   // has changed.
     91   virtual void OnWindowStackingChanged(Window* window) {}
     92 
     93   // Invoked when a region of |window| has damage from a new delegated frame.
     94   virtual void OnDelegatedFrameDamage(Window* window,
     95                                       const gfx::Rect& damage_rect_in_dip) {}
     96 
     97   // Invoked when the Window is being destroyed (i.e. from the start of its
     98   // destructor). This is called before the window is removed from its parent.
     99   virtual void OnWindowDestroying(Window* window) {}
    100 
    101   // Invoked when the Window has been destroyed (i.e. at the end of
    102   // its destructor). This is called after the window is removed from
    103   // its parent.  Window automatically removes its WindowObservers
    104   // before calling this method, so the following code is no op.
    105   //
    106   // void MyWindowObserver::OnWindowDestroyed(aura::Window* window) {
    107   //    window->RemoveObserver(this);
    108   // }
    109   virtual void OnWindowDestroyed(Window* window) {}
    110 
    111   // Called when a Window has been added to a RootWindow.
    112   virtual void OnWindowAddedToRootWindow(Window* window) {}
    113 
    114   // Called when a Window is about to be removed from a root Window.
    115   // |new_root| contains the new root Window if it is being added to one
    116   // atomically.
    117   virtual void OnWindowRemovingFromRootWindow(Window* window,
    118                                               Window* new_root) {}
    119 
    120   // Called when the window title has changed.
    121   virtual void OnWindowTitleChanged(Window* window) {}
    122 
    123  protected:
    124   virtual ~WindowObserver();
    125 
    126  private:
    127   friend class Window;
    128 
    129   // Called when this is added as an observer on |window|.
    130   void OnObservingWindow(Window* window);
    131 
    132   // Called when this is removed from the observers on |window|.
    133   void OnUnobservingWindow(Window* window);
    134 
    135   // Tracks the number of windows being observed to track down
    136   // http://crbug.com/365364.
    137   int observing_;
    138 
    139   DISALLOW_COPY_AND_ASSIGN(WindowObserver);
    140 };
    141 
    142 }  // namespace aura
    143 
    144 #endif  // UI_AURA_WINDOW_OBSERVER_H_
    145