Index: ui/base/ime/remote_input_method_win.cc |
diff --git a/ui/base/ime/remote_input_method_win.cc b/ui/base/ime/remote_input_method_win.cc |
index 5a3aa01ce56c2d60fe1e3b6ba23df5fc2fcf6f54..3f0ff991e9e5906f5caf1284e8783849cb81ad86 100644 |
--- a/ui/base/ime/remote_input_method_win.cc |
+++ b/ui/base/ime/remote_input_method_win.cc |
@@ -4,9 +4,11 @@ |
#include "ui/base/ime/remote_input_method_win.h" |
+#include "base/observer_list.h" |
#include "base/strings/utf_string_conversions.h" |
#include "ui/base/ime/input_method.h" |
#include "ui/base/ime/input_method_delegate.h" |
+#include "ui/base/ime/input_method_observer.h" |
#include "ui/base/ime/remote_input_method_delegate_win.h" |
#include "ui/base/ime/text_input_client.h" |
#include "ui/base/ime/win/tsf_input_scope.h" |
@@ -104,6 +106,8 @@ class RemoteInputMethodWin : public InputMethod, |
: delegate_(delegate), |
remote_delegate_(NULL), |
text_input_client_(NULL), |
+ current_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
+ current_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
is_candidate_popup_open_(false), |
is_ime_(false), |
langid_(kFallbackLangID) { |
@@ -111,6 +115,9 @@ class RemoteInputMethodWin : public InputMethod, |
} |
virtual ~RemoteInputMethodWin() { |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnInputMethodDestroyed(this)); |
UnregisterInstance(this); |
} |
@@ -120,14 +127,28 @@ class RemoteInputMethodWin : public InputMethod, |
delegate_ = delegate; |
} |
- virtual void Init(bool focused) OVERRIDE {} |
+ virtual void Init(bool focused) OVERRIDE { |
+ if (focused) |
+ OnFocus(); |
+ } |
- virtual void OnFocus() OVERRIDE {} |
+ virtual void OnFocus() OVERRIDE { |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnFocus()); |
+ } |
- virtual void OnBlur() OVERRIDE {} |
+ virtual void OnBlur() OVERRIDE { |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnBlur()); |
+ } |
virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event, |
NativeEventResult* result) OVERRIDE { |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnUntranslatedIMEMessage(event)); |
return false; |
} |
@@ -140,9 +161,17 @@ class RemoteInputMethodWin : public InputMethod, |
input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), |
client->GetTextInputMode()); |
composition_character_bounds_ = GetCompositionCharacterBounds(client); |
+ current_input_type_ = client->GetTextInputType(); |
+ current_input_mode_ = client->GetTextInputMode(); |
} |
+ const bool text_input_client_changed = text_input_client_ != client; |
text_input_client_ = client; |
+ if (text_input_client_changed) { |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnTextInputStateChanged(client)); |
+ } |
if (!remote_delegate_ || (prev_input_scopes == input_scopes_ && |
prev_bounds == composition_character_bounds_)) |
@@ -191,6 +220,11 @@ class RemoteInputMethodWin : public InputMethod, |
virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE { |
if (!text_input_client_ || text_input_client_ != client) |
return; |
+ const ui::TextInputType prev_type = current_input_type_; |
+ const ui::TextInputMode prev_mode = current_input_mode_; |
+ current_input_type_ = client->GetTextInputType(); |
+ current_input_mode_ = client->GetTextInputMode(); |
+ |
std::vector<int32> prev_input_scopes; |
std::swap(input_scopes_, prev_input_scopes); |
input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), |
@@ -199,6 +233,11 @@ class RemoteInputMethodWin : public InputMethod, |
remote_delegate_->OnTextInputClientUpdated( |
input_scopes_, composition_character_bounds_); |
} |
+ if (current_input_type_ != prev_type || current_input_mode_ != prev_mode) { |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnTextInputTypeChanged(client)); |
+ } |
} |
virtual void OnCaretBoundsChanged(const TextInputClient* client) OVERRIDE { |
@@ -211,6 +250,9 @@ class RemoteInputMethodWin : public InputMethod, |
remote_delegate_->OnTextInputClientUpdated( |
input_scopes_, composition_character_bounds_); |
} |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnCaretBoundsChanged(client)); |
} |
virtual void CancelComposition(const TextInputClient* client) OVERRIDE { |
@@ -219,7 +261,9 @@ class RemoteInputMethodWin : public InputMethod, |
} |
virtual void OnInputLocaleChanged() OVERRIDE { |
- // not supported. |
+ FOR_EACH_OBSERVER(InputMethodObserver, |
+ observer_list_, |
+ OnInputLocaleChanged()); |
} |
virtual std::string GetInputLocale() OVERRIDE { |
@@ -272,13 +316,11 @@ class RemoteInputMethodWin : public InputMethod, |
} |
virtual void AddObserver(InputMethodObserver* observer) OVERRIDE { |
- // not supported. |
- NOTREACHED(); |
+ observer_list_.AddObserver(observer); |
} |
virtual void RemoveObserver(InputMethodObserver* observer) OVERRIDE { |
- // not supported. |
- NOTREACHED(); |
+ observer_list_.RemoveObserver(observer); |
} |
// Overridden from RemoteInputMethodPrivateWin: |
@@ -312,10 +354,14 @@ class RemoteInputMethodWin : public InputMethod, |
remote_delegate_; |
} |
+ ObserverList<InputMethodObserver> observer_list_; |
+ |
internal::InputMethodDelegate* delegate_; |
internal::RemoteInputMethodDelegateWin* remote_delegate_; |
TextInputClient* text_input_client_; |
+ ui::TextInputType current_input_type_; |
+ ui::TextInputMode current_input_mode_; |
std::vector<int32> input_scopes_; |
std::vector<gfx::Rect> composition_character_bounds_; |
bool is_candidate_popup_open_; |
@@ -329,7 +375,6 @@ class RemoteInputMethodWin : public InputMethod, |
RemoteInputMethodPrivateWin::RemoteInputMethodPrivateWin() {} |
-// static |
scoped_ptr<InputMethod> CreateRemoteInputMethodWin( |
internal::InputMethodDelegate* delegate) { |
return scoped_ptr<InputMethod>(new RemoteInputMethodWin(delegate)); |