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