1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich
7 * Copyright 1995-2000 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
31 #include "trans_mgr.h"
34 #include "support/lstrings.h"
36 #include "frontends/Dialogs.h" // redrawGUI
38 #ifdef SIGC_CXX_NAMESPACES
44 // a wrapper around the callback static member.
45 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code);
49 : prim_lang(lyxrc.primary_kbmap),
50 sec_lang(lyxrc.secondary_kbmap)
52 , trans(new TransManager)
55 keymapon = lyxrc.use_kbmap;
57 primarykeymap = false;
60 r_ = Dialogs::redrawGUI.connect(slot(this, &Intl::redraw));
75 if (fd_form_keymap && fd_form_keymap->KeyMap->visible)
76 fl_redraw_form(fd_form_keymap->KeyMap);
80 int Intl::SetPrimary(string const & lang)
82 if (lyxerr.debugging(Debug::KBMAP))
83 lyxerr << "Primary: `" << lang << "'" << endl;
85 return trans->SetPrimary(lang);
87 return trans.SetPrimary(lang);
92 int Intl::SetSecondary(string const & lang)
94 if (lyxerr.debugging(Debug::KBMAP))
95 lyxerr << "Secondary: `" << lang << "'" << endl;
97 return trans->SetSecondary(lang);
99 return trans.SetSecondary(lang);
120 fl_set_button(fd_form_keymap->KeyOffBtn, off);
121 fl_set_button(fd_form_keymap->KeyOnBtn, prim);
122 fl_set_button(fd_form_keymap->KeyOnBtn2, sec);
126 void Intl::KeyMapOn(bool on)
127 // turn on/off key mappings, status in keymapon
131 if (!fd_form_keymap) return;
133 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
134 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
135 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
144 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
145 fl_hide_object(fd_form_keymap->KeymapErr);
147 trans->DisableKeymap();
149 trans.DisableKeymap();
155 void Intl::ToggleKeyMap()
157 if (keymapon && primarykeymap) {
159 } else if (keymapon) {
166 void Intl::KeyMapPrim()
168 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
169 fl_set_button(fd_form_keymap->KeyOnBtn, 1);
170 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
172 /* read text from choice */
173 int const i = Language->get();
176 if (i == otherkeymap)
177 p = fl_get_input(fd_form_keymap->OtherKeymap);
179 p = Language->getline();
184 if (p.empty() || trans->SetPrimary(p)) {
186 if (p.empty() || trans.SetPrimary(p)) {
188 // error selecting keymap
189 fl_show_object(fd_form_keymap->KeymapErr);
194 trans->EnablePrimary();
196 trans.EnablePrimary();
199 primarykeymap = true;
200 fl_hide_object(fd_form_keymap->KeymapErr);
205 void Intl::KeyMapSec()
207 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
208 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
209 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
211 // read text from choice
212 int const i = Language2->get();
215 if (i == otherkeymap)
216 p = fl_get_input(fd_form_keymap->OtherKeymap2);
218 p = Language2->getline();
222 if (p.empty() || trans->SetSecondary(p)) {
223 // error selecting keymap
224 fl_show_object(fd_form_keymap->KeymapErr);
228 trans->EnableSecondary();
230 primarykeymap = false;
231 fl_hide_object(fd_form_keymap->KeymapErr);
234 if (p.empty() || trans.SetSecondary(p)) {
235 // error selecting keymap
236 fl_show_object(fd_form_keymap->KeymapErr);
240 trans.EnableSecondary();
242 primarykeymap = false;
243 fl_hide_object(fd_form_keymap->KeymapErr);
249 void Intl::LCombo(int, void * v, Combox * combox)
251 Intl * itl = static_cast<Intl*>(v);
252 if (combox == itl->Language)
254 else if (combox == itl->Language2)
260 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
262 if (ob && (code == 0)) {
263 fl_hide_form(ob->form);
266 if (!ob || !(ob->u_vdata))
269 Intl * itl = static_cast<Intl *>(ob->u_vdata);
271 if (itl != 0) itl->Keymap(code);
275 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
277 Intl::DispatchCallback(ob, code);
281 void Intl::InitKeyMapper(bool on)
282 // initialize key mapper
284 lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
286 if (prim_lang.empty() && sec_lang.empty())
291 Language = new Combox(FL_COMBOX_DROPLIST);
292 Language2 = new Combox(FL_COMBOX_DROPLIST);
293 Language->setcallback(LCombo, this);
294 Language2->setcallback(LCombo, this);
296 fd_form_keymap = create_form_KeyMap();
298 // Add the Intl* pointer
299 fd_form_keymap->AcceptChset->u_vdata =
300 fd_form_keymap->Charset->u_vdata =
301 fd_form_keymap->Accept->u_vdata =
302 fd_form_keymap->OtherKeymap->u_vdata =
303 fd_form_keymap->KeyOnBtn->u_vdata =
304 fd_form_keymap->KeyOffBtn->u_vdata =
305 fd_form_keymap->KeyOnBtn2->u_vdata = this;
307 // add the callbacks.
308 fl_set_object_callback(fd_form_keymap->AcceptChset,
309 C_Intl_DispatchCallback, 27);
310 fl_set_object_callback(fd_form_keymap->Charset,
311 C_Intl_DispatchCallback, 26);
312 fl_set_object_callback(fd_form_keymap->Accept,
313 C_Intl_DispatchCallback, 0);
315 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
316 C_Intl_DispatchCallback, 23);
317 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
318 C_Intl_DispatchCallback, 3);
319 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
320 C_Intl_DispatchCallback, 43);
322 // Make sure pressing the close box does not kill LyX. (RvdK)
323 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
325 fl_hide_object(fd_form_keymap->KeymapErr);
326 fl_hide_object(fd_form_keymap->ChsetErr);
327 fl_set_input(fd_form_keymap->Charset, lyxrc.font_norm.c_str());
329 // Adds two comboxes to the keyboard map
330 fl_addto_form(fd_form_keymap->KeyMap);
331 Language->add(120, 30, 160, 30, 300); // Primary
332 Language2->add(120, 110, 160, 30, 300); // Secondary
336 // Default is not in the language map
337 #ifdef DO_USE_DEFAULT_LANGUAGE
338 Language->addto("default");
339 Language2->addto("default");
342 for (Languages::const_iterator cit = languages.begin();
343 cit != languages.end(); ++cit) {
344 Language->addto((*cit).second.lang());
345 Language2->addto((*cit).second.lang());
349 Language->addto(_("other..."));
350 Language2->addto(_("other..."));
352 if (!Language->select_text(prim_lang)) {
353 Language->select(n + 1);
354 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
358 trans->SetPrimary(prim_lang);
360 trans.SetPrimary(prim_lang);
362 if (!Language2->select_text(sec_lang)) {
363 Language2->select(n + 1);
364 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
368 trans->SetSecondary(sec_lang);
370 trans.SetSecondary(sec_lang);
375 Keymap(23); // turn primary on
377 trans->setCharset(lyxrc.font_norm);
379 trans.setCharset(lyxrc.font_norm);
384 void Intl::Keymap(long code)
386 if (lyxerr.debugging(Debug::KBMAP))
387 lyxerr << "KeyMap callback: " << code << endl;
389 // Did you wonder if it is possible to write spagetti code with
390 // other constructs thatn goto's? Well here we have a nice small
391 // spagetti example using a switch... (Lgb)
395 fl_hide_form(fd_form_keymap->KeyMap);
404 code -= 19; // change to language change type code
406 case 4: // 4 and 24 will never be called directly, they will only be
407 case 24: // called through 3, 23, 43 (lgb)
414 case 27: // set new font norm
415 char const * p = fl_get_input(fd_form_keymap->Charset);
417 if (trans->setCharset(p))
419 if (trans.setCharset(p))
421 fl_show_object(fd_form_keymap->ChsetErr);
423 fl_hide_object(fd_form_keymap->ChsetErr);
429 void Intl::MenuKeymap()
431 if (fd_form_keymap->KeyMap->visible) {
432 fl_raise_form(fd_form_keymap->KeyMap);
433 } else fl_show_form(fd_form_keymap->KeyMap,
434 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_TRANSIENT,