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