1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich
7 * Copyright 1995-1999 The LyX Team.
9 * ======================================================*/
12 * International support for LyX
18 #pragma implementation
21 #include FORMS_H_LOCATION
24 #include "tex-strings.h"
26 #include "lyx_gui_misc.h" // CancelCloseBoxCB
29 #include "trans_mgr.h"
30 #include "support/lstrings.h"
34 // a wrapper around the callback static member.
35 extern "C" void C_Intl_DispatchCallback(FL_OBJECT *ob,long code);
39 : prim_lang(lyxrc->primary_kbmap),
40 sec_lang(lyxrc->secondary_kbmap),
41 trans(new TransManager)
43 keymapon = lyxrc->use_kbmap;
45 primarykeymap = false;
56 int Intl::SetPrimary(string const & lang)
58 if (lyxerr.debugging(Debug::KBMAP))
59 lyxerr << "Primary: `" << lang << "'" << endl;
60 return trans->SetPrimary(lang);
64 int Intl::SetSecondary(string const & lang)
66 if (lyxerr.debugging(Debug::KBMAP))
67 lyxerr << "Secondary: `" << lang << "'" << endl;
68 return trans->SetSecondary(lang);
88 fl_set_button(fd_form_keymap->KeyOffBtn,off);
89 fl_set_button(fd_form_keymap->KeyOnBtn,prim);
90 fl_set_button(fd_form_keymap->KeyOnBtn2,sec);
94 void Intl::KeyMapOn(bool on)
95 /* turn on/off key mappings, status in keymapon */
99 if (!fd_form_keymap) return;
101 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
102 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
103 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
112 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
113 fl_hide_object(fd_form_keymap->KeymapErr);
114 trans->DisableKeymap();
119 void Intl::ToggleKeyMap()
121 if (keymapon && primarykeymap) {
123 } else if (keymapon) {
130 void Intl::KeyMapPrim()
135 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
136 fl_set_button(fd_form_keymap->KeyOnBtn, 1);
137 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
139 /* read text from choice */
142 if (lyxerr.debugging(Debug::KBMAP))
143 lyxerr << "Table: " << tex_babel[i-1] << endl;
145 if (i == otherkeymap)
146 p = fl_get_input(fd_form_keymap->OtherKeymap);
148 p = Language->getline();
152 if (p.empty() || trans->SetPrimary(p)) {
153 // error selecting keymap
154 fl_show_object(fd_form_keymap->KeymapErr);
158 trans->EnablePrimary();
160 primarykeymap = true;
161 fl_hide_object(fd_form_keymap->KeymapErr);
166 void Intl::KeyMapSec()
171 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
172 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
173 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
175 /* read text from choice */
176 i = Language2->get();
178 if (lyxerr.debugging(Debug::KBMAP))
179 lyxerr << "Table: " << tex_babel[i-1] << endl;
181 if (i == otherkeymap)
182 p = fl_get_input(fd_form_keymap->OtherKeymap2);
184 p = Language2->getline();
187 if (p.empty() || trans->SetSecondary(p)) {
188 // error selecting keymap
189 fl_show_object(fd_form_keymap->KeymapErr);
193 trans->EnableSecondary();
195 primarykeymap = false;
196 fl_hide_object(fd_form_keymap->KeymapErr);
201 void Intl::LCombo(int, void *v)
203 Intl *itl = (Intl*) v;
209 void Intl::LCombo2(int, void *v)
211 Intl *itl = (Intl*) v;
217 void Intl::DispatchCallback(FL_OBJECT *ob,long code)
219 if (ob && (code == 0)) {
220 fl_hide_form(ob->form);
223 if (!ob || !(ob->u_vdata))
226 Intl *itl=(Intl *)ob->u_vdata;
228 if (itl!=0) itl->Keymap(code);
231 extern "C" void C_Intl_DispatchCallback(FL_OBJECT *ob,long code)
233 Intl::DispatchCallback(ob,code);
236 void Intl::InitKeyMapper(bool on)
237 /* initialize key mapper */
239 lyxerr[Debug::KBMAP] << "Initializing key mappings..." << endl;
241 if (prim_lang.empty() && sec_lang.empty())
246 Language = new Combox(FL_COMBOX_DROPLIST);
247 Language2 = new Combox(FL_COMBOX_DROPLIST);
248 Language->setcallback(LCombo,this);
249 Language2->setcallback(LCombo2,this);
251 fd_form_keymap = create_form_KeyMap();
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;
262 // add the callbacks.
263 fl_set_object_callback(fd_form_keymap->AcceptChset,
264 C_Intl_DispatchCallback,27);
265 fl_set_object_callback(fd_form_keymap->Charset,
266 C_Intl_DispatchCallback,26);
267 fl_set_object_callback(fd_form_keymap->Accept,
268 C_Intl_DispatchCallback,0);
270 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
271 C_Intl_DispatchCallback,23);
272 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
273 C_Intl_DispatchCallback,3);
274 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
275 C_Intl_DispatchCallback,43);
277 // Make sure pressing the close box does not kill LyX. (RvdK)
278 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
280 fl_hide_object(fd_form_keymap->KeymapErr);
281 fl_hide_object(fd_form_keymap->ChsetErr);
282 fl_set_input(fd_form_keymap->Charset, lyxrc->font_norm.c_str());
284 // Adds two comboxes to the keyboard map
285 fl_addto_form(fd_form_keymap->KeyMap);
286 Language->add(120,30,160,30,300); // Primary
287 Language2->add(120,110,160,30,300); // Secondary
293 if (!strlen(tex_babel[n]))
296 Language->addto(tex_babel[n]);
297 Language2->addto(tex_babel[n]);
301 Language->addto(_("other..."));
302 Language2->addto(_("other..."));
304 if (!Language->select_text(prim_lang.c_str())) {
305 Language->select(n+1);
306 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
309 trans->SetPrimary(prim_lang);
311 if (!Language2->select_text(sec_lang.c_str())) {
312 Language2->select(n+1);
313 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
316 trans->SetSecondary(sec_lang);
320 Keymap(23); // turn primary on
322 trans->setCharset(lyxrc->font_norm.c_str());
326 void Intl::Keymap(long code)
330 if (lyxerr.debugging(Debug::KBMAP))
331 lyxerr << "KeyMap callback: " << code << endl;
336 fl_hide_form(fd_form_keymap->KeyMap);
345 code -= 19; // change to language change type code
347 case 4: // 4 and 24 will never be called directly, they will only be
348 case 24: // called through 3,23,43 (lgb)
355 case 27: /* set new font norm */
356 p = fl_get_input(fd_form_keymap->Charset);
357 if (trans->setCharset(p))
358 fl_show_object(fd_form_keymap->ChsetErr);
360 fl_hide_object(fd_form_keymap->ChsetErr);
366 void Intl::MenuKeymap()
368 if (fd_form_keymap->KeyMap->visible) {
369 fl_raise_form(fd_form_keymap->KeyMap);
370 } else fl_show_form(fd_form_keymap->KeyMap, FL_PLACE_MOUSE,
371 FL_FULLBORDER, _("Key Mappings"));