// Copyright (c) 2012 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_IBUS_H_ #define UI_BASE_IME_INPUT_METHOD_IBUS_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/ibus_bridge.h" #include "ui/base/ime/composition_text.h" #include "ui/base/ime/input_method_base.h" namespace dbus { class ObjectPath; } namespace chromeos { namespace ibus { class IBusText; } // namespace ibus } // namespace chromeos namespace ui { // A ui::InputMethod implementation based on IBus. class UI_EXPORT InputMethodIBus : public InputMethodBase, public chromeos::IBusInputContextHandlerInterface { public: explicit InputMethodIBus(internal::InputMethodDelegate* delegate); virtual ~InputMethodIBus(); // 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 base::i18n::TextDirection GetInputTextDirection() OVERRIDE; virtual bool IsActive() OVERRIDE; virtual bool IsCandidatePopupOpen() const OVERRIDE; protected: // Converts |text| into CompositionText. void ExtractCompositionText(const chromeos::IBusText& 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; // 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::IBusInputContextHandlerInterface overrides: virtual void CommitText(const std::string& text) OVERRIDE; virtual void UpdatePreeditText(const chromeos::IBusText& text, uint32 cursor_pos, bool visible) OVERRIDE; virtual void DeleteSurroundingText(int32 offset, uint32 length) OVERRIDE; // Hides the composition text. void HidePreeditText(); // Callback function for IBusEngineHandlerInterface::ProcessKeyEvent. void ProcessKeyEventDone(uint32 id, ui::KeyEvent* event, bool is_handled); // 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. string16 result_text_; string16 previous_surrounding_text_; gfx::Range previous_selection_range_; // Indicates if input context is focused or not. bool context_focused_; // Indicates if there is an ongoing composition text. bool composing_text_; // Indicates if the composition text is changed or deleted. bool composition_changed_; // If it's true then all input method result received before the next key // event will be discarded. bool suppress_next_result_; // 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_; TextInputType previous_textinput_type_; // Used for making callbacks. base::WeakPtrFactory<InputMethodIBus> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(InputMethodIBus); }; } // namespace ui #endif // UI_BASE_IME_INPUT_METHOD_IBUS_H_