ea19a3231f3766e88d3758dde7938acb8578a325
[profile/ivi/isf.git] / ism / src / scim_imengine.cpp
1 /** @file scim_imengine.cpp
2  *  @brief Implementation of class IMEngineFactoryBase and IMEngineInstanceBase.
3  */
4
5 /* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
6
7 /*
8  * Smart Common Input Method
9  *
10  * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
11  *
12  *
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.
17  *
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.
22  *
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
27  *
28  * $Id: scim_imengine.cpp,v 1.15 2005/04/08 15:24:11 suzhe Exp $
29  *
30  */
31
32 #define Uses_SCIM_IMENGINE
33 #define Uses_C_CTYPE
34
35 #include "scim_private.h"
36 #include "scim.h"
37
38 namespace scim {
39
40 typedef Signal1<void, IMEngineInstanceBase*>
41         IMEngineSignalVoid;
42
43 typedef Signal2<void, IMEngineInstanceBase*,int>
44         IMEngineSignalInt;
45
46 typedef Signal2<void, IMEngineInstanceBase*,bool>
47         IMEngineSignalBool;
48
49 typedef Signal2<void, IMEngineInstanceBase*,const String&>
50         IMEngineSignalString;
51
52 typedef Signal2<void, IMEngineInstanceBase*,const WideString&>
53         IMEngineSignalWideString;
54
55 typedef Signal2<void, IMEngineInstanceBase*,const KeyEvent&>
56         IMEngineSignalKeyEvent;
57
58 typedef Signal2<void, IMEngineInstanceBase*,const Property&>
59         IMEngineSignalProperty;
60
61 typedef Signal2<void, IMEngineInstanceBase*,const PropertyList&>
62         IMEngineSignalPropertyList;
63
64 typedef Signal2<void, IMEngineInstanceBase*,const LookupTable&>
65         IMEngineSignalLookupTable;
66
67 typedef Signal3<void, IMEngineInstanceBase*,const String&,const Transaction&>
68         IMEngineSignalStringTransaction;
69
70 typedef Signal3<void, IMEngineInstanceBase*,const WideString&,const AttributeList&>
71         IMEngineSignalWideStringAttributeList;
72
73 typedef Signal5<bool, IMEngineInstanceBase*,WideString&,int&,int,int>
74         IMEngineSignalGetSurroundingText;
75
76 typedef Signal3<bool, IMEngineInstanceBase*,int,int>
77         IMEngineSignalDeleteSurroundingText;
78
79 class IMEngineFactoryBase::IMEngineFactoryBaseImpl
80 {
81 public:
82     std::vector<String> m_encoding_list;
83     std::vector<String> m_locale_list;
84     String              m_language;
85 };
86
87 class IMEngineInstanceBase::IMEngineInstanceBaseImpl
88 {
89 public:
90     IMEngineFactoryPointer                m_factory;
91     String                                m_encoding;
92
93     IMEngineSignalVoid                    m_signal_show_preedit_string;
94     IMEngineSignalVoid                    m_signal_show_aux_string;
95     IMEngineSignalVoid                    m_signal_show_lookup_table;
96
97     IMEngineSignalVoid                    m_signal_hide_preedit_string;
98     IMEngineSignalVoid                    m_signal_hide_aux_string;
99     IMEngineSignalVoid                    m_signal_hide_lookup_table;
100
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;
106
107     IMEngineSignalKeyEvent                m_signal_forward_key_event;
108
109     IMEngineSignalPropertyList            m_signal_register_properties;
110     IMEngineSignalProperty                m_signal_update_property;
111
112     IMEngineSignalVoid                    m_signal_beep;
113
114     IMEngineSignalString                  m_signal_start_helper;
115     IMEngineSignalString                  m_signal_stop_helper;
116     IMEngineSignalStringTransaction       m_signal_send_helper_event;
117
118     IMEngineSignalGetSurroundingText      m_signal_get_surrounding_text;
119     IMEngineSignalDeleteSurroundingText   m_signal_delete_surrounding_text;
120
121
122     int    m_id;
123     void * m_frontend_data;
124
125     IMEngineInstanceBaseImpl () : m_id (0), m_frontend_data (0) { }
126 };
127
128 IMEngineFactoryBase::IMEngineFactoryBase ()
129     : m_impl (new IMEngineFactoryBaseImpl ())
130 {
131 }
132
133 IMEngineFactoryBase::~IMEngineFactoryBase ()
134 {
135     delete m_impl;
136 }
137
138 bool
139 IMEngineFactoryBase::validate_encoding (const String& encoding) const
140 {
141     if (encoding == "UTF-8")
142         return true;
143
144     for (size_t i=0; i<m_impl->m_encoding_list.size (); ++i)
145         if (m_impl->m_encoding_list [i] == encoding)
146             return true;
147
148     return false;
149 }
150
151 bool
152 IMEngineFactoryBase::validate_locale (const String& locale) const
153 {
154     for (size_t i=0; i<m_impl->m_locale_list.size (); ++i)
155         if (m_impl->m_locale_list [i] == locale)
156             return true;
157
158     if (scim_get_locale_encoding (locale) == "UTF-8")
159         return true;
160
161     return false;
162 }
163
164 String
165 IMEngineFactoryBase::get_language () const
166 {
167     return m_impl->m_language;
168 }
169
170 WideString
171 IMEngineFactoryBase::inverse_query (const WideString &str)
172 {
173     return WideString ();
174 }
175
176 void
177 IMEngineFactoryBase::load_resource ()
178 {
179     return ;
180 }
181
182 String
183 IMEngineFactoryBase::get_encodings () const
184 {
185     return scim_combine_string_list (m_impl->m_encoding_list);
186 }
187
188 String
189 IMEngineFactoryBase::get_locales () const
190 {
191     return scim_combine_string_list (m_impl->m_locale_list);
192 }
193
194 String
195 IMEngineFactoryBase::get_default_encoding () const
196 {
197     if (m_impl->m_encoding_list.size ())
198         return m_impl->m_encoding_list [0];
199     return String ("UTF-8");
200 }
201
202 String
203 IMEngineFactoryBase::get_default_locale () const
204 {
205     if (m_impl->m_locale_list.size ())
206         return m_impl->m_locale_list [0];
207     return String ("");
208 }
209
210 void
211 IMEngineFactoryBase::set_locales (const String& locales)
212 {
213     m_impl->m_locale_list.clear ();
214     m_impl->m_encoding_list.clear ();
215
216     if (locales.size () == 0) return;
217
218     String locale;
219     std::vector <String> lc_list;
220
221     scim_split_string_list (lc_list, locales);
222
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));
228         }
229     }
230
231     m_impl->m_language = scim_get_locale_language (get_default_locale ());
232 }
233
234 void
235 IMEngineFactoryBase::set_languages (const String& languages)
236 {
237     std::vector <String> lang_list;
238     String locales;
239     String all_locales;
240     std::vector<String> valid_langlist;
241     String valid_lang;
242
243     scim_split_string_list (lang_list, languages, ',');
244
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;
251         }
252     }
253
254     if (all_locales.length ())
255         set_locales (all_locales);
256
257     if (lang_list.size ())
258     {
259         for(size_t i = 0;i<lang_list.size();i++)
260         {
261             valid_lang = scim_validate_language (lang_list [i]);
262             valid_langlist.push_back(valid_lang);
263         }
264         m_impl->m_language = scim_combine_string_list (valid_langlist);
265     }
266 }
267
268 IMEngineInstanceBase::IMEngineInstanceBase (IMEngineFactoryBase *factory,
269                                             const String        &encoding,
270                                             int                  id)
271     : m_impl (new IMEngineInstanceBaseImpl ())
272 {
273     m_impl->m_factory = factory;
274     m_impl->m_encoding = encoding;
275     m_impl->m_id = id;
276
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 ();
280         }
281     } else {
282         m_impl->m_encoding = String ("UTF-8");
283     }
284 }
285
286 IMEngineInstanceBase::~IMEngineInstanceBase ()
287 {
288     delete m_impl;
289 }
290
291 bool
292 IMEngineInstanceBase::set_encoding (const String &encoding)
293 {
294     if (!m_impl->m_factory.null () && m_impl->m_factory->validate_encoding (encoding)) {
295         m_impl->m_encoding = encoding;
296         return true;
297     }
298     return false;
299 }
300
301 String
302 IMEngineInstanceBase::get_encoding () const
303 {
304     return m_impl->m_encoding;
305 }
306
307 int
308 IMEngineInstanceBase::get_id () const
309 {
310     return m_impl->m_id;
311 }
312
313 String
314 IMEngineInstanceBase::get_factory_uuid () const
315 {
316     if (!m_impl->m_factory.null ())
317         return m_impl->m_factory->get_uuid ();
318
319     return String ();
320 }
321
322 void
323 IMEngineInstanceBase::set_frontend_data (void *data)
324 {
325     m_impl->m_frontend_data = data;
326 }
327
328 void *
329 IMEngineInstanceBase::get_frontend_data (void)
330 {
331     return m_impl->m_frontend_data;
332 }
333
334 void
335 IMEngineInstanceBase::move_preedit_caret (unsigned int)
336 {
337 }
338
339 void
340 IMEngineInstanceBase::select_aux (unsigned int)
341 {
342 }
343
344 void
345 IMEngineInstanceBase::select_candidate (unsigned int)
346 {
347 }
348
349 void
350 IMEngineInstanceBase::update_lookup_table_page_size (unsigned int)
351 {
352 }
353
354 void
355 IMEngineInstanceBase::lookup_table_page_up ()
356 {
357 }
358
359 void
360 IMEngineInstanceBase::lookup_table_page_down ()
361 {
362 }
363
364 void
365 IMEngineInstanceBase::reset_option ()
366 {
367 }
368
369 void
370 IMEngineInstanceBase::reset ()
371 {
372 }
373
374 void
375 IMEngineInstanceBase::focus_in ()
376 {
377 }
378
379 void
380 IMEngineInstanceBase::focus_out ()
381 {
382 }
383
384 void
385 IMEngineInstanceBase::trigger_property (const String &)
386 {
387 }
388
389 void
390 IMEngineInstanceBase::process_helper_event (const String &, const Transaction &)
391 {
392 }
393
394 void
395 IMEngineInstanceBase::update_client_capabilities (unsigned int /*cap*/)
396 {
397 }
398
399 Connection
400 IMEngineInstanceBase::signal_connect_show_preedit_string (IMEngineSlotVoid *slot)
401 {
402     return m_impl->m_signal_show_preedit_string.connect (slot);
403 }
404
405 Connection
406 IMEngineInstanceBase::signal_connect_show_aux_string (IMEngineSlotVoid *slot)
407 {
408     return m_impl->m_signal_show_aux_string.connect (slot);
409 }
410
411 Connection
412 IMEngineInstanceBase::signal_connect_show_lookup_table (IMEngineSlotVoid *slot)
413 {
414     return m_impl->m_signal_show_lookup_table.connect (slot);
415 }
416
417 Connection
418 IMEngineInstanceBase::signal_connect_hide_preedit_string (IMEngineSlotVoid *slot)
419 {
420     return m_impl->m_signal_hide_preedit_string.connect (slot);
421 }
422
423 Connection
424 IMEngineInstanceBase::signal_connect_hide_aux_string (IMEngineSlotVoid *slot)
425 {
426     return m_impl->m_signal_hide_aux_string.connect (slot);
427 }
428
429 Connection
430 IMEngineInstanceBase::signal_connect_hide_lookup_table (IMEngineSlotVoid *slot)
431 {
432     return m_impl->m_signal_hide_lookup_table.connect (slot);
433 }
434
435 Connection
436 IMEngineInstanceBase::signal_connect_update_preedit_caret (IMEngineSlotInt *slot)
437 {
438     return m_impl->m_signal_update_preedit_caret.connect (slot);
439 }
440
441 Connection
442 IMEngineInstanceBase::signal_connect_update_preedit_string (IMEngineSlotWideStringAttributeList *slot)
443 {
444     return m_impl->m_signal_update_preedit_string.connect (slot);
445 }
446
447 Connection
448 IMEngineInstanceBase::signal_connect_update_aux_string (IMEngineSlotWideStringAttributeList *slot)
449 {
450     return m_impl->m_signal_update_aux_string.connect (slot);
451 }
452
453 Connection
454 IMEngineInstanceBase::signal_connect_update_lookup_table (IMEngineSlotLookupTable *slot)
455 {
456     return m_impl->m_signal_update_lookup_table.connect (slot);
457 }
458
459 Connection
460 IMEngineInstanceBase::signal_connect_commit_string (IMEngineSlotWideString *slot)
461 {
462     return m_impl->m_signal_commit_string.connect (slot);
463 }
464
465 Connection
466 IMEngineInstanceBase::signal_connect_forward_key_event (IMEngineSlotKeyEvent *slot)
467 {
468     return m_impl->m_signal_forward_key_event.connect (slot);
469 }
470
471 Connection
472 IMEngineInstanceBase::signal_connect_register_properties (IMEngineSlotPropertyList *slot)
473 {
474     return m_impl->m_signal_register_properties.connect (slot);
475 }
476
477 Connection
478 IMEngineInstanceBase::signal_connect_update_property (IMEngineSlotProperty *slot)
479 {
480     return m_impl->m_signal_update_property.connect (slot);
481 }
482
483 Connection
484 IMEngineInstanceBase::signal_connect_beep (IMEngineSlotVoid *slot)
485 {
486     return m_impl->m_signal_beep.connect (slot);
487 }
488
489 Connection
490 IMEngineInstanceBase::signal_connect_start_helper (IMEngineSlotString *slot)
491 {
492     return m_impl->m_signal_start_helper.connect (slot);
493 }
494
495 Connection
496 IMEngineInstanceBase::signal_connect_stop_helper (IMEngineSlotString *slot)
497 {
498     return m_impl->m_signal_stop_helper.connect (slot);
499 }
500
501 Connection
502 IMEngineInstanceBase::signal_connect_send_helper_event (IMEngineSlotStringTransaction *slot)
503 {
504     return m_impl->m_signal_send_helper_event.connect (slot);
505 }
506
507 Connection
508 IMEngineInstanceBase::signal_connect_get_surrounding_text (IMEngineSlotGetSurroundingText *slot)
509 {
510     return m_impl->m_signal_get_surrounding_text.connect (slot);
511 }
512
513 Connection
514 IMEngineInstanceBase::signal_connect_delete_surrounding_text (IMEngineSlotDeleteSurroundingText *slot)
515 {
516     return m_impl->m_signal_delete_surrounding_text.connect (slot);
517 }
518
519 void
520 IMEngineInstanceBase::show_preedit_string ()
521 {
522     m_impl->m_signal_show_preedit_string (this);
523 }
524
525 void
526 IMEngineInstanceBase::show_aux_string ()
527 {
528     m_impl->m_signal_show_aux_string (this);
529 }
530
531 void
532 IMEngineInstanceBase::show_lookup_table ()
533 {
534     m_impl->m_signal_show_lookup_table (this);
535 }
536
537 void
538 IMEngineInstanceBase::hide_preedit_string ()
539 {
540     m_impl->m_signal_hide_preedit_string (this);
541 }
542
543 void
544 IMEngineInstanceBase::hide_aux_string ()
545 {
546     m_impl->m_signal_hide_aux_string (this);
547 }
548
549 void
550 IMEngineInstanceBase::hide_lookup_table ()
551 {
552     m_impl->m_signal_hide_lookup_table (this);
553 }
554
555 void
556 IMEngineInstanceBase::update_preedit_caret (int caret)
557 {
558     m_impl->m_signal_update_preedit_caret (this, caret);
559 }
560
561 void
562 IMEngineInstanceBase::update_preedit_string (const WideString    &str,
563                                              const AttributeList &attrs)
564 {
565     m_impl->m_signal_update_preedit_string (this, str, attrs);
566 }
567
568 void
569 IMEngineInstanceBase::update_aux_string (const WideString    &str,
570                                          const AttributeList &attrs)
571 {
572     m_impl->m_signal_update_aux_string (this, str, attrs);
573 }
574
575 void
576 IMEngineInstanceBase::update_lookup_table (const LookupTable &table)
577 {
578     m_impl->m_signal_update_lookup_table (this, table);
579 }
580
581 void
582 IMEngineInstanceBase::commit_string (const WideString &str)
583 {
584     m_impl->m_signal_commit_string (this, str);
585 }
586
587 void
588 IMEngineInstanceBase::forward_key_event (const KeyEvent &key)
589 {
590     m_impl->m_signal_forward_key_event (this, key);
591 }
592
593 void
594 IMEngineInstanceBase::register_properties (const PropertyList &properties)
595 {
596     m_impl->m_signal_register_properties (this, properties);
597 }
598
599 void
600 IMEngineInstanceBase::update_property (const Property &property)
601 {
602     m_impl->m_signal_update_property (this, property);
603 }
604
605 void
606 IMEngineInstanceBase::beep ()
607 {
608     m_impl->m_signal_beep (this);
609 }
610
611 void
612 IMEngineInstanceBase::start_helper (const String &helper_uuid)
613 {
614     m_impl->m_signal_start_helper (this, helper_uuid);
615 }
616
617 void
618 IMEngineInstanceBase::stop_helper (const String &helper_uuid)
619 {
620     m_impl->m_signal_stop_helper (this, helper_uuid);
621 }
622
623 void
624 IMEngineInstanceBase::send_helper_event (const String &helper_uuid, const Transaction &trans)
625 {
626     m_impl->m_signal_send_helper_event (this, helper_uuid, trans);
627 }
628
629 bool
630 IMEngineInstanceBase::get_surrounding_text (WideString &text, int &cursor, int maxlen_before, int maxlen_after)
631 {
632     text = WideString ();
633     cursor = 0;
634
635     if (maxlen_before == 0 && maxlen_after == 0)
636         return false;
637
638     if (m_impl->m_signal_get_surrounding_text (this, text, cursor, maxlen_before, maxlen_after) && text.length ())
639         return true;
640
641     return false;
642 }
643
644 bool
645 IMEngineInstanceBase::delete_surrounding_text (int offset, int len)
646 {
647     return m_impl->m_signal_delete_surrounding_text (this, offset, len);
648 }
649
650 // implementation of DummyIMEngine
651 DummyIMEngineFactory::DummyIMEngineFactory ()
652 {
653     set_locales ("C");
654 }
655
656 DummyIMEngineFactory::~DummyIMEngineFactory ()
657 {
658 }
659
660 WideString
661 DummyIMEngineFactory::get_name () const
662 {
663     return utf8_mbstowcs (_("English/Keyboard"));
664 }
665
666 WideString
667 DummyIMEngineFactory::get_authors () const
668 {
669     return WideString ();
670 }
671
672 WideString
673 DummyIMEngineFactory::get_credits () const
674 {
675     return WideString ();
676 }
677
678 WideString
679 DummyIMEngineFactory::get_help () const
680 {
681     return WideString ();
682 }
683
684 String
685 DummyIMEngineFactory::get_uuid () const
686 {
687     return String ("0148bcec-850d-45f2-ba95-a493bb31492e");
688 }
689
690 String
691 DummyIMEngineFactory::get_icon_file () const
692 {
693     return String (SCIM_KEYBOARD_ICON_FILE);
694 }
695
696 bool
697 DummyIMEngineFactory::validate_encoding (const String& encoding) const
698 {
699     return true;
700 }
701
702 bool
703 DummyIMEngineFactory::validate_locale (const String& locale) const
704 {
705     return true;
706 }
707
708 IMEngineInstancePointer
709 DummyIMEngineFactory::create_instance (const String& encoding, int id)
710 {
711     return new DummyIMEngineInstance (this, encoding, id);
712 }
713
714 DummyIMEngineInstance::DummyIMEngineInstance (DummyIMEngineFactory *factory,
715                                         const String& encoding,
716                                         int id)
717     : IMEngineInstanceBase (factory, encoding, id)
718 {
719 }
720
721 DummyIMEngineInstance::~DummyIMEngineInstance ()
722 {
723 }
724
725 bool
726 DummyIMEngineInstance::process_key_event (const KeyEvent& key)
727 {
728     return false;
729 }
730
731 void
732 DummyIMEngineInstance::focus_in ()
733 {
734     register_properties (PropertyList ());
735 }
736
737 } // namespace scim
738
739 /*
740 vi:ts=4:nowrap:ai:expandtab
741 */