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;
51 int Intl::SetPrimary(string const & lang)
53 if (lyxerr.debugging(Debug::KBMAP))
54 lyxerr << "Primary: `" << lang << "'" << endl;
55 return trans->SetPrimary(lang);
59 int Intl::SetSecondary(string const & lang)
61 if (lyxerr.debugging(Debug::KBMAP))
62 lyxerr << "Secondary: `" << lang << "'" << endl;
63 return trans->SetSecondary(lang);
83 fl_set_button(fd_form_keymap->KeyOffBtn, off);
84 fl_set_button(fd_form_keymap->KeyOnBtn, prim);
85 fl_set_button(fd_form_keymap->KeyOnBtn2, sec);
89 void Intl::KeyMapOn(bool on)
90 /* turn on/off key mappings, status in keymapon */
94 if (!fd_form_keymap) return;
96 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
97 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
98 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
107 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
108 fl_hide_object(fd_form_keymap->KeymapErr);
109 trans->DisableKeymap();
114 void Intl::ToggleKeyMap()
116 if (keymapon && primarykeymap) {
118 } else if (keymapon) {
125 void Intl::KeyMapPrim()
127 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
128 fl_set_button(fd_form_keymap->KeyOnBtn, 1);
129 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
131 /* read text from choice */
132 int i = Language->get();
134 if (lyxerr.debugging(Debug::KBMAP))
135 lyxerr << "Table: " << tex_babel[i-1] << endl;
138 if (i == otherkeymap)
139 p = fl_get_input(fd_form_keymap->OtherKeymap);
141 p = Language->getline();
145 if (p.empty() || trans->SetPrimary(p)) {
146 // error selecting keymap
147 fl_show_object(fd_form_keymap->KeymapErr);
151 trans->EnablePrimary();
153 primarykeymap = true;
154 fl_hide_object(fd_form_keymap->KeymapErr);
159 void Intl::KeyMapSec()
161 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
162 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
163 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
165 /* read text from choice */
166 int i = Language2->get();
168 if (lyxerr.debugging(Debug::KBMAP))
169 lyxerr << "Table: " << tex_babel[i-1] << endl;
172 if (i == otherkeymap)
173 p = fl_get_input(fd_form_keymap->OtherKeymap2);
175 p = Language2->getline();
178 if (p.empty() || trans->SetSecondary(p)) {
179 // error selecting keymap
180 fl_show_object(fd_form_keymap->KeymapErr);
184 trans->EnableSecondary();
186 primarykeymap = false;
187 fl_hide_object(fd_form_keymap->KeymapErr);
192 void Intl::LCombo(int, void * v)
194 Intl * itl = static_cast<Intl*>(v);
200 void Intl::LCombo2(int, void * v)
202 Intl * itl = static_cast<Intl*>(v);
208 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
210 if (ob && (code == 0)) {
211 fl_hide_form(ob->form);
214 if (!ob || !(ob->u_vdata))
217 Intl * itl = static_cast<Intl *>(ob->u_vdata);
219 if (itl!= 0) itl->Keymap(code);
222 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
224 Intl::DispatchCallback(ob, code);
227 void Intl::InitKeyMapper(bool on)
228 /* initialize key mapper */
230 lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
232 if (prim_lang.empty() && sec_lang.empty())
237 Language = new Combox(FL_COMBOX_DROPLIST);
238 Language2 = new Combox(FL_COMBOX_DROPLIST);
239 Language->setcallback(LCombo, this);
240 Language2->setcallback(LCombo2, this);
242 fd_form_keymap = create_form_KeyMap();
244 // Add the Intl* pointer
245 fd_form_keymap->AcceptChset->u_vdata =
246 fd_form_keymap->Charset->u_vdata =
247 fd_form_keymap->Accept->u_vdata =
248 fd_form_keymap->OtherKeymap->u_vdata =
249 fd_form_keymap->KeyOnBtn->u_vdata =
250 fd_form_keymap->KeyOffBtn->u_vdata =
251 fd_form_keymap->KeyOnBtn2->u_vdata = this;
253 // add the callbacks.
254 fl_set_object_callback(fd_form_keymap->AcceptChset,
255 C_Intl_DispatchCallback, 27);
256 fl_set_object_callback(fd_form_keymap->Charset,
257 C_Intl_DispatchCallback, 26);
258 fl_set_object_callback(fd_form_keymap->Accept,
259 C_Intl_DispatchCallback, 0);
261 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
262 C_Intl_DispatchCallback, 23);
263 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
264 C_Intl_DispatchCallback, 3);
265 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
266 C_Intl_DispatchCallback, 43);
268 // Make sure pressing the close box does not kill LyX. (RvdK)
269 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
271 fl_hide_object(fd_form_keymap->KeymapErr);
272 fl_hide_object(fd_form_keymap->ChsetErr);
273 fl_set_input(fd_form_keymap->Charset, lyxrc->font_norm.c_str());
275 // Adds two comboxes to the keyboard map
276 fl_addto_form(fd_form_keymap->KeyMap);
277 Language->add(120, 30, 160, 30, 300); // Primary
278 Language2->add(120, 110, 160, 30, 300); // Secondary
284 if (!strlen(tex_babel[n]))
287 Language->addto(tex_babel[n]);
288 Language2->addto(tex_babel[n]);
292 Language->addto(_("other..."));
293 Language2->addto(_("other..."));
295 if (!Language->select_text(prim_lang.c_str())) {
296 Language->select(n+1);
297 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
300 trans->SetPrimary(prim_lang);
302 if (!Language2->select_text(sec_lang.c_str())) {
303 Language2->select(n+1);
304 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
307 trans->SetSecondary(sec_lang);
311 Keymap(23); // turn primary on
313 trans->setCharset(lyxrc->font_norm.c_str());
317 void Intl::Keymap(long code)
319 if (lyxerr.debugging(Debug::KBMAP))
320 lyxerr << "KeyMap callback: " << code << endl;
325 fl_hide_form(fd_form_keymap->KeyMap);
334 code -= 19; // change to language change type code
336 case 4: // 4 and 24 will never be called directly, they will only be
337 case 24: // called through 3, 23, 43 (lgb)
344 case 27: /* set new font norm */
345 char const * p = fl_get_input(fd_form_keymap->Charset);
346 if (trans->setCharset(p))
347 fl_show_object(fd_form_keymap->ChsetErr);
349 fl_hide_object(fd_form_keymap->ChsetErr);
355 void Intl::MenuKeymap()
357 if (fd_form_keymap->KeyMap->visible) {
358 fl_raise_form(fd_form_keymap->KeyMap);
359 } else fl_show_form(fd_form_keymap->KeyMap, FL_PLACE_MOUSE,
360 FL_FULLBORDER, _("Key Mappings"));