]> git.lyx.org Git - features.git/blob - src/intl.C
remove bogus backslashed from iso-8859-1, try to fix insert and encodeString, fixes...
[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
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, prim, sec;
70         
71         off = prim = 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 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
223 {
224         Intl::DispatchCallback(ob, code);
225 }
226
227 void Intl::InitKeyMapper(bool on)
228         /* initialize key mapper */
229 {
230         lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
231
232         if (prim_lang.empty() && sec_lang.empty())
233                 keymapon = false; 
234         else
235                 keymapon = on;
236
237         Language = new Combox(FL_COMBOX_DROPLIST);
238         Language2 = new Combox(FL_COMBOX_DROPLIST);
239         Language->setcallback(LCombo, this);
240         Language2->setcallback(LCombo2, this);
241
242         fd_form_keymap = create_form_KeyMap();
243
244         // Add the Intl* pointer
245         fd_form_keymap->AcceptChset->u_vdata =
246                 fd_form_keymap->Charset->u_vdata =
247                 fd_form_keymap->Accept->u_vdata =
248                 fd_form_keymap->OtherKeymap->u_vdata =
249                 fd_form_keymap->KeyOnBtn->u_vdata =
250                 fd_form_keymap->KeyOffBtn->u_vdata =
251                 fd_form_keymap->KeyOnBtn2->u_vdata = this;
252
253         // add the callbacks.
254         fl_set_object_callback(fd_form_keymap->AcceptChset,
255                                C_Intl_DispatchCallback, 27);
256         fl_set_object_callback(fd_form_keymap->Charset,
257                                C_Intl_DispatchCallback, 26);
258         fl_set_object_callback(fd_form_keymap->Accept,
259                                C_Intl_DispatchCallback, 0);
260
261         fl_set_object_callback(fd_form_keymap->KeyOnBtn,
262                                C_Intl_DispatchCallback, 23);
263         fl_set_object_callback(fd_form_keymap->KeyOffBtn,
264                                C_Intl_DispatchCallback, 3);
265         fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
266                                C_Intl_DispatchCallback, 43);
267         
268         // Make sure pressing the close box does not kill LyX. (RvdK)
269         fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
270
271         fl_hide_object(fd_form_keymap->KeymapErr);
272         fl_hide_object(fd_form_keymap->ChsetErr);
273         fl_set_input(fd_form_keymap->Charset, lyxrc->font_norm.c_str());
274
275         // Adds two comboxes to the keyboard map
276         fl_addto_form(fd_form_keymap->KeyMap);
277         Language->add(120, 30, 160, 30, 300);   // Primary
278         Language2->add(120, 110, 160, 30, 300); // Secondary
279         fl_end_form();
280
281         int n = 0;
282
283         while (true)
284                 if (!strlen(tex_babel[n]))
285                         break;
286                 else {
287                         Language->addto(tex_babel[n]);
288                         Language2->addto(tex_babel[n]);
289                         n++;
290                 }
291         
292         Language->addto(_("other..."));
293         Language2->addto(_("other..."));
294         otherkeymap = n+1;
295         if (!Language->select_text(prim_lang.c_str())) {
296                 Language->select(n+1);
297                 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
298         }
299         else 
300                 trans->SetPrimary(prim_lang);
301
302         if (!Language2->select_text(sec_lang.c_str())) {
303                 Language2->select(n+1);
304                 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
305         }
306         else
307                 trans->SetSecondary(sec_lang);
308
309         KeyMapOn(keymapon);
310         if (keymapon)
311                 Keymap(23); // turn primary on
312
313         trans->setCharset(lyxrc->font_norm.c_str());
314 }
315
316
317 void Intl::Keymap(long code)
318 {
319         if (lyxerr.debugging(Debug::KBMAP))
320                 lyxerr << "KeyMap callback: " << code << endl;
321
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 }