]> git.lyx.org Git - lyx.git/blob - src/intl.C
868500ca676caf75006e9120fc2fb78cb1193e07
[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 #include "language.h"
32
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 int Intl::SetPrimary(string const & lang)
52 {
53         if (lyxerr.debugging(Debug::KBMAP))
54                 lyxerr << "Primary: `" << lang << "'" << endl;
55         return trans->SetPrimary(lang);
56 }
57
58
59 int Intl::SetSecondary(string const & lang)
60 {
61         if (lyxerr.debugging(Debug::KBMAP))
62                 lyxerr << "Secondary: `" << lang << "'" << endl;
63         return trans->SetSecondary(lang);
64 }
65
66
67 void Intl::update()
68 {
69         int off = 0;
70         int prim = 0;
71         int sec = 0;
72         
73         if (!keymapon) {
74                 off = 1;
75         } else {
76                 if (primarykeymap) {
77                         prim = 1;
78                 } else {
79                         sec = 1;
80                 }
81         }
82         
83         fl_set_button(fd_form_keymap->KeyOffBtn, off);
84         fl_set_button(fd_form_keymap->KeyOnBtn, prim);
85         fl_set_button(fd_form_keymap->KeyOnBtn2, sec);
86 }
87
88
89 void Intl::KeyMapOn(bool on)
90         /* turn on/off key mappings, status in keymapon */
91 {
92         keymapon = on;
93
94         if (!fd_form_keymap) return;
95         
96         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
97         fl_set_button(fd_form_keymap->KeyOnBtn, 0);
98         fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
99
100         if (on) {
101                 if (primarykeymap) {
102                         KeyMapPrim();
103                 } else {
104                         KeyMapSec();
105                 }
106         } else {
107                 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
108                 fl_hide_object(fd_form_keymap->KeymapErr);
109                 trans->DisableKeymap();
110         }
111 }
112
113
114 void Intl::ToggleKeyMap()
115 {
116         if (keymapon && primarykeymap) {
117                 KeyMapSec();
118         } else if (keymapon) {
119                 KeyMapOn(false);
120         } else  
121                 KeyMapPrim();
122 }
123
124
125 void Intl::KeyMapPrim()
126 {
127         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
128         fl_set_button(fd_form_keymap->KeyOnBtn, 1);
129         fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
130
131         /* read text from choice */
132         int i = Language->get();
133
134 #if 0
135         if (lyxerr.debugging(Debug::KBMAP))
136                 lyxerr << "Table: " << tex_babel[i-1] << endl;
137 #endif
138         string p;
139         if (i == otherkeymap)
140                 p = fl_get_input(fd_form_keymap->OtherKeymap);
141         else
142                 p = Language->getline();
143
144         curkeymap = i;
145
146         if (p.empty() || trans->SetPrimary(p)) {
147                 // error selecting keymap
148                 fl_show_object(fd_form_keymap->KeymapErr);
149                 update();
150         } else {
151                 // no error
152                 trans->EnablePrimary();
153                 keymapon = true;
154                 primarykeymap = true;
155                 fl_hide_object(fd_form_keymap->KeymapErr);
156         }
157 }
158
159
160 void Intl::KeyMapSec()
161 {
162         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
163         fl_set_button(fd_form_keymap->KeyOnBtn, 0);
164         fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
165
166         /* read text from choice */
167         int i = Language2->get();
168
169 #if 0
170         if (lyxerr.debugging(Debug::KBMAP))
171                 lyxerr << "Table: " << tex_babel[i-1] << endl;
172 #endif
173         string p;
174         if (i == otherkeymap)
175                 p = fl_get_input(fd_form_keymap->OtherKeymap2);
176         else
177                 p = Language2->getline();
178         curkeymap = i;
179
180         if (p.empty() || trans->SetSecondary(p)) {
181                 // error selecting keymap
182                 fl_show_object(fd_form_keymap->KeymapErr);
183                 update();
184         } else {
185                 // no error
186                 trans->EnableSecondary();
187                 keymapon = true;
188                 primarykeymap = false;
189                 fl_hide_object(fd_form_keymap->KeymapErr);
190         }
191 }
192
193
194 void Intl::LCombo(int, void * v)
195 {
196         Intl * itl = static_cast<Intl*>(v);
197         itl->Keymap(23);
198         return;
199 }
200
201
202 void Intl::LCombo2(int, void * v)
203 {
204         Intl * itl = static_cast<Intl*>(v);
205         itl->Keymap(43);
206         return;
207 }
208
209
210 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
211 {
212         if (ob && (code == 0)) {
213                 fl_hide_form(ob->form);
214                 return;
215         }
216         if (!ob || !(ob->u_vdata))
217                 return;
218         
219         Intl * itl = static_cast<Intl *>(ob->u_vdata);
220
221         if (itl!= 0) itl->Keymap(code);
222 }
223
224
225 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
226 {
227         Intl::DispatchCallback(ob, code);
228 }
229
230
231 void Intl::InitKeyMapper(bool on)
232         /* initialize key mapper */
233 {
234         lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
235
236         if (prim_lang.empty() && sec_lang.empty())
237                 keymapon = false; 
238         else
239                 keymapon = on;
240
241         Language = new Combox(FL_COMBOX_DROPLIST);
242         Language2 = new Combox(FL_COMBOX_DROPLIST);
243         Language->setcallback(LCombo, this);
244         Language2->setcallback(LCombo2, this);
245
246         fd_form_keymap = create_form_KeyMap();
247
248         // Add the Intl* pointer
249         fd_form_keymap->AcceptChset->u_vdata =
250                 fd_form_keymap->Charset->u_vdata =
251                 fd_form_keymap->Accept->u_vdata =
252                 fd_form_keymap->OtherKeymap->u_vdata =
253                 fd_form_keymap->KeyOnBtn->u_vdata =
254                 fd_form_keymap->KeyOffBtn->u_vdata =
255                 fd_form_keymap->KeyOnBtn2->u_vdata = this;
256
257         // add the callbacks.
258         fl_set_object_callback(fd_form_keymap->AcceptChset,
259                                C_Intl_DispatchCallback, 27);
260         fl_set_object_callback(fd_form_keymap->Charset,
261                                C_Intl_DispatchCallback, 26);
262         fl_set_object_callback(fd_form_keymap->Accept,
263                                C_Intl_DispatchCallback, 0);
264
265         fl_set_object_callback(fd_form_keymap->KeyOnBtn,
266                                C_Intl_DispatchCallback, 23);
267         fl_set_object_callback(fd_form_keymap->KeyOffBtn,
268                                C_Intl_DispatchCallback, 3);
269         fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
270                                C_Intl_DispatchCallback, 43);
271         
272         // Make sure pressing the close box does not kill LyX. (RvdK)
273         fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
274
275         fl_hide_object(fd_form_keymap->KeymapErr);
276         fl_hide_object(fd_form_keymap->ChsetErr);
277         fl_set_input(fd_form_keymap->Charset, lyxrc.font_norm.c_str());
278
279         // Adds two comboxes to the keyboard map
280         fl_addto_form(fd_form_keymap->KeyMap);
281         Language->add(120, 30, 160, 30, 300);   // Primary
282         Language2->add(120, 110, 160, 30, 300); // Secondary
283         fl_end_form();
284
285 #if 0
286         int n = 0;
287         while (true)
288                 if (!strlen(tex_babel[n]))
289                         break;
290                 else {
291                         Language->addto(tex_babel[n]);
292                         Language2->addto(tex_babel[n]);
293                         ++n;
294                 }
295 #else
296         int n = 1;
297         // Default is not in the language map
298         Language->addto("default");
299         Language2->addto("default");
300         for (Languages::const_iterator cit = languages.begin();
301              cit != languages.end(); ++cit) {
302                 Language->addto((*cit).second.lang.c_str());
303                 Language2->addto((*cit).second.lang.c_str());
304                 ++n;
305         }
306 #endif
307         Language->addto(_("other..."));
308         Language2->addto(_("other..."));
309         otherkeymap = n + 1;
310         if (!Language->select_text(prim_lang.c_str())) {
311                 Language->select(n+1);
312                 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
313         }
314         else 
315                 trans->SetPrimary(prim_lang);
316
317         if (!Language2->select_text(sec_lang.c_str())) {
318                 Language2->select(n + 1);
319                 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
320         }
321         else
322                 trans->SetSecondary(sec_lang);
323
324         KeyMapOn(keymapon);
325         if (keymapon)
326                 Keymap(23); // turn primary on
327
328         trans->setCharset(lyxrc.font_norm.c_str());
329 }
330
331
332 void Intl::Keymap(long code)
333 {
334         if (lyxerr.debugging(Debug::KBMAP))
335                 lyxerr << "KeyMap callback: " << code << endl;
336
337         // Did you wonder if it is possible to write spagetti code with
338         // other constructs thatn goto's? Well here we have a nice small
339         // spagetti example using a switch... (Lgb)
340         switch (code) {
341         case 0:
342                 /* cancel/hide */
343                 fl_hide_form(fd_form_keymap->KeyMap);
344                 break;
345         case 3:
346         case 23:
347         case 43:
348                 if (code == 3) {
349                         KeyMapOn(false);
350                         return;
351                 }
352                 code -= 19;     // change to language change type code
353                 
354         case 4: // 4 and 24 will never be called directly, they will only be
355         case 24: // called through 3, 23, 43 (lgb)
356                 if (code == 4) {
357                         KeyMapPrim();
358                 } else {
359                         KeyMapSec();
360                 }
361                 break;
362         case 27:        /* set new font norm */
363                 char const * p = fl_get_input(fd_form_keymap->Charset);
364                 if (trans->setCharset(p))
365                         fl_show_object(fd_form_keymap->ChsetErr);
366                 else
367                         fl_hide_object(fd_form_keymap->ChsetErr);
368                 break;
369         }
370 }
371
372
373 void Intl::MenuKeymap()
374 {
375         if (fd_form_keymap->KeyMap->visible) {
376                 fl_raise_form(fd_form_keymap->KeyMap);
377         } else fl_show_form(fd_form_keymap->KeyMap, FL_PLACE_MOUSE,
378                             FL_FULLBORDER, _("Key Mappings"));
379 }