// Copyright 2014 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. #ifndef UI_BASE_IME_INPUT_METHOD_CHROMEOS_H_ #define UI_BASE_IME_INPUT_METHOD_CHROMEOS_H_ #include <set> #include <string> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "ui/base/ime/chromeos/character_composer.h" #include "ui/base/ime/chromeos/ime_bridge.h" #include "ui/base/ime/composition_text.h" #include "ui/base/ime/input_method_base.h" namespace ui { // A ui::InputMethod implementation based on IBus. class UI_BASE_EXPORT InputMethodChromeOS : public InputMethodBase, public chromeos::IMEInputContextHandlerInterface { public: explicit InputMethodChromeOS(internal::InputMethodDelegate* delegate); virtual ~InputMethodChromeOS(); // Overridden from InputMethod: virtual void OnFocus() OVERRIDE; virtual void OnBlur() OVERRIDE; virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event, NativeEventResult* result) OVERRIDE; virtual bool DispatchKeyEvent(const ui::KeyEvent& event) OVERRIDE; virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE; virtual void OnCaretBoundsChanged(const TextInputClient* client) OVERRIDE; virtual void CancelComposition(const TextInputClient* client) OVERRIDE; virtual void OnInputLocaleChanged() OVERRIDE; virtual std::string GetInputLocale() OVERRIDE; virtual bool IsActive() OVERRIDE; virtual bool IsCandidatePopupOpen() const OVERRIDE; protected: // Converts |text| into CompositionText. void ExtractCompositionText(const chromeos::CompositionText& text, uint32 cursor_position, CompositionText* out_composition) const; // Process a key returned from the input method. virtual void ProcessKeyEventPostIME(const ui::KeyEvent& event, bool handled); // Resets context and abandon all pending results and key events. void ResetContext(); private: class PendingKeyEvent; // Overridden from InputMethodBase: virtual void OnWillChangeFocusedClient(TextInputClient* focused_before, TextInputClient* focused) OVERRIDE; virtual void OnDidChangeFocusedClient(TextInputClient* focused_before, TextInputClient* focused) OVERRIDE; // Asks the client to confirm current composition text. void ConfirmCompositionText(); // Checks the availability of focused text input client and update focus // state. void UpdateContextFocusState(); // Processes a key event that was already filtered by the input method. // A VKEY_PROCESSKEY may be dispatched to the focused View. void ProcessFilteredKeyPressEvent(const ui::KeyEvent& event); // Processes a key event that was not filtered by the input method. void ProcessUnfilteredKeyPressEvent(const ui::KeyEvent& event); // Sends input method result caused by the given key event to the focused text // input client. void ProcessInputMethodResult(const ui::KeyEvent& event, bool filtered); // Checks if the pending input method result needs inserting into the focused // text input client as a single character. bool NeedInsertChar() const; // Checks if there is pending input method result. bool HasInputMethodResult() const; // Sends a fake key event for IME composing without physical key events. void SendFakeProcessKeyEvent(bool pressed) const; // Abandons all pending key events. It usually happends when we lose keyboard // focus, the text input type is changed or we are destroyed. void AbandonAllPendingKeyEvents(); // Passes keyevent and executes character composition if necessary. Returns // true if character composer comsumes key event. bool ExecuteCharacterComposer(const ui::KeyEvent& event); // chromeos::IMEInputContextHandlerInterface overrides: virtual void CommitText(const std::string& text) OVERRIDE; virtual void UpdateCompositionText(const chromeos::CompositionText& text, uint32 cursor_pos, bool visible) OVERRIDE; virtual void DeleteSurroundingText(int32 offset, uint32 length) OVERRIDE; // Hides the composition text. void HidePreeditText(); // Callback function for IMEEngineHandlerInterface::ProcessKeyEvent. void ProcessKeyEventDone(uint32 id, ui::KeyEvent* event, bool is_handled); // Returns whether an input field is focused. Note that password field is not // considered as an input field. bool IsInputFieldFocused(); // All pending key events. Note: we do not own these object, we just save // pointers to these object so that we can abandon them when necessary. // They will be deleted in ProcessKeyEventDone(). std::set<uint32> pending_key_events_; // Pending composition text generated by the current pending key event. // It'll be sent to the focused text input client as soon as we receive the // processing result of the pending key event. CompositionText composition_; // Pending result text generated by the current pending key event. // It'll be sent to the focused text input client as soon as we receive the // processing result of the pending key event. base::string16 result_text_; base::string16 previous_surrounding_text_; gfx::Range previous_selection_range_; // Indicates if there is an ongoing composition text. bool composing_text_; // Indicates if the composition text is changed or deleted. bool composition_changed_; // The latest id of key event. uint32 current_keyevent_id_; // An object to compose a character from a sequence of key presses // including dead key etc. CharacterComposer character_composer_; // Used for making callbacks. base::WeakPtrFactory<InputMethodChromeOS> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(InputMethodChromeOS); }; } // namespace ui #endif // UI_BASE_IME_INPUT_METHOD_CHROMEOS_H_