| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/views/ime/input_method_base.h" |
| |
| #include "base/logging.h" |
| #include "ui/base/ime/text_input_client.h" |
| #include "ui/events/event.h" |
| #include "ui/views/view.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace views { |
| |
| InputMethodBase::InputMethodBase() : delegate_(NULL), widget_(NULL) {} |
| |
| InputMethodBase::~InputMethodBase() { |
| DetachFromWidget(); |
| } |
| |
| void InputMethodBase::SetDelegate(internal::InputMethodDelegate* delegate) { |
| DCHECK(delegate); |
| delegate_ = delegate; |
| } |
| |
| void InputMethodBase::Init(Widget* widget) { |
| DCHECK(widget); |
| DCHECK(widget->GetFocusManager()); |
| DCHECK(!widget_) << "The input method is already initialized."; |
| |
| widget_ = widget; |
| // Alert the InputMethod of the Widget's currently focused view. |
| View* focused = widget->GetFocusManager()->GetFocusedView(); |
| if (focused) |
| OnWillChangeFocus(NULL, focused); |
| widget->GetFocusManager()->AddFocusChangeListener(this); |
| } |
| |
| views::View* InputMethodBase::GetFocusedView() const { |
| return widget_ ? widget_->GetFocusManager()->GetFocusedView() : NULL; |
| } |
| |
| void InputMethodBase::OnTextInputTypeChanged(View* view) {} |
| |
| ui::TextInputClient* InputMethodBase::GetTextInputClient() const { |
| return (widget_ && widget_->IsActive() && GetFocusedView()) ? |
| GetFocusedView()->GetTextInputClient() : NULL; |
| } |
| |
| ui::TextInputType InputMethodBase::GetTextInputType() const { |
| ui::TextInputClient* client = GetTextInputClient(); |
| return client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE; |
| } |
| |
| bool InputMethodBase::IsMock() const { |
| return false; |
| } |
| |
| void InputMethodBase::OnWillChangeFocus(View* focused_before, View* focused) {} |
| |
| void InputMethodBase::OnDidChangeFocus(View* focused_before, View* focused) {} |
| |
| bool InputMethodBase::IsViewFocused(View* view) const { |
| return widget_ && widget_->IsActive() && view && GetFocusedView() == view; |
| } |
| |
| bool InputMethodBase::IsTextInputTypeNone() const { |
| return GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE; |
| } |
| |
| void InputMethodBase::OnInputMethodChanged() const { |
| ui::TextInputClient* client = GetTextInputClient(); |
| if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) |
| client->OnInputMethodChanged(); |
| } |
| |
| void InputMethodBase::DispatchKeyEventPostIME(const ui::KeyEvent& key) const { |
| if (delegate_) |
| delegate_->DispatchKeyEventPostIME(key); |
| } |
| |
| bool InputMethodBase::GetCaretBoundsInWidget(gfx::Rect* rect) const { |
| DCHECK(rect); |
| ui::TextInputClient* client = GetTextInputClient(); |
| if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) |
| return false; |
| |
| gfx::Rect caret_bounds = client->GetCaretBounds(); |
| gfx::Point caret_origin = caret_bounds.origin(); |
| View::ConvertPointFromScreen(GetFocusedView(), &caret_origin); |
| caret_bounds.set_origin(caret_origin); |
| *rect = GetFocusedView()->ConvertRectToWidget(caret_bounds); |
| |
| // Convert coordinates if the focused view is inside a child Widget. |
| if (GetFocusedView()->GetWidget() != widget_) |
| return Widget::ConvertRect(GetFocusedView()->GetWidget(), widget_, rect); |
| return true; |
| } |
| |
| void InputMethodBase::DetachFromWidget() { |
| if (!widget_) |
| return; |
| |
| widget_->GetFocusManager()->RemoveFocusChangeListener(this); |
| widget_ = NULL; |
| } |
| |
| } // namespace views |