1 /** @file scim_imengine.cpp
2 * @brief Implementation of class IMEngineFactoryBase and IMEngineInstanceBase.
5 /* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
8 * Smart Common Input Method
10 * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2 of the License, or (at your option) any later version.
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this program; if not, write to the
25 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
26 * Boston, MA 02111-1307 USA
28 * $Id: scim_imengine.cpp,v 1.15 2005/04/08 15:24:11 suzhe Exp $
32 #define Uses_SCIM_IMENGINE
35 #include "scim_private.h"
40 typedef Signal1<void, IMEngineInstanceBase*>
43 typedef Signal2<void, IMEngineInstanceBase*,int>
46 typedef Signal2<void, IMEngineInstanceBase*,bool>
49 typedef Signal2<void, IMEngineInstanceBase*,const String&>
52 typedef Signal2<void, IMEngineInstanceBase*,const WideString&>
53 IMEngineSignalWideString;
55 typedef Signal2<void, IMEngineInstanceBase*,const KeyEvent&>
56 IMEngineSignalKeyEvent;
58 typedef Signal2<void, IMEngineInstanceBase*,const Property&>
59 IMEngineSignalProperty;
61 typedef Signal2<void, IMEngineInstanceBase*,const PropertyList&>
62 IMEngineSignalPropertyList;
64 typedef Signal2<void, IMEngineInstanceBase*,const LookupTable&>
65 IMEngineSignalLookupTable;
67 typedef Signal3<void, IMEngineInstanceBase*,const String&,const Transaction&>
68 IMEngineSignalStringTransaction;
70 typedef Signal3<void, IMEngineInstanceBase*,const WideString&,const AttributeList&>
71 IMEngineSignalWideStringAttributeList;
73 typedef Signal5<bool, IMEngineInstanceBase*,WideString&,int&,int,int>
74 IMEngineSignalGetSurroundingText;
76 typedef Signal3<bool, IMEngineInstanceBase*,int,int>
77 IMEngineSignalDeleteSurroundingText;
79 class IMEngineFactoryBase::IMEngineFactoryBaseImpl
82 std::vector<String> m_encoding_list;
83 std::vector<String> m_locale_list;
87 class IMEngineInstanceBase::IMEngineInstanceBaseImpl
90 IMEngineFactoryPointer m_factory;
93 IMEngineSignalVoid m_signal_show_preedit_string;
94 IMEngineSignalVoid m_signal_show_aux_string;
95 IMEngineSignalVoid m_signal_show_lookup_table;
97 IMEngineSignalVoid m_signal_hide_preedit_string;
98 IMEngineSignalVoid m_signal_hide_aux_string;
99 IMEngineSignalVoid m_signal_hide_lookup_table;
101 IMEngineSignalInt m_signal_update_preedit_caret;
102 IMEngineSignalWideStringAttributeList m_signal_update_preedit_string;
103 IMEngineSignalWideStringAttributeList m_signal_update_aux_string;
104 IMEngineSignalWideString m_signal_commit_string;
105 IMEngineSignalLookupTable m_signal_update_lookup_table;
107 IMEngineSignalKeyEvent m_signal_forward_key_event;
109 IMEngineSignalPropertyList m_signal_register_properties;
110 IMEngineSignalProperty m_signal_update_property;
112 IMEngineSignalVoid m_signal_beep;
114 IMEngineSignalString m_signal_start_helper;
115 IMEngineSignalString m_signal_stop_helper;
116 IMEngineSignalStringTransaction m_signal_send_helper_event;
118 IMEngineSignalGetSurroundingText m_signal_get_surrounding_text;
119 IMEngineSignalDeleteSurroundingText m_signal_delete_surrounding_text;
123 void * m_frontend_data;
125 IMEngineInstanceBaseImpl () : m_id (0), m_frontend_data (0) { }
128 IMEngineFactoryBase::IMEngineFactoryBase ()
129 : m_impl (new IMEngineFactoryBaseImpl ())
133 IMEngineFactoryBase::~IMEngineFactoryBase ()
139 IMEngineFactoryBase::validate_encoding (const String& encoding) const
141 if (encoding == "UTF-8")
144 for (size_t i=0; i<m_impl->m_encoding_list.size (); ++i)
145 if (m_impl->m_encoding_list [i] == encoding)
152 IMEngineFactoryBase::validate_locale (const String& locale) const
154 for (size_t i=0; i<m_impl->m_locale_list.size (); ++i)
155 if (m_impl->m_locale_list [i] == locale)
158 if (scim_get_locale_encoding (locale) == "UTF-8")
165 IMEngineFactoryBase::get_language () const
167 return m_impl->m_language;
171 IMEngineFactoryBase::inverse_query (const WideString &str)
173 return WideString ();
177 IMEngineFactoryBase::load_resource ()
183 IMEngineFactoryBase::get_encodings () const
185 return scim_combine_string_list (m_impl->m_encoding_list);
189 IMEngineFactoryBase::get_locales () const
191 return scim_combine_string_list (m_impl->m_locale_list);
195 IMEngineFactoryBase::get_default_encoding () const
197 if (m_impl->m_encoding_list.size ())
198 return m_impl->m_encoding_list [0];
199 return String ("UTF-8");
203 IMEngineFactoryBase::get_default_locale () const
205 if (m_impl->m_locale_list.size ())
206 return m_impl->m_locale_list [0];
211 IMEngineFactoryBase::set_locales (const String& locales)
213 m_impl->m_locale_list.clear ();
214 m_impl->m_encoding_list.clear ();
216 if (locales.size () == 0) return;
219 std::vector <String> lc_list;
221 scim_split_string_list (lc_list, locales);
223 for (size_t i=0; i<lc_list.size (); ++i) {
224 locale = scim_validate_locale (lc_list [i]);
225 if (locale.length ()) {
226 m_impl->m_locale_list.push_back (locale);
227 m_impl->m_encoding_list.push_back (scim_get_locale_encoding (locale));
231 m_impl->m_language = scim_get_locale_language (get_default_locale ());
235 IMEngineFactoryBase::set_languages (const String& languages)
237 std::vector <String> lang_list;
240 std::vector<String> valid_langlist;
243 scim_split_string_list (lang_list, languages, ',');
245 for (size_t i = 0; i < lang_list.size (); ++ i) {
246 locales = scim_get_language_locales (lang_list [i]);
247 if (locales.length ()) {
248 if (all_locales.length ())
249 all_locales.push_back (',');
250 all_locales += locales;
254 if (all_locales.length ())
255 set_locales (all_locales);
257 if (lang_list.size ())
259 for(size_t i = 0;i<lang_list.size();i++)
261 valid_lang = scim_validate_language (lang_list [i]);
262 valid_langlist.push_back(valid_lang);
264 m_impl->m_language = scim_combine_string_list (valid_langlist);
268 IMEngineInstanceBase::IMEngineInstanceBase (IMEngineFactoryBase *factory,
269 const String &encoding,
271 : m_impl (new IMEngineInstanceBaseImpl ())
273 m_impl->m_factory = factory;
274 m_impl->m_encoding = encoding;
277 if (!m_impl->m_factory.null ()) {
278 if (!m_impl->m_factory->validate_encoding (encoding)) {
279 m_impl->m_encoding = m_impl->m_factory->get_default_encoding ();
282 m_impl->m_encoding = String ("UTF-8");
286 IMEngineInstanceBase::~IMEngineInstanceBase ()
292 IMEngineInstanceBase::set_encoding (const String &encoding)
294 if (!m_impl->m_factory.null () && m_impl->m_factory->validate_encoding (encoding)) {
295 m_impl->m_encoding = encoding;
302 IMEngineInstanceBase::get_encoding () const
304 return m_impl->m_encoding;
308 IMEngineInstanceBase::get_id () const
314 IMEngineInstanceBase::get_factory_uuid () const
316 if (!m_impl->m_factory.null ())
317 return m_impl->m_factory->get_uuid ();
323 IMEngineInstanceBase::set_frontend_data (void *data)
325 m_impl->m_frontend_data = data;
329 IMEngineInstanceBase::get_frontend_data (void)
331 return m_impl->m_frontend_data;
335 IMEngineInstanceBase::move_preedit_caret (unsigned int)
340 IMEngineInstanceBase::select_aux (unsigned int)
345 IMEngineInstanceBase::select_candidate (unsigned int)
350 IMEngineInstanceBase::update_lookup_table_page_size (unsigned int)
355 IMEngineInstanceBase::lookup_table_page_up ()
360 IMEngineInstanceBase::lookup_table_page_down ()
365 IMEngineInstanceBase::reset_option ()
370 IMEngineInstanceBase::reset ()
375 IMEngineInstanceBase::focus_in ()
380 IMEngineInstanceBase::focus_out ()
385 IMEngineInstanceBase::trigger_property (const String &)
390 IMEngineInstanceBase::process_helper_event (const String &, const Transaction &)
395 IMEngineInstanceBase::update_client_capabilities (unsigned int /*cap*/)
400 IMEngineInstanceBase::signal_connect_show_preedit_string (IMEngineSlotVoid *slot)
402 return m_impl->m_signal_show_preedit_string.connect (slot);
406 IMEngineInstanceBase::signal_connect_show_aux_string (IMEngineSlotVoid *slot)
408 return m_impl->m_signal_show_aux_string.connect (slot);
412 IMEngineInstanceBase::signal_connect_show_lookup_table (IMEngineSlotVoid *slot)
414 return m_impl->m_signal_show_lookup_table.connect (slot);
418 IMEngineInstanceBase::signal_connect_hide_preedit_string (IMEngineSlotVoid *slot)
420 return m_impl->m_signal_hide_preedit_string.connect (slot);
424 IMEngineInstanceBase::signal_connect_hide_aux_string (IMEngineSlotVoid *slot)
426 return m_impl->m_signal_hide_aux_string.connect (slot);
430 IMEngineInstanceBase::signal_connect_hide_lookup_table (IMEngineSlotVoid *slot)
432 return m_impl->m_signal_hide_lookup_table.connect (slot);
436 IMEngineInstanceBase::signal_connect_update_preedit_caret (IMEngineSlotInt *slot)
438 return m_impl->m_signal_update_preedit_caret.connect (slot);
442 IMEngineInstanceBase::signal_connect_update_preedit_string (IMEngineSlotWideStringAttributeList *slot)
444 return m_impl->m_signal_update_preedit_string.connect (slot);
448 IMEngineInstanceBase::signal_connect_update_aux_string (IMEngineSlotWideStringAttributeList *slot)
450 return m_impl->m_signal_update_aux_string.connect (slot);
454 IMEngineInstanceBase::signal_connect_update_lookup_table (IMEngineSlotLookupTable *slot)
456 return m_impl->m_signal_update_lookup_table.connect (slot);
460 IMEngineInstanceBase::signal_connect_commit_string (IMEngineSlotWideString *slot)
462 return m_impl->m_signal_commit_string.connect (slot);
466 IMEngineInstanceBase::signal_connect_forward_key_event (IMEngineSlotKeyEvent *slot)
468 return m_impl->m_signal_forward_key_event.connect (slot);
472 IMEngineInstanceBase::signal_connect_register_properties (IMEngineSlotPropertyList *slot)
474 return m_impl->m_signal_register_properties.connect (slot);
478 IMEngineInstanceBase::signal_connect_update_property (IMEngineSlotProperty *slot)
480 return m_impl->m_signal_update_property.connect (slot);
484 IMEngineInstanceBase::signal_connect_beep (IMEngineSlotVoid *slot)
486 return m_impl->m_signal_beep.connect (slot);
490 IMEngineInstanceBase::signal_connect_start_helper (IMEngineSlotString *slot)
492 return m_impl->m_signal_start_helper.connect (slot);
496 IMEngineInstanceBase::signal_connect_stop_helper (IMEngineSlotString *slot)
498 return m_impl->m_signal_stop_helper.connect (slot);
502 IMEngineInstanceBase::signal_connect_send_helper_event (IMEngineSlotStringTransaction *slot)
504 return m_impl->m_signal_send_helper_event.connect (slot);
508 IMEngineInstanceBase::signal_connect_get_surrounding_text (IMEngineSlotGetSurroundingText *slot)
510 return m_impl->m_signal_get_surrounding_text.connect (slot);
514 IMEngineInstanceBase::signal_connect_delete_surrounding_text (IMEngineSlotDeleteSurroundingText *slot)
516 return m_impl->m_signal_delete_surrounding_text.connect (slot);
520 IMEngineInstanceBase::show_preedit_string ()
522 m_impl->m_signal_show_preedit_string (this);
526 IMEngineInstanceBase::show_aux_string ()
528 m_impl->m_signal_show_aux_string (this);
532 IMEngineInstanceBase::show_lookup_table ()
534 m_impl->m_signal_show_lookup_table (this);
538 IMEngineInstanceBase::hide_preedit_string ()
540 m_impl->m_signal_hide_preedit_string (this);
544 IMEngineInstanceBase::hide_aux_string ()
546 m_impl->m_signal_hide_aux_string (this);
550 IMEngineInstanceBase::hide_lookup_table ()
552 m_impl->m_signal_hide_lookup_table (this);
556 IMEngineInstanceBase::update_preedit_caret (int caret)
558 m_impl->m_signal_update_preedit_caret (this, caret);
562 IMEngineInstanceBase::update_preedit_string (const WideString &str,
563 const AttributeList &attrs)
565 m_impl->m_signal_update_preedit_string (this, str, attrs);
569 IMEngineInstanceBase::update_aux_string (const WideString &str,
570 const AttributeList &attrs)
572 m_impl->m_signal_update_aux_string (this, str, attrs);
576 IMEngineInstanceBase::update_lookup_table (const LookupTable &table)
578 m_impl->m_signal_update_lookup_table (this, table);
582 IMEngineInstanceBase::commit_string (const WideString &str)
584 m_impl->m_signal_commit_string (this, str);
588 IMEngineInstanceBase::forward_key_event (const KeyEvent &key)
590 m_impl->m_signal_forward_key_event (this, key);
594 IMEngineInstanceBase::register_properties (const PropertyList &properties)
596 m_impl->m_signal_register_properties (this, properties);
600 IMEngineInstanceBase::update_property (const Property &property)
602 m_impl->m_signal_update_property (this, property);
606 IMEngineInstanceBase::beep ()
608 m_impl->m_signal_beep (this);
612 IMEngineInstanceBase::start_helper (const String &helper_uuid)
614 m_impl->m_signal_start_helper (this, helper_uuid);
618 IMEngineInstanceBase::stop_helper (const String &helper_uuid)
620 m_impl->m_signal_stop_helper (this, helper_uuid);
624 IMEngineInstanceBase::send_helper_event (const String &helper_uuid, const Transaction &trans)
626 m_impl->m_signal_send_helper_event (this, helper_uuid, trans);
630 IMEngineInstanceBase::get_surrounding_text (WideString &text, int &cursor, int maxlen_before, int maxlen_after)
632 text = WideString ();
635 if (maxlen_before == 0 && maxlen_after == 0)
638 if (m_impl->m_signal_get_surrounding_text (this, text, cursor, maxlen_before, maxlen_after) && text.length ())
645 IMEngineInstanceBase::delete_surrounding_text (int offset, int len)
647 return m_impl->m_signal_delete_surrounding_text (this, offset, len);
650 // implementation of DummyIMEngine
651 DummyIMEngineFactory::DummyIMEngineFactory ()
656 DummyIMEngineFactory::~DummyIMEngineFactory ()
661 DummyIMEngineFactory::get_name () const
663 return utf8_mbstowcs (_("English/Keyboard"));
667 DummyIMEngineFactory::get_authors () const
669 return WideString ();
673 DummyIMEngineFactory::get_credits () const
675 return WideString ();
679 DummyIMEngineFactory::get_help () const
681 return WideString ();
685 DummyIMEngineFactory::get_uuid () const
687 return String ("0148bcec-850d-45f2-ba95-a493bb31492e");
691 DummyIMEngineFactory::get_icon_file () const
693 return String (SCIM_KEYBOARD_ICON_FILE);
697 DummyIMEngineFactory::validate_encoding (const String& encoding) const
703 DummyIMEngineFactory::validate_locale (const String& locale) const
708 IMEngineInstancePointer
709 DummyIMEngineFactory::create_instance (const String& encoding, int id)
711 return new DummyIMEngineInstance (this, encoding, id);
714 DummyIMEngineInstance::DummyIMEngineInstance (DummyIMEngineFactory *factory,
715 const String& encoding,
717 : IMEngineInstanceBase (factory, encoding, id)
721 DummyIMEngineInstance::~DummyIMEngineInstance ()
726 DummyIMEngineInstance::process_key_event (const KeyEvent& key)
732 DummyIMEngineInstance::focus_in ()
734 register_properties (PropertyList ());
740 vi:ts=4:nowrap:ai:expandtab