Home | History | Annotate | Download | only in input_method
      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