Index: trunk/src/ui/views/ime/input_method_bridge.cc |
=================================================================== |
--- trunk/src/ui/views/ime/input_method_bridge.cc (revision 220120) |
+++ trunk/src/ui/views/ime/input_method_bridge.cc (working copy) |
@@ -6,7 +6,9 @@ |
#include "ui/base/events/event.h" |
#include "ui/base/ime/input_method.h" |
-#include "ui/base/ime/text_input_client.h" |
+#include "ui/gfx/rect.h" |
+#include "ui/views/view.h" |
+#include "ui/views/widget/widget.h" |
namespace views { |
@@ -27,8 +29,31 @@ |
// this and go into |widget_|. NULL out |widget_| so we don't attempt to use |
// it. |
DetachFromWidget(); |
+ if (host_->GetTextInputClient() == this) |
+ host_->SetFocusedTextInputClient(NULL); |
} |
+void InputMethodBridge::OnFocus() { |
+ // Direct the shared IME to send TextInputClient messages to |this| object. |
+ if (shared_input_method_ || !host_->GetTextInputClient()) |
+ host_->SetFocusedTextInputClient(this); |
+ |
+ // TODO(yusukes): We don't need to call OnTextInputTypeChanged() once we move |
+ // text input type tracker code to ui::InputMethodBase. |
+ if (GetFocusedView()) |
+ OnTextInputTypeChanged(GetFocusedView()); |
+} |
+ |
+void InputMethodBridge::OnBlur() { |
+ if (HasCompositionText()) { |
+ ConfirmCompositionText(); |
+ host_->CancelComposition(this); |
+ } |
+ |
+ if (host_->GetTextInputClient() == this) |
+ host_->SetFocusedTextInputClient(NULL); |
+} |
+ |
bool InputMethodBridge::OnUntranslatedIMEMessage(const base::NativeEvent& event, |
NativeEventResult* result) { |
return host_->OnUntranslatedIMEMessage(event, result); |
@@ -44,17 +69,18 @@ |
void InputMethodBridge::OnTextInputTypeChanged(View* view) { |
if (IsViewFocused(view)) |
- host_->OnTextInputTypeChanged(GetTextInputClient()); |
+ host_->OnTextInputTypeChanged(this); |
+ InputMethodBase::OnTextInputTypeChanged(view); |
} |
void InputMethodBridge::OnCaretBoundsChanged(View* view) { |
if (IsViewFocused(view) && !IsTextInputTypeNone()) |
- host_->OnCaretBoundsChanged(GetTextInputClient()); |
+ host_->OnCaretBoundsChanged(this); |
} |
void InputMethodBridge::CancelComposition(View* view) { |
if (IsViewFocused(view)) |
- host_->CancelComposition(GetTextInputClient()); |
+ host_->CancelComposition(this); |
} |
void InputMethodBridge::OnInputLocaleChanged() { |
@@ -77,16 +103,149 @@ |
return host_->IsCandidatePopupOpen(); |
} |
+// Overridden from TextInputClient. Forward an event from the system-wide IME |
+// to the text input |client|, which is e.g. views::NativeTextfieldViews. |
+void InputMethodBridge::SetCompositionText( |
+ const ui::CompositionText& composition) { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->SetCompositionText(composition); |
+} |
+ |
+void InputMethodBridge::ConfirmCompositionText() { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->ConfirmCompositionText(); |
+} |
+ |
+void InputMethodBridge::ClearCompositionText() { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->ClearCompositionText(); |
+} |
+ |
+void InputMethodBridge::InsertText(const string16& text) { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->InsertText(text); |
+} |
+ |
+void InputMethodBridge::InsertChar(char16 ch, int flags) { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->InsertChar(ch, flags); |
+} |
+ |
+gfx::NativeWindow InputMethodBridge::GetAttachedWindow() const { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? |
+ client->GetAttachedWindow() : static_cast<gfx::NativeWindow>(NULL); |
+} |
+ |
+ui::TextInputType InputMethodBridge::GetTextInputType() const { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE; |
+} |
+ |
+ui::TextInputMode InputMethodBridge::GetTextInputMode() const { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->GetTextInputMode() : ui::TEXT_INPUT_MODE_DEFAULT; |
+} |
+ |
+bool InputMethodBridge::CanComposeInline() const { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->CanComposeInline() : true; |
+} |
+ |
+gfx::Rect InputMethodBridge::GetCaretBounds() { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (!client) |
+ return gfx::Rect(); |
+ |
+ return client->GetCaretBounds(); |
+} |
+ |
+bool InputMethodBridge::GetCompositionCharacterBounds(uint32 index, |
+ gfx::Rect* rect) { |
+ DCHECK(rect); |
+ TextInputClient* client = GetTextInputClient(); |
+ if (!client) |
+ return false; |
+ |
+ return client->GetCompositionCharacterBounds(index, rect); |
+} |
+ |
+bool InputMethodBridge::HasCompositionText() { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->HasCompositionText() : false; |
+} |
+ |
+bool InputMethodBridge::GetTextRange(ui::Range* range) { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->GetTextRange(range) : false; |
+} |
+ |
+bool InputMethodBridge::GetCompositionTextRange(ui::Range* range) { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->GetCompositionTextRange(range) : false; |
+} |
+ |
+bool InputMethodBridge::GetSelectionRange(ui::Range* range) { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->GetSelectionRange(range) : false; |
+} |
+ |
+bool InputMethodBridge::SetSelectionRange(const ui::Range& range) { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->SetSelectionRange(range) : false; |
+} |
+ |
+bool InputMethodBridge::DeleteRange(const ui::Range& range) { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->DeleteRange(range) : false; |
+} |
+ |
+bool InputMethodBridge::GetTextFromRange( |
+ const ui::Range& range, string16* text) { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? client->GetTextFromRange(range, text) : false; |
+} |
+ |
+void InputMethodBridge::OnInputMethodChanged() { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->OnInputMethodChanged(); |
+} |
+ |
+bool InputMethodBridge::ChangeTextDirectionAndLayoutAlignment( |
+ base::i18n::TextDirection direction) { |
+ TextInputClient* client = GetTextInputClient(); |
+ return client ? |
+ client->ChangeTextDirectionAndLayoutAlignment(direction) : false; |
+} |
+ |
+void InputMethodBridge::ExtendSelectionAndDelete(size_t before, size_t after) { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->ExtendSelectionAndDelete(before, after); |
+} |
+ |
+void InputMethodBridge::EnsureCaretInRect(const gfx::Rect& rect) { |
+ TextInputClient* client = GetTextInputClient(); |
+ if (client) |
+ client->EnsureCaretInRect(rect); |
+} |
+ |
+// Overridden from FocusChangeListener. |
void InputMethodBridge::OnWillChangeFocus(View* focused_before, View* focused) { |
- if (GetTextInputClient() && GetTextInputClient()->HasCompositionText()) { |
- GetTextInputClient()->ConfirmCompositionText(); |
+ if (HasCompositionText()) { |
+ ConfirmCompositionText(); |
CancelComposition(focused_before); |
} |
} |
void InputMethodBridge::OnDidChangeFocus(View* focused_before, View* focused) { |
DCHECK_EQ(GetFocusedView(), focused); |
- host_->SetFocusedTextInputClient(GetTextInputClient()); |
OnTextInputTypeChanged(focused); |
OnCaretBoundsChanged(focused); |
} |