2 * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <sclcommon.h>
23 #include <vconf-keys.h>
26 #include "languages.h"
31 static vector<LANGUAGE_INFO> _language_vector;
32 static int _current_language = -1;
33 static string _default_resource_file;
35 // A class function that is used for algorithm std::find_if
36 class _language_info_finder {
38 _language_info_finder(const string &language_name): m_name(language_name) {}
39 bool operator() (const LANGUAGE_INFO &info) {
40 return info.name == m_name;
47 ISELanguageManager::set_all_languages_enabled(sclboolean enabled)
49 sclboolean ret = FALSE;
51 vector<LANGUAGE_INFO>::iterator iter;
52 for (iter = _language_vector.begin(); iter != _language_vector.end(); ++iter) {
53 iter->enabled = enabled;
54 iter->enabled_temporarily = FALSE;
61 /* Each language-specific source files should put their callback information in the following vectors */
63 ISELanguageManager::add_language(LANGUAGE_INFO &language)
67 // check whether there is an language_info has the same name with "language" in the vector
68 vector<LANGUAGE_INFO>::iterator it;
69 it = std::find_if(_language_vector.begin(), _language_vector.end(), _language_info_finder(language.name));
70 if (it != _language_vector.end()) {
71 // if the assigned one has the priority "LANGUAGE_PRIORITY_SPECIALIZED" - which means high priority,
72 // then the assigned one will replace with the original one
73 if (language.priority == LANGUAGE_PRIORITY_SPECIALIZED) {
75 language_id = it - _language_vector.begin();
78 _language_vector.push_back(language);
79 language_id = _language_vector.size() -1;
82 if (_current_language == -1) {
83 /* If there is no default language set currently, assume this to be a default language */
84 _current_language = language_id;
85 } else if (language.priority == LANGUAGE_PRIORITY_SPECIALIZED) {
86 /* If this language has the SPECIALIZED priority, assume this to be a default language */
87 _current_language = language_id;
89 if (language.resource_file.length() > 0) {
90 if (_default_resource_file.empty()) {
91 /* If we don't have default resource file, set this resource file information as default */
92 _default_resource_file = language.resource_file;
93 } else if (language.priority == LANGUAGE_PRIORITY_SPECIALIZED) {
94 /* Or if this has SPECIALIZED priority, overwrite the existing default resource file information */
95 _default_resource_file = language.resource_file;
103 _find_language_info(const string &language_name, const vector<LANGUAGE_INFO>& vec_language_info)
105 vector<LANGUAGE_INFO>::const_iterator it;
107 it = std::find_if(vec_language_info.begin(), vec_language_info.end(), _language_info_finder(language_name));
108 if (it != vec_language_info.end()) {
109 return it - vec_language_info.begin();
114 // normal routine of select language
116 ISELanguageManager::do_select_language(int language_info_index)
118 sclboolean ret = FALSE;
120 if (language_info_index < 0 || language_info_index >= (int)_language_vector.size()) {
123 LANGUAGE_INFO &language_info = _language_vector.at(language_info_index);
124 // if not enabled and not temporary, return false
125 if (!language_info.enabled && !language_info.enabled_temporarily) {
129 // run the callback function
130 ILanguageCallback *callback = language_info.callback;
132 ret = callback->on_language_selected(language_info.name.c_str(), language_info.selected_input_mode.c_str());
138 _current_language = language_info_index;
139 if (!language_info.enabled_temporarily) {
140 /* Save the selected language */
141 CONFIG_VALUES *config_values = get_config_values();
143 config_values->selected_language = language_info.name;
144 write_ise_config_values();
147 vconf_set_str(VCONFKEY_ISF_INPUT_LANGUAGE, language_info.locale_string.c_str());
152 // normal routine of select language
154 ISELanguageManager::do_unselect_language(int language_info_index)
156 sclboolean ret = FALSE;
157 if (language_info_index < 0 || language_info_index >= (int)_language_vector.size()) {
161 LANGUAGE_INFO &language_info = _language_vector.at(language_info_index);
162 if (language_info.callback) {
163 ret = language_info.callback->on_language_unselected(language_info.name.c_str(), language_info.selected_input_mode.c_str());
169 // interface function, call do_select_language actually
171 ISELanguageManager::select_language(const sclchar *language, sclboolean temporarily)
173 sclboolean ret = FALSE;
175 if (language == NULL) return FALSE;
176 int pos = _find_language_info(language, _language_vector);
178 // the assigned language could not be found in the language info vector
179 if (pos < 0 || pos >= (int)_language_vector.size()) {
183 LANGUAGE_INFO &info = _language_vector.at(pos);
184 info.enabled_temporarily = temporarily;
186 ret = do_select_language(pos);
189 ret = select_next_language();
195 ISELanguageManager::select_current_language()
197 sclboolean ret = FALSE;
198 ret = do_select_language(_current_language);
204 ISELanguageManager::select_next_language()
206 sclboolean ret = FALSE;
208 // do some work before change to next language
209 // eg: commit preedit string...
210 ret = do_unselect_language(_current_language);
217 if (_current_language == (int)_language_vector.size()-1) {
220 next_pos = _current_language + 1;
222 assert(next_pos >= 0 && next_pos < (int)_language_vector.size());
224 // select next language
225 // the next one may be not enabled, so the loop below is to search afterwards
226 // continually until find an enabled one
227 // example: if current index is 5, the search order is:
228 // 5, 6, 7, 8, max, 0, 1, 2, 3, 4
229 sclboolean b_select_ok = FALSE;
230 for (int i = next_pos; i < (int)_language_vector.size(); ++i) {
231 b_select_ok = do_select_language(i);
232 if (b_select_ok == TRUE) {
237 if (b_select_ok == FALSE) {
238 for (int i = 0; i < next_pos; ++i) {
239 b_select_ok = do_select_language(i);
240 if (b_select_ok == TRUE) {
251 ISELanguageManager::select_previous_language()
253 sclboolean ret = FALSE;
255 // do some work before change to previous language
256 // eg: commit predit string...
257 ret = do_unselect_language(_current_language);
262 // get previous position
264 assert(_current_language >= 0 && _current_language < (int)_language_vector.size());
265 if (_current_language == 0) {
266 pre_pos = _language_vector.size() -1;
268 pre_pos = _current_language -1;
270 assert(pre_pos >= 0 && pre_pos < (int)_language_vector.size());
272 // select previous language
273 // the previous one may be not enabled, so the loop below is to search forwards
274 // continually until find an enabled one
275 // example: if current index is 5, the search order is:
276 // 5, 4, 3, 2, 1, 0, max, max-1, ...4
277 sclboolean b_select_ok = FALSE;
278 for (int i = pre_pos; i >= 0; --i) {
279 b_select_ok = do_select_language(i);
280 if (b_select_ok == TRUE) {
284 if (b_select_ok == FALSE) {
285 for (int i = _language_vector.size() -1; i > pre_pos; --i) {
286 b_select_ok = do_select_language(i);
287 if (b_select_ok == TRUE) {
298 ISELanguageManager::reset_language(const sclchar *name)
300 sclboolean ret = FALSE;
302 if (name == NULL) return FALSE;
303 int pos = _find_language_info(name, _language_vector);
305 // the assigned language could not be found in the language info vector
306 if (pos < 0 || pos >= (int)_language_vector.size()) {
310 // if the language is not the one currently selected
311 if (pos != _current_language) {
315 LANGUAGE_INFO &language_info = _language_vector.at(pos);
316 // if not enabled and not temporary, return false
317 if (!language_info.enabled && !language_info.enabled_temporarily) {
321 // run the callback function
322 ILanguageCallback *callback = language_info.callback;
324 ret = callback->reset_language(get_current_language());
330 sclboolean ISELanguageManager::set_language_enabled(const sclchar *name, sclboolean enabled)
332 sclboolean ret = FALSE;
335 for (vector<LANGUAGE_INFO>::iterator iter = _language_vector.begin();
336 iter != _language_vector.end() && !ret;advance(iter, 1)) {
337 if (iter->name.length() > 0) {
338 if (iter->name.compare(name) == 0) {
339 iter->enabled = enabled;
349 sclboolean ISELanguageManager::set_language_enabled_temporarily(const sclchar *name, sclboolean enabled_temporarily)
351 sclboolean ret = FALSE;
354 for (vector<LANGUAGE_INFO>::iterator iter = _language_vector.begin();
355 iter != _language_vector.end() && !ret;advance(iter, 1)) {
356 if (iter->name.length() > 0) {
357 if (iter->name.compare(name) == 0) {
358 iter->enabled_temporarily = enabled_temporarily;
369 ISELanguageManager::enable_languages(const vector<string> &vec_language_id)
371 sclboolean ret = FALSE;
373 if (vec_language_id.size() != 0) {
374 ret = set_all_languages_enabled(FALSE);
376 if (ret == FALSE) return ret;
378 vector<string>::const_iterator citer;
379 for (citer = vec_language_id.begin(); citer != vec_language_id.end(); ++citer) {
380 ret = set_language_enabled(citer->c_str(), TRUE);
381 if (ret == FALSE) return FALSE;
388 /* FIXME A temporary way for enable default language */
389 sclboolean ISELanguageManager::enable_default_language()
391 if (!_language_vector.empty()) {
392 LANGUAGE_INFO &default_language = _language_vector.at(0);
393 default_language.enabled = TRUE;
394 default_language.enabled_temporarily = FALSE;
401 sclboolean ISELanguageManager::set_enabled_languages(const vector<string> &vec_language_id)
403 sclboolean ret = FALSE;
405 if (vec_language_id.empty() || FALSE == enable_languages(vec_language_id)) {
406 ret = enable_default_language();
412 const sclchar* ISELanguageManager::get_current_language()
414 if (_current_language >= 0 && _current_language < (int)_language_vector.size()) {
415 return _language_vector.at(_current_language).name.c_str();
420 const sclchar* ISELanguageManager::get_previous_language()
422 // get previous position
424 assert(_current_language >= 0 && _current_language < (int)_language_vector.size());
425 if (_current_language == 0) {
426 pre_pos = _language_vector.size() -1;
428 pre_pos = _current_language -1;
430 assert(pre_pos >= 0 && pre_pos < (int)_language_vector.size());
432 // select previous language
433 // the previous one may be not enabled, so the loop below is to search forwards
434 // continually until find an enabled one
435 // example: if current index is 5, the search order is:
436 // 5, 4, 3, 2, 1, 0, max, max-1, ...4
437 sclboolean b_select_ok = FALSE;
438 for (int i = pre_pos; i >= 0; --i) {
439 if (_language_vector.at(i).enabled) {
441 LANGUAGE_INFO &info = _language_vector.at(i);
442 return info.display_name.c_str();
445 if (b_select_ok == FALSE) {
446 for (int i = _language_vector.size() -1; i > pre_pos; --i) {
447 if (_language_vector.at(i).enabled) {
448 LANGUAGE_INFO &info = _language_vector.at(i);
449 return info.display_name.c_str();
456 const sclchar* ISELanguageManager::get_next_language()
460 if (_current_language == (int)_language_vector.size()-1) {
463 next_pos = _current_language + 1;
465 assert(next_pos >= 0 && next_pos < (int)_language_vector.size());
467 // select next language
468 // the next one may be not enabled, so the loop below is to search afterwards
469 // continually until find an enabled one
470 // example: if current index is 5, the search order is:
471 // 5, 6, 7, 8, max, 0, 1, 2, 3, 4
472 sclboolean b_select_ok = FALSE;
473 for (int i = next_pos; i < (int)_language_vector.size(); ++i) {
474 if (_language_vector.at(i).enabled) {
476 LANGUAGE_INFO &info = _language_vector.at(i);
477 return info.display_name.c_str();
481 if (b_select_ok == FALSE) {
482 for (int i = 0; i < next_pos; ++i) {
483 if (_language_vector.at(i).enabled) {
484 LANGUAGE_INFO &info = _language_vector.at(i);
485 return info.display_name.c_str();
492 const sclchar* ISELanguageManager::get_resource_file_path()
494 return _default_resource_file.c_str();
497 bool ISELanguageManager::set_resource_file_path(const char *resource_file)
499 if (NULL == resource_file) {
502 _default_resource_file = resource_file;
506 scluint ISELanguageManager::get_languages_num()
508 return _language_vector.size();
511 scluint ISELanguageManager::get_enabled_languages_num()
515 for (vector<LANGUAGE_INFO>::iterator iter = _language_vector.begin();
516 iter != _language_vector.end();advance(iter, 1)) {
517 if (iter->enabled || iter->enabled_temporarily) {
525 LANGUAGE_INFO* ISELanguageManager::get_language_info(const sclchar *language_name)
527 vector<LANGUAGE_INFO>::iterator it;
529 it = std::find_if(_language_vector.begin(), _language_vector.end(), _language_info_finder(language_name));
531 if (it != _language_vector.end()) {
537 LANGUAGE_INFO* ISELanguageManager::get_language_info(int index)
539 LANGUAGE_INFO *ret = NULL;
541 if (index >= 0 && index < (int)_language_vector.size()) {
542 ret = &(_language_vector.at(index));
548 LANGUAGE_INFO* ISELanguageManager::get_current_language_info()
550 return get_language_info(_current_language);