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