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