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