Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / views / controls / menu / display_change_listener_aura.cc
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   ~AuraDisplayChangeListener() override;
21
22   // aura::WindowObserver overrides:
23   void OnWindowBoundsChanged(aura::Window* window,
24                              const gfx::Rect& old_bounds,
25                              const gfx::Rect& new_bounds) override;
26   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