- add sources.
[platform/framework/web/crosswalk.git] / src / ash / touch / touch_observer_hud.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 "ash/touch/touch_observer_hud.h"
6
7 #include "ash/root_window_controller.h"
8 #include "ash/root_window_settings.h"
9 #include "ash/shell.h"
10 #include "ash/shell_window_ids.h"
11 #include "ui/aura/root_window.h"
12 #include "ui/gfx/display.h"
13 #include "ui/gfx/rect.h"
14 #include "ui/gfx/screen.h"
15 #include "ui/gfx/size.h"
16 #include "ui/views/widget/widget.h"
17
18 namespace ash {
19 namespace internal {
20
21 TouchObserverHUD::TouchObserverHUD(aura::RootWindow* initial_root)
22     : display_id_(GetRootWindowSettings(initial_root)->display_id),
23       root_window_(initial_root),
24       widget_(NULL) {
25   const gfx::Display& display =
26       Shell::GetInstance()->display_manager()->GetDisplayForId(display_id_);
27
28   views::View* content = new views::View;
29
30   const gfx::Size& display_size = display.size();
31   content->SetSize(display_size);
32
33   widget_ = new views::Widget();
34   views::Widget::InitParams
35       params(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
36   params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
37   params.can_activate = false;
38   params.accept_events = false;
39   params.bounds = display.bounds();
40   params.parent = Shell::GetContainer(
41       root_window_,
42       internal::kShellWindowId_OverlayContainer);
43   widget_->Init(params);
44   widget_->SetContentsView(content);
45   widget_->StackAtTop();
46   widget_->Show();
47
48   widget_->AddObserver(this);
49
50   // Observe changes in display size and mode to update touch HUD.
51   Shell::GetScreen()->AddObserver(this);
52 #if defined(OS_CHROMEOS)
53   Shell::GetInstance()->output_configurator()->AddObserver(this);
54 #endif  // defined(OS_CHROMEOS)
55
56   Shell::GetInstance()->display_controller()->AddObserver(this);
57   root_window_->AddPreTargetHandler(this);
58 }
59
60 TouchObserverHUD::~TouchObserverHUD() {
61   Shell::GetInstance()->display_controller()->RemoveObserver(this);
62
63 #if defined(OS_CHROMEOS)
64   Shell::GetInstance()->output_configurator()->RemoveObserver(this);
65 #endif  // defined(OS_CHROMEOS)
66   Shell::GetScreen()->RemoveObserver(this);
67
68   widget_->RemoveObserver(this);
69 }
70
71 void TouchObserverHUD::Clear() {
72 }
73
74 void TouchObserverHUD::Remove() {
75   root_window_->RemovePreTargetHandler(this);
76
77   RootWindowController* controller = GetRootWindowController(root_window_);
78   UnsetHudForRootWindowController(controller);
79
80   widget_->CloseNow();
81 }
82
83 void TouchObserverHUD::OnTouchEvent(ui::TouchEvent* /*event*/) {
84 }
85
86 void TouchObserverHUD::OnWidgetDestroying(views::Widget* widget) {
87   DCHECK_EQ(widget, widget_);
88   delete this;
89 }
90
91 void TouchObserverHUD::OnDisplayBoundsChanged(const gfx::Display& display) {
92   if (display.id() != display_id_)
93     return;
94   widget_->SetSize(display.size());
95 }
96
97 void TouchObserverHUD::OnDisplayAdded(const gfx::Display& new_display) {}
98
99 void TouchObserverHUD::OnDisplayRemoved(const gfx::Display& old_display) {
100   if (old_display.id() != display_id_)
101     return;
102   widget_->CloseNow();
103 }
104
105 #if defined(OS_CHROMEOS)
106 void TouchObserverHUD::OnDisplayModeChanged(
107     const std::vector<chromeos::OutputConfigurator::OutputSnapshot>& outputs) {
108   // Clear touch HUD for any change in display mode (single, dual extended, dual
109   // mirrored, ...).
110   Clear();
111 }
112 #endif  // defined(OS_CHROMEOS)
113
114 void TouchObserverHUD::OnDisplayConfigurationChanging() {
115   if (!root_window_)
116     return;
117
118   root_window_->RemovePreTargetHandler(this);
119
120   RootWindowController* controller = GetRootWindowController(root_window_);
121   UnsetHudForRootWindowController(controller);
122
123   views::Widget::ReparentNativeView(
124       widget_->GetNativeView(),
125       Shell::GetContainer(root_window_,
126                           internal::kShellWindowId_UnparentedControlContainer));
127
128   root_window_ = NULL;
129 }
130
131 void TouchObserverHUD::OnDisplayConfigurationChanged() {
132   if (root_window_)
133     return;
134
135   root_window_ = Shell::GetInstance()->display_controller()->
136       GetRootWindowForDisplayId(display_id_);
137
138   views::Widget::ReparentNativeView(
139       widget_->GetNativeView(),
140       Shell::GetContainer(root_window_,
141                           internal::kShellWindowId_OverlayContainer));
142
143   RootWindowController* controller = GetRootWindowController(root_window_);
144   SetHudForRootWindowController(controller);
145
146   root_window_->AddPreTargetHandler(this);
147 }
148
149 }  // namespace internal
150 }  // namespace ash