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
29 #include "trans_mgr.h"
30 #include "support/lstrings.h"
35 // a wrapper around the callback static member.
36 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code);
40 : prim_lang(lyxrc.primary_kbmap),
41 sec_lang(lyxrc.secondary_kbmap),
42 trans(new TransManager)
44 keymapon = lyxrc.use_kbmap;
46 primarykeymap = false;
52 int Intl::SetPrimary(string const & lang)
54 if (lyxerr.debugging(Debug::KBMAP))
55 lyxerr << "Primary: `" << lang << "'" << endl;
56 return trans->SetPrimary(lang);
60 int Intl::SetSecondary(string const & lang)
62 if (lyxerr.debugging(Debug::KBMAP))
63 lyxerr << "Secondary: `" << lang << "'" << endl;
64 return trans->SetSecondary(lang);
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);
90 void Intl::KeyMapOn(bool on)
91 /* turn on/off key mappings, status in keymapon */
95 if (!fd_form_keymap) return;
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);
108 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
109 fl_hide_object(fd_form_keymap->KeymapErr);
110 trans->DisableKeymap();
115 void Intl::ToggleKeyMap()
117 if (keymapon && primarykeymap) {
119 } else if (keymapon) {
126 void Intl::KeyMapPrim()
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);
132 /* read text from choice */
133 int i = Language->get();
136 if (lyxerr.debugging(Debug::KBMAP))
137 lyxerr << "Table: " << tex_babel[i-1] << endl;
140 if (i == otherkeymap)
141 p = fl_get_input(fd_form_keymap->OtherKeymap);
143 p = Language->getline();
147 if (p.empty() || trans->SetPrimary(p)) {
148 // error selecting keymap
149 fl_show_object(fd_form_keymap->KeymapErr);
153 trans->EnablePrimary();
155 primarykeymap = true;
156 fl_hide_object(fd_form_keymap->KeymapErr);
161 void Intl::KeyMapSec()
163 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
164 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
165 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
167 /* read text from choice */
168 int i = Language2->get();
171 if (lyxerr.debugging(Debug::KBMAP))
172 lyxerr << "Table: " << tex_babel[i-1] << endl;
175 if (i == otherkeymap)
176 p = fl_get_input(fd_form_keymap->OtherKeymap2);
178 p = Language2->getline();
181 if (p.empty() || trans->SetSecondary(p)) {
182 // error selecting keymap
183 fl_show_object(fd_form_keymap->KeymapErr);
187 trans->EnableSecondary();
189 primarykeymap = false;
190 fl_hide_object(fd_form_keymap->KeymapErr);
195 void Intl::LCombo(int, void * v)
197 Intl * itl = static_cast<Intl*>(v);
203 void Intl::LCombo2(int, void * v)
205 Intl * itl = static_cast<Intl*>(v);
211 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
213 if (ob && (code == 0)) {
214 fl_hide_form(ob->form);
217 if (!ob || !(ob->u_vdata))
220 Intl * itl = static_cast<Intl *>(ob->u_vdata);
222 if (itl!= 0) itl->Keymap(code);
226 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
228 Intl::DispatchCallback(ob, code);
232 void Intl::InitKeyMapper(bool on)
233 /* initialize key mapper */
235 lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
237 if (prim_lang.empty() && sec_lang.empty())
242 Language = new Combox(FL_COMBOX_DROPLIST);
243 Language2 = new Combox(FL_COMBOX_DROPLIST);
244 Language->setcallback(LCombo, this);
245 Language2->setcallback(LCombo2, this);
247 fd_form_keymap = create_form_KeyMap();
249 // Add the Intl* pointer
250 fd_form_keymap->AcceptChset->u_vdata =
251 fd_form_keymap->Charset->u_vdata =
252 fd_form_keymap->Accept->u_vdata =
253 fd_form_keymap->OtherKeymap->u_vdata =
254 fd_form_keymap->KeyOnBtn->u_vdata =
255 fd_form_keymap->KeyOffBtn->u_vdata =
256 fd_form_keymap->KeyOnBtn2->u_vdata = this;
258 // add the callbacks.
259 fl_set_object_callback(fd_form_keymap->AcceptChset,
260 C_Intl_DispatchCallback, 27);
261 fl_set_object_callback(fd_form_keymap->Charset,
262 C_Intl_DispatchCallback, 26);
263 fl_set_object_callback(fd_form_keymap->Accept,
264 C_Intl_DispatchCallback, 0);
266 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
267 C_Intl_DispatchCallback, 23);
268 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
269 C_Intl_DispatchCallback, 3);
270 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
271 C_Intl_DispatchCallback, 43);
273 // Make sure pressing the close box does not kill LyX. (RvdK)
274 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
276 fl_hide_object(fd_form_keymap->KeymapErr);
277 fl_hide_object(fd_form_keymap->ChsetErr);
278 fl_set_input(fd_form_keymap->Charset, lyxrc.font_norm.c_str());
280 // Adds two comboxes to the keyboard map
281 fl_addto_form(fd_form_keymap->KeyMap);
282 Language->add(120, 30, 160, 30, 300); // Primary
283 Language2->add(120, 110, 160, 30, 300); // Secondary
289 if (!strlen(tex_babel[n]))
292 Language->addto(tex_babel[n]);
293 Language2->addto(tex_babel[n]);
298 // Default is not in the language map
299 Language->addto("default");
300 Language2->addto("default");
301 for (Languages::const_iterator cit = languages.begin();
302 cit != languages.end(); ++cit) {
303 Language->addto((*cit).second.lang.c_str());
304 Language2->addto((*cit).second.lang.c_str());
308 Language->addto(_("other..."));
309 Language2->addto(_("other..."));
311 if (!Language->select_text(prim_lang.c_str())) {
312 Language->select(n+1);
313 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
316 trans->SetPrimary(prim_lang);
318 if (!Language2->select_text(sec_lang.c_str())) {
319 Language2->select(n + 1);
320 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
323 trans->SetSecondary(sec_lang);
327 Keymap(23); // turn primary on
329 trans->setCharset(lyxrc.font_norm.c_str());
333 void Intl::Keymap(long code)
335 if (lyxerr.debugging(Debug::KBMAP))
336 lyxerr << "KeyMap callback: " << code << endl;
338 // Did you wonder if it is possible to write spagetti code with
339 // other constructs thatn goto's? Well here we have a nice small
340 // spagetti example using a switch... (Lgb)
344 fl_hide_form(fd_form_keymap->KeyMap);
353 code -= 19; // change to language change type code
355 case 4: // 4 and 24 will never be called directly, they will only be
356 case 24: // called through 3, 23, 43 (lgb)
363 case 27: /* set new font norm */
364 char const * p = fl_get_input(fd_form_keymap->Charset);
365 if (trans->setCharset(p))
366 fl_show_object(fd_form_keymap->ChsetErr);
368 fl_hide_object(fd_form_keymap->ChsetErr);
374 void Intl::MenuKeymap()
376 if (fd_form_keymap->KeyMap->visible) {
377 fl_raise_form(fd_form_keymap->KeyMap);
378 } else fl_show_form(fd_form_keymap->KeyMap, FL_PLACE_MOUSE,
379 FL_FULLBORDER, _("Key Mappings"));