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;
57 int Intl::SetPrimary(string const & lang)
59 if (lyxerr.debugging(Debug::KBMAP))
60 lyxerr << "Primary: `" << lang << "'" << endl;
61 return trans->SetPrimary(lang);
65 int Intl::SetSecondary(string const & lang)
67 if (lyxerr.debugging(Debug::KBMAP))
68 lyxerr << "Secondary: `" << lang << "'" << endl;
69 return trans->SetSecondary(lang);
89 fl_set_button(fd_form_keymap->KeyOffBtn, off);
90 fl_set_button(fd_form_keymap->KeyOnBtn, prim);
91 fl_set_button(fd_form_keymap->KeyOnBtn2, sec);
95 void Intl::KeyMapOn(bool on)
96 /* turn on/off key mappings, status in keymapon */
100 if (!fd_form_keymap) return;
102 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
103 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
104 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
113 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
114 fl_hide_object(fd_form_keymap->KeymapErr);
115 trans->DisableKeymap();
120 void Intl::ToggleKeyMap()
122 if (keymapon && primarykeymap) {
124 } else if (keymapon) {
131 void Intl::KeyMapPrim()
133 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
134 fl_set_button(fd_form_keymap->KeyOnBtn, 1);
135 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
137 /* read text from choice */
138 int const i = Language->get();
141 if (i == otherkeymap)
142 p = fl_get_input(fd_form_keymap->OtherKeymap);
144 p = Language->getline();
148 if (p.empty() || trans->SetPrimary(p)) {
149 // error selecting keymap
150 fl_show_object(fd_form_keymap->KeymapErr);
154 trans->EnablePrimary();
156 primarykeymap = true;
157 fl_hide_object(fd_form_keymap->KeymapErr);
162 void Intl::KeyMapSec()
164 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
165 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
166 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
168 /* read text from choice */
169 int const i = Language2->get();
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);
191 void Intl::LCombo(int, void * v, Combox * combox)
193 Intl * itl = static_cast<Intl*>(v);
194 if (combox == itl->Language)
196 else if (combox == itl->Language2)
201 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
203 if (ob && (code == 0)) {
204 fl_hide_form(ob->form);
207 if (!ob || !(ob->u_vdata))
210 Intl * itl = static_cast<Intl *>(ob->u_vdata);
212 if (itl!= 0) itl->Keymap(code);
216 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
218 Intl::DispatchCallback(ob, code);
222 void Intl::InitKeyMapper(bool on)
223 /* initialize key mapper */
225 lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
227 if (prim_lang.empty() && sec_lang.empty())
232 Language = new Combox(FL_COMBOX_DROPLIST);
233 Language2 = new Combox(FL_COMBOX_DROPLIST);
234 Language->setcallback(LCombo, this);
235 Language2->setcallback(LCombo, this);
237 fd_form_keymap = create_form_KeyMap();
239 // Add the Intl* pointer
240 fd_form_keymap->AcceptChset->u_vdata =
241 fd_form_keymap->Charset->u_vdata =
242 fd_form_keymap->Accept->u_vdata =
243 fd_form_keymap->OtherKeymap->u_vdata =
244 fd_form_keymap->KeyOnBtn->u_vdata =
245 fd_form_keymap->KeyOffBtn->u_vdata =
246 fd_form_keymap->KeyOnBtn2->u_vdata = this;
248 // add the callbacks.
249 fl_set_object_callback(fd_form_keymap->AcceptChset,
250 C_Intl_DispatchCallback, 27);
251 fl_set_object_callback(fd_form_keymap->Charset,
252 C_Intl_DispatchCallback, 26);
253 fl_set_object_callback(fd_form_keymap->Accept,
254 C_Intl_DispatchCallback, 0);
256 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
257 C_Intl_DispatchCallback, 23);
258 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
259 C_Intl_DispatchCallback, 3);
260 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
261 C_Intl_DispatchCallback, 43);
263 // Make sure pressing the close box does not kill LyX. (RvdK)
264 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
266 fl_hide_object(fd_form_keymap->KeymapErr);
267 fl_hide_object(fd_form_keymap->ChsetErr);
268 fl_set_input(fd_form_keymap->Charset, lyxrc.font_norm.c_str());
270 // Adds two comboxes to the keyboard map
271 fl_addto_form(fd_form_keymap->KeyMap);
272 Language->add(120, 30, 160, 30, 300); // Primary
273 Language2->add(120, 110, 160, 30, 300); // Secondary
277 // Default is not in the language map
278 #ifdef DO_USE_DEFAULT_LANGUAGE
279 Language->addto("default");
280 Language2->addto("default");
283 for (Languages::const_iterator cit = languages.begin();
284 cit != languages.end(); ++cit) {
285 Language->addto((*cit).second.lang());
286 Language2->addto((*cit).second.lang());
290 Language->addto(_("other..."));
291 Language2->addto(_("other..."));
293 if (!Language->select_text(prim_lang)) {
294 Language->select(n + 1);
295 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
298 trans->SetPrimary(prim_lang);
300 if (!Language2->select_text(sec_lang)) {
301 Language2->select(n + 1);
302 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
305 trans->SetSecondary(sec_lang);
309 Keymap(23); // turn primary on
311 trans->setCharset(lyxrc.font_norm);
315 void Intl::Keymap(long code)
317 if (lyxerr.debugging(Debug::KBMAP))
318 lyxerr << "KeyMap callback: " << code << endl;
320 // Did you wonder if it is possible to write spagetti code with
321 // other constructs thatn goto's? Well here we have a nice small
322 // spagetti example using a switch... (Lgb)
326 fl_hide_form(fd_form_keymap->KeyMap);
335 code -= 19; // change to language change type code
337 case 4: // 4 and 24 will never be called directly, they will only be
338 case 24: // called through 3, 23, 43 (lgb)
345 case 27: /* set new font norm */
346 char const * p = fl_get_input(fd_form_keymap->Charset);
347 if (trans->setCharset(p))
348 fl_show_object(fd_form_keymap->ChsetErr);
350 fl_hide_object(fd_form_keymap->ChsetErr);
356 void Intl::MenuKeymap()
358 if (fd_form_keymap->KeyMap->visible) {
359 fl_raise_form(fd_form_keymap->KeyMap);
360 } else fl_show_form(fd_form_keymap->KeyMap, FL_PLACE_MOUSE,
361 FL_FULLBORDER, _("Key Mappings"));