]> git.lyx.org Git - lyx.git/blob - src/intl.C
6e4f662ae909e36ad20f8b055e5e1537e70b2833
[lyx.git] / src / intl.C
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  * ======================================================*/
10
11 /*
12  *      International support for LyX
13  */
14
15 #include <config.h>
16
17 #ifdef __GNUG__
18 #pragma implementation
19 #endif
20  
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"
31
32 extern LyXRC* lyxrc;
33
34 // a wrapper around the callback static member.
35 extern "C" void C_Intl_DispatchCallback(FL_OBJECT *ob,long code);
36
37
38 Intl::Intl()
39         : prim_lang(lyxrc->primary_kbmap), 
40           sec_lang(lyxrc->secondary_kbmap),
41           trans(new TransManager)
42 {
43         keymapon = lyxrc->use_kbmap;
44         chsetcode = 0;
45         primarykeymap = false;
46         curkeymap = 0;
47         otherkeymap = 0;
48 }
49
50
51 Intl::~Intl()
52 {
53 }
54
55
56 int Intl::SetPrimary(string const & lang)
57 {
58         if (lyxerr.debugging(Debug::KBMAP))
59                 lyxerr << "Primary: `" << lang << "'" << endl;
60         return trans->SetPrimary(lang);
61 }
62
63
64 int Intl::SetSecondary(string const & lang)
65 {
66         if (lyxerr.debugging(Debug::KBMAP))
67                 lyxerr << "Secondary: `" << lang << "'" << endl;
68         return trans->SetSecondary(lang);
69 }
70
71
72 void Intl::update()
73 {
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);
91 }
92
93
94 void Intl::KeyMapOn(bool on)
95         /* turn on/off key mappings, status in keymapon */
96 {
97         keymapon = on;
98
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);
104
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         }
116 }
117
118
119 void Intl::ToggleKeyMap()
120 {
121         if (keymapon && primarykeymap) {
122                 KeyMapSec();
123         } else if (keymapon) {
124                 KeyMapOn(false);
125         } else  
126                 KeyMapPrim();
127 }
128
129
130 void Intl::KeyMapPrim()
131 {
132         int i;
133         string p;
134
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);
138
139         /* read text from choice */
140         i = Language->get();
141         
142         if (lyxerr.debugging(Debug::KBMAP))
143                 lyxerr << "Table: " << tex_babel[i-1] << endl;
144
145         if (i == otherkeymap)
146                 p = fl_get_input(fd_form_keymap->OtherKeymap);
147         else
148                 p = Language->getline();
149
150         curkeymap = i;
151
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         }
163 }
164
165
166 void Intl::KeyMapSec()
167 {
168         int i;
169         string p;
170
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);
174
175         /* read text from choice */
176         i = Language2->get();
177         
178         if (lyxerr.debugging(Debug::KBMAP))
179                 lyxerr << "Table: " << tex_babel[i-1] << endl;
180
181         if (i == otherkeymap)
182                 p = fl_get_input(fd_form_keymap->OtherKeymap2);
183         else
184                 p = Language2->getline();
185         curkeymap = i;
186
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         }
198 }
199
200
201 void Intl::LCombo(int, void *v)
202 {
203         Intl *itl = (Intl*) v;
204         itl->Keymap(23);
205         return;
206 }
207
208
209 void Intl::LCombo2(int, void *v)
210 {
211         Intl *itl = (Intl*) v;
212         itl->Keymap(43);
213         return;
214 }
215
216
217 void Intl::DispatchCallback(FL_OBJECT *ob,long code)
218 {
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;
227
228         if (itl!=0) itl->Keymap(code);
229 }
230
231 extern "C" void C_Intl_DispatchCallback(FL_OBJECT *ob,long code)
232 {
233         Intl::DispatchCallback(ob,code);
234 }
235
236 void Intl::InitKeyMapper(bool on)
237         /* initialize key mapper */
238 {
239         lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
240
241         if (prim_lang.empty() && sec_lang.empty())
242                 keymapon = false; 
243         else
244                 keymapon = on;
245
246         Language = new Combox(FL_COMBOX_DROPLIST);
247         Language2 = new Combox(FL_COMBOX_DROPLIST);
248         Language->setcallback(LCombo,this);
249         Language2->setcallback(LCombo2,this);
250
251         fd_form_keymap = create_form_KeyMap();
252
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;
261
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);
269
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);
279
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());
283
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();
289
290         int n=0;
291
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);
310
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);
317
318         KeyMapOn(keymapon);
319         if (keymapon)
320                 Keymap(23); // turn primary on
321
322         trans->setCharset(lyxrc->font_norm.c_str());
323 }
324
325
326 void Intl::Keymap(long code)
327 {
328         char const *p;
329
330         if (lyxerr.debugging(Debug::KBMAP))
331                 lyxerr << "KeyMap callback: " << code << endl;
332
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         }
363 }
364
365
366 void Intl::MenuKeymap()
367 {
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"));
372 }