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