1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHOD_ENGINE_IBUS_H_ 6 #define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHOD_ENGINE_IBUS_H_ 7 8 #include <map> 9 #include <string> 10 #include <vector> 11 #include "chrome/browser/chromeos/input_method/input_method_engine.h" 12 #include "chromeos/dbus/ibus/ibus_engine_factory_service.h" 13 #include "chromeos/dbus/ibus/ibus_engine_service.h" 14 #include "dbus/object_path.h" 15 16 namespace chromeos { 17 18 class IBusComponent; 19 class IBusLookupTable; 20 class IBusText; 21 22 class IBusEngineService; 23 namespace input_method { 24 struct KeyEventHandle; 25 } // namespace input_method 26 27 class InputMethodEngineIBus : public InputMethodEngine, 28 public IBusEngineHandlerInterface { 29 public: 30 InputMethodEngineIBus(); 31 32 virtual ~InputMethodEngineIBus(); 33 34 void Initialize( 35 InputMethodEngine::Observer* observer, 36 const char* engine_name, 37 const char* extension_id, 38 const char* engine_id, 39 const char* description, 40 const std::vector<std::string>& languages, 41 const std::vector<std::string>& layouts, 42 const GURL& options_page, 43 std::string* error); 44 45 // InputMethodEngine overrides. 46 virtual void StartIme() OVERRIDE; 47 virtual bool SetComposition(int context_id, 48 const char* text, 49 int selection_start, 50 int selection_end, 51 int cursor, 52 const std::vector<SegmentInfo>& segments, 53 std::string* error) OVERRIDE; 54 virtual bool ClearComposition(int context_id, std::string* error) OVERRIDE; 55 virtual bool CommitText(int context_id, const char* text, 56 std::string* error) OVERRIDE; 57 virtual bool SetCandidateWindowVisible(bool visible, 58 std::string* error) OVERRIDE; 59 virtual void SetCandidateWindowCursorVisible(bool visible) OVERRIDE; 60 virtual void SetCandidateWindowVertical(bool vertical) OVERRIDE; 61 virtual void SetCandidateWindowPageSize(int size) OVERRIDE; 62 virtual void SetCandidateWindowAuxText(const char* text) OVERRIDE; 63 virtual void SetCandidateWindowAuxTextVisible(bool visible) OVERRIDE; 64 virtual void SetCandidateWindowPosition( 65 CandidateWindowPosition position) OVERRIDE; 66 virtual bool SetCandidates(int context_id, 67 const std::vector<Candidate>& candidates, 68 std::string* error) OVERRIDE; 69 virtual bool SetCursorPosition(int context_id, int candidate_id, 70 std::string* error) OVERRIDE; 71 virtual bool SetMenuItems(const std::vector<MenuItem>& items) OVERRIDE; 72 virtual bool UpdateMenuItems(const std::vector<MenuItem>& items) OVERRIDE; 73 virtual bool IsActive() const OVERRIDE; 74 virtual void KeyEventDone(input_method::KeyEventHandle* key_data, 75 bool handled) OVERRIDE; 76 virtual bool DeleteSurroundingText(int context_id, 77 int offset, 78 size_t number_of_chars, 79 std::string* error) OVERRIDE; 80 81 // IBusEngineHandlerInterface overrides. 82 virtual void FocusIn() OVERRIDE; 83 virtual void FocusOut() OVERRIDE; 84 virtual void Enable() OVERRIDE; 85 virtual void Disable() OVERRIDE; 86 virtual void PropertyActivate( 87 const std::string& property_name, 88 ibus::IBusPropertyState property_state) OVERRIDE; 89 virtual void PropertyShow(const std::string& property_name) OVERRIDE; 90 virtual void PropertyHide(const std::string& property_name) OVERRIDE; 91 virtual void SetCapability(IBusCapability capability) OVERRIDE; 92 virtual void Reset() OVERRIDE; 93 virtual void ProcessKeyEvent(uint32 keysym, uint32 keycode, uint32 state, 94 const KeyEventDoneCallback& callback) OVERRIDE; 95 virtual void CandidateClicked(uint32 index, ibus::IBusMouseButton button, 96 uint32 state) OVERRIDE; 97 virtual void SetSurroundingText(const std::string& text, uint32 cursor_pos, 98 uint32 anchor_pos) OVERRIDE; 99 100 // Called when the connection with ibus-daemon is connected. 101 void OnConnected(); 102 103 // Called whtn the connection with ibus-daemon is disconnected. 104 void OnDisconnected(); 105 106 private: 107 // Returns true if the connection to ibus-daemon is avaiable. 108 bool IsConnected(); 109 110 // Converts MenuItem to IBusProperty. 111 bool MenuItemToProperty(const MenuItem& item, IBusProperty* property); 112 113 // Registers the engine component. 114 void RegisterComponent(); 115 116 // Called when the RegisterComponent is failed. 117 void OnComponentRegistrationFailed(); 118 119 // Called when the RegisterComponent is succeeded. 120 void OnComponentRegistered(); 121 122 // Called when the ibus-daemon sends CreateEngine message with corresponding 123 // engine id. 124 void CreateEngineHandler( 125 const IBusEngineFactoryService::CreateEngineResponseSender& sender); 126 127 // Returns current IBusEngineService, if there is no available service, this 128 // function returns NULL. 129 IBusEngineService* GetCurrentService(); 130 131 // True if the current context has focus. 132 bool focused_; 133 134 // True if this engine is active. 135 bool active_; 136 137 // ID that is used for the current input context. False if there is no focus. 138 int context_id_; 139 140 // Next id that will be assigned to a context. 141 int next_context_id_; 142 143 // This IME ID in Chrome Extension. 144 std::string engine_id_; 145 146 // This IME ID in ibus. 147 std::string ibus_id_; 148 149 // The current object path. 150 dbus::ObjectPath object_path_; 151 152 // The current auxialy text and it's visiblity. 153 scoped_ptr<IBusText> aux_text_; 154 bool aux_text_visible_; 155 156 // Pointer to the object recieving events for this IME. 157 InputMethodEngine::Observer* observer_; 158 159 // The current preedit text, and it's cursor position. 160 scoped_ptr<IBusText> preedit_text_; 161 int preedit_cursor_; 162 163 // The current engine component. 164 scoped_ptr<IBusComponent> component_; 165 166 // The current lookup table. 167 scoped_ptr<IBusLookupTable> table_; 168 169 // Indicates whether the candidate window is visible. 170 bool window_visible_; 171 172 // Mapping of candidate index to candidate id. 173 std::vector<int> candidate_ids_; 174 175 // Mapping of candidate id to index. 176 std::map<int, int> candidate_indexes_; 177 178 // Used for making callbacks. 179 base::WeakPtrFactory<InputMethodEngineIBus> weak_ptr_factory_; 180 }; 181 182 } // namespace chromeos 183 184 #endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHOD_ENGINE_IBUS_H_ 185