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"
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),
47 trans(new TransManager)
49 keymapon = lyxrc.use_kbmap;
51 primarykeymap = false;
54 r_ = Dialogs::redrawGUI.connect(slot(this, &Intl::redraw));
66 if (fd_form_keymap && fd_form_keymap->KeyMap->visible)
67 fl_redraw_form(fd_form_keymap->KeyMap);
71 int Intl::SetPrimary(string const & lang)
73 if (lyxerr.debugging(Debug::KBMAP))
74 lyxerr << "Primary: `" << lang << "'" << endl;
75 return trans->SetPrimary(lang);
79 int Intl::SetSecondary(string const & lang)
81 if (lyxerr.debugging(Debug::KBMAP))
82 lyxerr << "Secondary: `" << lang << "'" << endl;
83 return trans->SetSecondary(lang);
103 fl_set_button(fd_form_keymap->KeyOffBtn, off);
104 fl_set_button(fd_form_keymap->KeyOnBtn, prim);
105 fl_set_button(fd_form_keymap->KeyOnBtn2, sec);
109 void Intl::KeyMapOn(bool on)
110 /* turn on/off key mappings, status in keymapon */
114 if (!fd_form_keymap) return;
116 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
117 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
118 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
127 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
128 fl_hide_object(fd_form_keymap->KeymapErr);
129 trans->DisableKeymap();
134 void Intl::ToggleKeyMap()
136 if (keymapon && primarykeymap) {
138 } else if (keymapon) {
145 void Intl::KeyMapPrim()
147 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
148 fl_set_button(fd_form_keymap->KeyOnBtn, 1);
149 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
151 /* read text from choice */
152 int const i = Language->get();
155 if (i == otherkeymap)
156 p = fl_get_input(fd_form_keymap->OtherKeymap);
158 p = Language->getline();
162 if (p.empty() || trans->SetPrimary(p)) {
163 // error selecting keymap
164 fl_show_object(fd_form_keymap->KeymapErr);
168 trans->EnablePrimary();
170 primarykeymap = true;
171 fl_hide_object(fd_form_keymap->KeymapErr);
176 void Intl::KeyMapSec()
178 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
179 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
180 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
182 /* read text from choice */
183 int const i = Language2->get();
186 if (i == otherkeymap)
187 p = fl_get_input(fd_form_keymap->OtherKeymap2);
189 p = Language2->getline();
192 if (p.empty() || trans->SetSecondary(p)) {
193 // error selecting keymap
194 fl_show_object(fd_form_keymap->KeymapErr);
198 trans->EnableSecondary();
200 primarykeymap = false;
201 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)
215 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
217 if (ob && (code == 0)) {
218 fl_hide_form(ob->form);
221 if (!ob || !(ob->u_vdata))
224 Intl * itl = static_cast<Intl *>(ob->u_vdata);
226 if (itl!= 0) itl->Keymap(code);
230 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
232 Intl::DispatchCallback(ob, code);
236 void Intl::InitKeyMapper(bool on)
237 /* initialize key mapper */
239 lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
241 if (prim_lang.empty() && sec_lang.empty())
246 Language = new Combox(FL_COMBOX_DROPLIST);
247 Language2 = new Combox(FL_COMBOX_DROPLIST);
248 Language->setcallback(LCombo, this);
249 Language2->setcallback(LCombo, this);
251 fd_form_keymap = create_form_KeyMap();
253 // Add the Intl* pointer
254 fd_form_keymap->AcceptChset->u_vdata =
255 fd_form_keymap->Charset->u_vdata =
256 fd_form_keymap->Accept->u_vdata =
257 fd_form_keymap->OtherKeymap->u_vdata =
258 fd_form_keymap->KeyOnBtn->u_vdata =
259 fd_form_keymap->KeyOffBtn->u_vdata =
260 fd_form_keymap->KeyOnBtn2->u_vdata = this;
262 // add the callbacks.
263 fl_set_object_callback(fd_form_keymap->AcceptChset,
264 C_Intl_DispatchCallback, 27);
265 fl_set_object_callback(fd_form_keymap->Charset,
266 C_Intl_DispatchCallback, 26);
267 fl_set_object_callback(fd_form_keymap->Accept,
268 C_Intl_DispatchCallback, 0);
270 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
271 C_Intl_DispatchCallback, 23);
272 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
273 C_Intl_DispatchCallback, 3);
274 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
275 C_Intl_DispatchCallback, 43);
277 // Make sure pressing the close box does not kill LyX. (RvdK)
278 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
280 fl_hide_object(fd_form_keymap->KeymapErr);
281 fl_hide_object(fd_form_keymap->ChsetErr);
282 fl_set_input(fd_form_keymap->Charset, lyxrc.font_norm.c_str());
284 // Adds two comboxes to the keyboard map
285 fl_addto_form(fd_form_keymap->KeyMap);
286 Language->add(120, 30, 160, 30, 300); // Primary
287 Language2->add(120, 110, 160, 30, 300); // Secondary
291 // Default is not in the language map
292 #ifdef DO_USE_DEFAULT_LANGUAGE
293 Language->addto("default");
294 Language2->addto("default");
297 for (Languages::const_iterator cit = languages.begin();
298 cit != languages.end(); ++cit) {
299 Language->addto((*cit).second.lang());
300 Language2->addto((*cit).second.lang());
304 Language->addto(_("other..."));
305 Language2->addto(_("other..."));
307 if (!Language->select_text(prim_lang)) {
308 Language->select(n + 1);
309 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
312 trans->SetPrimary(prim_lang);
314 if (!Language2->select_text(sec_lang)) {
315 Language2->select(n + 1);
316 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
319 trans->SetSecondary(sec_lang);
323 Keymap(23); // turn primary on
325 trans->setCharset(lyxrc.font_norm);
329 void Intl::Keymap(long code)
331 if (lyxerr.debugging(Debug::KBMAP))
332 lyxerr << "KeyMap callback: " << code << endl;
334 // Did you wonder if it is possible to write spagetti code with
335 // other constructs thatn goto's? Well here we have a nice small
336 // spagetti example using a switch... (Lgb)
340 fl_hide_form(fd_form_keymap->KeyMap);
349 code -= 19; // change to language change type code
351 case 4: // 4 and 24 will never be called directly, they will only be
352 case 24: // called through 3, 23, 43 (lgb)
359 case 27: /* set new font norm */
360 char const * p = fl_get_input(fd_form_keymap->Charset);
361 if (trans->setCharset(p))
362 fl_show_object(fd_form_keymap->ChsetErr);
364 fl_hide_object(fd_form_keymap->ChsetErr);
370 void Intl::MenuKeymap()
372 if (fd_form_keymap->KeyMap->visible) {
373 fl_raise_form(fd_form_keymap->KeyMap);
374 } else fl_show_form(fd_form_keymap->KeyMap,
375 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_TRANSIENT,