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