home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lyx-0.13.2.tar.gz / lyx-0.13.2.tar / lyx-0.13.2 / src / intl.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  8KB  |  364 lines

  1. /* This file is part of
  2. * ======================================================
  3. *           LyX, The Document Processor
  4. *      
  5. *        Copyright (C) 1995 Matthias Ettrich
  6. *           Copyright (C) 1995-1998 The LyX Team.
  7. *
  8. *======================================================*/
  9.  
  10. /*
  11.  *    International support for LyX
  12.  */
  13.  
  14. #include <config.h>
  15.  
  16. #ifdef __GNUG__
  17. #pragma implementation
  18. #endif
  19.  
  20. #include FORMS_H_LOCATION
  21. #include "intl.h"
  22. #include "form1.h"
  23. #include "tex-strings.h"
  24. #include "combox.h"
  25. #include "lyx_gui_misc.h" // CancelCloseBoxCB
  26. #include "error.h"
  27. #include "lyxrc.h"
  28. #include "trans_mgr.h"
  29.  
  30.  
  31. //     $Id: intl.C,v 1.1.1.1 1998/04/23 16:02:51 larsbj Exp $    
  32.  
  33. #if !defined(lint) && !defined(WITH_WARNINGS)
  34. static char vcid[] = "$Id: intl.C,v 1.1.1.1 1998/04/23 16:02:51 larsbj Exp $";
  35. #endif /* lint */
  36.  
  37. // lyx rc 
  38. extern LyXRC* lyxrc;
  39.  
  40.  
  41. Intl::Intl()
  42.     : prim_lang(lyxrc->primary_kbmap), 
  43.       sec_lang(lyxrc->secondary_kbmap),
  44.       trans(new TransManager)
  45. {
  46.     keymapon = lyxrc->use_kbmap;
  47.     chsetcode = NULL;
  48.     primarykeymap = false;
  49.     curkeymap = 0;
  50.     otherkeymap = 0;
  51. }
  52.  
  53.  
  54. Intl::~Intl()
  55. {
  56. }
  57.  
  58.  
  59. int Intl::SetPrimary(LString const & lang)
  60. {
  61.     if (lyxerr.debugging(Error::KBMAP))
  62.         lyxerr.print("Primary: `" + lang + "'");
  63.     return trans->SetPrimary(lang);
  64. }
  65.  
  66.  
  67. int Intl::SetSecondary(LString const & lang)
  68. {
  69.     if (lyxerr.debugging(Error::KBMAP))
  70.         lyxerr.print("Secondary: `" + lang + "'");
  71.     return trans->SetSecondary(lang);
  72. }
  73.  
  74.  
  75. void Intl::update()
  76. {
  77.     int off,prim,sec;
  78.     
  79.     off=prim=sec=0;
  80.     
  81.     if (!keymapon) {
  82.         off=1;
  83.     } else {
  84.         if (primarykeymap) {
  85.             prim=1;
  86.         } else {
  87.             sec=1;
  88.         }
  89.     }
  90.     
  91.     fl_set_button(fd_form_keymap->KeyOffBtn,off);
  92.     fl_set_button(fd_form_keymap->KeyOnBtn,prim);
  93.     fl_set_button(fd_form_keymap->KeyOnBtn2,sec);
  94. }
  95.  
  96.  
  97. void Intl::KeyMapOn(bool on)
  98.     /* turn on/off key mappings, status in keymapon */
  99. {
  100.     keymapon = on;
  101.  
  102.     if (!fd_form_keymap) return;
  103.     
  104.     fl_set_button(fd_form_keymap->KeyOffBtn, 0);
  105.     fl_set_button(fd_form_keymap->KeyOnBtn, 0);
  106.     fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
  107.  
  108.     if (on) {
  109.         if (primarykeymap) {
  110.             KeyMapPrim();
  111.         } else {
  112.             KeyMapSec();
  113.         }
  114.     } else {
  115.         fl_set_button(fd_form_keymap->KeyOffBtn, 1);
  116.         fl_hide_object(fd_form_keymap->KeymapErr);
  117.         trans->DisableKeymap();
  118.     }
  119. }
  120.  
  121.  
  122. void Intl::ToggleKeyMap()
  123. {
  124.     if (keymapon && primarykeymap) {
  125.         KeyMapSec();
  126.     } else if (keymapon) {
  127.         KeyMapOn(false);
  128.     } else    
  129.         KeyMapPrim();
  130. }
  131.  
  132.  
  133. void Intl::KeyMapPrim()
  134. {
  135.     int i;
  136.     LString p;
  137.  
  138.     fl_set_button(fd_form_keymap->KeyOffBtn, 0);
  139.     fl_set_button(fd_form_keymap->KeyOnBtn, 1);
  140.     fl_set_button(fd_form_keymap->KeyOnBtn2, 0);
  141.  
  142.     /* read text from choice */
  143.     i = Language->get();
  144.     
  145.     if (lyxerr.debugging(Error::KBMAP))
  146.         lyxerr.print(LString("Table: ") + tex_babel[i-1]);
  147.  
  148.     if (i == otherkeymap)
  149.         p = fl_get_input(fd_form_keymap->OtherKeymap);
  150.     else
  151.         p = Language->getline();
  152.  
  153.     curkeymap = i;
  154.  
  155.     if (p.empty() || trans->SetPrimary(p)) {
  156.         // error selecting keymap
  157.         fl_show_object(fd_form_keymap->KeymapErr);
  158.         update();
  159.     } else {
  160.         // no error
  161.         trans->EnablePrimary();
  162.         keymapon = true;
  163.         primarykeymap = true;
  164.         fl_hide_object(fd_form_keymap->KeymapErr);
  165.     }
  166. }
  167.  
  168.  
  169. void Intl::KeyMapSec()
  170. {
  171.     int i;
  172.     LString p;
  173.  
  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);
  177.  
  178.     /* read text from choice */
  179.     i = Language2->get();
  180.     
  181.     if (lyxerr.debugging(Error::KBMAP))
  182.         lyxerr.print(LString("Table: ") + tex_babel[i-1]);
  183.  
  184.     if (i == otherkeymap)
  185.         p = fl_get_input(fd_form_keymap->OtherKeymap2);
  186.     else
  187.         p = Language2->getline();
  188.     curkeymap = i;
  189.  
  190.     if (p.empty() || trans->SetSecondary(p)) {
  191.         // error selecting keymap
  192.         fl_show_object(fd_form_keymap->KeymapErr);
  193.         update();
  194.     } else {
  195.         // no error
  196.         trans->EnableSecondary();
  197.         keymapon = true;
  198.         primarykeymap = false;
  199.         fl_hide_object(fd_form_keymap->KeymapErr);
  200.     }
  201. }
  202.  
  203.  
  204. void Intl::LCombo(int, void *v)
  205. {
  206.     Intl *itl = (Intl*) v;
  207.     itl->Keymap(23);
  208.     return;
  209. }
  210.  
  211.  
  212. void Intl::LCombo2(int, void *v)
  213. {
  214.     Intl *itl = (Intl*) v;
  215.     itl->Keymap(43);
  216.     return;
  217. }
  218.  
  219.  
  220. void Intl::DispatchCallback(FL_OBJECT *ob,long code)
  221. {
  222.     if (ob && (code == 0)) {
  223.         fl_hide_form(ob->form);
  224.         return;
  225.     }
  226.     if (!ob || !(ob->u_vdata))
  227.         return;
  228.     
  229.     Intl *itl=(Intl *)ob->u_vdata;
  230.  
  231.     if (itl!=NULL) itl->Keymap(code);
  232. }
  233.  
  234.  
  235. void Intl::InitKeyMapper(bool on)
  236.     /* initialize key mapper */
  237. {
  238.     lyxerr.debug("Initializing key mappings...", Error::KBMAP);
  239.  
  240.     keymapon = on;
  241.  
  242.     Language = new Combox(Combox::FL_COMBOX_DROPLIST);
  243.     Language2 = new Combox(Combox::FL_COMBOX_DROPLIST);
  244.     Language->setcallback(LCombo,this);
  245.     Language2->setcallback(LCombo2,this);
  246.  
  247.     fd_form_keymap = create_form_KeyMap();
  248.  
  249.     // Add the Intl* pointer
  250.     fd_form_keymap->AcceptChset->u_vdata=
  251.         fd_form_keymap->Charset->u_vdata=
  252.         fd_form_keymap->Accept->u_vdata=
  253.         fd_form_keymap->OtherKeymap->u_vdata=
  254.         fd_form_keymap->KeyOnBtn->u_vdata=
  255.         fd_form_keymap->KeyOffBtn->u_vdata=
  256.         fd_form_keymap->KeyOnBtn2->u_vdata=(void *)this;
  257.  
  258.     // add the callbacks.
  259.     fl_set_object_callback(fd_form_keymap->AcceptChset,DispatchCallback,27);
  260.     fl_set_object_callback(fd_form_keymap->Charset,DispatchCallback,26);
  261.     fl_set_object_callback(fd_form_keymap->Accept,DispatchCallback,0);
  262.  
  263.     fl_set_object_callback(fd_form_keymap->KeyOnBtn,DispatchCallback,23);
  264.     fl_set_object_callback(fd_form_keymap->KeyOffBtn,DispatchCallback,3);
  265.     fl_set_object_callback(fd_form_keymap->KeyOnBtn2,DispatchCallback,43);
  266.     
  267.     // Make sure pressing the close box does not kill LyX. (RvdK)
  268.     fl_set_form_atclose(fd_form_keymap->KeyMap, CancelCloseBoxCB, NULL);
  269.  
  270.     fl_hide_object(fd_form_keymap->KeymapErr);
  271.     fl_hide_object(fd_form_keymap->ChsetErr);
  272.     fl_set_input(fd_form_keymap->Charset, lyxrc->font_norm.c_str());
  273.  
  274.     // Adds two comboxes to the keyboard map
  275.     fl_addto_form(fd_form_keymap->KeyMap);
  276.     Language->add(120,30,160,30,300);    // Primary
  277.     Language2->add(120,110,160,30,300);    // Secondary
  278.     fl_end_form();
  279.  
  280.     int n=0;
  281.  
  282.      while (true)
  283.         if (!strlen(tex_babel[n]))
  284.             break;
  285.         else {
  286.             Language->addto(tex_babel[n]);
  287.             Language2->addto(tex_babel[n]);
  288.             n++;
  289.         }
  290.     
  291.     Language->addto(_("other..."));
  292.     Language2->addto(_("other..."));
  293.     otherkeymap = n+1;
  294.     if (!Language->select_text(prim_lang.c_str())) {
  295.         Language->select(n+1);
  296.         fl_set_input(fd_form_keymap->OtherKeymap, prim_lang.c_str());
  297.     }
  298.     else 
  299.         trans->SetPrimary(prim_lang);
  300.  
  301.     if (!Language2->select_text(sec_lang.c_str())) {
  302.         Language2->select(n+1);
  303.         fl_set_input(fd_form_keymap->OtherKeymap2, sec_lang.c_str());
  304.     }
  305.     else
  306.         trans->SetSecondary(sec_lang);
  307.  
  308.     KeyMapOn(keymapon);
  309.     if (keymapon)
  310.         Keymap(23); // turn primary on
  311.  
  312.     trans->setCharset(lyxrc->font_norm.c_str());
  313. }
  314.  
  315.  
  316. void Intl::Keymap(long code)
  317. {
  318.     char const *p;
  319.  
  320.     if (lyxerr.debugging(Error::KBMAP))
  321.         lyxerr.print(LString("KeyMap callback: ") + code);
  322.  
  323.     switch (code) {
  324.     case 0:
  325.         /* cancel/hide */
  326.         fl_hide_form(fd_form_keymap->KeyMap);
  327.         break;
  328.     case 3:
  329.     case 23:
  330.     case 43:
  331.         if (code==3) {
  332.             KeyMapOn(false);
  333.             return;
  334.         }
  335.         code -= 19;    // change to language change type code
  336.         
  337.     case 4: // 4 and 24 will never be called directly, they will only be
  338.     case 24: // called through 3,23,43 (lgb)
  339.         if (code==4) {
  340.             KeyMapPrim();
  341.         } else {
  342.             KeyMapSec();
  343.         }
  344.         break;
  345.     case 27:    /* set new font norm */
  346.         p = fl_get_input(fd_form_keymap->Charset);
  347.         if (trans->setCharset(p))
  348.             fl_show_object(fd_form_keymap->ChsetErr);
  349.         else
  350.             fl_hide_object(fd_form_keymap->ChsetErr);
  351.         break;
  352.     }
  353. }
  354.  
  355.  
  356. void Intl::MenuKeymap()
  357. {
  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"));
  362. }
  363.