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