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