sunpinyin2/src/ime-core/imi_option_event.h
author tchaikov
Fri, 13 Nov 2009 22:15:06 +0800
changeset 460 954a21b2c6cc
parent 406 97269b2f9ea4
child 522 ab21b1111321
permissions -rw-r--r--
* fix issue#46 - "unable to input after a fresh install": use open() instead of fopen() * kill compiler warnings * add error handling for open() failure
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
383
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     1
#ifndef _IMI_SESSION_H
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     2
#define _IMI_SESSION_H
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     3
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     4
#include <list>
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     5
#include <string>
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     6
#include <vector>
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     7
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     8
#include "utils.h"
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
     9
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    10
class COptionEventBus;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    11
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    12
struct COptionEvent
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    13
{
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    14
    enum Type {
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    15
        TYPE_SHARED = (1 << 0),
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    16
        TYPE_GLOBAL = (1 << 1)
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    17
    };
406
97269b2f9ea4 enable customizable punct mapping in ibus wrapper
tchaikov
parents: 401
diff changeset
    18
    template<typename ValueType>
97269b2f9ea4 enable customizable punct mapping in ibus wrapper
tchaikov
parents: 401
diff changeset
    19
    COptionEvent(const std::string& k, const ValueType& v,
97269b2f9ea4 enable customizable punct mapping in ibus wrapper
tchaikov
parents: 401
diff changeset
    20
                 int t = TYPE_SHARED|TYPE_GLOBAL)
97269b2f9ea4 enable customizable punct mapping in ibus wrapper
tchaikov
parents: 401
diff changeset
    21
        : type(t), name(k), value(v) 
97269b2f9ea4 enable customizable punct mapping in ibus wrapper
tchaikov
parents: 401
diff changeset
    22
    {}
383
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    23
    bool is_shared() const { return type & TYPE_SHARED; }
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    24
    bool is_global() const { return type & TYPE_GLOBAL; }
401
bda9b277d725 * enable page switch hot-key configuration
tchaikov
parents: 383
diff changeset
    25
    int get_int() const;
383
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    26
    bool get_bool() const;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    27
    std::string get_string() const;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    28
    std::vector<std::string> get_string_list() const;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    29
    
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    30
    /* TODO */
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    31
    std::vector<bool> get_bool_list() const;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    32
    std::vector<int> get_int_list() const;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    33
    
401
bda9b277d725 * enable page switch hot-key configuration
tchaikov
parents: 383
diff changeset
    34
    int type;
383
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    35
    std::string name;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    36
    
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    37
    struct variant_
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    38
    {
401
bda9b277d725 * enable page switch hot-key configuration
tchaikov
parents: 383
diff changeset
    39
        variant_(int);
383
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    40
        variant_(const std::string&);
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    41
        variant_(bool);
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    42
        variant_(const std::vector<std::string>&);
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    43
        struct val_
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    44
        {
401
bda9b277d725 * enable page switch hot-key configuration
tchaikov
parents: 383
diff changeset
    45
            int                      d_int;
383
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    46
            std::string              d_string;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    47
            bool                     d_bool;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    48
            std::vector<std::string> d_strings;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    49
        } data;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    50
        enum {
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    51
            VAL_UNSIGNED,
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    52
            VAL_UNSIGNED_LIST,
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    53
            VAL_STRING,
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    54
            VAL_STRING_LIST,
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    55
            VAL_BOOL,
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    56
            VAL_BOOL_LIST
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    57
        } type;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    58
    } value;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    59
};
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    60
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    61
class IConfigurable
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    62
{
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    63
public:
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    64
    IConfigurable();
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    65
    ~IConfigurable();
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    66
    /**
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    67
     * onConfigChanged will be called whenever an option is changed
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    68
     * @param event presents the changed option
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    69
     * @return true if the event is consumed, and not intented to be
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    70
     *         sent to another event listener, false otherwise.
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    71
     */
460
954a21b2c6cc * fix issue#46 - "unable to input after a fresh install": use open() instead of fopen()
tchaikov
parents: 406
diff changeset
    72
    virtual bool onConfigChanged(const COptionEvent&) { return false; }
383
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    73
    void addRef();
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    74
    void release();
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    75
    
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    76
private:
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    77
    int m_refcnt;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    78
};
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    79
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    80
class COptionEventBus
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    81
{
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    82
public:
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    83
    /**
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    84
     * listener will receive a message whenever an option is changed
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    85
     * @param listener who is interested in a change of options
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    86
     */
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    87
    void registerAsListener(IConfigurable* listener);
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    88
    
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    89
    /**
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    90
     * remove listener from the subscriber list
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    91
     * @param listener who is no more interested in a change of options
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    92
     */
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    93
    void unregisterAsListener(IConfigurable* listener);
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    94
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    95
    /**
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    96
     * publish an event to all listeners of this event bus
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    97
     * @param event the event which presents an option change
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    98
     */
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
    99
    void publishEvent(const COptionEvent& event);
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   100
    template<class> friend class SingletonHolder;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   101
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   102
private:
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   103
    COptionEventBus() {}
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   104
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   105
    typedef std::list<IConfigurable*> Subscribers;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   106
    Subscribers m_listeners;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   107
};
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   108
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   109
typedef SingletonHolder<COptionEventBus> AOptionEventBus;
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   110
586b50b608d4 * add option event support
tchaikov
parents:
diff changeset
   111
#endif // _IMI_SESSION_H