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