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
36 // a wrapper around the callback static member.
37 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code);
41 : prim_lang(lyxrc.primary_kbmap),
42 sec_lang(lyxrc.secondary_kbmap)
44 keymapon = lyxrc.use_kbmap;
46 primarykeymap = false;
49 r_ = Dialogs::redrawGUI.connect(slot(this, &Intl::redraw));
55 fl_free(fd_form_keymap);
62 if (fd_form_keymap && fd_form_keymap->KeyMap->visible)
63 fl_redraw_form(fd_form_keymap->KeyMap);
67 int Intl::SetPrimary(string const & lang)
69 if (lyxerr.debugging(Debug::KBMAP))
70 lyxerr << "Primary: `" << lang << "'" << endl;
71 return trans.SetPrimary(lang);
75 int Intl::SetSecondary(string const & lang)
77 if (lyxerr.debugging(Debug::KBMAP))
78 lyxerr << "Secondary: `" << lang << "'" << endl;
79 return trans.SetSecondary(lang);
99 fl_set_button(fd_form_keymap->KeyOffBtn, off);
100 fl_set_button(fd_form_keymap->KeyOnBtn, prim);
101 fl_set_button(fd_form_keymap->KeyOnBtn2, sec);
105 void Intl::KeyMapOn(bool on)
106 // turn on/off key mappings, status in keymapon
110 if (!fd_form_keymap) return;
112 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
113 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
114 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
123 fl_set_button(fd_form_keymap->KeyOffBtn, 1);
124 fl_hide_object(fd_form_keymap->KeymapErr);
125 trans.DisableKeymap();
130 void Intl::ToggleKeyMap()
132 if (keymapon && primarykeymap) {
134 } else if (keymapon) {
141 void Intl::KeyMapPrim()
143 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
144 fl_set_button(fd_form_keymap->KeyOnBtn, 1);
145 fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
147 /* read text from choice */
148 int const i = Language->get();
151 if (i == otherkeymap)
152 p = fl_get_input(fd_form_keymap->OtherKeymap);
154 p = Language->getline();
158 if (p.empty() || trans.SetPrimary(p)) {
159 // error selecting keymap
160 fl_show_object(fd_form_keymap->KeymapErr);
164 trans.EnablePrimary();
166 primarykeymap = true;
167 fl_hide_object(fd_form_keymap->KeymapErr);
172 void Intl::KeyMapSec()
174 fl_set_button(fd_form_keymap->KeyOffBtn, 0);
175 fl_set_button(fd_form_keymap->KeyOnBtn, 0);
176 fl_set_button(fd_form_keymap->KeyOnBtn2, 1);
178 // read text from choice
179 int const i = Language2->get();
182 if (i == otherkeymap)
183 p = fl_get_input(fd_form_keymap->OtherKeymap2);
185 p = Language2->getline();
188 if (p.empty() || trans.SetSecondary(p)) {
189 // error selecting keymap
190 fl_show_object(fd_form_keymap->KeymapErr);
194 trans.EnableSecondary();
196 primarykeymap = false;
197 fl_hide_object(fd_form_keymap->KeymapErr);
202 void Intl::LCombo(int, void * v, Combox * combox)
204 Intl * itl = static_cast<Intl*>(v);
205 if (combox == itl->Language.get())
207 else if (combox == itl->Language2.get())
213 void Intl::DispatchCallback(FL_OBJECT * ob, long code)
215 if (ob && (code == 0)) {
216 fl_hide_form(ob->form);
219 if (!ob || !(ob->u_vdata))
222 Intl * itl = static_cast<Intl *>(ob->u_vdata);
224 if (itl != 0) itl->Keymap(code);
228 extern "C" void C_Intl_DispatchCallback(FL_OBJECT * ob, long code)
230 Intl::DispatchCallback(ob, code);
234 void Intl::InitKeyMapper(bool on)
235 // initialize key mapper
237 lyxerr[Debug::INIT] << "Initializing key mappings..." << endl;
239 if (prim_lang.empty() && sec_lang.empty())
244 Language.reset(new Combox(FL_COMBOX_DROPLIST));
245 Language2.reset(new Combox(FL_COMBOX_DROPLIST));
246 Language->setcallback(LCombo, this);
247 Language2->setcallback(LCombo, this);
249 fd_form_keymap = create_form_KeyMap();
251 // Add the Intl* pointer
252 fd_form_keymap->AcceptChset->u_vdata =
253 fd_form_keymap->Charset->u_vdata =
254 fd_form_keymap->Accept->u_vdata =
255 fd_form_keymap->OtherKeymap->u_vdata =
256 fd_form_keymap->KeyOnBtn->u_vdata =
257 fd_form_keymap->KeyOffBtn->u_vdata =
258 fd_form_keymap->KeyOnBtn2->u_vdata = this;
260 // add the callbacks.
261 fl_set_object_callback(fd_form_keymap->AcceptChset,
262 C_Intl_DispatchCallback, 27);
263 fl_set_object_callback(fd_form_keymap->Charset,
264 C_Intl_DispatchCallback, 26);
265 fl_set_object_callback(fd_form_keymap->Accept,
266 C_Intl_DispatchCallback, 0);
268 fl_set_object_callback(fd_form_keymap->KeyOnBtn,
269 C_Intl_DispatchCallback, 23);
270 fl_set_object_callback(fd_form_keymap->KeyOffBtn,
271 C_Intl_DispatchCallback, 3);
272 fl_set_object_callback(fd_form_keymap->KeyOnBtn2,
273 C_Intl_DispatchCallback, 43);
275 // Make sure pressing the close box does not kill LyX. (RvdK)
276 fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, 0);
278 fl_hide_object(fd_form_keymap->KeymapErr);
279 fl_hide_object(fd_form_keymap->ChsetErr);
280 fl_set_input(fd_form_keymap->Charset, lyxrc.font_norm.c_str());
282 // Adds two comboxes to the keyboard map
283 fl_addto_form(fd_form_keymap->KeyMap);
284 Language->add(120, 30, 160, 30, 300); // Primary
285 Language2->add(120, 110, 160, 30, 300); // Secondary
290 for (Languages::const_iterator cit = languages.begin();
291 cit != languages.end(); ++cit) {
292 Language->addto((*cit).second.lang());
293 Language2->addto((*cit).second.lang());
297 Language->addto(_("other..."));
298 Language2->addto(_("other..."));
300 if (!Language->select_text(prim_lang)) {
301 Language->select(n + 1);
302 fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
304 trans.SetPrimary(prim_lang);
306 if (!Language2->select_text(sec_lang)) {
307 Language2->select(n + 1);
308 fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
310 trans.SetSecondary(sec_lang);
314 Keymap(23); // turn primary on
315 trans.setCharset(lyxrc.font_norm);
319 void Intl::Keymap(long code)
321 if (lyxerr.debugging(Debug::KBMAP))
322 lyxerr << "KeyMap callback: " << code << endl;
324 // Did you wonder if it is possible to write spagetti code with
325 // other constructs thatn goto's? Well here we have a nice small
326 // spagetti example using a switch... (Lgb)
330 fl_hide_form(fd_form_keymap->KeyMap);
339 code -= 19; // change to language change type code
341 case 4: // 4 and 24 will never be called directly, they will only be
342 case 24: // called through 3, 23, 43 (lgb)
349 case 27: // set new font norm
350 char const * p = fl_get_input(fd_form_keymap->Charset);
351 if (trans.setCharset(p))
352 fl_show_object(fd_form_keymap->ChsetErr);
354 fl_hide_object(fd_form_keymap->ChsetErr);
360 void Intl::MenuKeymap()
362 if (fd_form_keymap->KeyMap->visible) {
363 fl_raise_form(fd_form_keymap->KeyMap);
364 } else fl_show_form(fd_form_keymap->KeyMap,
365 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_TRANSIENT,