~ubuntu-branches/ubuntu/quantal/sunpinyin/quantal

« back to all changes in this revision

Viewing changes to wrapper/ibus/src/sunpinyin_lookup_table.cpp

  • Committer: Package Import Robot
  • Author(s): YunQiang Su
  • Date: 2012-04-11 03:06:40 UTC
  • mfrom: (1.1.4) (1.2.8 sid)
  • Revision ID: package-import@ubuntu.com-20120411030640-8mxepz5e6wffy87c
Tags: 2.0.3+git20120404-1
* Medium urgency for fixing RC bug.
* New upstream commit: fix FTBFS with gcc-4.7 (Closes: #667385).
* Add Multi-Arch: same to libsunpinyin3, -dev and -dbg.
* Add YunQiang Su to uploaders.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (c) 2009 Kov Chai <tchaikov@gmail.com>
3
 
 *
4
 
 * The contents of this file are subject to the terms of either the GNU Lesser
5
 
 * General Public License Version 2.1 only ("LGPL") or the Common Development and
6
 
 * Distribution License ("CDDL")(collectively, the "License"). You may not use this
7
 
 * file except in compliance with the License. You can obtain a copy of the CDDL at
8
 
 * http://www.opensource.org/licenses/cddl1.php and a copy of the LGPLv2.1 at
9
 
 * http://www.opensource.org/licenses/lgpl-license.php. See the License for the 
10
 
 * specific language governing permissions and limitations under the License. When
11
 
 * distributing the software, include this License Header Notice in each file and
12
 
 * include the full text of the License in the License file as well as the
13
 
 * following notice:
14
 
 * 
15
 
 * NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE
16
 
 * (CDDL)
17
 
 * For Covered Software in this distribution, this License shall be governed by the
18
 
 * laws of the State of California (excluding conflict-of-law provisions).
19
 
 * Any litigation relating to this License shall be subject to the jurisdiction of
20
 
 * the Federal Courts of the Northern District of California and the state courts
21
 
 * of the State of California, with venue lying in Santa Clara County, California.
22
 
 * 
23
 
 * Contributor(s):
24
 
 * 
25
 
 * If you wish your version of this file to be governed by only the CDDL or only
26
 
 * the LGPL Version 2.1, indicate your decision by adding "[Contributor]" elects to
27
 
 * include this software in this distribution under the [CDDL or LGPL Version 2.1]
28
 
 * license." If you don't indicate a single choice of license, a recipient has the
29
 
 * option to distribute your version of this file under either the CDDL or the LGPL
30
 
 * Version 2.1, or to extend the choice of license to its licensees as provided
31
 
 * above. However, if you add LGPL Version 2.1 code and therefore, elected the LGPL
32
 
 * Version 2 license, then the option applies only if the new code is made subject
33
 
 * to such option by the copyright holder. 
34
 
 */
35
 
 
36
 
#include <sunpinyin.h>
37
 
#include "ibus_portable.h"
38
 
#include "sunpinyin_lookup_table.h"
39
 
 
40
 
SunPinyinLookupTable::SunPinyinLookupTable() 
41
 
    : Pointer<IBusLookupTable>(ibus_lookup_table_new (9, 0, TRUE, TRUE))
42
 
{}
43
 
 
44
 
SunPinyinLookupTable::~SunPinyinLookupTable()
45
 
{
46
 
}
47
 
 
48
 
int
49
 
SunPinyinLookupTable::update_candidates(const ICandidateList& cl)
50
 
{
51
 
    const int size = cl.size();
52
 
    if (size <= 0)
53
 
        return size;
54
 
    
55
 
    const int total = cl.total();    
56
 
    // expand the array in lookup_table
57
 
    // we will fill the missing items in when we have them
58
 
    ibus_lookup_table_set_page_size(*this, size);
59
 
    g_array_set_size((*this)->candidates, total);
60
 
 
61
 
    for (int i = 0, begin = 0; i < size; ++i) {
62
 
        const int len = append_candidate(cl, i, begin);
63
 
        if (len)
64
 
            begin += len;
65
 
        else
66
 
            break;
67
 
    }
68
 
    return size;
69
 
    //ibus_lookup_table_set_cursor_pos (m_lookup_table, index);
70
 
}
71
 
 
72
 
bool
73
 
SunPinyinLookupTable::cursor_up()
74
 
{
75
 
    ibus_lookup_table_cursor_down(*this);
76
 
    return true;
77
 
}
78
 
 
79
 
bool
80
 
SunPinyinLookupTable::cursor_down()
81
 
{
82
 
    ibus_lookup_table_cursor_down(*this);
83
 
    return true;
84
 
}
85
 
 
86
 
size_t
87
 
SunPinyinLookupTable::get_cursor_pos() const
88
 
{
89
 
    return ibus_lookup_table_get_cursor_pos(*this);
90
 
}
91
 
 
92
 
// an alternative to ibus_lookup_table_append_candidate(m_lookup_table, text);
93
 
// if we can assume that WinHandler::updateCandiates() is called
94
 
// in sequence. we can use ibus_lookup_table_append_candidate()
95
 
static void
96
 
ibus_lookup_table_set_candidate(IBusLookupTable *table,
97
 
                                guint index,
98
 
                                IBusText *text)
99
 
{
100
 
    g_return_if_fail (IBUS_IS_LOOKUP_TABLE (table));
101
 
    g_return_if_fail (IBUS_IS_TEXT (text));
102
 
    g_assert(index < table->candidates->len);
103
 
    
104
 
    g_object_ref (text);
105
 
    g_array_insert_val (table->candidates, index, text);
106
 
}
107
 
 
108
 
int
109
 
SunPinyinLookupTable::append_candidate(const ICandidateList& cl,
110
 
                                       int item,
111
 
                                       int begin)
112
 
{
113
 
    const TWCHAR* cand = 0;
114
 
    int len = 0;
115
 
    
116
 
    cand = cl.candiString(item);
117
 
    if (!cand)
118
 
        return len;
119
 
    len = cl.candiSize(item);
120
 
    ibus::Text text(ibus_text_new_from_ucs4(cand));
121
 
    decorate_candidate(text, cl.candiType(item));
122
 
    int index = get_current_page_start() + item;
123
 
    ibus_lookup_table_set_candidate(*this, index, text);
124
 
    return len;
125
 
}
126
 
 
127
 
void
128
 
SunPinyinLookupTable::decorate_candidate(ibus::Text text, int type)
129
 
{
130
 
    switch (type) {
131
 
    case ICandidateList::BEST_WORD:
132
 
        ibus_text_append_attribute (text, IBUS_ATTR_TYPE_FOREGROUND,
133
 
                                    0x003E6B8A, 0, -1);
134
 
        ibus_text_append_attribute (text, IBUS_ATTR_TYPE_UNDERLINE,
135
 
                                    IBUS_ATTR_UNDERLINE_SINGLE, 0, -1);
136
 
        break;
137
 
    case ICandidateList::USER_SELECTED_WORD:
138
 
        break;
139
 
    case ICandidateList::NORMAL_WORD:
140
 
        break;
141
 
    }
142
 
}
143
 
 
144
 
int
145
 
SunPinyinLookupTable::get_current_page_start() const
146
 
{
147
 
    guint cursor = ibus_lookup_table_get_cursor_pos(*this);
148
 
    guint cursor_in_page = ibus_lookup_table_get_cursor_in_page(*this);
149
 
    return cursor - cursor_in_page;
150
 
}