Chromium Code Reviews| Index: ui/keyboard/keyboard_controller.cc |
| diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc |
| index cdecdc36dfb5971d10b4bd14bd2cf23e53284acb..fc4af8f7543a1a92fea1b4f0d5bf107524d7c673 100644 |
| --- a/ui/keyboard/keyboard_controller.cc |
| +++ b/ui/keyboard/keyboard_controller.cc |
| @@ -9,7 +9,6 @@ |
| #include "ui/aura/window_delegate.h" |
| #include "ui/base/hit_test.h" |
| #include "ui/base/ime/input_method.h" |
| -#include "ui/base/ime/input_method_base.h" |
| #include "ui/base/ime/text_input_client.h" |
| #include "ui/base/ime/text_input_type.h" |
| #include "ui/gfx/path.h" |
| @@ -28,38 +27,6 @@ gfx::Rect KeyboardBoundsFromWindowBounds(const gfx::Rect& window_bounds) { |
| window_bounds.height() * kKeyboardHeightRatio); |
| } |
| -// LayoutManager for the virtual keyboard container. Manages a single window |
| -// (the virtual keyboard) and keeps it positioned at the bottom of the |
| -// container window. |
| -class KeyboardLayoutManager : public aura::LayoutManager { |
| - public: |
| - KeyboardLayoutManager(aura::Window* owner, aura::Window* keyboard) |
| - : owner_(owner), keyboard_(keyboard) {} |
| - |
| - // Overridden from aura::LayoutManager |
| - virtual void OnWindowResized() OVERRIDE { |
| - SetChildBoundsDirect(keyboard_, |
| - KeyboardBoundsFromWindowBounds(owner_->bounds())); |
| - } |
| - virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE { |
| - CHECK(child == keyboard_); |
| - } |
| - virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {} |
| - virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE {} |
| - virtual void OnChildWindowVisibilityChanged(aura::Window* child, |
| - bool visible) OVERRIDE {} |
| - virtual void SetChildBounds(aura::Window* child, |
| - const gfx::Rect& requested_bounds) OVERRIDE { |
| - // Drop these: the size should only be set in OnWindowResized. |
| - } |
| - |
| - private: |
| - aura::Window* owner_; |
| - aura::Window* keyboard_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(KeyboardLayoutManager); |
| -}; |
| - |
| // The KeyboardWindowDelegate makes sure the keyboard-window does not get focus. |
| // This is necessary to make sure that the synthetic key-events reach the target |
| // window. |
| @@ -110,47 +77,97 @@ class KeyboardWindowDelegate : public aura::WindowDelegate { |
| namespace keyboard { |
| +// LayoutManager for the virtual keyboard container. Manages a single window |
| +// (the virtual keyboard) and keeps it positioned at the bottom of the |
| +// owner window. |
| +class KeyboardLayoutManager : public aura::LayoutManager { |
| + public: |
| + KeyboardLayoutManager(aura::Window* owner) : owner_(owner), keyboard_(NULL) { |
| + CHECK(owner_); |
| + } |
| + |
| + aura::Window* owner() { return owner_; } |
| + |
| + void AddKeyboard(aura::Window* keyboard) { |
| + keyboard->Show(); |
| + owner_->AddChild(keyboard); |
| + OnWindowResized(); |
| + } |
| + |
| + bool HasKeyboard() { return keyboard_ != NULL; } |
| + |
| + void ShowKeyboard() { |
| + owner_->parent()->StackChildAtTop(owner_); |
| + owner_->Show(); |
| + } |
| + |
| + void HideKeyboard() { |
| + owner_->Hide(); |
| + } |
| + |
| + // Overridden from aura::LayoutManager |
| + virtual void OnWindowResized() OVERRIDE { |
| + if (!keyboard_) |
| + return; |
| + SetChildBoundsDirect(keyboard_, |
| + KeyboardBoundsFromWindowBounds(owner_->bounds())); |
| + } |
| + virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE { |
| + DCHECK(!keyboard_); |
| + keyboard_ = child; |
| + } |
| + virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {} |
| + virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE {} |
| + virtual void OnChildWindowVisibilityChanged(aura::Window* child, |
| + bool visible) OVERRIDE {} |
| + virtual void SetChildBounds(aura::Window* child, |
| + const gfx::Rect& requested_bounds) OVERRIDE { |
| + // Drop these: the size should only be set in OnWindowResized. |
| + } |
| + |
| + private: |
| + aura::Window* owner_; |
| + aura::Window* keyboard_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(KeyboardLayoutManager); |
| +}; |
| + |
| KeyboardController::KeyboardController(KeyboardControllerProxy* proxy) |
| - : proxy_(proxy), container_(NULL) { |
| + : proxy_(proxy), layout_manager_(NULL), input_method_(NULL) { |
| CHECK(proxy); |
| - proxy_->GetInputMethod()->AddObserver(this); |
| + input_method_ = proxy_->GetInputMethod(); |
| + input_method_->AddObserver(this); |
|
sadrul
2013/04/15 03:48:44
I don't think having |input_method_| is useful her
bryeung
2013/04/15 15:02:22
Fetching the InputMethod from the Window propertie
|
| } |
| KeyboardController::~KeyboardController() { |
| - if (container_) |
| - container_->RemoveObserver(this); |
| - proxy_->GetInputMethod()->RemoveObserver(this); |
| + input_method_->RemoveObserver(this); |
| } |
| aura::Window* KeyboardController::GetContainerWindow() { |
| - if (!container_) { |
| - container_ = new aura::Window(new KeyboardWindowDelegate()); |
| - container_->SetName("KeyboardContainer"); |
| - container_->Init(ui::LAYER_NOT_DRAWN); |
| - container_->AddObserver(this); |
| - |
| - aura::Window* keyboard = proxy_->GetKeyboardWindow(); |
| - keyboard->Show(); |
| - |
| - container_->SetLayoutManager( |
| - new KeyboardLayoutManager(container_, keyboard)); |
| - container_->AddChild(keyboard); |
| + if (!layout_manager_) { |
| + aura::Window* container = new aura::Window(new KeyboardWindowDelegate()); |
| + container->SetName("KeyboardContainer"); |
| + container->Init(ui::LAYER_NOT_DRAWN); |
| + container->AddObserver(this); |
| + |
| + layout_manager_ = new KeyboardLayoutManager(container); |
| + container->SetLayoutManager(layout_manager_); |
| } |
| - return container_; |
| + return layout_manager_->owner(); |
|
sadrul
2013/04/15 03:48:44
I think having the |container_| in the KC is easie
bryeung
2013/04/15 15:02:22
Okay. I didn't like having two different referenc
|
| } |
| void KeyboardController::OnTextInputStateChanged( |
| const ui::TextInputClient* client) { |
| - if (!container_) |
| + if (!layout_manager_) |
| return; |
| if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) { |
| - container_->Hide(); |
| + layout_manager_->HideKeyboard(); |
| } else { |
| - container_->parent()->StackChildAtTop(container_); |
|
sadrul
2013/04/15 03:48:44
Could you have just checked that container_->child
bryeung
2013/04/15 15:02:22
Done.
|
| - container_->Show(); |
| + if (!layout_manager_->HasKeyboard()) |
| + layout_manager_->AddKeyboard(proxy_->GetKeyboardWindow()); |
| + layout_manager_->ShowKeyboard(); |
| } |
| - |
| // TODO(bryeung): whenever the TextInputClient changes we need to notify the |
| // keyboard (with the TextInputType) so that it can reset it's state (e.g. |
| // abandon compositions in progress) |
| @@ -162,8 +179,9 @@ void KeyboardController::OnWindowParentChanged(aura::Window* window, |
| } |
| void KeyboardController::OnWindowDestroying(aura::Window* window) { |
| - DCHECK_EQ(container_, window); |
| - container_ = NULL; |
| + DCHECK(layout_manager_); |
| + DCHECK_EQ(layout_manager_->owner(), window); |
| + layout_manager_->owner()->RemoveObserver(this); |
| } |
| } // namespace keyboard |