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
30 #include "support/lstrings.h"
32 #include "frontends/Dialogs.h" // redrawGUI
34 #ifdef SIGC_CXX_NAMESPACES
40 // a wrapper around the callback static member.
41 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code);
45 : prim_lang(lyxrc.primary_kbmap),
46 sec_lang(lyxrc.secondary_kbmap)
48 keymapon = lyxrc.use_kbmap;
50 primarykeymap = false;
53 r_ = Dialogs::redrawGUI.connect(slot(this, &Intl::redraw));
65 if (fd_form_keymap && fd_form_keymap->KeyMap->visible)
66 fl_redraw_form(fd_form_keymap->KeyMap);
70 int Intl::SetPrimary(string const & lang)
72 if (lyxerr.debugging(Debug::KBMAP))
73 lyxerr << "Primary: `" << lang << "'" << endl;
74 return trans.SetPrimary(lang);
78 int Intl::SetSecondary(string const & lang)
80 if (lyxerr.debugging(Debug::KBMAP))
81 lyxerr << "Secondary: `" << lang << "'" << endl;
82 return trans.SetSecondary(lang);
102 fl_set_button(fd_form_keymap->KeyOffBtn, off);
103 fl_set_button(fd_form_keymap->KeyOnBtn, prim);
104 fl_set_button(fd_form_keymap->KeyOnBtn2, sec);
108 void Intl::KeyMapOn(bool on)
109 // turn on/off key mappings, status in keymapon
113 if (!fd_form_keymap) return;
115 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
116 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
117 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
126 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
127 fl_hide_object(fd_form_keymap->KeymapErr);
128 trans.DisableKeymap();
133 void Intl::ToggleKeyMap()
135 if (keymapon && primarykeymap) {
137 } else if (keymapon) {
144 void Intl::KeyMapPrim()
146 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
147 fl_set_button(fd_form_keymap->KeyOnBtn, 1);
148 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
150 /* read text from choice */
151 int const i = Language->get();
154 if (i == otherkeymap)
155 p = fl_get_input(fd_form_keymap->OtherKeymap);
157 p = Language->getline();
161 if (p.empty() || trans.SetPrimary(p)) {
162 // error selecting keymap
163 fl_show_object(fd_form_keymap->KeymapErr);
167 trans.EnablePrimary();
169 primarykeymap = true;
170 fl_hide_object(fd_form_keymap->KeymapErr);
175 void Intl::KeyMapSec()
177 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
178 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
179 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
181 // read text from choice
182 int const i = Language2->get();
185 if (i == otherkeymap)
186 p = fl_get_input(fd_form_keymap->OtherKeymap2);
188 p = Language2->getline();
191 if (p.empty() || trans.SetSecondary(p)) {
192 // error selecting keymap
193 fl_show_object(fd_form_keymap->KeymapErr);
197 trans.EnableSecondary();
199 primarykeymap = false;
200 fl_hide_object(fd_form_keymap->KeymapErr);
205 void Intl::LCombo(int, void * v, Combox * combox)
207 Intl * itl = static_cast<Intl*>(v);
208 if (combox == itl->Language)
210 else if (combox == itl->Language2)
216 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
218 if (ob && (code == 0)) {
219 fl_hide_form(ob->form);
222 if (!ob || !(ob->u_vdata))
225 Intl * itl = static_cast<Intl *>(ob->u_vdata);
227 if (itl != 0) itl->Keymap(code);
231 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
233 Intl::DispatchCallback(ob, code);
237 void Intl::InitKeyMapper(bool on)
238 // initialize key mapper
240 lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
242 if (prim_lang.empty() && sec_lang.empty())
247 Language = new Combox(FL_COMBOX_DROPLIST);
248 Language2 = new Combox(FL_COMBOX_DROPLIST);
249 Language->setcallback(LCombo, this);
250 Language2->setcallback(LCombo, this);
252 fd_form_keymap = create_form_KeyMap();
254 // Add the Intl* pointer
255 fd_form_keymap->AcceptChset->u_vdata =
256 fd_form_keymap->Charset->u_vdata =
257 fd_form_keymap->Accept->u_vdata =
258 fd_form_keymap->OtherKeymap->u_vdata =
259 fd_form_keymap->KeyOnBtn->u_vdata =
260 fd_form_keymap->KeyOffBtn->u_vdata =
261 fd_form_keymap->KeyOnBtn2->u_vdata = this;
263 // add the callbacks.
264 fl_set_object_callback(fd_form_keymap->AcceptChset,
265 C_Intl_DispatchCallback, 27);
266 fl_set_object_callback(fd_form_keymap->Charset,
267 C_Intl_DispatchCallback, 26);
268 fl_set_object_callback(fd_form_keymap->Accept,
269 C_Intl_DispatchCallback, 0);
271 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
272 C_Intl_DispatchCallback, 23);
273 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
274 C_Intl_DispatchCallback, 3);
275 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
276 C_Intl_DispatchCallback, 43);
278 // Make sure pressing the close box does not kill LyX. (RvdK)
279 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
281 fl_hide_object(fd_form_keymap->KeymapErr);
282 fl_hide_object(fd_form_keymap->ChsetErr);
283 fl_set_input(fd_form_keymap->Charset, lyxrc.font_norm.c_str());
285 // Adds two comboxes to the keyboard map
286 fl_addto_form(fd_form_keymap->KeyMap);
287 Language->add(120, 30, 160, 30, 300); // Primary
288 Language2->add(120, 110, 160, 30, 300); // Secondary
293 for (Languages::const_iterator cit = languages.begin();
294 cit != languages.end(); ++cit) {
295 Language->addto((*cit).second.lang());
296 Language2->addto((*cit).second.lang());
300 Language->addto(_("other..."));
301 Language2->addto(_("other..."));
303 if (!Language->select_text(prim_lang)) {
304 Language->select(n + 1);
305 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
307 trans.SetPrimary(prim_lang);
309 if (!Language2->select_text(sec_lang)) {
310 Language2->select(n + 1);
311 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
313 trans.SetSecondary(sec_lang);
317 Keymap(23); // turn primary on
318 trans.setCharset(lyxrc.font_norm);
322 void Intl::Keymap(long code)
324 if (lyxerr.debugging(Debug::KBMAP))
325 lyxerr << "KeyMap callback: " << code << endl;
327 // Did you wonder if it is possible to write spagetti code with
328 // other constructs thatn goto's? Well here we have a nice small
329 // spagetti example using a switch... (Lgb)
333 fl_hide_form(fd_form_keymap->KeyMap);
342 code -= 19; // change to language change type code
344 case 4: // 4 and 24 will never be called directly, they will only be
345 case 24: // called through 3, 23, 43 (lgb)
352 case 27: // set new font norm
353 char const * p = fl_get_input(fd_form_keymap->Charset);
354 if (trans.setCharset(p))
355 fl_show_object(fd_form_keymap->ChsetErr);
357 fl_hide_object(fd_form_keymap->ChsetErr);
363 void Intl::MenuKeymap()
365 if (fd_form_keymap->KeyMap->visible) {
366 fl_raise_form(fd_form_keymap->KeyMap);
367 } else fl_show_form(fd_form_keymap->KeyMap,
368 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_TRANSIENT,