]> git.lyx.org Git - features.git/blob - src/menus.C
Initial revision
[features.git] / src / menus.C
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 1999/09/27 18:44:38 larsbj Exp $     
50
51 #if !defined(lint) && !defined(WITH_WARNINGS)
52 static char vcid[] = "$Id: menus.C,v 1.1 1999/09/27 18:44:38 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         bool DocBook  = tmpbuffer->isDocBook();
403         bool Literate = tmpbuffer->isLiterate();
404
405         // Import sub-menu
406
407         int SubFileImport =fl_defpup(FL_ObjWin(ob),
408                                      _("Import%t"
409                                        "|LaTeX...%x30"
410                                        "|Ascii Text as Lines...%x31"
411                                        "|Ascii Text as Paragraphs%x32"
412                                        "|Noweb%x33"));
413         fl_setpup_shortcut(SubFileImport, 30, scex(_("FIM|Ll#l#L")));
414         fl_setpup_shortcut(SubFileImport, 31, scex(_("FIM|Aa#a#A")));
415         fl_setpup_shortcut(SubFileImport, 32, scex(_("FIM|Pp#p#P")));
416         fl_setpup_shortcut(SubFileImport, 33, scex(_("FIM|Nn#n#N")));
417
418         // Export sub-menu
419
420         // remember to make this handle linuxdoc too.
421         // and now docbook also.
422         int SubFileExport;
423         if (!LinuxDoc && !DocBook)
424             SubFileExport=fl_defpup(FL_ObjWin(ob),
425                                       _("Export%t"
426                                         "|as LaTeX...%x40"
427                                         "|as DVI...%x41"
428                                         "|as PostScript...%x42"
429                                         "|as Ascii Text...%x43"
430                                         "|Custom...%x44"));
431         else if(LinuxDoc)
432             SubFileExport=fl_defpup(FL_ObjWin(ob),
433                                       _("Export%t"
434                                         "|as LinuxDoc...%x40"
435                                         "|as DVI...%x41"
436                                         "|as PostScript...%x42"
437                                         "|as Ascii Text...%x43"));
438         else if(DocBook)
439             SubFileExport=fl_defpup(FL_ObjWin(ob),
440                                       _("Export%t"
441                                         "|as DocBook...%x40"
442                                         "|as DVI...%x41"
443                                         "|as PostScript...%x42"
444                                         "|as Ascii Text...%x43"));
445
446         fl_setpup_shortcut(SubFileExport, 40, scex(_("FEX|Ll#l#L")));
447         fl_setpup_shortcut(SubFileExport, 41, scex(_("FEX|Dd#d#D")));
448         fl_setpup_shortcut(SubFileExport, 42, scex(_("FEX|Pp#p#P")));
449         fl_setpup_shortcut(SubFileExport, 43, scex(_("FEX|Tt#t#T")));
450         fl_setpup_shortcut(SubFileExport, 44, scex(_("FEX|mM#m#M")));
451         
452         int FileMenu = fl_defpup(FL_ObjWin(ob),
453                                  _("New..."
454                                    "|New from template..."
455                                    "|Open...%l"
456                                    "|Close"
457                                    "|Save"
458                                    "|Save As..."
459                                    "|Revert to saved%l"
460                                    "|View dvi"
461                                    "|View PostScript"
462                                    "|Update dvi"
463                                    "|Update PostScript"
464                                    "|Build program%l"
465                                    "|Print..."
466                                    "|Fax..."));
467
468         fl_setpup_shortcut(FileMenu, 1, scex(_("FM|Nn#n#N")));
469         fl_setpup_shortcut(FileMenu, 2, scex(_("FM|tT#t#T")));
470         fl_setpup_shortcut(FileMenu, 3, scex(_("FM|Oo#o#O")));
471         fl_setpup_shortcut(FileMenu, 4, scex(_("FM|Cc#c#C")));
472         fl_setpup_shortcut(FileMenu, 5, scex(_("FM|Ss#s#S")));
473         fl_setpup_shortcut(FileMenu, 6, scex(_("FM|Aa#a#A")));
474         fl_setpup_shortcut(FileMenu, 7, scex(_("FM|Rr#r#R")));
475         fl_setpup_shortcut(FileMenu, 8, scex(_("FM|dD#d#D")));
476         fl_setpup_shortcut(FileMenu, 9, scex(_("FM|wW#w#W")));
477         fl_setpup_shortcut(FileMenu,10, scex(_("FM|vV#v#V")));
478         fl_setpup_shortcut(FileMenu,11, scex(_("FM|Uu#u#U")));
479         fl_setpup_shortcut(FileMenu,12, scex(_("FM|Bb#b#B")));
480         fl_setpup_shortcut(FileMenu,13, scex(_("FM|Pp#p#P")));
481         fl_setpup_shortcut(FileMenu,14, scex(_("FM|Ff#f#F")));
482
483         // These commands are disabled when the corresponding programs
484         // are not installed. I simply grey them out, since I do not
485         // want to change their number (JMarc)
486         bool hasLaTeX = lyxrc->latex_command != "none";
487
488         if (!hasLaTeX || lyxrc->view_dvi_command == "none") 
489                 fl_setpup_mode(FileMenu, 8, FL_PUP_GREY);
490         
491         if (!hasLaTeX || lyxrc->view_ps_command == "none") 
492                 fl_setpup_mode(FileMenu, 9, FL_PUP_GREY);
493         
494         if (!hasLaTeX) {
495                 fl_setpup_mode(FileMenu, 10, FL_PUP_GREY);
496                 fl_setpup_mode(FileMenu, 11, FL_PUP_GREY);
497         } 
498
499         if (lyxrc->literate_command == "none" || ! Literate) 
500                 fl_setpup_mode(FileMenu, 12, FL_PUP_GREY);
501
502         if (!hasLaTeX || lyxrc->print_command == "none") 
503                 fl_setpup_mode(FileMenu, 13, FL_PUP_GREY);
504
505         if (!hasLaTeX || lyxrc->fax_command == "none") 
506                 fl_setpup_mode(FileMenu, 14, FL_PUP_GREY);
507
508         bool hasReLyX = lyxrc->relyx_command != "none";
509         if (!hasReLyX) {
510                 // Disable import LaTeX and Noweb
511                 fl_setpup_mode(SubFileImport, 30, FL_PUP_GREY);
512                 fl_setpup_mode(SubFileImport, 33, FL_PUP_GREY);
513         }
514
515         if (!hasLaTeX) {
516                 // Disable export dvi and export postscript
517                 fl_setpup_mode(SubFileExport, 41, FL_PUP_GREY);
518                 fl_setpup_mode(SubFileExport, 42, FL_PUP_GREY);
519         }
520         // xgettext:no-c-format
521         fl_addtopup(FileMenu,_("|Import%m"), SubFileImport);
522         // xgettext:no-c-format
523         fl_addtopup(FileMenu,_("|Export%m%l"), SubFileExport);
524         // xgettext:no-c-format
525         fl_addtopup(FileMenu,_("|Exit%l"));
526         fl_setpup_shortcut(FileMenu, 15, scex(_("FM|Ii#i#I")));
527         fl_setpup_shortcut(FileMenu, 16, scex(_("FM|Ee#e#E")));
528         fl_setpup_shortcut(FileMenu, 17, scex(_("FM|xX#x#X")));
529
530         // make the lastfiles menu
531         LastFiles_Iter liter(*lastfiles); // :-)
532         LString filname;
533         int ii = 1;
534         while( ii < 10 && !(filname = liter()).empty() ) {
535                 LString tmp;
536                 LString tmp2;
537                 LString relbuf = MakeDisplayPath(filname,30);
538                 tmp += ii;
539                 tmp2 = tmp;
540                 tmp += ". " + relbuf;
541                 tmp2 += LString('#') + ii;
542                 fl_addtopup(FileMenu, tmp.c_str());
543                 fl_setpup_shortcut(FileMenu, 18 - 1 + ii, tmp2.c_str());
544                 ii++;
545         }
546
547         // place popup
548         fl_setpup_position(
549                 men->_view->getForm()->x + ob->x,
550                 men->_view->getForm()->y + ob->y + ob->h + 10);   
551         int choice = fl_dopup(FileMenu);
552         XFlush(fl_display);
553
554         // set the pseudo menu-button back
555         fl_set_object_boxtype(ob, FL_FLAT_BOX);
556         fl_redraw_object(ob);
557
558         switch (choice) {
559         case -1: case 0: // we won't do anything
560                 break;
561         case  1: tmpfunc->Dispatch(LFUN_MENUNEW); break;
562         case  2: tmpfunc->Dispatch(LFUN_MENUNEWTMPLT); break;
563         case  3: tmpfunc->Dispatch(LFUN_MENUOPEN); break;
564         case  4: tmpfunc->Dispatch(LFUN_CLOSEBUFFER); break;
565         case  5: tmpfunc->Dispatch(LFUN_MENUWRITE); break;
566         case  6: tmpfunc->Dispatch(LFUN_MENUWRITEAS); break;
567         case  7: tmpfunc->Dispatch(LFUN_MENURELOAD); break;
568         case  8: tmpfunc->Dispatch(LFUN_PREVIEW); break;
569         case  9: tmpfunc->Dispatch(LFUN_PREVIEWPS); break;
570         case 10: tmpfunc->Dispatch(LFUN_RUNLATEX); break;
571         case 11: tmpfunc->Dispatch(LFUN_RUNDVIPS); break;
572         case 12: tmpfunc->Dispatch(LFUN_BUILDPROG); break;
573         case 13: tmpfunc->Dispatch(LFUN_MENUPRINT); break;
574         case 14: tmpfunc->Dispatch(LFUN_FAX); break;
575         case 15: // import menu
576         case 30: tmpfunc->Dispatch(LFUN_IMPORT, "latex");
577                 break;
578         case 31: tmpfunc->Dispatch(LFUN_IMPORT, "ascii");
579                 break;
580         case 32: tmpfunc->Dispatch(LFUN_IMPORT, "asciiparagraph");
581                 break;
582         case 33: tmpfunc->Dispatch(LFUN_IMPORT, "noweb");
583                 break;
584         case 16: // export menu
585         case 40:
586                 if (!LinuxDoc && !DocBook)
587                         tmpfunc->Dispatch(LFUN_EXPORT, "latex");
588                 else if(LinuxDoc)
589                         tmpfunc->Dispatch(LFUN_EXPORT, "linuxdoc");
590                 else
591                         tmpfunc->Dispatch(LFUN_EXPORT, "docbook");
592                 break;
593         case 41: tmpfunc->Dispatch(LFUN_EXPORT, "dvi");
594                 break;
595         case 42: tmpfunc->Dispatch(LFUN_EXPORT, "postscript");
596                 break;
597         case 43: tmpfunc->Dispatch(LFUN_EXPORT, "ascii");
598                 break;
599         case 44: tmpfunc->Dispatch(LFUN_EXPORT, "custom"); 
600                 break;
601         case 17: tmpfunc->Dispatch(LFUN_QUIT); break;
602                 // Lastfiles:
603         case 18: // The first item with lastfiles.
604         default:
605                 men->currentView()->setBuffer(bufferlist.loadLyXFile(liter[choice-18])); // ok one more
606                 break;
607         }
608         fl_freepup(SubFileImport);
609         fl_freepup(SubFileExport);
610         fl_freepup(FileMenu);
611
612         AllowInput();
613 }
614
615
616 void Menus::ShowFileMenu2(FL_OBJECT *ob, long)
617 {
618         Menus *men = (Menus*) ob->u_ldata;
619
620         // Regarding the pseudo-menu-button:
621         // ok, ok this is a hack. It would be better to use the menus of the
622         // xforms 0.8 library. but then all popups have to be defined all the
623         // time, code rewriting would be necessary and contex-depending menus
624         // (i.e. the linux-doc-sgml stuff) are a bit more complicated. But of
625         // course it would be more proper (and little faster). So if anybody
626         // likes to do the cleanup, just do it. Matthias
627
628         // set the pseudo menu-button
629         fl_set_object_boxtype(ob, FL_UP_BOX);
630         fl_set_button(ob, 0);
631         fl_redraw_object(ob);
632
633         LyXFunc *tmpfunc = men->_view->getLyXFunc();
634
635         // Import sub-menu
636         
637         int SubFileImport = fl_defpup(FL_ObjWin(ob),
638                                      _("Import%t"
639                                        "|LaTeX...%x15"
640                                        "|Ascii Text as Lines...%x16"
641                                        "|Ascii Text as Paragraphs...%x17"
642                                        "|Noweb...%x18"));
643         fl_setpup_shortcut(SubFileImport, 15, scex(_("FIM|Ll#l#L")));
644         fl_setpup_shortcut(SubFileImport, 16, scex(_("FIM|Aa#a#A")));
645         fl_setpup_shortcut(SubFileImport, 17, scex(_("FIM|Pp#p#P")));
646         fl_setpup_shortcut(SubFileImport, 18, scex(_("FIM|Nn#n#N")));
647
648         bool hasReLyX = lyxrc->relyx_command != "none";
649         if (!hasReLyX) {
650                 // Disable import LaTeX and Noweb
651                 fl_setpup_mode(SubFileImport, 15, FL_PUP_GREY);
652                 fl_setpup_mode(SubFileImport, 18, FL_PUP_GREY);
653         }
654
655         // This can be done cleaner later.
656         int FileMenu = fl_defpup(FL_ObjWin(ob), 
657                                  _("New..."
658                                  "|New from template..."
659                                  "|Open...%l"
660                                  "|Import%m%l"
661                                  "|Exit%l"), SubFileImport);
662         fl_setpup_shortcut(FileMenu, 1, scex(_("FM|Nn#n#N")));
663         fl_setpup_shortcut(FileMenu, 2, scex(_("FM|tT#t#T")));
664         fl_setpup_shortcut(FileMenu, 3, scex(_("FM|Oo#o#O")));
665         fl_setpup_shortcut(FileMenu, 4, scex(_("FM|Ii#i#I")));
666         fl_setpup_shortcut(FileMenu, 5, scex(_("FM|xX#x#X")));
667         
668         // make the lastfiles menu
669         LastFiles_Iter liter(*lastfiles); // :-)
670         LString filname;
671         int ii = 1;
672         while( ii < 10 && !(filname = liter()).empty() ) {
673                 LString tmp;
674                 LString tmp2;
675                 LString relbuf = MakeDisplayPath(filname,30);
676                 tmp += ii;
677                 tmp2 = tmp;
678                 tmp += ". " + relbuf;
679                 tmp2 += LString('#') + ii;
680                 fl_addtopup(FileMenu, tmp.c_str());
681                 fl_setpup_shortcut(FileMenu, 6 - 1 + ii, tmp2.c_str());
682                 ii++;
683         }
684
685         // place popup
686         fl_setpup_position(
687                 men->_view->getForm()->x + ob->x,
688                 men->_view->getForm()->y + ob->y + ob->h + 10);   
689         int choice = fl_dopup(FileMenu);
690         XFlush(fl_display);
691
692         // set the pseudo menu-button back
693         fl_set_object_boxtype(ob, FL_FLAT_BOX);
694         fl_redraw_object(ob);
695
696         switch (choice) {
697         case -1: case 0: // we won't do anything
698                 break;
699         case 1:
700                 tmpfunc->Dispatch(LFUN_MENUNEW);
701                 break;
702         case 2:
703                 tmpfunc->Dispatch(LFUN_MENUNEWTMPLT);
704                 break;
705         case 3:
706                 tmpfunc->Dispatch(LFUN_MENUOPEN);
707                 break;
708         case 4: // import menu
709         case 15: tmpfunc->Dispatch(LFUN_IMPORT, "latex");
710                 break;
711         case 16: tmpfunc->Dispatch(LFUN_IMPORT, "ascii");
712                 break;
713         case 17: tmpfunc->Dispatch(LFUN_IMPORT, "asciiparagraph");
714                 break;
715         case 18: tmpfunc->Dispatch(LFUN_IMPORT, "noweb");
716                 break;
717         case 5:
718                 tmpfunc->Dispatch(LFUN_QUIT);
719                 break;
720                 // Lastfiles:
721         default:
722                 men->currentView()->setBuffer(bufferlist.loadLyXFile(liter[choice-6]));
723                 break;
724         }
725
726         fl_freepup(SubFileImport);
727         fl_freepup(FileMenu);
728         AllowInput();
729         return;
730 }
731
732
733 void Menus::ShowEditMenu(FL_OBJECT *ob, long)
734 {
735         Menus *men = (Menus*) ob->u_ldata;
736         
737         // set the pseudo menu-button
738         fl_set_object_boxtype(ob, FL_UP_BOX);
739         fl_set_button(ob, 0);
740         fl_redraw_object(ob);
741
742         Buffer *tmpbuffer = men->_view->currentBuffer();
743         LyXFunc *tmpfunc = men->_view->getLyXFunc();
744
745         // Floats & Insets submenu
746         int SubEditFloats=fl_defpup(FL_ObjWin(ob),
747                                     _("Floats & Insets%t"
748                                     "|Open/Close%x21"
749                                     "|Melt%x22"
750                                     "|Open All Footnotes/Margin Notes%x23"
751                                     "|Close All Footnotes/Margin Notes%x24"
752                                     "|Open All Figures/Tables%x25"
753                                     "|Close All Figures/Tables%x26%l"
754                                     "|Remove all Error Boxes%x27")
755                 );
756         fl_setpup_shortcut(SubEditFloats, 21, scex(_("EMF|Oo#o#O")));
757         fl_setpup_shortcut(SubEditFloats, 22, scex(_("EMF|Mm#m#M")));
758         fl_setpup_shortcut(SubEditFloats, 23, scex(_("EMF|Aa#a#A")));
759         fl_setpup_shortcut(SubEditFloats, 24, scex(_("EMF|Cc#c#C")));
760         fl_setpup_shortcut(SubEditFloats, 25, scex(_("EMF|Ff#f#F")));
761         fl_setpup_shortcut(SubEditFloats, 26, scex(_("EMF|Tt#t#T")));
762         fl_setpup_shortcut(SubEditFloats, 27, scex(_("EMF|Rr#r#R")));
763
764         // Table submenu
765         int SubEditTable = fl_newpup(FL_ObjWin(ob));
766         if (men->currentView()->available() && 
767             tmpbuffer->text->cursor.par->table &&
768             !tmpbuffer->isReadonly()){
769
770                 fl_addtopup(SubEditTable, _("Table%t"));
771
772                 if (tmpbuffer->text->cursor.par->table->
773                     IsMultiColumn(tmpbuffer->text->
774                                   NumberOfCell(tmpbuffer->
775                                                text->cursor.par, 
776                                                tmpbuffer->
777                                                text->cursor.pos)))
778                         fl_addtopup(SubEditTable, _("|Multicolumn%B%x44%l"));
779                 else
780                         fl_addtopup(SubEditTable, _("|Multicolumn%b%x44%l"));
781                 fl_setpup_shortcut(SubEditTable, 44, scex(_("EMT|Mm#m#M")));
782      
783                 if (tmpbuffer->text->cursor.par->table->
784                     TopLine(tmpbuffer->text->
785                             NumberOfCell(tmpbuffer->
786                                          text->cursor.par, 
787                                          tmpbuffer->text->
788                                          cursor.pos)))
789                         fl_addtopup(SubEditTable, _("|Line Top%B%x36"));
790                 else
791                         fl_addtopup(SubEditTable, _("|Line Top%b%x36"));
792                 fl_setpup_shortcut(SubEditTable, 36, scex(_("EMT|Tt#t#T")));
793      
794                 if (tmpbuffer->text->cursor.par->table->
795                     BottomLine(tmpbuffer->text->
796                                NumberOfCell(tmpbuffer->
797                                             text->cursor.par, 
798                                             tmpbuffer->
799                                             text->cursor.pos)))
800                         fl_addtopup(SubEditTable, _("|Line Bottom%B%x37"));
801                 else
802                         fl_addtopup(SubEditTable, _("|Line Bottom%b%x37"));
803                 fl_setpup_shortcut(SubEditTable, 37, scex(_("EMT|Bb#b#B")));
804
805                 if (tmpbuffer->text->cursor.par->table->
806                     LeftLine(tmpbuffer->text->
807                              NumberOfCell(tmpbuffer->
808                                           text->cursor.par, 
809                                           tmpbuffer->
810                                           text->cursor.pos)))
811                         fl_addtopup(SubEditTable, _("|Line Left%B%x38"));
812                 else
813                         fl_addtopup(SubEditTable, _("|Line Left%b%x38"));
814                 fl_setpup_shortcut(SubEditTable, 38, scex(_("EMT|Ll#l#L")));
815
816                 if (tmpbuffer->text->cursor.par->table->
817                     RightLine(tmpbuffer->text->
818                               NumberOfCell(tmpbuffer->
819                                            text->cursor.par, 
820                                            tmpbuffer->
821                                            text->cursor.pos)))
822                         fl_addtopup(SubEditTable, _("|Line Right%B%x39%l"));
823                 else
824                         fl_addtopup(SubEditTable, _("|Line Right%b%x39%l"));
825                 fl_setpup_shortcut(SubEditTable, 39, scex(_("EMT|Rr#r#R")));
826
827                 int align = tmpbuffer->text->cursor.par->
828                         table->GetAlignment(tmpbuffer->text->
829                                      NumberOfCell(tmpbuffer->
830                                                   text->cursor.par, 
831                                                   tmpbuffer->
832                                                   text->cursor.pos));
833                 if (align == LYX_ALIGN_LEFT)
834                         fl_addtopup(SubEditTable, _("|Align Left%R%x40"));
835                 else
836                         fl_addtopup(SubEditTable, _("|Align Left%r%x40"));
837                 fl_setpup_shortcut(SubEditTable, 40, scex(_("EMT|eE#e#E")));
838
839                 if (align == LYX_ALIGN_RIGHT)
840                         fl_addtopup(SubEditTable, _("|Align Right%R%x41"));
841                 else
842                         fl_addtopup(SubEditTable, _("|Align Right%r%x41"));
843                 fl_setpup_shortcut(SubEditTable, 41, scex(_("EMT|iI#i#I")));
844
845                 if (align == LYX_ALIGN_CENTER)
846                         fl_addtopup(SubEditTable, _("|Align Center%R%x42%l"));
847                 else
848                         fl_addtopup(SubEditTable, _("|Align Center%r%x42%l"));
849                 fl_setpup_shortcut(SubEditTable, 42, scex(_("EMT|Cc#c#C")));
850
851                 // xgettext:no-c-format
852                 fl_addtopup(SubEditTable, _("|Append Row%x32"));
853                 fl_setpup_shortcut(SubEditTable, 32, scex(_("EMT|oO#o#O")));
854                 // xgettext:no-c-format
855                 fl_addtopup(SubEditTable, _("|Append Column%x33%l"));
856                 fl_setpup_shortcut(SubEditTable, 33, scex(_("EMT|uU#u#U")));
857                 // xgettext:no-c-format
858                 fl_addtopup(SubEditTable, _("|Delete Row%x34"));
859                 fl_setpup_shortcut(SubEditTable, 34, scex(_("EMT|wW#w#W")));
860                 // xgettext:no-c-format
861                 fl_addtopup(SubEditTable, _("|Delete Column%x35%l"));
862                 fl_setpup_shortcut(SubEditTable, 35, scex(_("EMT|nN#n#N")));
863                 // xgettext:no-c-format
864                 fl_addtopup(SubEditTable, _("|Delete Table%x43"));
865                 fl_setpup_shortcut(SubEditTable, 43, scex(_("EMT|Dd#d#D")));
866         }
867         else {
868                 fl_addtopup(SubEditTable, _("Table%t"));
869                 // xgettext:no-c-format
870                 fl_addtopup(SubEditTable, _("|Insert table%x31"));
871                 fl_setpup_shortcut(SubEditTable, 31, scex(_("EMT|Ii#i#I")));
872         }
873
874         int SubVersionControl = fl_newpup(FL_ObjWin(ob));
875         fl_addtopup(SubVersionControl, _("Version Control%t"));
876         if (tmpbuffer->lyxvc.inUse()) {
877                 // xgettext:no-c-format
878                 fl_addtopup(SubVersionControl, _("|Register%d%x51"));
879                 if (tmpbuffer->isReadonly()) {
880                         // signifies that the file is not checked out
881                         // xgettext:no-c-format
882                         fl_addtopup(SubVersionControl, _("|Check In Changes%d%x52"));
883                         // xgettext:no-c-format
884                         fl_addtopup(SubVersionControl, _("|Check Out for Edit%x53"));
885                 } else {
886                         // signifies that the file is checked out
887                         // xgettext:no-c-format
888                         fl_addtopup(SubVersionControl, _("|Check In Changes%x52"));
889                         // xgettext:no-c-format
890                         fl_addtopup(SubVersionControl, _("|Check Out for Edit%d%x53"));
891                 }
892                 // xgettext:no-c-format
893                 fl_addtopup(SubVersionControl, _("|Revert to last version%x54"));
894                 // xgettext:no-c-format
895                 fl_addtopup(SubVersionControl, _("|Undo last check in%x55"));
896                 // xgettext:no-c-format
897                 fl_addtopup(SubVersionControl, _("|Show History%x56"));
898         } else {
899                 // xgettext:no-c-format
900                 fl_addtopup(SubVersionControl, _("|Register%x51"));
901         }
902         // the shortcuts are not good.
903         fl_setpup_shortcut(SubVersionControl, 51, scex(_("EMV|Rr#r#R")));
904         fl_setpup_shortcut(SubVersionControl, 52, scex(_("EMV|Ii#i#I")));
905         fl_setpup_shortcut(SubVersionControl, 53, scex(_("EMV|Oo#o#O")));
906         fl_setpup_shortcut(SubVersionControl, 54, scex(_("EMV|lL#l#l")));
907         fl_setpup_shortcut(SubVersionControl, 55, scex(_("EMV|Uu#u#U")));
908         fl_setpup_shortcut(SubVersionControl, 56, scex(_("EMV|Hh#h#H")));
909
910         int EditMenu=fl_defpup(FL_ObjWin(ob),
911                                _("Undo"
912                                "|Redo %l"
913                                "|Cut"
914                                "|Copy"
915                                "|Paste%l"
916                                "|Find & Replace..."
917                                "|Go to Error"
918                                "|Go to Note"
919                                "|Floats & Insets%m"
920                                "|Table%m"
921                                "|Spellchecker...."
922                                "|Check TeX"
923                                "|Table of Contents...%l"
924                                "|Version Control%m%l"
925                                "|View LaTeX log file%l"
926                                "|Paste Primary Selection as Lines"
927                                "|Paste Primary Selection as Paragraphs"),
928                                SubEditFloats, SubEditTable, SubVersionControl);
929
930         fl_setpup_shortcut(EditMenu, 1, scex(_("EM|Uu#u#U")));
931         fl_setpup_shortcut(EditMenu, 2, scex(_("EM|Rr#r#R")));
932         fl_setpup_shortcut(EditMenu, 3, scex(_("EM|Cc#c#C")));
933         fl_setpup_shortcut(EditMenu, 4, scex(_("EM|oO#o#O")));
934         fl_setpup_shortcut(EditMenu, 5, scex(_("EM|Pp#p#P")));
935         fl_setpup_shortcut(EditMenu, 6, scex(_("EM|Ff#f#F")));
936         fl_setpup_shortcut(EditMenu, 7, scex(_("EM|Ee#e#E")));
937         fl_setpup_shortcut(EditMenu, 8, scex(_("EM|Nn#n#N")));
938         fl_setpup_shortcut(EditMenu, 9, scex(_("EM|Ii#i#I")));
939         fl_setpup_shortcut(EditMenu, 10, scex(_("EM|Tt#t#T")));
940         fl_setpup_shortcut(EditMenu, 11, scex(_("EM|Ss#s#S")));
941         fl_setpup_shortcut(EditMenu, 12, scex(_("EM|hH#h#H")));
942         fl_setpup_shortcut(EditMenu, 13, scex(_("EM|aA#a#A")));
943         fl_setpup_shortcut(EditMenu, 14, scex(_("EM|Vv#v#V")));
944         fl_setpup_shortcut(EditMenu, 15, scex(_("EM|wW#w#W")));
945         fl_setpup_shortcut(EditMenu, 16, scex(_("EM|Ll#l#L")));
946         fl_setpup_shortcut(EditMenu, 17, scex(_("EM|gG#g#G")));
947       
948         // disable unavailable entries.
949         if(tmpbuffer->undostack.Top() == NULL)
950                 fl_setpup_mode(EditMenu, 1, FL_PUP_GREY);
951         if(tmpbuffer->redostack.Top() == NULL)
952                 fl_setpup_mode(EditMenu, 2, FL_PUP_GREY);
953         if(lyxrc->isp_command == "none") 
954                 fl_setpup_mode(EditMenu, 11, FL_PUP_GREY);
955         if(lyxrc->chktex_command == "none") 
956                 fl_setpup_mode(EditMenu, 12, FL_PUP_GREY);
957
958         if (tmpbuffer->isReadonly()) {
959                 fl_setpup_mode(EditMenu, 1, FL_PUP_GREY); 
960                 fl_setpup_mode(EditMenu, 2, FL_PUP_GREY); 
961                 fl_setpup_mode(EditMenu, 3, FL_PUP_GREY); 
962                 fl_setpup_mode(EditMenu, 5, FL_PUP_GREY); 
963                 fl_setpup_mode(EditMenu, 16, FL_PUP_GREY); 
964                 fl_setpup_mode(EditMenu, 17, FL_PUP_GREY);
965         }
966         
967         fl_setpup_position(men->_view->getForm()->x + ob->x,
968                            men->_view->getForm()->y + ob->y +
969                            ob->h + 10);   
970         int choice = fl_dopup(EditMenu);
971         XFlush(fl_display);
972    
973         // set the pseudo menu-button back
974         fl_set_object_boxtype(ob, FL_FLAT_BOX);
975         fl_redraw_object(ob);
976
977         switch (choice) {
978         case  1: tmpfunc->Dispatch(LFUN_UNDO); break;
979         case  2: tmpfunc->Dispatch(LFUN_REDO); break;
980         case  3: tmpfunc->Dispatch(LFUN_CUT); break;
981         case  4: tmpfunc->Dispatch(LFUN_COPY); break;
982         case  5: tmpfunc->Dispatch(LFUN_PASTE); break;
983         case  6: tmpfunc->Dispatch(LFUN_MENUSEARCH); break;
984         case  7: tmpfunc->Dispatch(LFUN_GOTOERROR); break;
985         case  8: tmpfunc->Dispatch(LFUN_GOTONOTE); break;
986         case  9: // floats & insets
987                 break;
988         case 10:// table 
989                 break;
990         case 11: tmpfunc->Dispatch(LFUN_SPELLCHECK); break;
991         case 12: tmpfunc->Dispatch(LFUN_RUNCHKTEX); break;
992         case 13: tmpfunc->Dispatch(LFUN_TOCVIEW); break;
993         case 14: // version control
994                 break;
995         case 15: tmpfunc->Dispatch(LFUN_LATEX_LOG); break;
996         case 16: tmpfunc->Dispatch(LFUN_PASTESELECTION, "line"); break;
997         case 17: tmpfunc->Dispatch(LFUN_PASTESELECTION, "paragraph"); break;
998
999                 // floats & insets sub-menu
1000         case 21: ToggleFloat(); break;
1001         case 22: tmpfunc->Dispatch(LFUN_MELT); break;
1002         case 23: AllFloats(1, 0); break;
1003         case 24: AllFloats(0, 0); break;
1004         case 25: AllFloats(1, 1); break;
1005         case 26: AllFloats(0, 1); break;
1006         case 27: tmpfunc->Dispatch(LFUN_REMOVEERRORS); break;
1007
1008         case 31: tmpfunc->Dispatch(LFUN_TABLE); break;
1009                 // this is really temporary. We need new function in keybind.C
1010                 // These should set the minibuffer, too.
1011         case 32: case 33: case 34:
1012         case 35: case 36: case 37:
1013         case 38: case 39: case 40: 
1014         case 41: case 42: case 43:
1015         case 44: 
1016                 if (men->currentView()->available()){
1017                         men->currentView()->getScreen()->HideCursor();
1018                         if (!tmpbuffer->text->selection){
1019                                 BeforeChange(); 
1020                                 tmpbuffer->update(-2);
1021                         }
1022                         tmpbuffer->text->
1023                                 TableFeatures(choice - 32);
1024                         tmpbuffer->update(1);
1025                 }
1026                 break;
1027                 // version control sub-menu
1028         case 51: // register
1029                 tmpfunc->Dispatch(LFUN_VC_REGISTER);
1030                 break;
1031         case 52: // check in
1032                 tmpfunc->Dispatch(LFUN_VC_CHECKIN);
1033                 break;
1034         case 53: // check out
1035                 tmpfunc->Dispatch(LFUN_VC_CHECKOUT);
1036                 break;
1037         case 54: // revert to last
1038                 tmpfunc->Dispatch(LFUN_VC_REVERT);
1039                 break;
1040         case 55: // undo last
1041                 tmpfunc->Dispatch(LFUN_VC_UNDO);
1042                 break;
1043         case 56: // show history
1044                 tmpfunc->Dispatch(LFUN_VC_HISTORY);
1045                 break;
1046         }
1047
1048         fl_freepup(EditMenu);
1049         fl_freepup(SubEditFloats);
1050         fl_freepup(SubEditTable);
1051         fl_freepup(SubVersionControl);
1052 }
1053
1054
1055 void Menus::ShowLayoutMenu(FL_OBJECT *ob, long)
1056 {
1057         Menus *men = (Menus*) ob->u_ldata;
1058
1059         if (!men->currentView()->available())
1060                 return;
1061         
1062         // set the pseudo menu-button
1063         fl_set_object_boxtype(ob, FL_UP_BOX);
1064         fl_set_button(ob, 0);
1065         fl_redraw_object(ob);
1066    
1067         Buffer *tmpbuffer = men->_view->currentBuffer();
1068         LyXFunc *tmpfunc = men->_view->getLyXFunc();
1069
1070         int LayoutMenu = fl_newpup(FL_ObjWin(ob));
1071         fl_addtopup(LayoutMenu, _("Character..."
1072                                   "|Paragraph..."
1073                                   "|Document..."
1074                                   "|Paper..."
1075                                   "|Table..."
1076                                   "|Quotes...%l"
1077                                   "|Emphasize Style%b"
1078                                   "|Noun Style%b"
1079                                   "|Bold Style%b"
1080                                   "|TeX Style%b"
1081                                   "|Change Environment Depth"
1082                                   "|LaTeX Preamble...%l"
1083                                   "|Save layout as default"));
1084         fl_setpup_shortcut(LayoutMenu, 1, scex(_("LM|Cc#c#C")));
1085         fl_setpup_shortcut(LayoutMenu, 2, scex(_("LM|Pp#p#P")));
1086         fl_setpup_shortcut(LayoutMenu, 3, scex(_("LM|Dd#d#D")));
1087         fl_setpup_shortcut(LayoutMenu, 4, scex(_("LM|aA#a#A")));
1088         fl_setpup_shortcut(LayoutMenu, 5, scex(_("LM|eE#e#E")));
1089         fl_setpup_shortcut(LayoutMenu, 6, scex(_("LM|Qq#q#Q")));
1090         fl_setpup_shortcut(LayoutMenu, 7, scex(_("LM|mM#m#M")));
1091         fl_setpup_shortcut(LayoutMenu, 8, scex(_("LM|Nn#n#N")));
1092         fl_setpup_shortcut(LayoutMenu, 9, scex(_("LM|Bb#b#B")));
1093         fl_setpup_shortcut(LayoutMenu, 10, scex(_("LM|Tt#t#T")));
1094         fl_setpup_shortcut(LayoutMenu, 11, scex(_("LM|vV#v#V")));
1095         fl_setpup_shortcut(LayoutMenu, 12, scex(_("LM|Ll#l#L")));
1096         fl_setpup_shortcut(LayoutMenu, 13, scex(_("LM|Ss#s#S")));
1097
1098         // Set values of checkboxes according to font
1099         LyXFont font = tmpbuffer->text->real_current_font;
1100         if (font.emph() == LyXFont::ON)
1101                 fl_setpup_mode(LayoutMenu, 7, FL_PUP_CHECK);
1102         if (font.noun() == LyXFont::ON)
1103                 fl_setpup_mode(LayoutMenu, 8, FL_PUP_CHECK);
1104         if (font.series() == LyXFont::BOLD_SERIES)
1105                 fl_setpup_mode(LayoutMenu, 9, FL_PUP_CHECK);
1106         if (font.latex() == LyXFont::ON)
1107                 fl_setpup_mode(LayoutMenu, 10, FL_PUP_CHECK);
1108            
1109         // Grey out unavailable entries
1110         if (!tmpbuffer->text->cursor.par->table)
1111                 fl_setpup_mode(LayoutMenu, 5, FL_PUP_GREY);
1112
1113         if (tmpbuffer->isReadonly()) {
1114                 fl_setpup_mode(LayoutMenu, 1, FL_PUP_GREY);
1115                 fl_setpup_mode(LayoutMenu, 6, FL_PUP_GREY);
1116                 fl_setpup_mode(LayoutMenu, 11, FL_PUP_GREY);
1117         }
1118
1119         fl_setpup_position(
1120                 men->_view->getForm()->x + ob->x,
1121                 men->_view->getForm()->y + ob->y + ob->h + 10);
1122         int choice = fl_dopup(LayoutMenu);
1123         XFlush(fl_display);
1124
1125         // set the pseudo menu-button back
1126         fl_set_object_boxtype(ob, FL_FLAT_BOX);
1127         fl_redraw_object(ob);
1128
1129         switch (choice) {
1130         case 1:  tmpfunc->Dispatch(LFUN_LAYOUT_CHARACTER); break;
1131         case 2:  tmpfunc->Dispatch(LFUN_LAYOUT_PARAGRAPH); break;
1132         case 3:  tmpfunc->Dispatch(LFUN_LAYOUT_DOCUMENT);  break;
1133         case 4:  tmpfunc->Dispatch(LFUN_LAYOUT_PAPER); break;
1134         case 5:  tmpfunc->Dispatch(LFUN_LAYOUT_TABLE, "true"); break;
1135         case 6:  tmpfunc->Dispatch(LFUN_LAYOUT_QUOTES); break;
1136         case 7:  tmpfunc->Dispatch(LFUN_EMPH); break;
1137         case 8:  tmpfunc->Dispatch(LFUN_NOUN); break;
1138         case 9:  tmpfunc->Dispatch(LFUN_BOLD); break;
1139         case 10: tmpfunc->Dispatch(LFUN_TEX); break;
1140         case 11: tmpfunc->Dispatch(LFUN_DEPTH_PLUS); break;
1141         case 12: tmpfunc->Dispatch(LFUN_LAYOUT_PREAMBLE); break;
1142         case 13: tmpfunc->Dispatch(LFUN_LAYOUT_SAVE_DEFAULT); break;//MenuLayoutSave(); break;
1143         }
1144         fl_freepup(LayoutMenu); 
1145 }
1146
1147
1148 void Menus::ShowInsertMenu(FL_OBJECT *ob, long /*data*/)
1149 {
1150         Menus *men = (Menus*) ob->u_ldata;
1151         
1152         // set the pseudo menu-button
1153         fl_set_object_boxtype(ob, FL_UP_BOX);
1154         fl_set_button(ob, 0);
1155         fl_redraw_object(ob);
1156  
1157         Buffer *tmpbuffer = men->_view->currentBuffer();
1158         LyXFunc *tmpfunc = men->_view->getLyXFunc();
1159
1160 #if 0
1161         // Is textclass LinuxDoc?
1162         bool LinuxDoc = tmpbuffer->isLinuxDoc();
1163 #endif
1164
1165         int SubInsertAscii = fl_defpup(FL_ObjWin(ob),
1166                                        _("Import ASCII file%t"
1167                                        "|As Lines%x41"
1168                                        "|As Paragraphs%x42"));
1169         fl_setpup_shortcut(SubInsertAscii, 41, scex(_("IMA|Ll#l#L")));
1170         fl_setpup_shortcut(SubInsertAscii, 42, scex(_("IMA|Pp#p#P")));
1171
1172         int SubInsertTableList=fl_defpup(FL_ObjWin(ob),
1173                                          _("Lists & TOC%t"
1174                                            "|Table of Contents%x21"
1175                                            "|List of Figures%x22"
1176                                            "|List of Tables%x23"
1177                                            "|List of Algorithms%x24"
1178                                            "|Index List%x25"
1179                                            "|BibTeX Reference%x26"));      
1180         fl_setpup_shortcut(SubInsertTableList, 21, scex(_("IMT|Cc#c#C")));
1181         fl_setpup_shortcut(SubInsertTableList, 22, scex(_("IMT|Ff#f#F")));
1182         fl_setpup_shortcut(SubInsertTableList, 23, scex(_("IMT|Tt#t#T")));
1183         fl_setpup_shortcut(SubInsertTableList, 24, scex(_("IMT|Aa#a#A")));
1184         fl_setpup_shortcut(SubInsertTableList, 25, scex(_("IMT|Ii#i#I")));
1185         fl_setpup_shortcut(SubInsertTableList, 26, scex(_("IMT|Bb#b#B")));
1186
1187         int SubInsertFloatList;
1188         //if (men->_view->currentBuffer()->params.columns == 1) {
1189         // SubInsertFloatList = fl_defpup(FL_ObjWin(ob),
1190         //                               _("Floats%t"
1191         //                                 "|Figure Float%x71"
1192         //                                 "|Table Float%l%x72"
1193         //                                 "|Algorithm Float%x73"));
1194         //}
1195         //else {
1196           SubInsertFloatList = fl_defpup(FL_ObjWin(ob),
1197                                          _("Floats%t"
1198                                            "|Figure Float%x71"
1199                                            "|Table Float%x72"
1200                                            "|Wide Figure Float%x73"
1201                                            "|Wide Table Float%l%x74"
1202                                            "|Algorithm Float%x75"));
1203           //}
1204         fl_setpup_shortcut(SubInsertFloatList, 71, scex(_("IMF|gG#g#G")));
1205         fl_setpup_shortcut(SubInsertFloatList, 72, scex(_("IMF|Tt#t#T")));
1206         fl_setpup_shortcut(SubInsertFloatList, 73, scex(_("IMF|Ww#w#W")));
1207         fl_setpup_shortcut(SubInsertFloatList, 74, scex(_("IMF|iI#i#I")));
1208         fl_setpup_shortcut(SubInsertFloatList, 75, scex(_("IMF|Aa#a#A")));
1209         
1210         int SubInsertSpecial=fl_defpup(FL_ObjWin(ob),
1211                                        _("Special Character%t"
1212                                          "|HFill%x31"
1213                                          "|Hyphenation Point%x32"
1214                                          "|Protected Blank%x33"
1215                                          "|Linebreak%x34"
1216                                          "|Ellipsis (...)%x35"
1217                                          "|End of sentence period%x36"
1218                                          "|Ordinary Quote (\")%x37"
1219                                          "|Menu Separator %x38"));
1220
1221         fl_setpup_shortcut(SubInsertSpecial, 31, scex(_("IMS|Hh#h#H")));
1222         fl_setpup_shortcut(SubInsertSpecial, 32, scex(_("IMS|Pp#p#P")));
1223         fl_setpup_shortcut(SubInsertSpecial, 33, scex(_("IMS|Bb#b#B")));
1224         fl_setpup_shortcut(SubInsertSpecial, 34, scex(_("IMS|Ll#l#L")));
1225         fl_setpup_shortcut(SubInsertSpecial, 35, scex(_("IMS|iI#i#I")));
1226         fl_setpup_shortcut(SubInsertSpecial, 36, scex(_("IMS|Ee#e#E")));
1227         fl_setpup_shortcut(SubInsertSpecial, 37, scex(_("IMS|Qq#q#Q")));
1228         fl_setpup_shortcut(SubInsertSpecial, 38, scex(_("IMS|Mm#m#M")));
1229         
1230         int InsertMenu = fl_defpup(FL_ObjWin(ob),
1231                                    _("Figure..."
1232                                      "|Table...%l"
1233                                      "|Include File..." 
1234                                      "|Import ASCII File%m"
1235                                      "|Insert LyX File...%l"
1236                                      "|Footnote"
1237                                      "|Margin Note"
1238                                      "|Floats%m%l"      
1239                                      "|Lists & TOC%m%l"
1240                                      "|Special Character%m%l"
1241                                      "|Note..."
1242                                      "|Label..."
1243                                      "|Cross-Reference..."
1244                                      "|Citation Reference..."
1245                                      "|Index entry..."
1246                                      "|Index entry of last word"),
1247                                    SubInsertAscii,
1248                                    SubInsertFloatList,  
1249                                    SubInsertTableList,
1250                                    SubInsertSpecial);
1251
1252         fl_setpup_shortcut(InsertMenu, 1, scex(_("IM|gG#g#G")));
1253         fl_setpup_shortcut(InsertMenu, 2, scex(_("IM|bB#b#B")));
1254         fl_setpup_shortcut(InsertMenu, 3, scex(_("IM|cC#c#C")));
1255         fl_setpup_shortcut(InsertMenu, 4, scex(_("IM|Aa#a#A")));
1256         fl_setpup_shortcut(InsertMenu, 5, scex(_("IM|Xx#x#X")));
1257         fl_setpup_shortcut(InsertMenu, 6, scex(_("IM|Ff#f#F")));
1258         fl_setpup_shortcut(InsertMenu, 7, scex(_("IM|Mm#m#M")));
1259         fl_setpup_shortcut(InsertMenu, 8, scex(_("IM|oO#o#O")));
1260         fl_setpup_shortcut(InsertMenu, 9, scex(_("IM|Tt#t#T")));
1261         fl_setpup_shortcut(InsertMenu, 10, scex(_("IM|Ss#s#S")));
1262         fl_setpup_shortcut(InsertMenu, 11, scex(_("IM|Nn#n#N")));
1263         fl_setpup_shortcut(InsertMenu, 12, scex(_("IM|Ll#l#L")));
1264         fl_setpup_shortcut(InsertMenu, 13, scex(_("IM|rR#r#R")));     
1265         fl_setpup_shortcut(InsertMenu, 14, scex(_("IM|iI#i#I")));
1266         fl_setpup_shortcut(InsertMenu, 15, scex(_("IM|dD#d#D")));
1267         fl_setpup_shortcut(InsertMenu, 16, scex(_("IM|wW#w#W")));
1268
1269 #if 0
1270         if (LinuxDoc) {
1271                 /* for linuxdoc sgml */
1272 #endif
1273                 fl_addtopup(InsertMenu, _("|URL..."));
1274                 fl_setpup_shortcut(InsertMenu, 17, scex(_("IM|Uu#u#U")));
1275 #if 0
1276         }      
1277 #endif
1278         if (tmpbuffer->isReadonly()) {
1279                 for (int ii = 1; ii <= 16; ii++)
1280                         fl_setpup_mode(InsertMenu, ii, FL_PUP_GREY);
1281 #if 0
1282                 if (LinuxDoc) {
1283 #endif
1284                         fl_setpup_mode(InsertMenu, 17, FL_PUP_GREY);
1285 #if 0
1286                 }
1287 #endif
1288         }
1289
1290         fl_setpup_position(
1291                 men->_view->getForm()->x + ob->x,
1292                 men->_view->getForm()->y + ob->y + ob->h + 10);
1293    
1294         int choice = fl_dopup(InsertMenu);
1295         XFlush(fl_display);
1296
1297         // set the pseudo menu-button back
1298         fl_set_object_boxtype(ob, FL_FLAT_BOX);
1299         fl_redraw_object(ob);
1300
1301         if (men->currentView()->available()){
1302                 men->currentView()->getScreen()->HideCursor();
1303                 switch (choice) {
1304                 case 1: tmpfunc->Dispatch(LFUN_FIGURE); break;
1305                 case 2: tmpfunc->Dispatch(LFUN_TABLE); break;
1306                 case 3: tmpfunc->Dispatch(LFUN_CHILDINSERT); break;
1307                 case 4: // Insert ASCII file submenu
1308                         break;
1309                 case 5: tmpfunc->Dispatch(LFUN_FILE_INSERT); break;
1310                 case 41: tmpfunc->Dispatch(LFUN_FILE_INSERT_ASCII, "line"); break;
1311                 case 42: tmpfunc->Dispatch(LFUN_FILE_INSERT_ASCII, "paragraph"); break;
1312                 case 43: 
1313                         break;
1314
1315                 case 6: tmpfunc->Dispatch(LFUN_FOOTMELT); break
1316 ;
1317                 case 7: tmpfunc->Dispatch(LFUN_MARGINMELT); break;
1318   
1319                case 8: // Float sub-menu
1320                 case 71:
1321                         tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "figure");
1322                         break;
1323                 case 72:
1324                         tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "table");
1325                         break;
1326                 case 73:
1327                         tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "wide-fig");
1328                         break;
1329                 case 74:
1330                         tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "wide-tab");
1331                         break;
1332                 case 75:
1333                         tmpfunc->Dispatch(LFUN_INSERTFOOTNOTE, "algorithm");
1334                         break;
1335
1336                 case 9: // Table/List submenu
1337                         break;
1338                 case 21: tmpfunc->Dispatch(LFUN_TOC_INSERT); break;
1339                 case 22: tmpfunc->Dispatch(LFUN_LOF_INSERT); break;
1340                 case 23: tmpfunc->Dispatch(LFUN_LOT_INSERT); break;
1341                 case 24: tmpfunc->Dispatch(LFUN_LOA_INSERT); break;
1342                 case 25: tmpfunc->Dispatch(LFUN_INDEX_PRINT); break;
1343                 case 26: tmpfunc->Dispatch(LFUN_INSERT_BIBTEX); break;
1344
1345                 case 10: // Special Character submenu
1346                         break;
1347                 case 31: tmpfunc->Dispatch(LFUN_HFILL); break;
1348                 case 32: tmpfunc->Dispatch(LFUN_HYPHENATION); break;
1349                 case 33: tmpfunc->Dispatch(LFUN_PROTECTEDSPACE); break; 
1350                 case 34: tmpfunc->Dispatch(LFUN_BREAKLINE); break; 
1351                 case 35: tmpfunc->Dispatch(LFUN_LDOTS); break;
1352                 case 36: tmpfunc->Dispatch(LFUN_END_OF_SENTENCE); break;
1353                 case 37: tmpfunc->Dispatch(LFUN_QUOTE); break;
1354                 case 38: tmpfunc->Dispatch(LFUN_MENU_SEPARATOR); break;
1355
1356                 case 11: tmpfunc->Dispatch(LFUN_INSERT_NOTE); break;
1357                 case 12: tmpfunc->Dispatch(LFUN_INSERT_LABEL); break;
1358                 case 13: tmpfunc->Dispatch(LFUN_INSERT_REF); break;
1359                 case 14: tmpfunc->Dispatch(LFUN_INSERT_CITATION); break;
1360                 case 15: tmpfunc->Dispatch(LFUN_INDEX_INSERT); break;
1361                 case 16: tmpfunc->Dispatch(LFUN_INDEX_INSERT_LAST); break;
1362                 case 17: tmpfunc->Dispatch(LFUN_URL); break;
1363                 }
1364         }
1365         fl_freepup(InsertMenu);
1366         fl_freepup(SubInsertAscii);
1367         fl_freepup(SubInsertTableList);
1368         fl_freepup(SubInsertFloatList);
1369         fl_freepup(SubInsertSpecial);
1370 }
1371
1372
1373 void Menus::ShowMathMenu(FL_OBJECT *ob, long)
1374 {
1375         extern void math_insert_symbol(char const* s);
1376
1377         Menus *men = (Menus*) ob->u_ldata;
1378
1379         // set the pseudo menu-button
1380         fl_set_object_boxtype(ob, FL_UP_BOX);
1381         fl_set_button(ob, 0);
1382         fl_redraw_object(ob);
1383
1384         Buffer *tmpbuffer = men->_view->currentBuffer();
1385         LyXFunc *tmpfunc = men->_view->getLyXFunc();
1386
1387         int MathMenu = fl_defpup(FL_ObjWin(ob), 
1388                                  _("Fraction"
1389                                  "|Square root"
1390                                  "|Exponent"
1391                                  "|Index"
1392                                  "|Sum"
1393                                  "|Integral%l"
1394                                  "|Math mode"
1395                                  "|Display%l"
1396                                  "|Math Panel..."));
1397
1398         fl_setpup_shortcut(MathMenu, 1, scex(_("MM|Ff#f#F")));
1399         fl_setpup_shortcut(MathMenu, 2, scex(_("MM|Ss#s#S")));
1400         fl_setpup_shortcut(MathMenu, 3, scex(_("MM|Ee#e#E")));
1401         fl_setpup_shortcut(MathMenu, 4, scex(_("MM|xX#x#X")));
1402         fl_setpup_shortcut(MathMenu, 5, scex(_("MM|uU#u#U")));
1403         fl_setpup_shortcut(MathMenu, 6, scex(_("MM|Ii#i#I")));
1404         fl_setpup_shortcut(MathMenu, 7, scex(_("MM|Mm#m#M")));
1405         fl_setpup_shortcut(MathMenu, 8, scex(_("MM|Dd#d#D")));
1406         fl_setpup_shortcut(MathMenu, 9, scex(_("MM|Pp#p#P")));
1407
1408         if (tmpbuffer->isReadonly()) 
1409                 for (int ii = 1; ii <= 9; ii++)
1410                         fl_setpup_mode(MathMenu, ii, FL_PUP_GREY);
1411
1412
1413         fl_setpup_position(
1414                 men->_view->getForm()->x + ob->x,
1415                 men->_view->getForm()->y + ob->y + ob->h + 10);   
1416         int choice = fl_dopup(MathMenu);  
1417         XFlush(fl_display);
1418
1419         // set the pseudo menu-button back
1420         fl_set_object_boxtype(ob, FL_FLAT_BOX);
1421         fl_redraw_object(ob);
1422
1423         if (men->currentView()->available())  {
1424                 switch (choice) {
1425                 case 1: /* frac */
1426                         tmpfunc->Dispatch(LFUN_INSERT_MATH, "frac");
1427                         break;
1428                 case 2: /* sqrt */
1429                         tmpfunc->Dispatch(LFUN_INSERT_MATH, "sqrt");
1430                         break;
1431                 case 3: /* Exponent */ 
1432                         tmpfunc->Dispatch(LFUN_INSERT_MATH, "^");
1433                         break;
1434                 case 4: /* Index */
1435                         tmpfunc->Dispatch(LFUN_INSERT_MATH, "_");
1436                         break;
1437                 case 5: /* sum */ 
1438                         tmpfunc->Dispatch(LFUN_INSERT_MATH, "sum");
1439                         break;
1440                 case 6: /* int */
1441                         tmpfunc->Dispatch(LFUN_INSERT_MATH, "int");
1442                         break;
1443                 case 7:
1444                         tmpfunc->Dispatch(LFUN_MATH_MODE);
1445                         break;
1446                 case 8:
1447                         tmpfunc->Dispatch(LFUN_MATH_DISPLAY);
1448                         break;
1449                 case 9: /* Panel */
1450                         show_symbols_form(tmpfunc);
1451                         break;
1452                 }
1453                 tmpbuffer->update(0);
1454         } 
1455         fl_freepup(MathMenu);
1456 }
1457
1458
1459 void Menus::ShowOptionsMenu(FL_OBJECT *ob, long)
1460 {
1461         Menus *men = (Menus*) ob->u_ldata;
1462
1463         // set the pseudo menu-button
1464         fl_set_object_boxtype(ob, FL_UP_BOX);
1465         fl_set_button(ob, 0);
1466         fl_redraw_object(ob);
1467
1468         //Buffer *tmpbuffer = men->_view->currentBuffer();
1469         LyXFunc *tmpfunc = men->_view->getLyXFunc();
1470
1471         int OptionsMenu = fl_defpup(FL_ObjWin(ob),
1472                                     _("Screen Fonts..."
1473                                     "|Spellchecker Options..."
1474                                     "|Keyboard..."
1475                                     "|LaTeX...%l"
1476                                     "|Reconfigure" ));
1477
1478         fl_setpup_shortcut(OptionsMenu, 1, scex(_("OM|Ff#f#F")));
1479         fl_setpup_shortcut(OptionsMenu, 2, scex(_("OM|Ss#s#S")));
1480         fl_setpup_shortcut(OptionsMenu, 3, scex(_("OM|Kk#k#K")));
1481         fl_setpup_shortcut(OptionsMenu, 4, scex(_("OM|Ll#l#L")));
1482         fl_setpup_shortcut(OptionsMenu, 5, scex(_("OM|Rr#r#R")));
1483
1484         if(lyxrc->isp_command == "none") 
1485                 fl_setpup_mode(OptionsMenu, 2, FL_PUP_GREY);
1486
1487         fl_setpup_position(
1488                 men->_view->getForm()->x + ob->x,
1489                 men->_view->getForm()->y + ob->y + ob->h + 10);   
1490         int choice = fl_dopup(OptionsMenu);
1491         XFlush(fl_display);
1492
1493         // set the pseudo menu-button back
1494         fl_set_object_boxtype(ob, FL_FLAT_BOX);
1495         fl_redraw_object(ob);
1496         switch (choice){
1497         case 1: men->ScreenOptions(); break;
1498         case 2: SpellCheckerOptions(); break;      
1499         case 3: men->_view->getIntl()->MenuKeymap(); break;
1500         case 4: LaTeXOptions(); break;
1501         case 5: tmpfunc->Dispatch(LFUN_RECONFIGURE); break;
1502         default: break;
1503         }   
1504         fl_freepup(OptionsMenu);
1505 }
1506
1507
1508 void Menus::ShowBufferMenu(FL_OBJECT *ob, long)
1509 {
1510         Menus *men = (Menus*) ob->u_ldata;
1511         
1512         // set the pseudo menu-button
1513         fl_set_object_boxtype(ob, FL_UP_BOX);
1514         fl_set_button(ob, 0);
1515         fl_redraw_object(ob);
1516    
1517         int BufferMenu = fl_newpup(FL_ObjWin(ob));
1518         bufferlist.makePup(BufferMenu);
1519    
1520         fl_setpup_position(
1521                 men->_view->getForm()->x + ob->x,
1522                 men->_view->getForm()->y + ob->y + ob->h + 10);   
1523         int choice = fl_dopup(BufferMenu);
1524         XFlush(fl_display);
1525
1526         // set the pseudo menu-button back
1527         fl_set_object_boxtype(ob, FL_FLAT_BOX);
1528         fl_redraw_object(ob);
1529         if (choice > 0) men->handleBufferMenu(choice);
1530    
1531         fl_freepup(BufferMenu);
1532 }
1533
1534
1535 static
1536 char const *doc_files [] = {"Intro", "Tutorial", 
1537                             "UserGuide", "Extended",
1538                             "Customization", "Reference",
1539                             "BUGS", "LaTeXConfig"}; 
1540
1541 void Menus::ShowHelpMenu(FL_OBJECT *ob, long)
1542 {
1543         Menus *men = (Menus*) ob->u_ldata;
1544
1545         // set the pseudo menu-button
1546         fl_set_object_boxtype(ob, FL_UP_BOX);
1547         fl_set_button(ob, 0);
1548         fl_redraw_object(ob);
1549    
1550         int HelpMenu = fl_defpup(FL_ObjWin(ob),
1551                                  _("Introduction"
1552                                  "|Tutorial"
1553                                  "|User's Guide"
1554                                  "|Extended Features"
1555                                  "|Customization"
1556                                  "|Reference Manual"
1557                                  "|Known Bugs"
1558                                  "|LaTeX Configuration%l"
1559                                  "|Copyright and Warranty..."
1560                                  "|Credits..."
1561                                  "|Version..."));
1562    
1563         fl_setpup_shortcut(HelpMenu,  1, scex(_("HM|Ii#I#i")));
1564         fl_setpup_shortcut(HelpMenu,  2, scex(_("HM|Tt#T#t")));
1565         fl_setpup_shortcut(HelpMenu,  3, scex(_("HM|Uu#U#u")));
1566         fl_setpup_shortcut(HelpMenu,  4, scex(_("HM|xX#x#X")));
1567         fl_setpup_shortcut(HelpMenu,  5, scex(_("HM|Cc#C#c")));
1568         fl_setpup_shortcut(HelpMenu,  6, scex(_("HM|Rr#R#r")));
1569         fl_setpup_shortcut(HelpMenu,  7, scex(_("HM|Kk#K#k")));
1570         fl_setpup_shortcut(HelpMenu,  8, scex(_("HM|Ll#L#l")));
1571         fl_setpup_shortcut(HelpMenu,  9, scex(_("HM|oO#o#O")));
1572         fl_setpup_shortcut(HelpMenu, 10, scex(_("HM|eE#e#E")));
1573         fl_setpup_shortcut(HelpMenu, 11, scex(_("HM|Vv#v#V")));
1574
1575         fl_setpup_position(
1576                 men->_view->getForm()->x + ob->x,
1577                 men->_view->getForm()->y + ob->y + ob->h + 10);   
1578         int choice = fl_dopup(HelpMenu);
1579         XFlush(fl_display);
1580
1581         // set the pseudo menu-button back
1582         fl_set_object_boxtype(ob, FL_FLAT_BOX);
1583         fl_redraw_object(ob);
1584
1585         switch (choice) {
1586         case 1: case 2: case 3: case 4: case 5: 
1587         case 6: case 7: case 8:
1588                 ProhibitInput();
1589                 men->MenuDocu(doc_files[choice - 1]);
1590                 AllowInput();
1591                 break;
1592         case 9: ShowCopyright(); break;
1593         case 10: ShowCredits(); break;
1594         case 11:
1595                 ProhibitInput();
1596                 fl_show_message((LString(_("LyX Version ")) + LYX_VERSION 
1597                                  + _(" of ") + LYX_RELEASE).c_str(),
1598                                 (_("Library directory: ")
1599                                  + MakeDisplayPath(system_lyxdir)).c_str(),
1600                                 (_("User directory: ") 
1601                                  + MakeDisplayPath(user_lyxdir)).c_str());
1602                 AllowInput();
1603                 break;
1604         }
1605         fl_freepup(HelpMenu);
1606 }
1607
1608
1609 void Menus::MenuDocu(LString const &docname) 
1610 {
1611         LString fname = i18nLibFileSearch("doc", docname, "lyx");
1612         _view->getMiniBuffer()->Set(_("Opening help file"),
1613                                     MakeDisplayPath(fname),"...");
1614         currentView()->setBuffer(bufferlist.loadLyXFile(fname,false));
1615
1616         if (docname == "Reference")
1617                 _view->getLyXFunc()->Dispatch(LFUN_TOCVIEW);
1618 }
1619
1620
1621 void Menus::handleBufferMenu(int choice)
1622 {
1623         currentView()->setBuffer(bufferlist.getBuffer(choice));
1624 }