Home | History | Annotate | Download | only in ibus
      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 CHROMEOS_DBUS_IBUS_IBUS_TEXT_H_
      6 #define CHROMEOS_DBUS_IBUS_IBUS_TEXT_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 #include "base/basictypes.h"
     11 #include "chromeos/chromeos_export.h"
     12 
     13 namespace dbus {
     14 class MessageWriter;
     15 class MessageReader;
     16 }  // dbus
     17 
     18 namespace chromeos {
     19 
     20 // The IBusText is one of IBusObjects and it contains IBusAttrList object which
     21 // contains array of IBusAttribute object. The overview of each data structure
     22 // is as follows:
     23 //
     24 // DATA STRUCTURE OVERVIEW:
     25 //
     26 // IBusAttribute: (signature is "uuuu")
     27 // variant  struct {
     28 //     string "IBusAttribute"
     29 //     array[]
     30 //     uint32 1  // Type of attribute.
     31 //     uint32 1  // The value of attribute.
     32 //     uint32 0  // The start index of the text.
     33 //     uint32 1  // The end index of the text.
     34 // }
     35 //
     36 // IBusAttrList: (signature is "av")
     37 // variant  struct {
     38 //     string "IBusAttrList"
     39 //     array[]
     40 //     array[  // The array of IBusAttribute.
     41 //       variant  struct{
     42 //           string "IBusAttribute"
     43 //           ...
     44 //       }
     45 //       variant  struct{
     46 //           string "IBusAttribute"
     47 //           ...
     48 //       }
     49 //       variant  struct{
     50 //           string "IBusAttribute"
     51 //           ...
     52 //       }
     53 //    ]
     54 // }
     55 //
     56 // IBusText: (signature is "sv")
     57 // variant  struct {
     58 //     string "IBusText"
     59 //     array[]
     60 //     string "A"
     61 //     variant  struct {
     62 //         string "IBusAttrList"
     63 //         array[]
     64 //         array[
     65 //           variant  struct{
     66 //               string "IBusAttribute"
     67 //               ...
     68 //             }
     69 //           variant  struct{
     70 //               string "IBusAttribute"
     71 //               ...
     72 //             }
     73 //        ]
     74 //      }
     75 //  }
     76 //
     77 class IBusText;
     78 
     79 // Pops a IBusText from |reader|.
     80 // Returns false if an error occurs.
     81 bool CHROMEOS_EXPORT PopIBusText(dbus::MessageReader* reader,
     82                                  IBusText* ibus_text);
     83 // Pops a IBusText from |reader| and stores it's text field into text. Use
     84 // PopIBusText instead in the case of using any attribute entries in IBusText.
     85 // Returns true on success.
     86 bool CHROMEOS_EXPORT PopStringFromIBusText(dbus::MessageReader* reader,
     87                                            std::string* text);
     88 // Appends a IBusText to |writer|. Annotation and description field is not
     89 // filled with AppendIBusText.
     90 // TODO(nona): Support annotation/description appending if necessary.
     91 void CHROMEOS_EXPORT AppendIBusText(const IBusText& ibus_text,
     92                                     dbus::MessageWriter* writer);
     93 
     94 // Appends a string to |writer| as IBusText without any attributes. Use
     95 // AppendIBusText instead in the case of using any attribute entries.
     96 // TODO(nona): Support annotation/description appending if necessary.
     97 void CHROMEOS_EXPORT AppendStringAsIBusText(const std::string& text,
     98                                             dbus::MessageWriter* writer);
     99 
    100 // Handles IBusText object which is used in dbus communication with ibus-daemon.
    101 // The IBusAttribute has four uint32 variables and the IBusAttributes represents
    102 // three type of decoration based on it's values.
    103 // 1. Underline decoration (corresponds to UnderlineAttribute structure)
    104 //   1st value: indicates underline attribute.
    105 //   2nd value: type of decoration. Chrome only support single and double
    106 //              underline and error line.
    107 //   3rd value: the start index of this attribute in multibyte.
    108 //   4th value: the end index of this attribute in multibyte.
    109 //
    110 // 2. Background decoration (corresponds to SelectionAttribute structure)
    111 //   NOTE: Background decoration is treated as selection in Chrome.
    112 //   1st value: indicates background attribute.
    113 //   2nd value: Represents color but not supported in Chrome.
    114 //   3rd value: the start index of this attribute in multibyte.
    115 //   4th value: the end index of this attribute in multibyte.
    116 //
    117 // 3. Forward decoration
    118 //   Not supported in Chrome.
    119 class CHROMEOS_EXPORT IBusText {
    120  public:
    121   enum IBusTextUnderlineType {
    122     IBUS_TEXT_UNDERLINE_SINGLE = 1,
    123     IBUS_TEXT_UNDERLINE_DOUBLE = 2,
    124     IBUS_TEXT_UNDERLINE_ERROR  = 4,
    125   };
    126 
    127   struct UnderlineAttribute {
    128     IBusTextUnderlineType type;
    129     uint32 start_index;  // The inclusive start index.
    130     uint32 end_index;  // The exclusive end index.
    131   };
    132 
    133   struct SelectionAttribute {
    134     uint32 start_index;  // The inclusive start index.
    135     uint32 end_index;  // The exclusive end index.
    136   };
    137 
    138   // Accessors
    139   IBusText();
    140   virtual ~IBusText();
    141 
    142   const std::string& text() const { return text_; }
    143   void set_text(const std::string& text) { text_ = text; }
    144 
    145   const std::string& annotation() const { return annotation_; }
    146   void set_annotation(const std::string& annotation) {
    147     annotation_ = annotation;
    148   }
    149 
    150   const std::string& description_title() const { return description_title_; }
    151   void set_description_title(const std::string& title) {
    152     description_title_ = title;
    153   }
    154 
    155   const std::string& description_body() const { return description_body_; }
    156   void set_description_body(const std::string& body) {
    157     description_body_ = body;
    158   }
    159 
    160   const std::vector<UnderlineAttribute>& underline_attributes() const {
    161     return underline_attributes_;
    162   }
    163 
    164   std::vector<UnderlineAttribute>* mutable_underline_attributes() {
    165     return &underline_attributes_;
    166   }
    167 
    168   const std::vector<SelectionAttribute>& selection_attributes() const {
    169     return selection_attributes_;
    170   }
    171   std::vector<SelectionAttribute>* mutable_selection_attributes() {
    172     return &selection_attributes_;
    173   }
    174 
    175   void CopyFrom(const IBusText& obj);
    176 
    177  private:
    178   std::string text_;
    179   std::string annotation_;
    180   std::string description_title_;
    181   std::string description_body_;
    182   std::vector<UnderlineAttribute> underline_attributes_;
    183   std::vector<SelectionAttribute> selection_attributes_;
    184 
    185   DISALLOW_COPY_AND_ASSIGN(IBusText);
    186 };
    187 
    188 }  // namespace chromeos
    189 
    190 #endif  // CHROMEOS_DBUS_IBUS_IBUS_TEXT_H_
    191