This commit was manufactured by cvs2svn to create tag
[lyx.git] / src / intl.C
blobb96fc747a0d392e78b226b75fdbe589f2172a982
1 /* This file is part of
2  * ======================================================
3  * 
4  *           LyX, The Document Processor
5  *       
6  *           Copyright 1995 Matthias Ettrich
7  *           Copyright 1995-1999 The LyX Team.
8  *
9  * ======================================================*/
12  *      International support for LyX
13  */
15 #include <config.h>
17 #ifdef __GNUG__
18 #pragma implementation
19 #endif
21 #include FORMS_H_LOCATION
22 #include "intl.h"
23 #include "form1.h"
24 #include "tex-strings.h"
25 #include "combox.h"
26 #include "lyx_gui_misc.h" // CancelCloseBoxCB
27 #include "debug.h"
28 #include "lyxrc.h"
29 #include "trans_mgr.h"
30 #include "support/lstrings.h"
32 extern LyXRC* lyxrc;
34 // a wrapper around the callback static member.
35 extern "C" void C_Intl_DispatchCallback(FL_OBJECT *ob,long code);
38 Intl::Intl()
39         : prim_lang(lyxrc->primary_kbmap), 
40           sec_lang(lyxrc->secondary_kbmap),
41           trans(new TransManager)
43         keymapon = lyxrc->use_kbmap;
44         chsetcode = 0;
45         primarykeymap = false;
46         curkeymap = 0;
47         otherkeymap = 0;
51 Intl::~Intl()
56 int Intl::SetPrimary(string const & lang)
58         if (lyxerr.debugging(Debug::KBMAP))
59                 lyxerr << "Primary: `" << lang << "'" << endl;
60         return trans->SetPrimary(lang);
64 int Intl::SetSecondary(string const & lang)
66         if (lyxerr.debugging(Debug::KBMAP))
67                 lyxerr << "Secondary: `" << lang << "'" << endl;
68         return trans->SetSecondary(lang);
72 void Intl::update()
74         int off,prim,sec;
75         
76         off=prim=sec=0;
77         
78         if (!keymapon) {
79                 off=1;
80         } else {
81                 if (primarykeymap) {
82                         prim=1;
83                 } else {
84                         sec=1;
85                 }
86         }
87         
88         fl_set_button(fd_form_keymap->KeyOffBtn,off);
89         fl_set_button(fd_form_keymap->KeyOnBtn,prim);
90         fl_set_button(fd_form_keymap->KeyOnBtn2,sec);
94 void Intl::KeyMapOn(bool on)
95         /* turn on/off key mappings, status in keymapon */
97         keymapon = on;
99         if (!fd_form_keymap) return;
100         
101         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
102         fl_set_button(fd_form_keymap->KeyOnBtn, 0);
103         fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
105         if (on) {
106                 if (primarykeymap) {
107                         KeyMapPrim();
108                 } else {
109                         KeyMapSec();
110                 }
111         } else {
112                 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
113                 fl_hide_object(fd_form_keymap->KeymapErr);
114                 trans->DisableKeymap();
115         }
119 void Intl::ToggleKeyMap()
121         if (keymapon && primarykeymap) {
122                 KeyMapSec();
123         } else if (keymapon) {
124                 KeyMapOn(false);
125         } else  
126                 KeyMapPrim();
130 void Intl::KeyMapPrim()
132         int i;
133         string p;
135         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
136         fl_set_button(fd_form_keymap->KeyOnBtn, 1);
137         fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
139         /* read text from choice */
140         i = Language->get();
141         
142         if (lyxerr.debugging(Debug::KBMAP))
143                 lyxerr << "Table: " << tex_babel[i-1] << endl;
145         if (i == otherkeymap)
146                 p = fl_get_input(fd_form_keymap->OtherKeymap);
147         else
148                 p = Language->getline();
150         curkeymap = i;
152         if (p.empty() || trans->SetPrimary(p)) {
153                 // error selecting keymap
154                 fl_show_object(fd_form_keymap->KeymapErr);
155                 update();
156         } else {
157                 // no error
158                 trans->EnablePrimary();
159                 keymapon = true;
160                 primarykeymap = true;
161                 fl_hide_object(fd_form_keymap->KeymapErr);
162         }
166 void Intl::KeyMapSec()
168         int i;
169         string p;
171         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
172         fl_set_button(fd_form_keymap->KeyOnBtn, 0);
173         fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
175         /* read text from choice */
176         i = Language2->get();
177         
178         if (lyxerr.debugging(Debug::KBMAP))
179                 lyxerr << "Table: " << tex_babel[i-1] << endl;
181         if (i == otherkeymap)
182                 p = fl_get_input(fd_form_keymap->OtherKeymap2);
183         else
184                 p = Language2->getline();
185         curkeymap = i;
187         if (p.empty() || trans->SetSecondary(p)) {
188                 // error selecting keymap
189                 fl_show_object(fd_form_keymap->KeymapErr);
190                 update();
191         } else {
192                 // no error
193                 trans->EnableSecondary();
194                 keymapon = true;
195                 primarykeymap = false;
196                 fl_hide_object(fd_form_keymap->KeymapErr);
197         }
201 void Intl::LCombo(int, void *v)
203         Intl *itl = (Intl*) v;
204         itl->Keymap(23);
205         return;
209 void Intl::LCombo2(int, void *v)
211         Intl *itl = (Intl*) v;
212         itl->Keymap(43);
213         return;
217 void Intl::DispatchCallback(FL_OBJECT *ob,long code)
219         if (ob && (code == 0)) {
220                 fl_hide_form(ob->form);
221                 return;
222         }
223         if (!ob || !(ob->u_vdata))
224                 return;
225         
226         Intl *itl=(Intl *)ob->u_vdata;
228         if (itl!=0) itl->Keymap(code);
231 extern "C" void C_Intl_DispatchCallback(FL_OBJECT *ob,long code)
233         Intl::DispatchCallback(ob,code);
236 void Intl::InitKeyMapper(bool on)
237         /* initialize key mapper */
239         lyxerr[Debug::KBMAP] << "Initializing key mappings..." << endl;
241         if (prim_lang.empty() && sec_lang.empty())
242                 keymapon = false; 
243         else
244                 keymapon = on;
246         Language = new Combox(FL_COMBOX_DROPLIST);
247         Language2 = new Combox(FL_COMBOX_DROPLIST);
248         Language->setcallback(LCombo,this);
249         Language2->setcallback(LCombo2,this);
251         fd_form_keymap = create_form_KeyMap();
253         // Add the Intl* pointer
254         fd_form_keymap->AcceptChset->u_vdata=
255                 fd_form_keymap->Charset->u_vdata=
256                 fd_form_keymap->Accept->u_vdata=
257                 fd_form_keymap->OtherKeymap->u_vdata=
258                 fd_form_keymap->KeyOnBtn->u_vdata=
259                 fd_form_keymap->KeyOffBtn->u_vdata=
260                 fd_form_keymap->KeyOnBtn2->u_vdata=(void *)this;
262         // add the callbacks.
263         fl_set_object_callback(fd_form_keymap->AcceptChset,
264                                C_Intl_DispatchCallback,27);
265         fl_set_object_callback(fd_form_keymap->Charset,
266                                C_Intl_DispatchCallback,26);
267         fl_set_object_callback(fd_form_keymap->Accept,
268                                C_Intl_DispatchCallback,0);
270         fl_set_object_callback(fd_form_keymap->KeyOnBtn,
271                                C_Intl_DispatchCallback,23);
272         fl_set_object_callback(fd_form_keymap->KeyOffBtn,
273                                C_Intl_DispatchCallback,3);
274         fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
275                                C_Intl_DispatchCallback,43);
276         
277         // Make sure pressing the close box does not kill LyX. (RvdK)
278         fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
280         fl_hide_object(fd_form_keymap->KeymapErr);
281         fl_hide_object(fd_form_keymap->ChsetErr);
282         fl_set_input(fd_form_keymap->Charset, lyxrc->font_norm.c_str());
284         // Adds two comboxes to the keyboard map
285         fl_addto_form(fd_form_keymap->KeyMap);
286         Language->add(120,30,160,30,300);       // Primary
287         Language2->add(120,110,160,30,300);     // Secondary
288         fl_end_form();
290         int n=0;
292         while (true)
293                 if (!strlen(tex_babel[n]))
294                         break;
295                 else {
296                         Language->addto(tex_babel[n]);
297                         Language2->addto(tex_babel[n]);
298                         n++;
299                 }
300         
301         Language->addto(_("other..."));
302         Language2->addto(_("other..."));
303         otherkeymap = n+1;
304         if (!Language->select_text(prim_lang.c_str())) {
305                 Language->select(n+1);
306                 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
307         }
308         else 
309                 trans->SetPrimary(prim_lang);
311         if (!Language2->select_text(sec_lang.c_str())) {
312                 Language2->select(n+1);
313                 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
314         }
315         else
316                 trans->SetSecondary(sec_lang);
318         KeyMapOn(keymapon);
319         if (keymapon)
320                 Keymap(23); // turn primary on
322         trans->setCharset(lyxrc->font_norm.c_str());
326 void Intl::Keymap(long code)
328         char const *p;
330         if (lyxerr.debugging(Debug::KBMAP))
331                 lyxerr << "KeyMap callback: " << code << endl;
333         switch (code) {
334         case 0:
335                 /* cancel/hide */
336                 fl_hide_form(fd_form_keymap->KeyMap);
337                 break;
338         case 3:
339         case 23:
340         case 43:
341                 if (code==3) {
342                         KeyMapOn(false);
343                         return;
344                 }
345                 code -= 19;     // change to language change type code
346                 
347         case 4: // 4 and 24 will never be called directly, they will only be
348         case 24: // called through 3,23,43 (lgb)
349                 if (code==4) {
350                         KeyMapPrim();
351                 } else {
352                         KeyMapSec();
353                 }
354                 break;
355         case 27:        /* set new font norm */
356                 p = fl_get_input(fd_form_keymap->Charset);
357                 if (trans->setCharset(p))
358                         fl_show_object(fd_form_keymap->ChsetErr);
359                 else
360                         fl_hide_object(fd_form_keymap->ChsetErr);
361                 break;
362         }
366 void Intl::MenuKeymap()
368         if (fd_form_keymap->KeyMap->visible) {
369                 fl_raise_form(fd_form_keymap->KeyMap);
370         } else fl_show_form(fd_form_keymap->KeyMap, FL_PLACE_MOUSE,
371                             FL_FULLBORDER, _("Key Mappings"));