| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/base/ime/remote_input_method_win.h" | 5 #include "ui/base/ime/remote_input_method_win.h" |
| 6 | 6 |
| 7 #include "base/observer_list.h" | 7 #include "base/observer_list.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "base/win/metro.h" | 9 #include "base/win/metro.h" |
| 10 #include "base/win/scoped_handle.h" | 10 #include "base/win/scoped_handle.h" |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 return bounds; | 101 return bounds; |
| 102 } | 102 } |
| 103 | 103 |
| 104 class RemoteInputMethodWin : public InputMethod, | 104 class RemoteInputMethodWin : public InputMethod, |
| 105 public RemoteInputMethodPrivateWin { | 105 public RemoteInputMethodPrivateWin { |
| 106 public: | 106 public: |
| 107 explicit RemoteInputMethodWin(internal::InputMethodDelegate* delegate) | 107 explicit RemoteInputMethodWin(internal::InputMethodDelegate* delegate) |
| 108 : delegate_(delegate), | 108 : delegate_(delegate), |
| 109 remote_delegate_(NULL), | 109 remote_delegate_(NULL), |
| 110 text_input_client_(NULL), | 110 text_input_client_(NULL), |
| 111 current_input_type_(ui::TEXT_INPUT_TYPE_NONE), | |
| 112 current_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | |
| 113 is_candidate_popup_open_(false), | 111 is_candidate_popup_open_(false), |
| 114 is_ime_(false), | 112 is_ime_(false), |
| 115 langid_(kFallbackLangID) { | 113 langid_(kFallbackLangID) { |
| 116 RegisterInstance(this, this); | 114 RegisterInstance(this, this); |
| 117 } | 115 } |
| 118 | 116 |
| 119 virtual ~RemoteInputMethodWin() { | 117 virtual ~RemoteInputMethodWin() { |
| 120 FOR_EACH_OBSERVER(InputMethodObserver, | 118 FOR_EACH_OBSERVER(InputMethodObserver, |
| 121 observer_list_, | 119 observer_list_, |
| 122 OnInputMethodDestroyed(this)); | 120 OnInputMethodDestroyed(this)); |
| 123 UnregisterInstance(this); | 121 UnregisterInstance(this); |
| 124 } | 122 } |
| 125 | 123 |
| 126 private: | 124 private: |
| 127 // Overridden from InputMethod: | 125 // Overridden from InputMethod: |
| 128 virtual void SetDelegate(internal::InputMethodDelegate* delegate) OVERRIDE { | 126 virtual void SetDelegate(internal::InputMethodDelegate* delegate) OVERRIDE { |
| 129 delegate_ = delegate; | 127 delegate_ = delegate; |
| 130 } | 128 } |
| 131 | 129 |
| 132 virtual void Init(bool focused) OVERRIDE { | 130 virtual void Init(bool focused) OVERRIDE { |
| 133 if (focused) | |
| 134 OnFocus(); | |
| 135 } | 131 } |
| 136 | 132 |
| 137 virtual void OnFocus() OVERRIDE { | 133 virtual void OnFocus() OVERRIDE { |
| 138 FOR_EACH_OBSERVER(InputMethodObserver, | |
| 139 observer_list_, | |
| 140 OnFocus()); | |
| 141 } | 134 } |
| 142 | 135 |
| 143 virtual void OnBlur() OVERRIDE { | 136 virtual void OnBlur() OVERRIDE { |
| 144 FOR_EACH_OBSERVER(InputMethodObserver, | |
| 145 observer_list_, | |
| 146 OnBlur()); | |
| 147 } | 137 } |
| 148 | 138 |
| 149 virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event, | 139 virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event, |
| 150 NativeEventResult* result) OVERRIDE { | 140 NativeEventResult* result) OVERRIDE { |
| 151 return false; | 141 return false; |
| 152 } | 142 } |
| 153 | 143 |
| 154 virtual void SetFocusedTextInputClient(TextInputClient* client) OVERRIDE { | 144 virtual void SetFocusedTextInputClient(TextInputClient* client) OVERRIDE { |
| 155 std::vector<int32> prev_input_scopes; | 145 std::vector<int32> prev_input_scopes; |
| 156 std::swap(input_scopes_, prev_input_scopes); | 146 std::swap(input_scopes_, prev_input_scopes); |
| 157 std::vector<gfx::Rect> prev_bounds; | 147 std::vector<gfx::Rect> prev_bounds; |
| 158 std::swap(composition_character_bounds_, prev_bounds); | 148 std::swap(composition_character_bounds_, prev_bounds); |
| 159 if (client) { | 149 if (client) { |
| 160 input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), | 150 input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), |
| 161 client->GetTextInputMode()); | 151 client->GetTextInputMode()); |
| 162 composition_character_bounds_ = GetCompositionCharacterBounds(client); | 152 composition_character_bounds_ = GetCompositionCharacterBounds(client); |
| 163 current_input_type_ = client->GetTextInputType(); | |
| 164 current_input_mode_ = client->GetTextInputMode(); | |
| 165 } | 153 } |
| 166 | 154 |
| 167 const bool text_input_client_changed = text_input_client_ != client; | 155 const bool text_input_client_changed = text_input_client_ != client; |
| 168 text_input_client_ = client; | 156 text_input_client_ = client; |
| 169 if (text_input_client_changed) { | 157 if (text_input_client_changed) { |
| 170 FOR_EACH_OBSERVER(InputMethodObserver, | 158 FOR_EACH_OBSERVER(InputMethodObserver, |
| 171 observer_list_, | 159 observer_list_, |
| 172 OnTextInputStateChanged(client)); | 160 OnTextInputStateChanged(client)); |
| 173 } | 161 } |
| 174 | 162 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 if (!delegate_) | 200 if (!delegate_) |
| 213 return false; | 201 return false; |
| 214 return delegate_->DispatchFabricatedKeyEventPostIME(event.type(), | 202 return delegate_->DispatchFabricatedKeyEventPostIME(event.type(), |
| 215 event.key_code(), | 203 event.key_code(), |
| 216 event.flags()); | 204 event.flags()); |
| 217 } | 205 } |
| 218 | 206 |
| 219 virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE { | 207 virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE { |
| 220 if (!text_input_client_ || text_input_client_ != client) | 208 if (!text_input_client_ || text_input_client_ != client) |
| 221 return; | 209 return; |
| 222 const ui::TextInputType prev_type = current_input_type_; | |
| 223 const ui::TextInputMode prev_mode = current_input_mode_; | |
| 224 current_input_type_ = client->GetTextInputType(); | |
| 225 current_input_mode_ = client->GetTextInputMode(); | |
| 226 | |
| 227 std::vector<int32> prev_input_scopes; | 210 std::vector<int32> prev_input_scopes; |
| 228 std::swap(input_scopes_, prev_input_scopes); | 211 std::swap(input_scopes_, prev_input_scopes); |
| 229 input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), | 212 input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), |
| 230 client->GetTextInputMode()); | 213 client->GetTextInputMode()); |
| 231 if (input_scopes_ != prev_input_scopes && remote_delegate_) { | 214 if (input_scopes_ != prev_input_scopes && remote_delegate_) { |
| 232 remote_delegate_->OnTextInputClientUpdated( | 215 remote_delegate_->OnTextInputClientUpdated( |
| 233 input_scopes_, composition_character_bounds_); | 216 input_scopes_, composition_character_bounds_); |
| 234 } | 217 } |
| 235 if (current_input_type_ != prev_type || current_input_mode_ != prev_mode) { | |
| 236 FOR_EACH_OBSERVER(InputMethodObserver, | |
| 237 observer_list_, | |
| 238 OnTextInputTypeChanged(client)); | |
| 239 } | |
| 240 } | 218 } |
| 241 | 219 |
| 242 virtual void OnCaretBoundsChanged(const TextInputClient* client) OVERRIDE { | 220 virtual void OnCaretBoundsChanged(const TextInputClient* client) OVERRIDE { |
| 243 if (!text_input_client_ || text_input_client_ != client) | 221 if (!text_input_client_ || text_input_client_ != client) |
| 244 return; | 222 return; |
| 245 std::vector<gfx::Rect> prev_rects; | 223 std::vector<gfx::Rect> prev_rects; |
| 246 std::swap(composition_character_bounds_, prev_rects); | 224 std::swap(composition_character_bounds_, prev_rects); |
| 247 composition_character_bounds_ = GetCompositionCharacterBounds(client); | 225 composition_character_bounds_ = GetCompositionCharacterBounds(client); |
| 248 if (composition_character_bounds_ != prev_rects && remote_delegate_) { | 226 if (composition_character_bounds_ != prev_rects && remote_delegate_) { |
| 249 remote_delegate_->OnTextInputClientUpdated( | 227 remote_delegate_->OnTextInputClientUpdated( |
| 250 input_scopes_, composition_character_bounds_); | 228 input_scopes_, composition_character_bounds_); |
| 251 } | 229 } |
| 252 FOR_EACH_OBSERVER(InputMethodObserver, | |
| 253 observer_list_, | |
| 254 OnCaretBoundsChanged(client)); | |
| 255 } | 230 } |
| 256 | 231 |
| 257 virtual void CancelComposition(const TextInputClient* client) OVERRIDE { | 232 virtual void CancelComposition(const TextInputClient* client) OVERRIDE { |
| 258 if (CanSendRemoteNotification(client)) | 233 if (CanSendRemoteNotification(client)) |
| 259 remote_delegate_->CancelComposition(); | 234 remote_delegate_->CancelComposition(); |
| 260 } | 235 } |
| 261 | 236 |
| 262 virtual void OnInputLocaleChanged() OVERRIDE { | 237 virtual void OnInputLocaleChanged() OVERRIDE { |
| 263 } | 238 } |
| 264 | 239 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 text_input_client_ == text_input_client && | 345 text_input_client_ == text_input_client && |
| 371 remote_delegate_; | 346 remote_delegate_; |
| 372 } | 347 } |
| 373 | 348 |
| 374 ObserverList<InputMethodObserver> observer_list_; | 349 ObserverList<InputMethodObserver> observer_list_; |
| 375 | 350 |
| 376 internal::InputMethodDelegate* delegate_; | 351 internal::InputMethodDelegate* delegate_; |
| 377 internal::RemoteInputMethodDelegateWin* remote_delegate_; | 352 internal::RemoteInputMethodDelegateWin* remote_delegate_; |
| 378 | 353 |
| 379 TextInputClient* text_input_client_; | 354 TextInputClient* text_input_client_; |
| 380 ui::TextInputType current_input_type_; | |
| 381 ui::TextInputMode current_input_mode_; | |
| 382 std::vector<int32> input_scopes_; | 355 std::vector<int32> input_scopes_; |
| 383 std::vector<gfx::Rect> composition_character_bounds_; | 356 std::vector<gfx::Rect> composition_character_bounds_; |
| 384 bool is_candidate_popup_open_; | 357 bool is_candidate_popup_open_; |
| 385 bool is_ime_; | 358 bool is_ime_; |
| 386 LANGID langid_; | 359 LANGID langid_; |
| 387 | 360 |
| 388 DISALLOW_COPY_AND_ASSIGN(RemoteInputMethodWin); | 361 DISALLOW_COPY_AND_ASSIGN(RemoteInputMethodWin); |
| 389 }; | 362 }; |
| 390 | 363 |
| 391 } // namespace | 364 } // namespace |
| (...skipping 16 matching lines...) Expand all Loading... |
| 408 return scoped_ptr<InputMethod>(new RemoteInputMethodWin(delegate)); | 381 return scoped_ptr<InputMethod>(new RemoteInputMethodWin(delegate)); |
| 409 } | 382 } |
| 410 | 383 |
| 411 // static | 384 // static |
| 412 RemoteInputMethodPrivateWin* RemoteInputMethodPrivateWin::Get( | 385 RemoteInputMethodPrivateWin* RemoteInputMethodPrivateWin::Get( |
| 413 InputMethod* input_method) { | 386 InputMethod* input_method) { |
| 414 return GetPrivate(input_method); | 387 return GetPrivate(input_method); |
| 415 } | 388 } |
| 416 | 389 |
| 417 } // namespace ui | 390 } // namespace ui |
| OLD | NEW |