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