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