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/views/ime/input_method_base.h" 6 7 #include "base/logging.h" 8 #include "ui/base/ime/text_input_client.h" 9 #include "ui/events/event.h" 10 #include "ui/views/view.h" 11 #include "ui/views/widget/widget.h" 12 13 namespace views { 14 15 InputMethodBase::InputMethodBase() : delegate_(NULL), widget_(NULL) {} 16 17 InputMethodBase::~InputMethodBase() { 18 DetachFromWidget(); 19 } 20 21 void InputMethodBase::SetDelegate(internal::InputMethodDelegate* delegate) { 22 DCHECK(delegate); 23 delegate_ = delegate; 24 } 25 26 void InputMethodBase::Init(Widget* widget) { 27 DCHECK(widget); 28 DCHECK(widget->GetFocusManager()); 29 DCHECK(!widget_) << "The input method is already initialized."; 30 31 widget_ = widget; 32 // Alert the InputMethod of the Widget's currently focused view. 33 View* focused = widget->GetFocusManager()->GetFocusedView(); 34 if (focused) 35 OnWillChangeFocus(NULL, focused); 36 widget->GetFocusManager()->AddFocusChangeListener(this); 37 } 38 39 views::View* InputMethodBase::GetFocusedView() const { 40 return widget_ ? widget_->GetFocusManager()->GetFocusedView() : NULL; 41 } 42 43 void InputMethodBase::OnTextInputTypeChanged(View* view) {} 44 45 ui::TextInputClient* InputMethodBase::GetTextInputClient() const { 46 return (widget_ && widget_->IsActive() && GetFocusedView()) ? 47 GetFocusedView()->GetTextInputClient() : NULL; 48 } 49 50 ui::TextInputType InputMethodBase::GetTextInputType() const { 51 ui::TextInputClient* client = GetTextInputClient(); 52 return client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE; 53 } 54 55 bool InputMethodBase::IsMock() const { 56 return false; 57 } 58 59 void InputMethodBase::OnWillChangeFocus(View* focused_before, View* focused) {} 60 61 void InputMethodBase::OnDidChangeFocus(View* focused_before, View* focused) {} 62 63 bool InputMethodBase::IsViewFocused(View* view) const { 64 return widget_ && widget_->IsActive() && view && GetFocusedView() == view; 65 } 66 67 bool InputMethodBase::IsTextInputTypeNone() const { 68 return GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE; 69 } 70 71 void InputMethodBase::OnInputMethodChanged() const { 72 ui::TextInputClient* client = GetTextInputClient(); 73 if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) 74 client->OnInputMethodChanged(); 75 } 76 77 void InputMethodBase::DispatchKeyEventPostIME(const ui::KeyEvent& key) const { 78 if (delegate_) 79 delegate_->DispatchKeyEventPostIME(key); 80 } 81 82 bool InputMethodBase::GetCaretBoundsInWidget(gfx::Rect* rect) const { 83 DCHECK(rect); 84 ui::TextInputClient* client = GetTextInputClient(); 85 if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) 86 return false; 87 88 gfx::Rect caret_bounds = client->GetCaretBounds(); 89 gfx::Point caret_origin = caret_bounds.origin(); 90 View::ConvertPointFromScreen(GetFocusedView(), &caret_origin); 91 caret_bounds.set_origin(caret_origin); 92 *rect = GetFocusedView()->ConvertRectToWidget(caret_bounds); 93 94 // Convert coordinates if the focused view is inside a child Widget. 95 if (GetFocusedView()->GetWidget() != widget_) 96 return Widget::ConvertRect(GetFocusedView()->GetWidget(), widget_, rect); 97 return true; 98 } 99 100 void InputMethodBase::DetachFromWidget() { 101 if (!widget_) 102 return; 103 104 widget_->GetFocusManager()->RemoveFocusChangeListener(this); 105 widget_ = NULL; 106 } 107 108 } // namespace views 109