Home | History | Annotate | Download | only in menu
      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 #include "ui/aura/window.h"
      6 #include "ui/aura/window_observer.h"
      7 #include "ui/views/controls/menu/menu_runner.h"
      8 #include "ui/views/widget/widget.h"
      9 
     10 namespace views {
     11 namespace internal {
     12 
     13 // DisplayChangeListener implementation for aura. Cancels the menu any time the
     14 // root window bounds change.
     15 class AuraDisplayChangeListener
     16     : public DisplayChangeListener,
     17       public aura::WindowObserver {
     18  public:
     19   AuraDisplayChangeListener(Widget* widget, MenuRunner* menu_runner);
     20   virtual ~AuraDisplayChangeListener();
     21 
     22   // aura::WindowObserver overrides:
     23   virtual void OnWindowBoundsChanged(aura::Window* window,
     24                                      const gfx::Rect& old_bounds,
     25                                      const gfx::Rect& new_bounds) OVERRIDE;
     26   virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
     27 
     28  private:
     29   MenuRunner* menu_runner_;
     30   aura::Window* root_window_;
     31 
     32   DISALLOW_COPY_AND_ASSIGN(AuraDisplayChangeListener);
     33 };
     34 
     35 AuraDisplayChangeListener::AuraDisplayChangeListener(Widget* widget,
     36                                                      MenuRunner* menu_runner)
     37     : menu_runner_(menu_runner),
     38       root_window_(widget->GetNativeView()->GetRootWindow()) {
     39   if (root_window_)
     40     root_window_->AddObserver(this);
     41 }
     42 
     43 AuraDisplayChangeListener::~AuraDisplayChangeListener() {
     44   if (root_window_)
     45     root_window_->RemoveObserver(this);
     46 }
     47 
     48 void AuraDisplayChangeListener::OnWindowBoundsChanged(
     49     aura::Window* window,
     50     const gfx::Rect& old_bounds,
     51     const gfx::Rect& new_bounds) {
     52   menu_runner_->Cancel();
     53 }
     54 
     55 void AuraDisplayChangeListener::OnWindowDestroying(aura::Window* window) {
     56   DCHECK_EQ(window, root_window_);
     57   root_window_->RemoveObserver(this);
     58   root_window_ = NULL;
     59 }
     60 
     61 // static
     62 DisplayChangeListener* DisplayChangeListener::Create(Widget* widget,
     63                                                      MenuRunner* runner) {
     64   return new AuraDisplayChangeListener(widget, runner);
     65 }
     66 
     67 }  // namespace internal
     68 }  // namespace views
     69