]> git.lyx.org Git - lyx.git/blob - src/intl.C
white-space changes, removed definitions.h several enum changes because of this,...
[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         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
169         fl_set_button(fd_form_keymap->KeyOnBtn, 0);
170         fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
171
172         /* read text from choice */
173         int i = Language2->get();
174         
175         if (lyxerr.debugging(Debug::KBMAP))
176                 lyxerr << "Table: " << tex_babel[i-1] << endl;
177
178         string p;
179         if (i == otherkeymap)
180                 p = fl_get_input(fd_form_keymap->OtherKeymap2);
181         else
182                 p = Language2->getline();
183         curkeymap = i;
184
185         if (p.empty() || trans->SetSecondary(p)) {
186                 // error selecting keymap
187                 fl_show_object(fd_form_keymap->KeymapErr);
188                 update();
189         } else {
190                 // no error
191                 trans->EnableSecondary();
192                 keymapon = true;
193                 primarykeymap = false;
194                 fl_hide_object(fd_form_keymap->KeymapErr);
195         }
196 }
197
198
199 void Intl::LCombo(int, void * v)
200 {
201         Intl * itl = static_cast<Intl*>(v);
202         itl->Keymap(23);
203         return;
204 }
205
206
207 void Intl::LCombo2(int, void * v)
208 {
209         Intl * itl = static_cast<Intl*>(v);
210         itl->Keymap(43);
211         return;
212 }
213
214
215 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
216 {
217         if (ob && (code == 0)) {
218                 fl_hide_form(ob->form);
219                 return;
220         }
221         if (!ob || !(ob->u_vdata))
222                 return;
223         
224         Intl * itl = static_cast<Intl *>(ob->u_vdata);
225
226         if (itl!= 0) itl->Keymap(code);
227 }
228
229 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
230 {
231         Intl::DispatchCallback(ob, code);
232 }
233
234 void Intl::InitKeyMapper(bool on)
235         /* initialize key mapper */
236 {
237         lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
238
239         if (prim_lang.empty() && sec_lang.empty())
240                 keymapon = false; 
241         else
242                 keymapon = on;
243
244         Language = new Combox(FL_COMBOX_DROPLIST);
245         Language2 = new Combox(FL_COMBOX_DROPLIST);
246         Language->setcallback(LCombo, this);
247         Language2->setcallback(LCombo2, this);
248
249         fd_form_keymap = create_form_KeyMap();
250
251         // Add the Intl* pointer
252         fd_form_keymap->AcceptChset->u_vdata =
253                 fd_form_keymap->Charset->u_vdata =
254                 fd_form_keymap->Accept->u_vdata =
255                 fd_form_keymap->OtherKeymap->u_vdata =
256                 fd_form_keymap->KeyOnBtn->u_vdata =
257                 fd_form_keymap->KeyOffBtn->u_vdata =
258                 fd_form_keymap->KeyOnBtn2->u_vdata = this;
259
260         // add the callbacks.
261         fl_set_object_callback(fd_form_keymap->AcceptChset,
262                                C_Intl_DispatchCallback, 27);
263         fl_set_object_callback(fd_form_keymap->Charset,
264                                C_Intl_DispatchCallback, 26);
265         fl_set_object_callback(fd_form_keymap->Accept,
266                                C_Intl_DispatchCallback, 0);
267
268         fl_set_object_callback(fd_form_keymap->KeyOnBtn,
269                                C_Intl_DispatchCallback, 23);
270         fl_set_object_callback(fd_form_keymap->KeyOffBtn,
271                                C_Intl_DispatchCallback, 3);
272         fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
273                                C_Intl_DispatchCallback, 43);
274         
275         // Make sure pressing the close box does not kill LyX. (RvdK)
276         fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
277
278         fl_hide_object(fd_form_keymap->KeymapErr);
279         fl_hide_object(fd_form_keymap->ChsetErr);
280         fl_set_input(fd_form_keymap->Charset, lyxrc->font_norm.c_str());
281
282         // Adds two comboxes to the keyboard map
283         fl_addto_form(fd_form_keymap->KeyMap);
284         Language->add(120, 30, 160, 30, 300);   // Primary
285         Language2->add(120, 110, 160, 30, 300); // Secondary
286         fl_end_form();
287
288         int n = 0;
289
290         while (true)
291                 if (!strlen(tex_babel[n]))
292                         break;
293                 else {
294                         Language->addto(tex_babel[n]);
295                         Language2->addto(tex_babel[n]);
296                         n++;
297                 }
298         
299         Language->addto(_("other..."));
300         Language2->addto(_("other..."));
301         otherkeymap = n+1;
302         if (!Language->select_text(prim_lang.c_str())) {
303                 Language->select(n+1);
304                 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
305         }
306         else 
307                 trans->SetPrimary(prim_lang);
308
309         if (!Language2->select_text(sec_lang.c_str())) {
310                 Language2->select(n+1);
311                 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
312         }
313         else
314                 trans->SetSecondary(sec_lang);
315
316         KeyMapOn(keymapon);
317         if (keymapon)
318                 Keymap(23); // turn primary on
319
320         trans->setCharset(lyxrc->font_norm.c_str());
321 }
322
323
324 void Intl::Keymap(long code)
325 {
326         if (lyxerr.debugging(Debug::KBMAP))
327                 lyxerr << "KeyMap callback: " << code << endl;
328
329         switch (code) {
330         case 0:
331                 /* cancel/hide */
332                 fl_hide_form(fd_form_keymap->KeyMap);
333                 break;
334         case 3:
335         case 23:
336         case 43:
337                 if (code == 3) {
338                         KeyMapOn(false);
339                         return;
340                 }
341                 code -= 19;     // change to language change type code
342                 
343         case 4: // 4 and 24 will never be called directly, they will only be
344         case 24: // called through 3, 23, 43 (lgb)
345                 if (code == 4) {
346                         KeyMapPrim();
347                 } else {
348                         KeyMapSec();
349                 }
350                 break;
351         case 27:        /* set new font norm */
352                 char const * p = fl_get_input(fd_form_keymap->Charset);
353                 if (trans->setCharset(p))
354                         fl_show_object(fd_form_keymap->ChsetErr);
355                 else
356                         fl_hide_object(fd_form_keymap->ChsetErr);
357                 break;
358         }
359 }
360
361
362 void Intl::MenuKeymap()
363 {
364         if (fd_form_keymap->KeyMap->visible) {
365                 fl_raise_form(fd_form_keymap->KeyMap);
366         } else fl_show_form(fd_form_keymap->KeyMap, FL_PLACE_MOUSE,
367                             FL_FULLBORDER, _("Key Mappings"));
368 }