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