2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4 * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
6 * The contents of this file are subject to the terms of either the GNU Lesser
7 * General Public License Version 2.1 only ("LGPL") or the Common Development and
8 * Distribution License ("CDDL")(collectively, the "License"). You may not use this
9 * file except in compliance with the License. You can obtain a copy of the CDDL at
10 * http://www.opensource.org/licenses/cddl1.php and a copy of the LGPLv2.1 at
11 * http://www.opensource.org/licenses/lgpl-license.php. See the License for the
12 * specific language governing permissions and limitations under the License. When
13 * distributing the software, include this License Header Notice in each file and
14 * include the full text of the License in the License file as well as the
17 * NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE
19 * For Covered Software in this distribution, this License shall be governed by the
20 * laws of the State of California (excluding conflict-of-law provisions).
21 * Any litigation relating to this License shall be subject to the jurisdiction of
22 * the Federal Courts of the Northern District of California and the state courts
23 * of the State of California, with venue lying in Santa Clara County, California.
27 * If you wish your version of this file to be governed by only the CDDL or only
28 * the LGPL Version 2.1, indicate your decision by adding "[Contributor]" elects to
29 * include this software in this distribution under the [CDDL or LGPL Version 2.1]
30 * license." If you don't indicate a single choice of license, a recipient has the
31 * option to distribute your version of this file under either the CDDL or the LGPL
32 * Version 2.1, or to extend the choice of license to its licensees as provided
33 * above. However, if you add LGPL Version 2.1 code and therefore, elected the LGPL
34 * Version 2 license, then the option applies only if the new code is made subject
35 * to such option by the copyright holder.
43 #include "imi_view_classic.h"
46 #include "imi_plugin.h"
49 // #pragma setlocale("zh_CN.UTF-8")
51 CHotkeyProfile::CHotkeyProfile()
52 : m_punctSwitchKey(IM_VK_PERIOD, 0, IM_CTRL_MASK),
53 m_symbolSwitchKey(IM_VK_SPACE, 0, IM_SHIFT_MASK),
54 m_candiDeleteKey(0, 0, IM_CTRL_MASK),
57 addModeSwitchKey(CKeyEvent(IM_VK_SHIFT_L, 0, IM_ALT_MASK));
62 : m_pIC(NULL), m_pWinHandler(NULL), m_pPySegmentor(NULL),
63 m_pHotkeyProfile(NULL),
64 m_candiWindowSize(10), m_bCN(true), m_bFullPunct(true),
65 m_bFullSymbol(false), m_backspaceCancel(true), m_smartPunct(true)
68 // load all needed plugins
69 AIMIPluginManager::instance().initializePlugins();
74 CIMIView::setStatusAttrValue(int key, int value)
77 case CIMIWinHandler::STATUS_ID_CN:
80 m_pWinHandler->updateStatus(key, value);
82 case CIMIWinHandler::STATUS_ID_FULLPUNC:
83 m_bFullPunct = (value != 0);
85 m_pWinHandler->updateStatus(key, value);
87 m_pIC->setFullPunctForwarding(m_bFullPunct);
89 case CIMIWinHandler::STATUS_ID_FULLSYMBOL:
90 m_bFullSymbol = (value != 0);
92 m_pWinHandler->updateStatus(key, value);
94 m_pIC->setFullSymbolForwarding(m_bFullSymbol);
100 CIMIView::getStatusAttrValue(int key)
103 case CIMIWinHandler::STATUS_ID_CN:
104 return (m_bCN) ? 1 : 0;
105 case CIMIWinHandler::STATUS_ID_FULLPUNC:
106 return (m_bFullPunct) ? 1 : 0;
107 case CIMIWinHandler::STATUS_ID_FULLSYMBOL:
108 return (m_bFullSymbol) ? 1 : 0;
114 CIMIView::handlerUpdatePreedit(const IPreeditString* ppd)
116 if (m_pWinHandler == NULL || ppd == NULL) {
119 // nothing to do here for plugins
120 m_pWinHandler->updatePreedit(ppd);
123 // only build these with plugins support
124 #ifdef ENABLE_PLUGINS
127 CIMIView::_pluginProvideCandidates(wstring preedit, ICandidateList* pcl)
129 CIMIPluginManager& manager = AIMIPluginManager::instance();
130 if (preedit.size() == 0) {
134 for (size_t i = 0; i < manager.getPluginSize(); i++) {
135 CIMIPlugin* plugin = manager.getPlugin(i);
137 TPluginCandidates candidates = plugin->provide_candidates(preedit,
139 if (wait_time != 0) {
140 manager.markWaitTime(wait_time);
143 for (size_t j = 0; j < candidates.size(); j++) {
144 const TPluginCandidateItem& item = candidates[j];
145 pcl->insertCandidateNoDedup(item.m_candidate,
146 ICandidateList::PLUGIN_TAIL,
153 CIMIView::_pluginTranslateCandidate(ICandidateList* pcl)
155 CIMIPluginManager& manager = AIMIPluginManager::instance();
156 ICandidateList::CCandiStrings& css = pcl->getCandiStrings();
157 if (css.size() == 0) {
161 for (size_t i = 0; i < css.size(); i++) {
162 for (size_t j = 0; j < manager.getPluginSize(); j++) {
163 CIMIPlugin* plugin = manager.getPlugin(j);
165 wstring result = plugin->translate_candidate(css[i], &wait_time);
166 if (wait_time != 0) {
167 manager.markWaitTime(wait_time);
175 #endif // ENABLE_PLUGINS
178 CIMIView::handlerUpdateCandidates(IPreeditString* ppd,
181 if (m_pWinHandler == NULL || pcl == NULL) {
184 #ifdef ENABLE_PLUGINS
185 _pluginProvideCandidates(ppd->getString(), pcl);
187 _pluginTranslateCandidate(pcl);
189 m_pWinHandler->updateCandidates(pcl);
190 CIMIPluginManager& manager = AIMIPluginManager::instance();
191 m_pWinHandler->enableDeferedUpdate(this, manager.getWaitTime());
192 manager.resetWaitTime();
195 m_pWinHandler->updateCandidates(pcl);
200 CIMIView::handlerCommit(const wstring& wstr)
202 if (m_pWinHandler == NULL) {
205 #ifdef ENABLE_PLUGINS
206 wstring commit_result = wstr;
207 CIMIPluginManager& manager = AIMIPluginManager::instance();
208 // re-run filter again
209 for (size_t i = 0; i < manager.getPluginSize(); i++) {
210 CIMIPlugin* plugin = manager.getPlugin(i);
212 wstring result = plugin->translate_candidate(commit_result, &wait_time);
213 if (wait_time != 0) {
216 commit_result = result;
218 m_pWinHandler->commit(commit_result.c_str());
219 m_pWinHandler->disableDeferedUpdate();
221 m_pWinHandler->commit(wstr.c_str());