Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ash / display / virtual_keyboard_window_controller.cc
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 #include "ash/display/virtual_keyboard_window_controller.h"
6
7 #include "ash/display/display_controller.h"
8 #include "ash/display/display_info.h"
9 #include "ash/display/display_manager.h"
10 #include "ash/display/root_window_transformers.h"
11 #include "ash/host/ash_window_tree_host.h"
12 #include "ash/host/root_window_transformer.h"
13 #include "ash/root_window_controller.h"
14 #include "ash/root_window_settings.h"
15 #include "ash/shell.h"
16 #include "ash/shell_window_ids.h"
17 #include "base/strings/stringprintf.h"
18 #include "base/strings/utf_string_conversions.h"
19 #include "ui/aura/env.h"
20 #include "ui/aura/window_event_dispatcher.h"
21 #include "ui/keyboard/keyboard_controller.h"
22 #include "ui/keyboard/keyboard_util.h"
23
24 namespace ash {
25
26 VirtualKeyboardWindowController::VirtualKeyboardWindowController() {
27   Shell::GetInstance()->AddShellObserver(this);
28 }
29
30 VirtualKeyboardWindowController::~VirtualKeyboardWindowController() {
31   Shell::GetInstance()->RemoveShellObserver(this);
32   // Make sure the root window gets deleted before cursor_window_delegate.
33   Close();
34 }
35
36 void VirtualKeyboardWindowController::ActivateKeyboard(
37     keyboard::KeyboardController* keyboard_controller) {
38   root_window_controller_->ActivateKeyboard(keyboard_controller);
39 }
40
41 void VirtualKeyboardWindowController::UpdateWindow(
42     const DisplayInfo& display_info) {
43   static int virtual_keyboard_host_count = 0;
44   if (!root_window_controller_.get()) {
45     const gfx::Rect& bounds_in_native = display_info.bounds_in_native();
46     AshWindowTreeHost* ash_host = AshWindowTreeHost::Create(bounds_in_native);
47     aura::WindowTreeHost* host = ash_host->AsWindowTreeHost();
48
49     host->window()->SetName(base::StringPrintf("VirtualKeyboardRootWindow-%d",
50                                                virtual_keyboard_host_count++));
51
52     // No need to remove WindowTreeHostObserver because the DisplayController
53     // outlives the host.
54     host->AddObserver(Shell::GetInstance()->display_controller());
55     InitRootWindowSettings(host->window())->display_id = display_info.id();
56     host->InitHost();
57     RootWindowController::CreateForVirtualKeyboardDisplay(ash_host);
58     root_window_controller_.reset(GetRootWindowController(host->window()));
59     root_window_controller_->GetHost()->Show();
60     root_window_controller_->ActivateKeyboard(
61         keyboard::KeyboardController::GetInstance());
62     FlipDisplay();
63   } else {
64     aura::WindowTreeHost* host = root_window_controller_->GetHost();
65     GetRootWindowSettings(host->window())->display_id = display_info.id();
66     host->SetBounds(display_info.bounds_in_native());
67   }
68 }
69
70 void VirtualKeyboardWindowController::Close() {
71   if (root_window_controller_.get()) {
72     root_window_controller_->GetHost()->RemoveObserver(
73         Shell::GetInstance()->display_controller());
74     root_window_controller_->Shutdown();
75     root_window_controller_.reset();
76   }
77 }
78
79 void VirtualKeyboardWindowController::FlipDisplay() {
80   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
81   if (!display_manager->virtual_keyboard_root_window_enabled()) {
82     NOTREACHED() << "Attempting to flip virtual keyboard root window when it "
83                  << "is not enabled.";
84     return;
85   }
86   display_manager->SetDisplayRotation(
87       display_manager->non_desktop_display().id(), gfx::Display::ROTATE_180);
88
89   aura::WindowTreeHost* host = root_window_controller_->GetHost();
90   scoped_ptr<RootWindowTransformer> transformer(
91       CreateRootWindowTransformerForDisplay(
92           host->window(), display_manager->non_desktop_display()));
93   root_window_controller_->ash_host()->SetRootWindowTransformer(
94       transformer.Pass());
95 }
96
97 void VirtualKeyboardWindowController::OnMaximizeModeStarted() {
98   keyboard::SetTouchKeyboardEnabled(true);
99   Shell::GetInstance()->CreateKeyboard();
100 }
101
102 void VirtualKeyboardWindowController::OnMaximizeModeEnded() {
103   keyboard::SetTouchKeyboardEnabled(false);
104   if (!keyboard::IsKeyboardEnabled())
105     Shell::GetInstance()->DeactivateKeyboard();
106 }
107
108 }  // namespace ash