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 / menus.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  47KB  |  1,505 lines

  1. /*
  2.  *  This file is part of
  3.  * ==================================================
  4.  *
  5.  *       LyX, The Document Processor
  6.  *
  7.  *       Copyright (C) 1995 Matthias Ettrich
  8.  *       Copyright (C) 1995-1998 The LyX Team.
  9.  *
  10.  * ==================================================
  11.  */
  12.  
  13. /* This file contains all the menu and submenu declarations.
  14.    The call backs are in lyx_cb.C */
  15.  
  16. /*
  17.  * REMEMBER:
  18.  * XFORMS can handle 10 (more with the new xforms, but not unlimited)
  19.  * popups at the same time
  20.  * so when you are finished looking at a pup free it (fl_freepup)
  21.  */
  22.  
  23. #include <config.h>
  24.  
  25. #ifdef __GNUG__
  26. #pragma implementation
  27. #endif
  28.  
  29. #include "menus.h"
  30. #include "lyx_cb.h"
  31. #include "version.h"
  32. #include "lyxfont.h"
  33. #include "lyx_main.h"
  34. #include "lyxfunc.h"
  35. #include "spellchecker.h"
  36. #include "filetools.h"
  37. #include "LyXView.h"
  38. #include "lastfiles.h"
  39. #include "bufferlist.h"
  40. #include "lyx_gui_misc.h"
  41. #include "minibuffer.h"
  42. #include "lyxscreen.h"
  43. #include "intl.h"
  44. #include "error.h"
  45. #include "lyxrc.h"
  46. #include "lyxtext.h"
  47. #include "gettext.h"
  48.  
  49. //     $Id: menus.C,v 1.1.1.1 1998/04/23 16:02:56 larsbj Exp $    
  50.  
  51. #if !defined(lint) && !defined(WITH_WARNINGS)
  52. static char vcid[] = "$Id: menus.C,v 1.1.1.1 1998/04/23 16:02:56 larsbj Exp $";
  53. #endif /* lint */
  54.  
  55. extern FD_form_screen *fd_form_screen;
  56. extern BufferList bufferlist;
  57.  
  58. // I would really prefere to see most or all of these 'extern's disappear.
  59. // Their commands should be called through LyXFunc (IMO). (Lgb)
  60.  
  61. extern void MenuLayoutSave();
  62. extern void ShowCredits();
  63. extern void ShowCopyright();
  64. extern void show_symbols_form(LyXFunc*);
  65. extern void BeforeChange();
  66. extern void ProhibitInput();
  67. extern void AllowInput();
  68. extern void OpenStuff();
  69. extern void ToggleFloat();
  70. extern void AllFloats(char flag, char figmar);
  71. extern void LaTeXOptions();
  72.  
  73. Menus::Menus(LyXView *view,int air)
  74.     : _view(view)
  75. {    
  76.     create_menus(air);
  77.     // deactivate the menu accelerators
  78.     fl_set_object_shortcut(menu_file, "", 1);
  79.     fl_set_object_shortcut(menu_file2, "", 1);
  80.     fl_set_object_shortcut(menu_edit, "", 1);
  81.     fl_set_object_shortcut(menu_layout, "", 1);
  82.     fl_set_object_shortcut(menu_math, "", 1);
  83.     fl_set_object_shortcut(menu_insert, "", 1);
  84.     fl_set_object_shortcut(menu_options, "", 1);
  85.     fl_set_object_shortcut(menu_options2, "", 1);
  86.     fl_set_object_shortcut(menu_buffer, "", 1);
  87.     fl_set_object_shortcut(menu_help, "", 1);
  88.     fl_set_object_shortcut(menu_help2, "", 1);
  89.     hideMenus();
  90. }
  91.  
  92.  
  93. inline BufferView *Menus::currentView() 
  94. {
  95.     return _view->currentView(); 
  96. }
  97.  
  98.  
  99. void Menus::showMenus()
  100. {
  101.     fl_hide_object(menu_grp2);
  102.     fl_show_object(menu_grp1);
  103. }
  104.  
  105.  
  106. void Menus::hideMenus()
  107. {
  108.     fl_hide_object(menu_grp1);
  109.     fl_show_object(menu_grp2);
  110. }
  111.  
  112.  
  113. void Menus::openByName(LString const &menuName)
  114.     /* Opens the visible menu of given name, or simply does nothing
  115.        when the name is not known. NOTE THE EXTREMELY STUPID
  116.        IMPLEMENTATION! :-) There are probably hundred ways to do
  117.        this better, for instance, by scanning the menu objects and
  118.        testing for the given name. I leave this as an exercise for an
  119.        experienced GG (GUI Guy/Girl). RVDK_PATCH_5. */
  120. {
  121.     if (menu_file->visible) {
  122.         if (menuName == _("File"))          ShowFileMenu(menu_file, 0);
  123.         else if (menuName == _("Edit"))      ShowEditMenu(menu_edit, 0);
  124.         else if (menuName == _("Layout"))    ShowLayoutMenu(menu_layout, 0);
  125.         else if (menuName == _("Insert"))    ShowInsertMenu(menu_insert, 0);
  126.         else if (menuName == _("Math"))      ShowMathMenu(menu_math, 0);
  127.         else if (menuName == _("Options"))   ShowOptionsMenu(menu_options, 0);
  128.         else if (menuName == _("Documents")) ShowBufferMenu(menu_buffer, 0);
  129.         else if (menuName == _("Help"))      ShowHelpMenu(menu_help, 0);
  130.         else lyxerr.print("The menu '" + menuName + "' is not available.");
  131.     } else {
  132.         if (menuName == _("File"))          ShowFileMenu2(menu_file2, 0);
  133.         else if (menuName == _("Options"))   ShowOptionsMenu(menu_options2, 0);
  134.         else if (menuName == _("Help"))      ShowHelpMenu(menu_help2, 0);
  135.         else lyxerr.print("The menu '" + menuName + "' is not available.");
  136.     }
  137. }
  138.  
  139.  
  140. void Menus::create_menus(int air)
  141. {
  142.     FL_FORM *form = _view->getForm(); 
  143.  
  144.     // Here I'd really like to see code like:
  145.     // addMenuBar();
  146.     FL_OBJECT *obj;
  147.  
  148.     const int MENU_LABEL_SIZE = FL_NORMAL_SIZE;
  149.     const int mheight = 30;
  150.     const int mbheight= 22;
  151.     // where to place the menubar?
  152.     const int yloc = (mheight - mbheight)/2; //air + bw;
  153.     const int mbadd = 20; // menu button add (to width)
  154.     int moffset = 0;
  155.  
  156.     // menubar frame
  157.     obj = fl_add_frame(FL_UP_FRAME,0,0,form->w,mheight,"");
  158.     fl_set_object_resize(obj, FL_RESIZE_ALL);
  159.     fl_set_object_gravity(obj, NorthWestGravity, NorthEastGravity);
  160.  
  161.     menu_grp1 = fl_bgn_group();
  162.     
  163.     // File menu button
  164.     menu_file = obj =
  165.         fl_add_button(FL_TOUCH_BUTTON,
  166.                   air+moffset,yloc,
  167.                   fl_get_string_width(FL_BOLD_STYLE,
  168.                           MENU_LABEL_SIZE,
  169.                           _("File"),
  170.                           strlen(_("File"))) + mbadd,
  171.                   mbheight,_("File"));
  172.     moffset += obj->w + air;
  173.     fl_set_object_shortcut(obj, scex(_("MB|#F")), 1);
  174.     fl_set_object_callback(obj,ShowFileMenu, 0);
  175.     obj->u_ldata = (long)this;
  176.     
  177.     // Edit menu button
  178.     menu_edit = obj =
  179.         fl_add_button(FL_TOUCH_BUTTON,
  180.                   moffset,yloc,
  181.                   fl_get_string_width(FL_BOLD_STYLE,
  182.                           MENU_LABEL_SIZE,
  183.                           _("Edit"),
  184.                           strlen(_("Edit"))) + mbadd,
  185.                   mbheight,_("Edit"));
  186.     moffset += obj->w + air;
  187.     fl_set_object_shortcut(obj, scex(_("MB|#E")),1);
  188.     fl_set_object_callback(obj,ShowEditMenu,0);
  189.     obj->u_ldata = (long) this;
  190.     
  191.     // Layout menu button
  192.     menu_layout = obj =
  193.         fl_add_button(FL_TOUCH_BUTTON,
  194.                   moffset,yloc,
  195.                   fl_get_string_width(FL_BOLD_STYLE,
  196.                           MENU_LABEL_SIZE,
  197.                           _("Layout"),
  198.                           strlen(_("Layout"))) + mbadd,
  199.                       mbheight,_("Layout"));
  200.     moffset += obj->w + air;
  201.     fl_set_object_shortcut(obj, scex(_("MB|#L")), 1);
  202.     fl_set_object_callback(obj,ShowLayoutMenu,0);
  203.     obj->u_ldata = (long) this;
  204.     
  205.     // Insert menu button button
  206.     menu_insert = obj =
  207.         fl_add_button(FL_TOUCH_BUTTON,
  208.                   moffset,yloc,
  209.                   fl_get_string_width(FL_BOLD_STYLE,
  210.                           MENU_LABEL_SIZE,
  211.                           _("Insert"),
  212.                           strlen(_("Insert"))) + mbadd,
  213.                   mbheight,_("Insert"));
  214.     moffset += obj->w + air;
  215.     fl_set_object_shortcut(obj, scex(_("MB|#I")), 1);
  216.     fl_set_object_callback(obj,ShowInsertMenu,0);
  217.     obj->u_ldata = (long) this;
  218.     
  219.     // Math menu button
  220.     menu_math = obj =
  221.         fl_add_button(FL_TOUCH_BUTTON,
  222.                   moffset,yloc,
  223.                   fl_get_string_width(FL_BOLD_STYLE,
  224.                           MENU_LABEL_SIZE,
  225.                           _("Math"),
  226.                           strlen(_("Math"))) + mbadd,
  227.                   mbheight,_("Math"));
  228.     moffset += obj->w + air;
  229.     fl_set_object_shortcut(obj, scex(_("MB|#M")), 1);
  230.     fl_set_object_callback(obj,ShowMathMenu,0);
  231.     obj->u_ldata = (long) this;
  232.     
  233.     // Options menu button
  234.     menu_options = obj =
  235.         fl_add_button(FL_TOUCH_BUTTON,
  236.                   moffset,yloc,
  237.                   fl_get_string_width(FL_BOLD_STYLE,
  238.                           MENU_LABEL_SIZE,
  239.                           _("Options"),
  240.                           strlen(_("Options"))) + mbadd,
  241.                   mbheight,_("Options"));
  242.     moffset += obj->w + air;
  243.     fl_set_object_shortcut(obj, scex(_("MB|#O")), 1);
  244.     fl_set_object_callback(obj,ShowOptionsMenu, 0);
  245.     obj->u_ldata = (long) this;
  246.  
  247.     // Documents menu button
  248.     menu_buffer = obj =
  249.         fl_add_button(FL_TOUCH_BUTTON,
  250.                   moffset,yloc,
  251.                   fl_get_string_width(FL_BOLD_STYLE,
  252.                           MENU_LABEL_SIZE,
  253.                           _("Documents"),
  254.                           strlen(_("Documents"))) + mbadd,
  255.                   mbheight,_("Documents"));
  256.     moffset += obj->w + air;
  257.     fl_set_object_shortcut(obj, scex(_("MB|#D")), 1);
  258.     fl_set_object_callback(obj,ShowBufferMenu,0);
  259.     obj->u_ldata = (long) this;
  260.     
  261.     // Help menu button
  262.     menu_help = obj =
  263.         fl_add_button(FL_TOUCH_BUTTON,
  264.                   moffset,yloc,
  265.                   fl_get_string_width(FL_BOLD_STYLE,
  266.                           MENU_LABEL_SIZE,
  267.                           _("Help"),
  268.                           strlen(_("Help"))) + mbadd,
  269.                   mbheight,_("Help"));
  270.     moffset += obj->w + air;
  271.     fl_set_object_shortcut(obj, scex(_("MB|#H")), 1);
  272.     fl_set_object_callback(obj,ShowHelpMenu,0);
  273.     obj->u_ldata = (long) this;
  274.     
  275.     fl_end_group();
  276.  
  277.     // Set the menu buttons atrributes.
  278.     // Due to a bug in xforms we cant do this only an the group.
  279.     obj = menu_grp1->next;
  280.     do {
  281.         fl_set_object_boxtype(obj, FL_FLAT_BOX);
  282.         fl_set_object_color(obj,FL_MCOL, FL_MCOL);
  283.         fl_set_object_lsize(obj,MENU_LABEL_SIZE);
  284.         fl_set_object_lstyle(obj,FL_BOLD_STYLE);
  285.         fl_set_object_resize(obj, FL_RESIZE_ALL);
  286.         fl_set_object_gravity(obj, NorthWestGravity, NorthWestGravity);
  287.         obj=obj->next;
  288.     } while (obj != 0 && obj->objclass != FL_END_GROUP);
  289.  
  290.     // group 2
  291.     moffset = 0;
  292.     menu_grp2 = fl_bgn_group();
  293.     
  294.     // File menu button
  295.     menu_file2 = obj =
  296.         fl_add_button(FL_TOUCH_BUTTON,
  297.                   air+moffset,yloc,
  298.                   fl_get_string_width(FL_BOLD_STYLE,
  299.                           MENU_LABEL_SIZE,
  300.                           _("File"),
  301.                           strlen(_("File"))) + mbadd,
  302.                   mbheight,_("File"));
  303.     moffset += obj->w + air;
  304.     fl_set_object_shortcut(obj, scex(_("MB|#F")), 1);
  305.     fl_set_object_callback(obj,ShowFileMenu2, 0);
  306.     obj->u_ldata = (long)this;
  307.     
  308.     // Options menu button
  309.     menu_options2 = obj =
  310.         fl_add_button(FL_TOUCH_BUTTON,
  311.                   moffset,yloc,
  312.                   fl_get_string_width(FL_BOLD_STYLE,
  313.                           MENU_LABEL_SIZE,
  314.                           _("Options"),
  315.                           strlen(_("Options"))) +mbadd,
  316.                   mbheight,_("Options"));
  317.     moffset += obj->w + air;
  318.     fl_set_object_shortcut(obj, scex(_("MB|#O")), 1);
  319.     fl_set_object_callback(obj,ShowOptionsMenu, 0);
  320.     obj->u_ldata = (long) this;
  321.  
  322.     // Help menu button
  323.     menu_help2 = obj =
  324.         fl_add_button(FL_TOUCH_BUTTON,
  325.                   moffset,yloc,
  326.                   fl_get_string_width(FL_BOLD_STYLE,
  327.                           MENU_LABEL_SIZE,
  328.                           _("Help"),
  329.                           strlen(_("Help"))) + mbadd,
  330.                   mbheight,_("Help"));
  331.     moffset += obj->w + air;
  332.     fl_set_object_shortcut(obj, scex(_("MB|#H")), 1);
  333.     fl_set_object_callback(obj,ShowHelpMenu,0);
  334.     obj->u_ldata = (long) this;
  335.     
  336.     fl_end_group();
  337.  
  338.     // Set the menu buttons atrributes.
  339.     // Due to a bug in xforms we cant do this only an the group.
  340.     obj = menu_grp2->next;
  341.     do {
  342.         fl_set_object_boxtype(obj, FL_FLAT_BOX);
  343.         fl_set_object_color(obj,FL_MCOL, FL_MCOL);
  344.         fl_set_object_lsize(obj,MENU_LABEL_SIZE);
  345.         fl_set_object_lstyle(obj,FL_BOLD_STYLE);
  346.         fl_set_object_resize(obj, FL_RESIZE_ALL);
  347.         fl_set_object_gravity(obj, NorthWestGravity, NorthWestGravity);
  348.         obj=obj->next;
  349.     } while (obj != 0 && obj->objclass != FL_END_GROUP);
  350. }
  351.  
  352.  
  353. void Menus::ScreenOptions()
  354. {
  355.     // this is not very nice....
  356.     fl_set_input(fd_form_screen->input_roman, 
  357.              lyxrc->roman_font_name.c_str());
  358.     fl_set_input(fd_form_screen->input_sans, 
  359.              lyxrc->sans_font_name.c_str());
  360.     fl_set_input(fd_form_screen->input_typewriter,
  361.              lyxrc->typewriter_font_name.c_str());
  362.     fl_set_input(fd_form_screen->input_font_norm, 
  363.              lyxrc->font_norm.c_str());
  364.     char tmpstring[10];
  365.     sprintf(tmpstring,"%d", lyxrc->zoom);
  366.     fl_set_input(fd_form_screen->intinput_size, tmpstring);
  367.     if (fd_form_screen->form_screen->visible) {
  368.         fl_raise_form(fd_form_screen->form_screen);
  369.     } else {
  370.         fl_show_form(fd_form_screen->form_screen,
  371.                  FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
  372.                  _("Screen Options"));
  373.     }
  374. }
  375.  
  376.  
  377. //
  378. // Here comes all the menu callbacks.
  379. //
  380.  
  381. void Menus::ShowFileMenu(FL_OBJECT *ob, long)
  382. {
  383.     Menus *men = (Menus*) ob->u_ldata;
  384.  
  385.     // Regarding the pseudo-menu-button:
  386.     // ok, ok this is a hack. It would be better to use the menus of the
  387.     // xforms 0.8 library. but then all popups have to be defined all the
  388.     // time, code rewriting would be necessary and contex-depending menus
  389.     // (i.e. the linux-doc-sgml stuff) are a bit more complicated. But of
  390.     // course it would be more proper (and little faster). So if anybody
  391.     // likes to do the cleanup, just do it. Matthias
  392.  
  393.     // set the pseudo menu-button
  394.     fl_set_object_boxtype(ob, FL_UP_BOX);
  395.     fl_set_button(ob, 0);
  396.     fl_redraw_object(ob);
  397.  
  398.     Buffer *tmpbuffer = men->_view->currentBuffer();
  399.     LyXFunc *tmpfunc = men->_view->getLyXFunc();
  400.  
  401.     bool LinuxDoc = tmpbuffer->isLinuxDoc();
  402.  
  403.     // remember to make this handle linuxdoc too.
  404.     int SubFileExport;
  405.     if (!LinuxDoc)
  406.             SubFileExport=fl_defpup(FL_ObjWin(ob),
  407.                       _("Export%t"
  408.                     "|as LaTeX...%x26"
  409.                     "|as DVI...%x27"
  410.                     "|as PostScript...%x28"
  411.                     "|as Ascii Text...%x29"
  412.                     "|Custom...%x30"));
  413.         else
  414.             SubFileExport=fl_defpup(FL_ObjWin(ob),
  415.                       _("Export%t"
  416.                     "|as LinuxDoc...%x26"
  417.                     "|as DVI...%x27"
  418.                     "|as PostScript...%x28"
  419.                     "|as Ascii Text...%x29"));
  420.     fl_setpup_shortcut(SubFileExport, 26, scex(_("FEX|Ll#l#L")));
  421.     fl_setpup_shortcut(SubFileExport, 27, scex(_("FEX|Dd#d#D")));
  422.     fl_setpup_shortcut(SubFileExport, 28, scex(_("FEX|Pp#p#P")));
  423.     fl_setpup_shortcut(SubFileExport, 29, scex(_("FEX|Tt#t#T")));
  424.     fl_setpup_shortcut(SubFileExport, 30, scex(_("FEX|mM#m#M")));
  425.     
  426.     int FileMenu = fl_defpup(FL_ObjWin(ob),
  427.                  _("New..."
  428.                    "|New from template..."
  429.                    "|Open...%l"
  430.                    "|Close"
  431.                    "|Save"
  432.                    "|Save As..."
  433.                    "|Revert to saved%l"
  434.                    "|View dvi"
  435.                    "|View PostScript"
  436.                    "|Update dvi"
  437.                    "|Update PostScript%l"
  438.                    "|Print..."
  439.                    "|Fax..."));
  440.  
  441.     fl_setpup_shortcut(FileMenu, 1, scex(_("FM|Nn#n#N")));
  442.     fl_setpup_shortcut(FileMenu, 2, scex(_("FM|tT#t#T")));
  443.     fl_setpup_shortcut(FileMenu, 3, scex(_("FM|Oo#o#O")));
  444.     fl_setpup_shortcut(FileMenu, 4, scex(_("FM|Cc#c#C")));
  445.     fl_setpup_shortcut(FileMenu, 5, scex(_("FM|Ss#s#S")));
  446.     fl_setpup_shortcut(FileMenu, 6, scex(_("FM|Aa#a#A")));
  447.     fl_setpup_shortcut(FileMenu, 7, scex(_("FM|Rr#r#R")));
  448.     fl_setpup_shortcut(FileMenu, 8, scex(_("FM|dD#d#D")));
  449.     fl_setpup_shortcut(FileMenu, 9, scex(_("FM|iI#i#I")));
  450.     fl_setpup_shortcut(FileMenu,10, scex(_("FM|vV#v#V")));
  451.     fl_setpup_shortcut(FileMenu,11, scex(_("FM|Uu#u#U")));
  452.     fl_setpup_shortcut(FileMenu,12, scex(_("FM|Pp#p#P")));
  453.     fl_setpup_shortcut(FileMenu,13, scex(_("FM|Ff#f#F")));
  454.  
  455.  
  456.     // These commands are disabled when the corresponding programs
  457.     // are not installed. I simply grey them out, since I do not
  458.     // want to change their number (JMarc)
  459.     bool hasLaTeX = lyxrc->latex_command != "none";
  460.  
  461.     if (!hasLaTeX || lyxrc->view_dvi_command == "none") 
  462.         fl_setpup_mode(FileMenu, 8, FL_PUP_GREY);
  463.     
  464.     if (!hasLaTeX || lyxrc->view_ps_command == "none") 
  465.         fl_setpup_mode(FileMenu, 9, FL_PUP_GREY);
  466.     
  467.     if (!hasLaTeX) {
  468.         fl_setpup_mode(FileMenu, 10, FL_PUP_GREY);
  469.         fl_setpup_mode(FileMenu, 11, FL_PUP_GREY);
  470.     } 
  471.  
  472.     if (!hasLaTeX || lyxrc->print_command == "none") 
  473.         fl_setpup_mode(FileMenu, 12, FL_PUP_GREY);
  474.  
  475.     if (!hasLaTeX || lyxrc->fax_command == "none") 
  476.         fl_setpup_mode(FileMenu, 13, FL_PUP_GREY);
  477.  
  478.     if (!hasLaTeX) 
  479.         fl_setpup_mode(FileMenu, 14, FL_PUP_GREY);
  480.  
  481.     fl_addtopup(FileMenu,_("|Export%m%l"), SubFileExport);
  482.     fl_addtopup(FileMenu,_("|Exit%l"));
  483.     fl_setpup_shortcut(FileMenu, 14, scex(_("FM|Ee#e#E")));
  484.     fl_setpup_shortcut(FileMenu, 15, scex(_("FM|xX#x#X")));
  485.  
  486.     // make the lastfiles menu
  487.     LastFiles_Iter liter(*lastfiles); // :-)
  488.     LString filname;
  489.     int ii = 1;
  490.     while( ii < 10 && !(filname = liter()).empty() ) {
  491.         LString tmp;
  492.         LString tmp2;
  493.         LString relbuf = MakeDisplayPath(filname,30);
  494.         tmp += ii;
  495.         tmp2 = tmp;
  496.         tmp += ". " + relbuf;
  497.         tmp2 += LString("#") + ii;
  498.         fl_addtopup(FileMenu, tmp.c_str());
  499.         fl_setpup_shortcut(FileMenu, 16 - 1 + ii, tmp2.c_str());
  500.         ii++;
  501.     }
  502.  
  503.     // place popup
  504.     fl_setpup_position(
  505.         men->_view->getForm()->x + ob->x,
  506.         men->_view->getForm()->y + ob->y + ob->h + 10);   
  507.     int choice = fl_dopup(FileMenu);
  508.     XFlush(fl_display);
  509.  
  510.     // set the pseudo menu-button back
  511.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  512.     fl_redraw_object(ob);
  513.  
  514.     switch (choice) {
  515.     case -1: case 0: // we won't do anything
  516.         break;
  517.     case  1: tmpfunc->Dispatch(LFUN_MENUNEW); break;
  518.     case  2: tmpfunc->Dispatch(LFUN_MENUNEWTMPLT); break;
  519.     case  3: tmpfunc->Dispatch(LFUN_MENUOPEN); break;
  520.     case  4: tmpfunc->Dispatch(LFUN_CLOSEBUFFER); break;
  521.     case  5: tmpfunc->Dispatch(LFUN_MENUWRITE); break;
  522.     case  6: tmpfunc->Dispatch(LFUN_MENUWRITEAS); break;
  523.     case  7: tmpfunc->Dispatch(LFUN_MENURELOAD); break;
  524.     case  8: tmpfunc->Dispatch(LFUN_PREVIEW); break;
  525.     case  9: tmpfunc->Dispatch(LFUN_PREVIEWPS); break;
  526.     case 10: tmpfunc->Dispatch(LFUN_RUNLATEX); break;
  527.     case 11: tmpfunc->Dispatch(LFUN_RUNDVIPS); break;
  528.     case 12: tmpfunc->Dispatch(LFUN_MENUPRINT); break;
  529.     case 13: tmpfunc->Dispatch(LFUN_FAX); break;
  530.     case 14: // export menu
  531.     case 26:
  532.         if (!LinuxDoc)
  533.             tmpfunc->Dispatch(LFUN_EXPORT, "latex");
  534.         else
  535.             tmpfunc->Dispatch(LFUN_EXPORT, "linuxdoc");
  536.         break;
  537.     case 27: tmpfunc->Dispatch(LFUN_EXPORT, "dvi");
  538.         break;
  539.     case 28: tmpfunc->Dispatch(LFUN_EXPORT,
  540.                             "postscript");
  541.     break;
  542.     case 29: tmpfunc->Dispatch(LFUN_EXPORT, "ascii");
  543.         break;
  544.     case 30: tmpfunc->Dispatch(LFUN_EXPORT, "custom"); 
  545.         break;
  546.     case 15: tmpfunc->Dispatch(LFUN_QUIT); break;
  547.         // Lastfiles:
  548.     case 16: // The first item with lastfiles.
  549.     default:
  550.         men->currentView()->setBuffer(bufferlist.loadLyXFile(liter[choice-16])); // ok one more
  551.         break;
  552.     }
  553.     fl_freepup(FileMenu);
  554.     fl_freepup(SubFileExport);
  555.  
  556.     AllowInput();
  557. }
  558.  
  559.  
  560. void Menus::ShowFileMenu2(FL_OBJECT *ob, long)
  561. {
  562.     Menus *men = (Menus*) ob->u_ldata;
  563.  
  564.     // Regarding the pseudo-menu-button:
  565.     // ok, ok this is a hack. It would be better to use the menus of the
  566.     // xforms 0.8 library. but then all popups have to be defined all the
  567.     // time, code rewriting would be necessary and contex-depending menus
  568.     // (i.e. the linux-doc-sgml stuff) are a bit more complicated. But of
  569.     // course it would be more proper (and little faster). So if anybody
  570.     // likes to do the cleanup, just do it. Matthias
  571.  
  572.     // set the pseudo menu-button
  573.     fl_set_object_boxtype(ob, FL_UP_BOX);
  574.     fl_set_button(ob, 0);
  575.     fl_redraw_object(ob);
  576.  
  577.     LyXFunc *tmpfunc = men->_view->getLyXFunc();
  578.  
  579.     // This can be done cleaner later.
  580.     int FileMenu = fl_defpup(FL_ObjWin(ob), 
  581.                  _("New..."
  582.                  "|New from template..."
  583.                  "|Open...%l"
  584.                  "|Exit%l"));
  585.     
  586.     fl_setpup_shortcut(FileMenu, 1, scex(_("FM|Nn#n#N")));
  587.     fl_setpup_shortcut(FileMenu, 2, scex(_("FM|tT#t#T")));
  588.     fl_setpup_shortcut(FileMenu, 3, scex(_("FM|Oo#o#O")));
  589.     fl_setpup_shortcut(FileMenu, 4, scex(_("FM|xX#x#X")));
  590.     
  591.     // make the lastfiles menu
  592.     LastFiles_Iter liter(*lastfiles); // :-)
  593.     LString filname;
  594.     int ii = 1;
  595.     while( ii < 10 && !(filname = liter()).empty() ) {
  596.         LString tmp;
  597.         LString tmp2;
  598.         LString relbuf = MakeDisplayPath(filname,30);
  599.         tmp += ii;
  600.         tmp2 = tmp;
  601.         tmp += ". " + relbuf;
  602.         tmp2 += '#' + ii;
  603.         fl_addtopup(FileMenu, tmp.c_str());
  604.         fl_setpup_shortcut(FileMenu, 5 - 1 + ii, tmp2.c_str());
  605.         ii++;
  606.     }
  607.  
  608.     // place popup
  609.     fl_setpup_position(
  610.         men->_view->getForm()->x + ob->x,
  611.         men->_view->getForm()->y + ob->y + ob->h + 10);   
  612.     int choice = fl_dopup(FileMenu);
  613.     XFlush(fl_display);
  614.  
  615.     // set the pseudo menu-button back
  616.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  617.     fl_redraw_object(ob);
  618.  
  619.     switch (choice) {
  620.     case -1: case 0: // we won't do anything
  621.         break;
  622.     case 1:
  623.         tmpfunc->Dispatch(LFUN_MENUNEW);
  624.         break;
  625.     case 2:
  626.         tmpfunc->Dispatch(LFUN_MENUNEWTMPLT);
  627.         break;
  628.     case 3:
  629.         tmpfunc->Dispatch(LFUN_MENUOPEN);
  630.         break;
  631.     case 4:
  632.         tmpfunc->Dispatch(LFUN_QUIT);
  633.         break;
  634.         // Lastfiles:
  635.     default:
  636.         men->currentView()->setBuffer(bufferlist.loadLyXFile(liter[choice-5]));
  637.         break;
  638.     }
  639.  
  640.     fl_freepup(FileMenu);
  641.     AllowInput();
  642.     return;
  643. }
  644.  
  645.  
  646. void Menus::ShowEditMenu(FL_OBJECT *ob, long)
  647. {
  648.     Menus *men = (Menus*) ob->u_ldata;
  649.     
  650.     // set the pseudo menu-button
  651.     fl_set_object_boxtype(ob, FL_UP_BOX);
  652.     fl_set_button(ob, 0);
  653.     fl_redraw_object(ob);
  654.  
  655.     Buffer *tmpbuffer = men->_view->currentBuffer();
  656.     LyXFunc *tmpfunc = men->_view->getLyXFunc();
  657.  
  658.     // Floats & Insets submenu
  659.     int SubEditFloats=fl_defpup(FL_ObjWin(ob),
  660.                     _("Floats & Insets%t"
  661.                     "|Open/Close%x21"
  662.                     "|Melt%x22"
  663.                     "|Open All Footnotes/Margin Notes%x23"
  664.                     "|Close All Footnotes/Margin Notes%x24"
  665.                     "|Open All Figures/Tables%x25"
  666.                     "|Close All Figures/Tables%x26%l"
  667.                     "|Remove all Error Boxes%x27")
  668.         );
  669.     fl_setpup_shortcut(SubEditFloats, 21, scex(_("EMF|Oo#o#O")));
  670.     fl_setpup_shortcut(SubEditFloats, 22, scex(_("EMF|Mm#m#M")));
  671.     fl_setpup_shortcut(SubEditFloats, 23, scex(_("EMF|Aa#a#A")));
  672.     fl_setpup_shortcut(SubEditFloats, 24, scex(_("EMF|Cc#c#C")));
  673.     fl_setpup_shortcut(SubEditFloats, 25, scex(_("EMF|Ff#f#F")));
  674.     fl_setpup_shortcut(SubEditFloats, 26, scex(_("EMF|Tt#t#T")));
  675.     fl_setpup_shortcut(SubEditFloats, 27, scex(_("EMF|Rr#r#R")));
  676.  
  677.     // Table submenu
  678.     int SubEditTable = fl_newpup(FL_ObjWin(ob));
  679.     if (men->currentView()->available() && 
  680.         tmpbuffer->text->cursor.par->table &&
  681.         !tmpbuffer->isReadonly()){
  682.  
  683.         fl_addtopup(SubEditTable, _("Table%t"));
  684.  
  685.         if (tmpbuffer->text->cursor.par->table->
  686.             IsMultiColumn(tmpbuffer->text->
  687.                   NumberOfCell(tmpbuffer->
  688.                            text->cursor.par, 
  689.                            tmpbuffer->
  690.                            text->cursor.pos)))
  691.             fl_addtopup(SubEditTable, _("|Multicolumn%B%x44%l"));
  692.         else
  693.             fl_addtopup(SubEditTable, _("|Multicolumn%b%x44%l"));
  694.         fl_setpup_shortcut(SubEditTable, 44, scex(_("EMT|Mm#m#M")));
  695.      
  696.         if (tmpbuffer->text->cursor.par->table->
  697.             TopLine(tmpbuffer->text->
  698.                 NumberOfCell(tmpbuffer->
  699.                      text->cursor.par, 
  700.                      tmpbuffer->text->
  701.                      cursor.pos)))
  702.             fl_addtopup(SubEditTable, _("|Line Top%B%x36"));
  703.         else
  704.             fl_addtopup(SubEditTable, _("|Line Top%b%x36"));
  705.         fl_setpup_shortcut(SubEditTable, 36, scex(_("EMT|Tt#t#T")));
  706.      
  707.         if (tmpbuffer->text->cursor.par->table->
  708.             BottomLine(tmpbuffer->text->
  709.                    NumberOfCell(tmpbuffer->
  710.                         text->cursor.par, 
  711.                         tmpbuffer->
  712.                         text->cursor.pos)))
  713.             fl_addtopup(SubEditTable, _("|Line Bottom%B%x37"));
  714.         else
  715.             fl_addtopup(SubEditTable, _("|Line Bottom%b%x37"));
  716.         fl_setpup_shortcut(SubEditTable, 37, scex(_("EMT|Bb#b#B")));
  717.  
  718.         if (tmpbuffer->text->cursor.par->table->
  719.             LeftLine(tmpbuffer->text->
  720.                  NumberOfCell(tmpbuffer->
  721.                       text->cursor.par, 
  722.                       tmpbuffer->
  723.                       text->cursor.pos)))
  724.             fl_addtopup(SubEditTable, _("|Line Left%B%x38"));
  725.         else
  726.             fl_addtopup(SubEditTable, _("|Line Left%b%x38"));
  727.         fl_setpup_shortcut(SubEditTable, 38, scex(_("EMT|Ll#l#L")));
  728.  
  729.         if (tmpbuffer->text->cursor.par->table->
  730.             RightLine(tmpbuffer->text->
  731.                   NumberOfCell(tmpbuffer->
  732.                        text->cursor.par, 
  733.                        tmpbuffer->
  734.                        text->cursor.pos)))
  735.             fl_addtopup(SubEditTable, _("|Line Right%B%x39%l"));
  736.         else
  737.             fl_addtopup(SubEditTable, _("|Line Right%b%x39%l"));
  738.         fl_setpup_shortcut(SubEditTable, 39, scex(_("EMT|Rr#r#R")));
  739.  
  740.         int align = tmpbuffer->text->cursor.par->
  741.             table->GetAlignment(tmpbuffer->text->
  742.                      NumberOfCell(tmpbuffer->
  743.                           text->cursor.par, 
  744.                           tmpbuffer->
  745.                           text->cursor.pos));
  746.         if (align == LYX_ALIGN_LEFT)
  747.             fl_addtopup(SubEditTable, _("|Align Left%R%x40"));
  748.         else
  749.             fl_addtopup(SubEditTable, _("|Align Left%r%x40"));
  750.         fl_setpup_shortcut(SubEditTable, 40, scex(_("EMT|eE#e#E")));
  751.  
  752.         if (align == LYX_ALIGN_RIGHT)
  753.             fl_addtopup(SubEditTable, _("|Align Right%R%x41"));
  754.         else
  755.             fl_addtopup(SubEditTable, _("|Align Right%r%x41"));
  756.         fl_setpup_shortcut(SubEditTable, 41, scex(_("EMT|iI#i#I")));
  757.  
  758.         if (align == LYX_ALIGN_CENTER)
  759.             fl_addtopup(SubEditTable, _("|Align Center%R%x42%l"));
  760.         else
  761.             fl_addtopup(SubEditTable, _("|Align Center%r%x42%l"));
  762.         fl_setpup_shortcut(SubEditTable, 42, scex(_("EMT|Cc#c#C")));
  763.  
  764.         fl_addtopup(SubEditTable, _("|Append Row%x32"));
  765.         fl_setpup_shortcut(SubEditTable, 32, scex(_("EMT|oO#o#O")));
  766.         fl_addtopup(SubEditTable, _("|Append Column%x33%l"));
  767.         fl_setpup_shortcut(SubEditTable, 33, scex(_("EMT|uU#u#U")));
  768.         fl_addtopup(SubEditTable, _("|Delete Row%x34"));
  769.         fl_setpup_shortcut(SubEditTable, 34, scex(_("EMT|wW#w#W")));
  770.         fl_addtopup(SubEditTable, _("|Delete Column%x35%l"));
  771.         fl_setpup_shortcut(SubEditTable, 35, scex(_("EMT|nN#n#N")));
  772.         fl_addtopup(SubEditTable, _("|Delete Table%x43"));
  773.         fl_setpup_shortcut(SubEditTable, 43, scex(_("EMT|Dd#d#D")));
  774.     }
  775.     else {
  776.         fl_addtopup(SubEditTable, _("Table%t"));
  777.         fl_addtopup(SubEditTable, _("|Insert table%x31"));
  778.         fl_setpup_shortcut(SubEditTable, 31, scex(_("EMT|Ii#i#I")));
  779.     }
  780.  
  781.     int SubVersionControl =    fl_newpup(FL_ObjWin(ob));
  782.     fl_addtopup(SubVersionControl, _("Version Control%t"));
  783.     if (tmpbuffer->lyxvc.inUse()) {
  784.         fl_addtopup(SubVersionControl, _("|Register%d%x51"));
  785.         if (tmpbuffer->isReadonly()) {
  786.             // signifies that the file is not checked out
  787.             fl_addtopup(SubVersionControl,
  788.                     _("|Check In Changes%d%x52"));
  789.             fl_addtopup(SubVersionControl,
  790.                     _("|Check Out for Edit%x53"));
  791.         } else {
  792.             // signifies that the file is checked out
  793.             fl_addtopup(SubVersionControl,
  794.                     _("|Check In Changes%x52"));
  795.             fl_addtopup(SubVersionControl,
  796.                     _("|Check Out for Edit%d%x53"));
  797.         }
  798.         fl_addtopup(SubVersionControl,
  799.                 _("|Revert to last version%x54"));
  800.         fl_addtopup(SubVersionControl, _("|Undo last check in%x55"));
  801.         fl_addtopup(SubVersionControl, _("|Show History%x56"));
  802.     } else {
  803.         fl_addtopup(SubVersionControl, _("|Register%x51"));
  804.     }
  805.     // the shortcuts are not good.
  806.     fl_setpup_shortcut(SubVersionControl, 51, scex(_("EMV|Rr#r#R")));
  807.     fl_setpup_shortcut(SubVersionControl, 52, scex(_("EMV|Ii#i#I")));
  808.     fl_setpup_shortcut(SubVersionControl, 53, scex(_("EMV|Oo#o#O")));
  809.     fl_setpup_shortcut(SubVersionControl, 54, scex(_("EMV|lL#l#l")));
  810.     fl_setpup_shortcut(SubVersionControl, 55, scex(_("EMV|Uu#u#U")));
  811.     fl_setpup_shortcut(SubVersionControl, 56, scex(_("EMV|Hh#h#H")));
  812.  
  813.     int EditMenu=fl_defpup(FL_ObjWin(ob),
  814.                    _("Undo"
  815.                    "|Redo %l"
  816.                    "|Cut"
  817.                    "|Copy"
  818.                    "|Paste%l"
  819.                    "|Find & Replace..."
  820.                    "|Go to Error"
  821.                    "|Go to Note"
  822.                    "|Floats & Insets%m"
  823.                    "|Table%m"
  824.                    "|Spellchecker...."
  825.                    "|Check TeX"
  826.                    "|Table of Contents...%l"
  827.                    "|Version Control%m%l"
  828.                    "|View LaTeX log file%l"
  829.                    "|Paste Primary Selection as Lines"
  830.                    "|Paste Primary Selection as Paragraphs"),
  831.                    SubEditFloats, SubEditTable, SubVersionControl);
  832.  
  833.     fl_setpup_shortcut(EditMenu, 1, scex(_("EM|Uu#u#U")));
  834.     fl_setpup_shortcut(EditMenu, 2, scex(_("EM|Rr#r#R")));
  835.     fl_setpup_shortcut(EditMenu, 3, scex(_("EM|Cc#c#C")));
  836.     fl_setpup_shortcut(EditMenu, 4, scex(_("EM|oO#o#O")));
  837.     fl_setpup_shortcut(EditMenu, 5, scex(_("EM|Pp#p#P")));
  838.     fl_setpup_shortcut(EditMenu, 6, scex(_("EM|Ff#f#F")));
  839.     fl_setpup_shortcut(EditMenu, 7, scex(_("EM|Ee#e#E")));
  840.     fl_setpup_shortcut(EditMenu, 8, scex(_("EM|Nn#n#N")));
  841.     fl_setpup_shortcut(EditMenu, 9, scex(_("EM|Ii#i#I")));
  842.     fl_setpup_shortcut(EditMenu, 10, scex(_("EM|Tt#t#T")));
  843.     fl_setpup_shortcut(EditMenu, 11, scex(_("EM|Ss#s#S")));
  844.     fl_setpup_shortcut(EditMenu, 12, scex(_("EM|hH#h#H")));
  845.     fl_setpup_shortcut(EditMenu, 13, scex(_("EM|aA#a#A")));
  846.     fl_setpup_shortcut(EditMenu, 14, scex(_("EM|Vv#v#V")));
  847.     fl_setpup_shortcut(EditMenu, 15, scex(_("EM|wW#w#W")));
  848.     fl_setpup_shortcut(EditMenu, 16, scex(_("EM|Ll#l#L")));
  849.     fl_setpup_shortcut(EditMenu, 17, scex(_("EM|gG#g#G")));
  850.       
  851.     // disable unavailable entries.
  852.     if(tmpbuffer->undostack.Top() == NULL)
  853.         fl_setpup_mode(EditMenu, 1, FL_PUP_GREY);
  854.     if(tmpbuffer->redostack.Top() == NULL)
  855.         fl_setpup_mode(EditMenu, 2, FL_PUP_GREY);
  856.     if(lyxrc->chktex_command == "none") 
  857.         fl_setpup_mode(EditMenu, 12, FL_PUP_GREY);
  858.  
  859.     if (tmpbuffer->isReadonly()) {
  860.                 fl_setpup_mode(EditMenu, 1, FL_PUP_GREY); 
  861.                 fl_setpup_mode(EditMenu, 2, FL_PUP_GREY); 
  862.                 fl_setpup_mode(EditMenu, 3, FL_PUP_GREY); 
  863.                 fl_setpup_mode(EditMenu, 5, FL_PUP_GREY); 
  864.                 fl_setpup_mode(EditMenu, 16, FL_PUP_GREY); 
  865.                 fl_setpup_mode(EditMenu, 17, FL_PUP_GREY);
  866.     }
  867.     
  868.     fl_setpup_position(men->_view->getForm()->x + ob->x,
  869.                men->_view->getForm()->y + ob->y +
  870.                ob->h + 10);   
  871.     int choice = fl_dopup(EditMenu);
  872.     XFlush(fl_display);
  873.    
  874.     // set the pseudo menu-button back
  875.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  876.     fl_redraw_object(ob);
  877.  
  878.     switch (choice) {
  879.     case  1: tmpfunc->Dispatch(LFUN_UNDO); break;
  880.     case  2: tmpfunc->Dispatch(LFUN_REDO); break;
  881.     case  3: tmpfunc->Dispatch(LFUN_CUT); break;
  882.     case  4: tmpfunc->Dispatch(LFUN_COPY); break;
  883.     case  5: tmpfunc->Dispatch(LFUN_PASTE); break;
  884.     case  6: tmpfunc->Dispatch(LFUN_MENUSEARCH); break;
  885.     case  7: tmpfunc->Dispatch(LFUN_GOTOERROR); break;
  886.     case  8: tmpfunc->Dispatch(LFUN_GOTONOTE); break;
  887.     case  9: // floats & insets
  888.         break;
  889.     case 10:// table 
  890.         break;
  891.     case 11: tmpfunc->Dispatch(LFUN_SPELLCHECK); break;
  892.     case 12: tmpfunc->Dispatch(LFUN_RUNCHKTEX); break;
  893.     case 13: tmpfunc->Dispatch(LFUN_TOCVIEW); break;
  894.     case 14: // version control
  895.         break;
  896.     case 15: tmpfunc->Dispatch(LFUN_LATEX_LOG); break;
  897.     case 16: tmpfunc->Dispatch(LFUN_PASTESELECTION, "line"); break;
  898.     case 17: tmpfunc->Dispatch(LFUN_PASTESELECTION, "paragraph"); break;
  899.  
  900.         // floats & insets sub-menu
  901.     case 21: ToggleFloat(); break;
  902.     case 22: tmpfunc->Dispatch(LFUN_MELT); break;
  903.     case 23: AllFloats(1, 0); break;
  904.     case 24: AllFloats(0, 0); break;
  905.     case 25: AllFloats(1, 1); break;
  906.     case 26: AllFloats(0, 1); break;
  907.     case 27: tmpfunc->Dispatch(LFUN_REMOVEERRORS); break;
  908.  
  909.     case 31: tmpfunc->Dispatch(LFUN_TABLE); break;
  910.         // this is really temporary. We need new function in keybind.C
  911.         // These should set the minibuffer, too.
  912.     case 32: case 33: case 34:
  913.     case 35: case 36: case 37:
  914.     case 38: case 39: case 40: 
  915.     case 41: case 42: case 43:
  916.     case 44: 
  917.              if (men->currentView()->available()){
  918.             men->currentView()->getScreen()->HideCursor();
  919.             if (!tmpbuffer->text->selection){
  920.                 BeforeChange(); 
  921.                 tmpbuffer->update(-2);
  922.             }
  923.             tmpbuffer->text->
  924.                 TableFeatures(choice - 32);
  925.             tmpbuffer->update(1);
  926.         }
  927.         break;
  928.         // version control sub-menu
  929.     case 51: // register
  930.         tmpfunc->Dispatch(LFUN_VC_REGISTER);
  931.         break;
  932.     case 52: // check in
  933.         tmpfunc->Dispatch(LFUN_VC_CHECKIN);
  934.         break;
  935.     case 53: // check out
  936.         tmpfunc->Dispatch(LFUN_VC_CHECKOUT);
  937.         break;
  938.     case 54: // revert to last
  939.         tmpfunc->Dispatch(LFUN_VC_REVERT);
  940.         break;
  941.     case 55: // undo last
  942.         tmpfunc->Dispatch(LFUN_VC_UNDO);
  943.         break;
  944.     case 56: // show history
  945.         tmpfunc->Dispatch(LFUN_VC_HISTORY);
  946.         break;
  947.     }
  948.  
  949.     fl_freepup(EditMenu);
  950.     fl_freepup(SubEditFloats);
  951.     fl_freepup(SubEditTable);
  952.     fl_freepup(SubVersionControl);
  953. }
  954.  
  955.  
  956. void Menus::ShowLayoutMenu(FL_OBJECT *ob, long)
  957. {
  958.     Menus *men = (Menus*) ob->u_ldata;
  959.  
  960.     if (!men->currentView()->available())
  961.         return;
  962.     
  963.     // set the pseudo menu-button
  964.     fl_set_object_boxtype(ob, FL_UP_BOX);
  965.     fl_set_button(ob, 0);
  966.     fl_redraw_object(ob);
  967.    
  968.     Buffer *tmpbuffer = men->_view->currentBuffer();
  969.     LyXFunc *tmpfunc = men->_view->getLyXFunc();
  970.  
  971.     int LayoutMenu = fl_newpup(FL_ObjWin(ob));
  972.     fl_addtopup(LayoutMenu, _("Character..."
  973.                   "|Paragraph..."
  974.                   "|Document..."
  975.                   "|Paper..."
  976.                   "|Table..."
  977.                   "|Quotes...%l"
  978.                   "|Emphasize Style%b"
  979.                   "|Noun Style%b"
  980.                   "|Bold Style%b"
  981.                   "|TeX Style%b"
  982.                   "|Change Environment Depth"
  983.                   "|LaTeX Preamble...%l"
  984.                   "|Save layout as default"));
  985.     fl_setpup_shortcut(LayoutMenu, 1, scex(_("LM|Cc#c#C")));
  986.     fl_setpup_shortcut(LayoutMenu, 2, scex(_("LM|Pp#p#P")));
  987.     fl_setpup_shortcut(LayoutMenu, 3, scex(_("LM|Dd#d#D")));
  988.      fl_setpup_shortcut(LayoutMenu, 4, scex(_("LM|aA#a#A")));
  989.      fl_setpup_shortcut(LayoutMenu, 5, scex(_("LM|eE#e#E")));
  990.     fl_setpup_shortcut(LayoutMenu, 6, scex(_("LM|Qq#q#Q")));
  991.     fl_setpup_shortcut(LayoutMenu, 7, scex(_("LM|mM#m#M")));
  992.     fl_setpup_shortcut(LayoutMenu, 8, scex(_("LM|Nn#n#N")));
  993.     fl_setpup_shortcut(LayoutMenu, 9, scex(_("LM|Bb#b#B")));
  994.     fl_setpup_shortcut(LayoutMenu, 10, scex(_("LM|Tt#t#T")));
  995.     fl_setpup_shortcut(LayoutMenu, 11, scex(_("LM|vV#v#V")));
  996.     fl_setpup_shortcut(LayoutMenu, 12, scex(_("LM|Ll#l#L")));
  997.     fl_setpup_shortcut(LayoutMenu, 13, scex(_("LM|Ss#s#S")));
  998.  
  999.     // Set values of checkboxes according to font
  1000.     LyXFont font = tmpbuffer->text->real_current_font;
  1001.     if (font.emph() == LyXFont::ON)
  1002.         fl_setpup_mode(LayoutMenu, 7, FL_PUP_CHECK);
  1003.     if (font.noun() == LyXFont::ON)
  1004.         fl_setpup_mode(LayoutMenu, 8, FL_PUP_CHECK);
  1005.     if (font.series() == LyXFont::BOLD_SERIES)
  1006.         fl_setpup_mode(LayoutMenu, 9, FL_PUP_CHECK);
  1007.     if (font.latex() == LyXFont::ON)
  1008.         fl_setpup_mode(LayoutMenu, 10, FL_PUP_CHECK);
  1009.        
  1010.     // Grey out unavailable entries
  1011.     if (!tmpbuffer->text->cursor.par->table)
  1012.         fl_setpup_mode(LayoutMenu, 5, FL_PUP_GREY);
  1013.  
  1014.     if (tmpbuffer->isReadonly()) {
  1015.             fl_setpup_mode(LayoutMenu, 1, FL_PUP_GREY);
  1016.         fl_setpup_mode(LayoutMenu, 6, FL_PUP_GREY);
  1017.         fl_setpup_mode(LayoutMenu, 11, FL_PUP_GREY);
  1018.     }
  1019.  
  1020.     fl_setpup_position(
  1021.         men->_view->getForm()->x + ob->x,
  1022.         men->_view->getForm()->y + ob->y + ob->h + 10);
  1023.     int choice = fl_dopup(LayoutMenu);
  1024.     XFlush(fl_display);
  1025.  
  1026.     // set the pseudo menu-button back
  1027.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  1028.     fl_redraw_object(ob);
  1029.  
  1030.     switch (choice) {
  1031.     case 1:  tmpfunc->Dispatch(LFUN_LAYOUT_CHARACTER); break;
  1032.     case 2:  tmpfunc->Dispatch(LFUN_LAYOUT_PARAGRAPH); break;
  1033.     case 3:     tmpfunc->Dispatch(LFUN_LAYOUT_DOCUMENT);  break;
  1034.     case 4:     tmpfunc->Dispatch(LFUN_LAYOUT_PAPER); break;
  1035.     case 5:  tmpfunc->Dispatch(LFUN_LAYOUT_TABLE, "true"); break;
  1036.     case 6:  tmpfunc->Dispatch(LFUN_LAYOUT_QUOTES); break;
  1037.     case 7:  tmpfunc->Dispatch(LFUN_EMPH); break;
  1038.     case 8:  tmpfunc->Dispatch(LFUN_NOUN); break;
  1039.     case 9:  tmpfunc->Dispatch(LFUN_BOLD); break;
  1040.     case 10: tmpfunc->Dispatch(LFUN_TEX); break;
  1041.     case 11: tmpfunc->Dispatch(LFUN_DEPTH_PLUS); break;
  1042.     case 12: tmpfunc->Dispatch(LFUN_LAYOUT_PREAMBLE); break;
  1043.     case 13: MenuLayoutSave(); break;
  1044.     }
  1045.     fl_freepup(LayoutMenu); 
  1046. }
  1047.  
  1048.  
  1049. void Menus::ShowInsertMenu(FL_OBJECT *ob, long /*data*/)
  1050. {
  1051.     Menus *men = (Menus*) ob->u_ldata;
  1052.     
  1053.     // set the pseudo menu-button
  1054.     fl_set_object_boxtype(ob, FL_UP_BOX);
  1055.     fl_set_button(ob, 0);
  1056.     fl_redraw_object(ob);
  1057.  
  1058.     Buffer *tmpbuffer = men->_view->currentBuffer();
  1059.     LyXFunc *tmpfunc = men->_view->getLyXFunc();
  1060.  
  1061.     // Is textclass LinuxDoc?
  1062.     bool LinuxDoc = tmpbuffer->isLinuxDoc();
  1063.  
  1064.     int SubInsertAscii = fl_defpup(FL_ObjWin(ob),
  1065.                        _("Import ASCII file%t"
  1066.                        "|As Lines%x41"
  1067.                        "|As Paragraphs%x42"));
  1068.     fl_setpup_shortcut(SubInsertAscii, 41, scex(_("IMA|Ll#l#L")));
  1069.     fl_setpup_shortcut(SubInsertAscii, 42, scex(_("IMA|Pp#p#P")));
  1070.  
  1071.     int SubInsertTableList=fl_defpup(FL_ObjWin(ob),
  1072.                      _("Lists & TOC%t"
  1073.                        "|Table of Contents%x21"
  1074.                        "|List of Figures%x22"
  1075.                        "|List of Tables%x23"
  1076.                        "|List of Algorithms%x24"
  1077.                        "|Index List%x25"
  1078.                        "|BibTeX Reference%x26"));
  1079.     fl_setpup_shortcut(SubInsertTableList, 21, scex(_("IMT|Cc#c#C")));
  1080.     fl_setpup_shortcut(SubInsertTableList, 22, scex(_("IMT|Ff#f#F")));
  1081.     fl_setpup_shortcut(SubInsertTableList, 23, scex(_("IMT|Tt#t#T")));
  1082.     fl_setpup_shortcut(SubInsertTableList, 24, scex(_("IMT|Aa#a#A")));
  1083.     fl_setpup_shortcut(SubInsertTableList, 25, scex(_("IMT|Ii#i#I")));
  1084.     fl_setpup_shortcut(SubInsertTableList, 26, scex(_("IMT|Bb#b#B")));
  1085.  
  1086.     int SubInsertFloatList;
  1087.     SubInsertFloatList = fl_defpup(FL_ObjWin(ob),
  1088.                        _("Floats%t"
  1089.                      "|Figure Float%x71"
  1090.                      "|Table Float%x72"
  1091.                      "|Wide Figure Float%x73"
  1092.                      "|Wide Table Float%l%x74"
  1093.                      "|Algorithm Float%x75"));
  1094.     fl_setpup_shortcut(SubInsertFloatList, 71, scex(_("IMF|Ff#f#F")));
  1095.     fl_setpup_shortcut(SubInsertFloatList, 72, scex(_("IMF|Tt#t#T")));
  1096.     fl_setpup_shortcut(SubInsertFloatList, 73, scex(_("IMF|Ww#w#W")));
  1097.     fl_setpup_shortcut(SubInsertFloatList, 74, scex(_("IMF|iI#i#I")));
  1098.     fl_setpup_shortcut(SubInsertFloatList, 75, scex(_("IMF|Aa#a#A")));
  1099.      
  1100.     int SubInsertSpecial=fl_defpup(FL_ObjWin(ob),
  1101.                        _("Special Character%t"
  1102.                      "|HFill%x31"
  1103.                      "|Hyphenation Point%x32"
  1104.                      "|Protected Blank%x33"
  1105.                      "|Linebreak%x34"
  1106.                      "|Ellipsis (...)%x35"
  1107.                      "|End of sentence period%x36"
  1108.                      "|Ordinary Quote (\")%x37"));
  1109.  
  1110.     fl_setpup_shortcut(SubInsertSpecial, 31, scex(_("IMS|Hh#h#H")));
  1111.     fl_setpup_shortcut(SubInsertSpecial, 32, scex(_("IMS|Pp#p#P")));
  1112.     fl_setpup_shortcut(SubInsertSpecial, 33, scex(_("IMS|Bb#b#B")));
  1113.     fl_setpup_shortcut(SubInsertSpecial, 34, scex(_("IMS|Ll#l#L")));
  1114.     fl_setpup_shortcut(SubInsertSpecial, 35, scex(_("IMS|iI#i#I")));
  1115.     fl_setpup_shortcut(SubInsertSpecial, 36, scex(_("IMS|Ee#e#E")));
  1116.     fl_setpup_shortcut(SubInsertSpecial, 37, scex(_("IMS|Qq#q#Q")));
  1117.     
  1118.     int InsertMenu = fl_defpup(FL_ObjWin(ob),
  1119.                    _("Figure..."
  1120.                      "|Table...%l"
  1121.                      "|Include File..." 
  1122.                      "|Import ASCII File%m"
  1123.                      "|Insert LyX File...%l"
  1124.                      "|Footnote"
  1125.                      "|Margin Note"
  1126.                      "|Floats%m%l"      
  1127.                      "|Lists & TOC%m%l"
  1128.                      "|Special Character%m%l"
  1129.                      "|Note"
  1130.                      "|Label..."
  1131.                      "|Cross-Reference..."
  1132.                      "|Citation Reference"
  1133.                           "|Index entry"),
  1134.                    SubInsertAscii,
  1135.                    SubInsertFloatList,     
  1136.                    SubInsertTableList,
  1137.                    SubInsertSpecial);
  1138.  
  1139.     fl_setpup_shortcut(InsertMenu, 1, scex(_("IM|gG#g#G")));
  1140.     fl_setpup_shortcut(InsertMenu, 2, scex(_("IM|bB#b#B")));
  1141.     fl_setpup_shortcut(InsertMenu, 3, scex(_("IM|cC#c#C")));
  1142.     fl_setpup_shortcut(InsertMenu, 4, scex(_("IM|Aa#a#A")));
  1143.     fl_setpup_shortcut(InsertMenu, 5, scex(_("IM|Xx#x#X")));
  1144.     fl_setpup_shortcut(InsertMenu, 6, scex(_("IM|Ff#f#F")));
  1145.     fl_setpup_shortcut(InsertMenu, 7, scex(_("IM|Mm#m#M")));
  1146.     fl_setpup_shortcut(InsertMenu, 8, scex(_("IM|oO#o#O")));
  1147.     fl_setpup_shortcut(InsertMenu, 9, scex(_("IM|Tt#t#T")));
  1148.     fl_setpup_shortcut(InsertMenu, 10, scex(_("IM|Ss#s#S")));
  1149.     fl_setpup_shortcut(InsertMenu, 11, scex(_("IM|Nn#n#N")));
  1150.     fl_setpup_shortcut(InsertMenu, 12, scex(_("IM|Ll#l#L")));
  1151.     fl_setpup_shortcut(InsertMenu, 13, scex(_("IM|rR#r#R")));     
  1152.     fl_setpup_shortcut(InsertMenu, 14, scex(_("IM|iI#i#I")));
  1153.     fl_setpup_shortcut(InsertMenu, 15, scex(_("IM|dD#d#D")));
  1154.     
  1155.     if (LinuxDoc) {
  1156.         /* for linuxdoc sgml */ 
  1157.         fl_addtopup(InsertMenu, _("|URL"));
  1158.         fl_setpup_shortcut(InsertMenu, 16, scex(_("IM|Uu#u#U")));
  1159.         fl_addtopup(InsertMenu, _("|HTML URL"));
  1160.         fl_setpup_shortcut(InsertMenu, 17, scex(_("IM|Hh#h#H"))); 
  1161.     }      
  1162.  
  1163.     if (tmpbuffer->isReadonly()) {
  1164.                 for (int ii = 1; ii <= 15; ii++)
  1165.                     fl_setpup_mode(InsertMenu, ii, FL_PUP_GREY);
  1166.                 if (LinuxDoc) {
  1167.                         fl_setpup_mode(InsertMenu, 16, FL_PUP_GREY);
  1168.                         fl_setpup_mode(InsertMenu, 17, FL_PUP_GREY);
  1169.                 }
  1170.     }
  1171.  
  1172.     fl_setpup_position(
  1173.         men->_view->getForm()->x + ob->x,
  1174.         men->_view->getForm()->y + ob->y + ob->h + 10);
  1175.    
  1176.     int choice = fl_dopup(InsertMenu);
  1177.     XFlush(fl_display);
  1178.  
  1179.     // set the pseudo menu-button back
  1180.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  1181.     fl_redraw_object(ob);
  1182.  
  1183.     if (men->currentView()->available()){
  1184.         men->currentView()->getScreen()->HideCursor();
  1185.         switch (choice) {
  1186.         case 1: tmpfunc->Dispatch(LFUN_FIGURE); break;
  1187.         case 2: tmpfunc->Dispatch(LFUN_TABLE); break;
  1188.         case 3: tmpfunc->Dispatch(LFUN_CHILDINSERT); break;
  1189.         case 4: // Insert ASCII file submenu
  1190.             break;
  1191.         case 5: tmpfunc->Dispatch(LFUN_FILE_INSERT); break;
  1192.         case 41: tmpfunc->Dispatch(LFUN_FILE_INSERT_ASCII, "line"); break;
  1193.         case 42: tmpfunc->Dispatch(LFUN_FILE_INSERT_ASCII, "paragraph"); break;
  1194.         case 43: 
  1195.             break;
  1196.  
  1197.         case 6: tmpfunc->Dispatch(LFUN_FOOTMELT); break
  1198. ;
  1199.         case 7: tmpfunc->Dispatch(LFUN_MARGINMELT); break;
  1200.   
  1201.                case 8: // Float sub-menu
  1202.                 case 71:
  1203.             tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "figure");
  1204.             break;
  1205.         case 72:
  1206.             tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "table");
  1207.             break;
  1208.         case 73:
  1209.             tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "wide-fig");
  1210.             break;
  1211.         case 74:
  1212.             tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "wide-tab");
  1213.             break;
  1214.         case 75:
  1215.             tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "algorithm");
  1216.             break;
  1217.  
  1218.         case 9: // Table/List submenu
  1219.             break;
  1220.         case 21: tmpfunc->Dispatch(LFUN_TOC_INSERT); break;
  1221.         case 22: tmpfunc->Dispatch(LFUN_LOF_INSERT); break;
  1222.         case 23: tmpfunc->Dispatch(LFUN_LOT_INSERT); break;
  1223.         case 24: tmpfunc->Dispatch(LFUN_LOA_INSERT); break;
  1224.         case 25: tmpfunc->Dispatch(LFUN_INDEX_PRINT); break;
  1225.         case 26: tmpfunc->Dispatch(LFUN_INSERT_BIBTEX); break;
  1226.  
  1227.         case 10: // Special Character submenu
  1228.             break;
  1229.         case 31: tmpfunc->Dispatch(LFUN_HFILL); break;
  1230.         case 32: tmpfunc->Dispatch(LFUN_HYPHENATION); break;
  1231.         case 33: tmpfunc->Dispatch(LFUN_PROTECTEDSPACE); break; 
  1232.         case 34: tmpfunc->Dispatch(LFUN_BREAKLINE); break; 
  1233.         case 35: tmpfunc->Dispatch(LFUN_LDOTS); break;
  1234.         case 36: tmpfunc->Dispatch(LFUN_END_OF_SENTENCE); break;
  1235.         case 37: tmpfunc->Dispatch(LFUN_QUOTE); break;
  1236.  
  1237.         case 11: tmpfunc->Dispatch(LFUN_INSERT_NOTE); break;
  1238.         case 12: tmpfunc->Dispatch(LFUN_INSERT_LABEL); break;
  1239.         case 13: tmpfunc->Dispatch(LFUN_INSERT_REF); break;
  1240.         case 14: tmpfunc->Dispatch(LFUN_INSERT_CITATION); break;
  1241.         case 15: tmpfunc->Dispatch(LFUN_INDEX_INSERT); break;
  1242.         case 16: tmpfunc->Dispatch(LFUN_URL); break;
  1243.         case 17: tmpfunc->Dispatch(LFUN_HTMLURL); break;
  1244.         }
  1245.     }
  1246.     fl_freepup(InsertMenu);
  1247.     fl_freepup(SubInsertAscii);
  1248.     fl_freepup(SubInsertTableList);
  1249.     fl_freepup(SubInsertFloatList);
  1250.     fl_freepup(SubInsertSpecial);
  1251. }
  1252.  
  1253.  
  1254. void Menus::ShowMathMenu(FL_OBJECT *ob, long)
  1255. {
  1256.     extern void math_insert_symbol(char const* s);
  1257.  
  1258.     Menus *men = (Menus*) ob->u_ldata;
  1259.  
  1260.     // set the pseudo menu-button
  1261.     fl_set_object_boxtype(ob, FL_UP_BOX);
  1262.     fl_set_button(ob, 0);
  1263.     fl_redraw_object(ob);
  1264.  
  1265.     Buffer *tmpbuffer = men->_view->currentBuffer();
  1266.     LyXFunc *tmpfunc = men->_view->getLyXFunc();
  1267.  
  1268.     int MathMenu = fl_defpup(FL_ObjWin(ob), 
  1269.                  _("Fraction"
  1270.                  "|Square root"
  1271.                  "|Exponent"
  1272.                  "|Index"
  1273.                  "|Sum"
  1274.                  "|Integral%l"
  1275.                  "|Math mode"
  1276.                  "|Display%l"
  1277.                  "|Math Panel..."));
  1278.  
  1279.     fl_setpup_shortcut(MathMenu, 1, scex(_("MM|Ff#f#F")));
  1280.     fl_setpup_shortcut(MathMenu, 2, scex(_("MM|Ss#s#S")));
  1281.     fl_setpup_shortcut(MathMenu, 3, scex(_("MM|Ee#e#E")));
  1282.     fl_setpup_shortcut(MathMenu, 4, scex(_("MM|xX#x#X")));
  1283.     fl_setpup_shortcut(MathMenu, 5, scex(_("MM|uU#u#U")));
  1284.     fl_setpup_shortcut(MathMenu, 6, scex(_("MM|Ii#i#I")));
  1285.     fl_setpup_shortcut(MathMenu, 7, scex(_("MM|Mm#m#M")));
  1286.     fl_setpup_shortcut(MathMenu, 8, scex(_("MM|Dd#d#D")));
  1287.     fl_setpup_shortcut(MathMenu, 9, scex(_("MM|Pp#p#P")));
  1288.  
  1289.     if (tmpbuffer->isReadonly()) 
  1290.                 for (int ii = 1; ii <= 9; ii++)
  1291.                     fl_setpup_mode(MathMenu, ii, FL_PUP_GREY);
  1292.  
  1293.  
  1294.     fl_setpup_position(
  1295.         men->_view->getForm()->x + ob->x,
  1296.         men->_view->getForm()->y + ob->y + ob->h + 10);   
  1297.     int choice = fl_dopup(MathMenu);  
  1298.     XFlush(fl_display);
  1299.  
  1300.     // set the pseudo menu-button back
  1301.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  1302.     fl_redraw_object(ob);
  1303.  
  1304.     if (men->currentView()->available())  {
  1305.         switch (choice) {
  1306.         case 1: /* frac */
  1307.             tmpfunc->Dispatch(LFUN_INSERT_MATH, "frac");
  1308.             break;
  1309.         case 2: /* sqrt */
  1310.             tmpfunc->Dispatch(LFUN_INSERT_MATH, "sqrt");
  1311.             break;
  1312.         case 3: /* Exponent */ 
  1313.             tmpfunc->Dispatch(LFUN_INSERT_MATH, "^");
  1314.             break;
  1315.         case 4: /* Index */
  1316.             tmpfunc->Dispatch(LFUN_INSERT_MATH, "_");
  1317.             break;
  1318.         case 5: /* sum */ 
  1319.             tmpfunc->Dispatch(LFUN_INSERT_MATH, "sum");
  1320.             break;
  1321.         case 6: /* int */
  1322.             tmpfunc->Dispatch(LFUN_INSERT_MATH, "int");
  1323.             break;
  1324.         case 7:
  1325.             tmpfunc->Dispatch(LFUN_MATH_MODE);
  1326.             break;
  1327.         case 8:
  1328.             tmpfunc->Dispatch(LFUN_MATH_DISPLAY);
  1329.             break;
  1330.         case 9: /* Panel */
  1331.             show_symbols_form(tmpfunc);
  1332.             break;
  1333.         }
  1334.         tmpbuffer->update(0);
  1335.     } 
  1336.     fl_freepup(MathMenu);
  1337. }
  1338.  
  1339.  
  1340. void Menus::ShowOptionsMenu(FL_OBJECT *ob, long)
  1341. {
  1342.     Menus *men = (Menus*) ob->u_ldata;
  1343.  
  1344.     // set the pseudo menu-button
  1345.     fl_set_object_boxtype(ob, FL_UP_BOX);
  1346.     fl_set_button(ob, 0);
  1347.     fl_redraw_object(ob);
  1348.  
  1349.     //Buffer *tmpbuffer = men->_view->currentBuffer();
  1350.     LyXFunc *tmpfunc = men->_view->getLyXFunc();
  1351.  
  1352.     int OptionsMenu = fl_defpup(FL_ObjWin(ob),
  1353.                     _("Screen Fonts..."
  1354.                     "|Spellchecker Options..."
  1355.                     "|Keyboard..."
  1356.                     "|LaTeX...%l"
  1357.                     "|Reconfigure" ));
  1358.  
  1359.     fl_setpup_shortcut(OptionsMenu, 1, scex(_("OM|Ff#f#F")));
  1360.     fl_setpup_shortcut(OptionsMenu, 2, scex(_("OM|Ss#s#S")));
  1361.     fl_setpup_shortcut(OptionsMenu, 3, scex(_("OM|Kk#k#K")));
  1362.     fl_setpup_shortcut(OptionsMenu, 4, scex(_("OM|Ll#l#L")));
  1363.     fl_setpup_shortcut(OptionsMenu, 5, scex(_("OM|Rr#r#R")));
  1364.  
  1365.     fl_setpup_position(
  1366.         men->_view->getForm()->x + ob->x,
  1367.         men->_view->getForm()->y + ob->y + ob->h + 10);   
  1368.     int choice = fl_dopup(OptionsMenu);
  1369.     XFlush(fl_display);
  1370.  
  1371.     // set the pseudo menu-button back
  1372.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  1373.     fl_redraw_object(ob);
  1374.     switch (choice){
  1375.     case 1: men->ScreenOptions(); break;
  1376.     case 2: SpellCheckerOptions(); break;      
  1377.     case 3: men->_view->getIntl()->MenuKeymap(); break;
  1378.     case 4: LaTeXOptions(); break;
  1379.     case 5: tmpfunc->Dispatch(LFUN_RECONFIGURE); break;
  1380.     default: break;
  1381.     }   
  1382.     fl_freepup(OptionsMenu);
  1383. }
  1384.  
  1385.  
  1386. void Menus::ShowBufferMenu(FL_OBJECT *ob, long)
  1387. {
  1388.     Menus *men = (Menus*) ob->u_ldata;
  1389.     
  1390.     // set the pseudo menu-button
  1391.     fl_set_object_boxtype(ob, FL_UP_BOX);
  1392.     fl_set_button(ob, 0);
  1393.     fl_redraw_object(ob);
  1394.    
  1395.     int BufferMenu = fl_newpup(FL_ObjWin(ob));
  1396.     bufferlist.makePup(BufferMenu);
  1397.    
  1398.     fl_setpup_position(
  1399.         men->_view->getForm()->x + ob->x,
  1400.         men->_view->getForm()->y + ob->y + ob->h + 10);   
  1401.     int choice = fl_dopup(BufferMenu);
  1402.     XFlush(fl_display);
  1403.  
  1404.     // set the pseudo menu-button back
  1405.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  1406.     fl_redraw_object(ob);
  1407.     if (choice > 0) men->handleBufferMenu(choice);
  1408.    
  1409.     fl_freepup(BufferMenu);
  1410. }
  1411.  
  1412.  
  1413. static
  1414. char const *doc_files [] = {"Intro", "Tutorial", "HowDoI-", 
  1415.                        "UserGuide", "AdvancedEdit",
  1416.                        "Customization", "Reference",
  1417.                        "BUGS", "LaTeXConfig"}; 
  1418.  
  1419. void Menus::ShowHelpMenu(FL_OBJECT *ob, long)
  1420. {
  1421.     Menus *men = (Menus*) ob->u_ldata;
  1422.  
  1423.     // set the pseudo menu-button
  1424.     fl_set_object_boxtype(ob, FL_UP_BOX);
  1425.     fl_set_button(ob, 0);
  1426.     fl_redraw_object(ob);
  1427.    
  1428.     int HelpMenu = fl_defpup(FL_ObjWin(ob),
  1429.                  _("Introduction"
  1430.                  "|Tutorial"
  1431.                  "|How Do I -"
  1432.                  "|User's Guide"
  1433.                  "|Advanced Editing"
  1434.                  "|Customization"
  1435.                  "|Reference Manual"
  1436.                  "|Known Bugs"
  1437.                  "|LaTeX Configuration%l"
  1438.                  "|Copyright and Warranty..."
  1439.                  "|Credits..."
  1440.                  "|Version..."));
  1441.    
  1442.     fl_setpup_shortcut(HelpMenu,  1, scex(_("HM|Ii#I#i")));
  1443.     fl_setpup_shortcut(HelpMenu,  2, scex(_("HM|Tt#T#t")));
  1444.     fl_setpup_shortcut(HelpMenu,  3, scex(_("HM|Hh#H#h")));
  1445.     fl_setpup_shortcut(HelpMenu,  4, scex(_("HM|Uu#U#u")));
  1446.     fl_setpup_shortcut(HelpMenu,  5, scex(_("HM|Aa#A#a")));
  1447.     fl_setpup_shortcut(HelpMenu,  6, scex(_("HM|Cc#C#c")));
  1448.     fl_setpup_shortcut(HelpMenu,  7, scex(_("HM|Rr#R#r")));
  1449.     fl_setpup_shortcut(HelpMenu,  8, scex(_("HM|Kk#K#k")));
  1450.     fl_setpup_shortcut(HelpMenu,  9, scex(_("HM|Ll#L#l")));
  1451.     fl_setpup_shortcut(HelpMenu, 10, scex(_("HM|oO#o#O")));
  1452.     fl_setpup_shortcut(HelpMenu, 11, scex(_("HM|eE#e#E")));
  1453.     fl_setpup_shortcut(HelpMenu, 12, scex(_("HM|Vv#v#V")));
  1454.  
  1455.     fl_setpup_position(
  1456.         men->_view->getForm()->x + ob->x,
  1457.         men->_view->getForm()->y + ob->y + ob->h + 10);   
  1458.     int choice = fl_dopup(HelpMenu);
  1459.     XFlush(fl_display);
  1460.  
  1461.     // set the pseudo menu-button back
  1462.     fl_set_object_boxtype(ob, FL_FLAT_BOX);
  1463.     fl_redraw_object(ob);
  1464.  
  1465.     switch (choice) {
  1466.     case 1: case 2: case 3: case 4: case 5: 
  1467.     case 6: case 7: case 8: case 9:
  1468.         ProhibitInput();
  1469.         men->MenuDocu(doc_files[choice - 1]);
  1470.         AllowInput();
  1471.         break;
  1472.     case 10: ShowCopyright(); break;
  1473.     case 11: ShowCredits(); break;
  1474.     case 12:
  1475.         ProhibitInput();
  1476.         fl_show_message((LString(_("LyX Version ")) + LYX_VERSION 
  1477.                  + _(" of ") + LYX_RELEASE).c_str(),
  1478.                 (_("Library directory: ")
  1479.                  + MakeDisplayPath(system_lyxdir)).c_str(),
  1480.                 (_("User directory: ") 
  1481.                  + MakeDisplayPath(user_lyxdir)).c_str());
  1482.         AllowInput();
  1483.         break;
  1484.     }
  1485.     fl_freepup(HelpMenu);
  1486. }
  1487.  
  1488.  
  1489. void Menus::MenuDocu(LString const &docname) 
  1490. {
  1491.     LString fname = LibFileSearch("doc",docname,"lyx");
  1492.     _view->getMiniBuffer()->Set(_("Opening help file"),
  1493.                     MakeDisplayPath(fname),"...");
  1494.     currentView()->setBuffer(bufferlist.loadLyXFile(fname,false));
  1495.  
  1496.     if (docname == "Reference")
  1497.         _view->getLyXFunc()->Dispatch(LFUN_TOCVIEW);
  1498. }
  1499.  
  1500.  
  1501. void Menus::handleBufferMenu(int choice)
  1502. {
  1503.     currentView()->switchBuffer(bufferlist.getBuffer(choice));
  1504. }
  1505.