]> git.lyx.org Git - lyx.git/blob - src/intl.C
fc6266c558be06f567f88efe099d6bd9620fa659
[lyx.git] / src / intl.C
1 /* This file is part of
2 * ======================================================
3
4 *           LyX, The Document Processor
5 *        
6 *           Copyright (C) 1995 Matthias Ettrich
7 *           Copyright (C) 1995-1998 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 "error.h"
28 #include "lyxrc.h"
29 #include "trans_mgr.h"
30
31
32 //      $Id: intl.C,v 1.1 1999/09/27 18:44:37 larsbj Exp $      
33
34 #if !defined(lint) && !defined(WITH_WARNINGS)
35 static char vcid[] = "$Id: intl.C,v 1.1 1999/09/27 18:44:37 larsbj Exp $";
36 #endif /* lint */
37
38 // lyx rc 
39 extern LyXRC* lyxrc;
40
41
42 Intl::Intl()
43         : prim_lang(lyxrc->primary_kbmap), 
44           sec_lang(lyxrc->secondary_kbmap),
45           trans(new TransManager)
46 {
47         keymapon = lyxrc->use_kbmap;
48         chsetcode = NULL;
49         primarykeymap = false;
50         curkeymap = 0;
51         otherkeymap = 0;
52 }
53
54
55 Intl::~Intl()
56 {
57 }
58
59
60 int Intl::SetPrimary(LString const & lang)
61 {
62         if (lyxerr.debugging(Error::KBMAP))
63                 lyxerr.print("Primary: `" + lang + "'");
64         return trans->SetPrimary(lang);
65 }
66
67
68 int Intl::SetSecondary(LString const & lang)
69 {
70         if (lyxerr.debugging(Error::KBMAP))
71                 lyxerr.print("Secondary: `" + lang + "'");
72         return trans->SetSecondary(lang);
73 }
74
75
76 void Intl::update()
77 {
78         int off,prim,sec;
79         
80         off=prim=sec=0;
81         
82         if (!keymapon) {
83                 off=1;
84         } else {
85                 if (primarykeymap) {
86                         prim=1;
87                 } else {
88                         sec=1;
89                 }
90         }
91         
92         fl_set_button(fd_form_keymap->KeyOffBtn,off);
93         fl_set_button(fd_form_keymap->KeyOnBtn,prim);
94         fl_set_button(fd_form_keymap->KeyOnBtn2,sec);
95 }
96
97
98 void Intl::KeyMapOn(bool on)
99         /* turn on/off key mappings, status in keymapon */
100 {
101         keymapon = on;
102
103         if (!fd_form_keymap) return;
104         
105         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
106         fl_set_button(fd_form_keymap->KeyOnBtn, 0);
107         fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
108
109         if (on) {
110                 if (primarykeymap) {
111                         KeyMapPrim();
112                 } else {
113                         KeyMapSec();
114                 }
115         } else {
116                 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
117                 fl_hide_object(fd_form_keymap->KeymapErr);
118                 trans->DisableKeymap();
119         }
120 }
121
122
123 void Intl::ToggleKeyMap()
124 {
125         if (keymapon && primarykeymap) {
126                 KeyMapSec();
127         } else if (keymapon) {
128                 KeyMapOn(false);
129         } else  
130                 KeyMapPrim();
131 }
132
133
134 void Intl::KeyMapPrim()
135 {
136         int i;
137         LString p;
138
139         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
140         fl_set_button(fd_form_keymap->KeyOnBtn, 1);
141         fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
142
143         /* read text from choice */
144         i = Language->get();
145         
146         if (lyxerr.debugging(Error::KBMAP))
147                 lyxerr.print(LString("Table: ") + tex_babel[i-1]);
148
149         if (i == otherkeymap)
150                 p = fl_get_input(fd_form_keymap->OtherKeymap);
151         else
152                 p = Language->getline();
153
154         curkeymap = i;
155
156         if (p.empty() || trans->SetPrimary(p)) {
157                 // error selecting keymap
158                 fl_show_object(fd_form_keymap->KeymapErr);
159                 update();
160         } else {
161                 // no error
162                 trans->EnablePrimary();
163                 keymapon = true;
164                 primarykeymap = true;
165                 fl_hide_object(fd_form_keymap->KeymapErr);
166         }
167 }
168
169
170 void Intl::KeyMapSec()
171 {
172         int i;
173         LString p;
174
175         fl_set_button(fd_form_keymap->KeyOffBtn, 0);
176         fl_set_button(fd_form_keymap->KeyOnBtn, 0);
177         fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
178
179         /* read text from choice */
180         i = Language2->get();
181         
182         if (lyxerr.debugging(Error::KBMAP))
183                 lyxerr.print(LString("Table: ") + tex_babel[i-1]);
184
185         if (i == otherkeymap)
186                 p = fl_get_input(fd_form_keymap->OtherKeymap2);
187         else
188                 p = Language2->getline();
189         curkeymap = i;
190
191         if (p.empty() || trans->SetSecondary(p)) {
192                 // error selecting keymap
193                 fl_show_object(fd_form_keymap->KeymapErr);
194                 update();
195         } else {
196                 // no error
197                 trans->EnableSecondary();
198                 keymapon = true;
199                 primarykeymap = false;
200                 fl_hide_object(fd_form_keymap->KeymapErr);
201         }
202 }
203
204
205 void Intl::LCombo(int, void *v)
206 {
207         Intl *itl = (Intl*) v;
208         itl->Keymap(23);
209         return;
210 }
211
212
213 void Intl::LCombo2(int, void *v)
214 {
215         Intl *itl = (Intl*) v;
216         itl->Keymap(43);
217         return;
218 }
219
220
221 void Intl::DispatchCallback(FL_OBJECT *ob,long code)
222 {
223         if (ob && (code == 0)) {
224                 fl_hide_form(ob->form);
225                 return;
226         }
227         if (!ob || !(ob->u_vdata))
228                 return;
229         
230         Intl *itl=(Intl *)ob->u_vdata;
231
232         if (itl!=NULL) itl->Keymap(code);
233 }
234
235
236 void Intl::InitKeyMapper(bool on)
237         /* initialize key mapper */
238 {
239         lyxerr.debug("Initializing key mappings...", Error::KBMAP);
240
241         if (prim_lang.empty() && sec_lang.empty())
242                 keymapon = false; 
243         else
244                 keymapon = on;
245
246         Language = new Combox(FL_COMBOX_DROPLIST);
247         Language2 = new Combox(FL_COMBOX_DROPLIST);
248         Language->setcallback(LCombo,this);
249         Language2->setcallback(LCombo2,this);
250
251         fd_form_keymap = create_form_KeyMap();
252
253         // Add the Intl* pointer
254         fd_form_keymap->AcceptChset->u_vdata=
255                 fd_form_keymap->Charset->u_vdata=
256                 fd_form_keymap->Accept->u_vdata=
257                 fd_form_keymap->OtherKeymap->u_vdata=
258                 fd_form_keymap->KeyOnBtn->u_vdata=
259                 fd_form_keymap->KeyOffBtn->u_vdata=
260                 fd_form_keymap->KeyOnBtn2->u_vdata=(void *)this;
261
262         // add the callbacks.
263         fl_set_object_callback(fd_form_keymap->AcceptChset,DispatchCallback,27);
264         fl_set_object_callback(fd_form_keymap->Charset,DispatchCallback,26);
265         fl_set_object_callback(fd_form_keymap->Accept,DispatchCallback,0);
266
267         fl_set_object_callback(fd_form_keymap->KeyOnBtn,DispatchCallback,23);
268         fl_set_object_callback(fd_form_keymap->KeyOffBtn,DispatchCallback,3);
269         fl_set_object_callback(fd_form_keymap->KeyOnBtn2,DispatchCallback,43);
270         
271         // Make sure pressing the close box does not kill LyX. (RvdK)
272         fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, NULL);
273
274         fl_hide_object(fd_form_keymap->KeymapErr);
275         fl_hide_object(fd_form_keymap->ChsetErr);
276         fl_set_input(fd_form_keymap->Charset, lyxrc->font_norm.c_str());
277
278         // Adds two comboxes to the keyboard map
279         fl_addto_form(fd_form_keymap->KeyMap);
280         Language->add(120,30,160,30,300);       // Primary
281         Language2->add(120,110,160,30,300);     // Secondary
282         fl_end_form();
283
284         int n=0;
285
286         while (true)
287                 if (!strlen(tex_babel[n]))
288                         break;
289                 else {
290                         Language->addto(tex_babel[n]);
291                         Language2->addto(tex_babel[n]);
292                         n++;
293                 }
294         
295         Language->addto(_("other..."));
296         Language2->addto(_("other..."));
297         otherkeymap = n+1;
298         if (!Language->select_text(prim_lang.c_str())) {
299                 Language->select(n+1);
300                 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
301         }
302         else 
303                 trans->SetPrimary(prim_lang);
304
305         if (!Language2->select_text(sec_lang.c_str())) {
306                 Language2->select(n+1);
307                 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
308         }
309         else
310                 trans->SetSecondary(sec_lang);
311
312         KeyMapOn(keymapon);
313         if (keymapon)
314                 Keymap(23); // turn primary on
315
316         trans->setCharset(lyxrc->font_norm.c_str());
317 }
318
319
320 void Intl::Keymap(long code)
321 {
322         char const *p;
323
324         if (lyxerr.debugging(Error::KBMAP))
325                 lyxerr.print(LString("KeyMap callback: ") + code);
326
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                 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 }