]> git.lyx.org Git - features.git/blob - src/lyxfunc.C
use the new sstream return non-pods as const, use string instead of char * in a lot...
[features.git] / src / lyxfunc.C
1 /* This file is part of
2  * ====================================================== 
3  * 
4  *           LyX, The Document Processor
5  *       
6  *          Copyright 1995 Matthias Ettrich
7  *          Copyright 1995-2000 The LyX Team.
8  *
9  * ====================================================== */
10
11 #include <config.h>
12
13 #if 0
14 #ifdef HAVE_SSTREAM
15 #include <sstream>
16 using std::istringstream;
17 #else
18 #include <strstream>
19 #endif
20 #else
21 #include "Lsstream.h"
22 #endif
23
24 #include <time.h>
25 #include <locale.h>
26
27 #include <cstdlib>
28 #include <cctype>
29 #include <cstring>
30
31 #ifdef __GNUG__
32 #pragma implementation
33 #endif
34
35 #include "version.h"
36 #include "lyxlookup.h"
37 #include "kbmap.h"
38 #include "lyxfunc.h"
39 #include "bufferlist.h"
40 #include "ColorHandler.h"
41 #include "lyxserver.h"
42 #include "lyx.h"
43 #include "intl.h"
44 #include "lyx_main.h"
45 #include "lyx_cb.h"
46 #include "LyXAction.h"
47 #include "insets/inseturl.h"
48 #include "insets/insetlatexaccent.h"
49 #include "insets/insettoc.h"
50 #include "insets/insetref.h"
51 #include "insets/insetparent.h"
52 #include "insets/insetindex.h"
53 #include "insets/insetinclude.h"
54 #include "insets/insetbib.h"
55 #include "insets/insetcite.h"
56 #include "insets/insettext.h"
57 #include "insets/insetert.h"
58 #include "insets/insetexternal.h"
59 #include "insets/insetgraphics.h"
60 #include "insets/insetfoot.h"
61 #include "insets/insetmarginal.h"
62 #include "insets/insetminipage.h"
63 #include "insets/insetfloat.h"
64 #include "insets/insetlist.h"
65 #include "insets/insettabular.h"
66 #include "insets/insettheorem.h"
67 #include "insets/insetcaption.h"
68 #include "mathed/formulamacro.h"
69 #include "spellchecker.h" // RVDK_PATCH_5
70 #include "minibuffer.h"
71 #include "vspace.h"
72 #include "LyXView.h"
73 #include "filedlg.h"
74 #include "lyx_gui_misc.h"
75 #include "support/filetools.h"
76 #include "support/FileInfo.h"
77 #include "support/syscall.h"
78 #include "support/lstrings.h"
79 #include "support/path.h"
80 #include "debug.h"
81 #include "lyxrc.h"
82 #include "lyxtext.h"
83 #include "gettext.h"
84 #include "trans_mgr.h"
85 #include "ImportLaTeX.h"
86 #include "ImportNoweb.h"
87 #include "layout.h"
88 #include "WorkArea.h"
89 #include "lyxfr1.h"
90 #include "bufferview_funcs.h"
91 #include "frontends/Dialogs.h"
92 #include "frontends/Toolbar.h"
93 #include "frontends/Menubar.h"
94 #include "FloatList.h"
95 #include "exporter.h"
96 #include "FontLoader.h"
97 #include "TextCache.h"
98
99 using std::pair;
100 using std::endl;
101
102 extern bool cursor_follows_scrollbar;
103
104 extern void InsertAsciiFile(BufferView *, string const &, bool);
105 extern void math_insert_symbol(string const &);
106 extern bool math_insert_greek(char);
107 extern BufferList bufferlist;
108 extern LyXServer * lyxserver;
109 extern int greek_kb_flag;
110 extern bool selection_possible;
111
112 extern kb_keymap * toplevel_keymap;
113
114 extern bool MenuWrite(Buffer *);
115 extern bool MenuWriteAs(Buffer *);
116 extern int  MenuRunLaTeX(Buffer *);
117 extern int  MenuBuildProg(Buffer *);
118 extern int  MenuRunChktex(Buffer *);
119 #ifndef NEW_EXPORT
120 extern bool CreatePostscript(Buffer *, bool);
121 #endif
122 extern void MenuPrint(Buffer *);
123 extern void MenuSendto();
124 extern void QuitLyX();
125 extern void MenuFax(Buffer *);
126 #ifndef NEW_EXPORT
127 extern void MenuExport(Buffer *, string const &);
128 #endif
129 extern void show_symbols_form(LyXFunc *);
130
131 extern LyXAction lyxaction;
132 // (alkis)
133 extern tex_accent_struct get_accent(kb_action action);
134
135 extern void AutoSave(BufferView *);
136 #ifndef NEW_EXPORT
137 extern bool PreviewDVI(Buffer *);
138 extern bool PreviewPostscript(Buffer *);
139 #endif
140 extern void MenuInsertLabel(string const &);
141 extern void MenuLayoutCharacter();
142 extern void MenuLayoutParagraph();
143 extern void MenuLayoutDocument();
144 extern void MenuLayoutPaper();
145 extern void MenuLayoutTable(int flag);
146 extern void MenuLayoutQuotes();
147 extern void MenuLayoutPreamble();
148 extern void MenuLayoutSave();
149 extern void bulletForm();
150
151 extern Buffer * NewLyxFile(string const &);
152 extern void LoadLyXFile(string const &);
153 extern void Reconfigure(BufferView *);
154
155 extern LyXTextClass::size_type current_layout;
156 extern int getISOCodeFromLaTeX(char *);
157
158 extern void ShowLatexLog();
159
160 /* === globals =========================================================== */
161
162 bool LyXFunc::show_sc = true;
163
164
165 LyXFunc::LyXFunc(LyXView * o)
166         : owner(o)
167 {
168         meta_fake_bit = 0;
169         lyx_dead_action = LFUN_NOACTION;
170         lyx_calling_dead_action = LFUN_NOACTION;
171         setupLocalKeymap();
172 }
173
174
175 // I changed this func slightly. I commented out the ...FinishUndo(),
176 // this means that all places that used to have a moveCursorUpdate, now
177 // have a ...FinishUndo() as the preceeding statement. I have also added
178 // a moveCursorUpdate to some of the functions that updated the cursor, but
179 // that did not show its new position.
180 inline
181 void LyXFunc::moveCursorUpdate(bool selecting)
182 {
183         if (selecting || owner->view()->text->mark_set) {
184                 owner->view()->text->SetSelection();
185                 owner->view()->toggleToggle();
186         }
187         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
188         owner->view()->showCursor();
189         
190         /* ---> Everytime the cursor is moved, show the current font state. */
191         // should this too me moved out of this func?
192         //owner->showState();
193         owner->view()->setState();
194 }
195
196
197 int LyXFunc::processKeySym(KeySym keysym, unsigned int state) 
198 {
199         string argument;
200         
201         if (lyxerr.debugging(Debug::KEY)) {
202                 char * tmp = XKeysymToString(keysym);
203                 string stm = (tmp ? tmp : "");
204                 lyxerr << "KeySym is "
205                        << stm
206                        << "["
207                        << keysym << "]"
208                        << endl;
209         }
210         // Do nothing if we have nothing (JMarc)
211         if (keysym == NoSymbol) {
212                 lyxerr[Debug::KEY] << "Empty kbd action (probably composing)"
213                                    << endl;
214                 //return 0;
215                 return FL_PREEMPT;
216         }
217         
218         // this function should be used always [asierra060396]
219         UpdatableInset * tli = owner->view()->the_locking_inset;
220         if (owner->view()->available() && tli && (keysym == XK_Escape)) {
221                 if (tli == tli->GetLockingInset()) {
222                         owner->view()->unlockInset(tli);
223                         owner->view()->text->CursorRight(owner->view());
224                         moveCursorUpdate(false);
225                         owner->showState();
226                 } else {
227                         tli->UnlockInsetInInset(owner->view(),
228                                                 tli->GetLockingInset(),true);
229                 }
230                 //return 0;
231                 return FL_PREEMPT;
232         }
233
234         // Can we be sure that this will work for all X-Windows
235         // implementations? (Lgb)
236         // This code snippet makes lyx ignore some keys. Perhaps
237         // all of them should be explictly mentioned?
238         if((keysym >= XK_Shift_L && keysym <= XK_Hyper_R)
239            || keysym == XK_Mode_switch || keysym == 0x0)
240                 return 0;
241
242         // Do a one-deep top-level lookup for
243         // cancel and meta-fake keys. RVDK_PATCH_5
244         cancel_meta_seq.reset();
245
246         int action = cancel_meta_seq.addkey(keysym, state
247                                             &(ShiftMask|ControlMask
248                                               |Mod1Mask)); 
249
250         // When not cancel or meta-fake, do the normal lookup. 
251         // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards.
252         // Mostly, meta_fake_bit = 0. RVDK_PATCH_5.
253         if ( (action != LFUN_CANCEL) && (action != LFUN_META_FAKE) ) {
254
255                 // remove Caps Lock and Mod2 as a modifiers
256                 action = keyseq.addkey(keysym,
257                                        (state | meta_fake_bit)
258                                        &(ShiftMask|ControlMask
259                                          |Mod1Mask));      
260         }
261         // Dont remove this unless you know what you are doing.
262         meta_fake_bit = 0;
263                 
264         if (action == 0) action = LFUN_PREFIX;
265
266         if (lyxerr.debugging(Debug::KEY)) {
267                 string buf;
268                 keyseq.print(buf);
269                 lyxerr << "Key ["
270                        << action << "]["
271                        << buf << "]"
272                        << endl;
273         }
274
275         // already here we know if it any point in going further
276         // why not return already here if action == -1 and
277         // num_bytes == 0? (Lgb)
278
279         if(keyseq.length > 1 || keyseq.length < -1) {
280                 string buf;
281                 keyseq.print(buf);
282                 owner->getMiniBuffer()->Set(buf);
283         }
284
285         if (action == -1) {
286                 if (keyseq.length < -1) { // unknown key sequence...
287                         string buf;
288                         LyXBell();
289                         keyseq.print(buf);
290                         owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf);
291                         return 0;
292                 }
293         
294                 char isochar = keyseq.getiso();
295                 if (!(state & ControlMask) &&
296                     !(state & Mod1Mask) &&
297                     (isochar && keysym < 0xF000)) {
298                         argument += isochar;
299                 }
300                 if (argument.empty()) {
301                         lyxerr.debug() << "Empty argument!" << endl;
302                         // This can`t possibly be of any use
303                         // so we`ll skip the dispatch.
304                         return 0;
305                 }
306         }
307
308         bool tmp_sc = show_sc;
309         show_sc = false;
310         Dispatch(action, argument.c_str());
311         show_sc = tmp_sc;
312         
313         return 0;
314
315
316
317 #if 0
318 int LyXFunc::processKeyEvent(XEvent * ev)
319 {
320         char s_r[10];
321         KeySym keysym_return = 0;
322         string argument;
323         XKeyEvent * keyevent = &ev->xkey;
324         int num_bytes = LyXLookupString(ev, s_r, 10, &keysym_return);
325         s_r[num_bytes] = '\0';
326
327         if (lyxerr.debugging(Debug::KEY)) {
328                 char * tmp = XKeysymToString(keysym_return);
329                 string stm = (tmp ? tmp : "");
330                 lyxerr << "KeySym is "
331                        << stm
332                        << "["
333                        << keysym_return << "]"
334                        << " and num_bytes is "
335                        << num_bytes
336                        << " the string returned is \""
337                        << s_r << '\"'
338                        << endl;
339         }
340         // Do nothing if we have nothing (JMarc)
341         if (num_bytes == 0 && keysym_return == NoSymbol) {
342                 lyxerr[Debug::KEY] << "Empty kbd action (probably composing)"
343                                    << endl;
344                 return 0;
345         }
346         
347         // this function should be used always [asierra060396]
348         UpdatableInset * tli = owner->view()->the_locking_inset;
349         if (owner->view()->available() && tli && (keysym_return==XK_Escape)) {
350                 if (tli == tli->GetLockingInset()) {
351                         owner->view()->unlockInset(tli);
352                         owner->view()->text->CursorRight(owner->view());
353                         moveCursorUpdate(false);
354                         owner->showState();
355                 } else {
356                         tli->UnlockInsetInInset(owner->view(),
357                                                 tli->GetLockingInset(),true);
358                 }
359                 return 0;
360         }
361
362         // Can we be sure that this will work for all X-Windows
363         // implementations? (Lgb)
364         // This code snippet makes lyx ignore some keys. Perhaps
365         // all of them should be explictly mentioned?
366         if((keysym_return >= XK_Shift_L && keysym_return <= XK_Hyper_R)
367            || keysym_return == XK_Mode_switch || keysym_return == 0x0)
368                 return 0;
369
370         // Do a one-deep top-level lookup for
371         // cancel and meta-fake keys. RVDK_PATCH_5
372         cancel_meta_seq.reset();
373
374         int action = cancel_meta_seq.addkey(keysym_return, keyevent->state
375                                             &(ShiftMask|ControlMask
376                                               |Mod1Mask)); 
377
378         // When not cancel or meta-fake, do the normal lookup. 
379         // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards.
380         // Mostly, meta_fake_bit = 0. RVDK_PATCH_5.
381         if ( (action != LFUN_CANCEL) && (action != LFUN_META_FAKE) ) {
382
383                 // remove Caps Lock and Mod2 as a modifiers
384                 action = keyseq.addkey(keysym_return,
385                                        (keyevent->state | meta_fake_bit)
386                                        &(ShiftMask|ControlMask
387                                          |Mod1Mask));      
388         }
389         // Dont remove this unless you know what you are doing.
390         meta_fake_bit = 0;
391                 
392         if (action == 0) action = LFUN_PREFIX;
393
394         if (lyxerr.debugging(Debug::KEY)) {
395                 string buf;
396                 keyseq.print(buf);
397                 lyxerr << "Key ["
398                        << action << "]["
399                        << buf << "]"
400                        << "["
401                        << num_bytes << "]"
402                        << endl;
403         }
404
405         // already here we know if it any point in going further
406         // why not return already here if action == -1 and
407         // num_bytes == 0? (Lgb)
408
409         if(keyseq.length > 1 || keyseq.length < -1) {
410                 string buf;
411                 keyseq.print(buf);
412                 owner->getMiniBuffer()->Set(buf);
413         }
414
415         if (action == -1) {
416                 if (keyseq.length < -1) { // unknown key sequence...
417                         string buf;
418                         LyXBell();
419                         keyseq.print(buf);
420                         owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf);
421                         return 0;
422                 }
423         
424                 char isochar = keyseq.getiso();
425                 if (!(keyevent->state&ControlMask) &&
426                     !(keyevent->state&Mod1Mask) &&
427                     (isochar && keysym_return < 0xF000)) {
428                         argument += isochar;
429                 }
430                 if (argument.empty()) {
431                         lyxerr.debug() << "Empty argument!" << endl;
432                         // This can`t possibly be of any use
433                         // so we`ll skip the dispatch.
434                         return 0;
435                 }
436         }
437         else
438                 if (action == LFUN_SELFINSERT) {
439                         argument = s_r[0];
440                 }
441
442         bool tmp_sc = show_sc;
443         show_sc = false;
444         Dispatch(action, argument.c_str());
445         show_sc = tmp_sc;
446         
447         return 0;
448
449 #endif
450
451
452 LyXFunc::func_status LyXFunc::getStatus(int ac) const
453 {
454         kb_action action;
455         func_status flag = LyXFunc::OK;
456         string argument;
457         Buffer * buf = owner->buffer();
458         
459         if (lyxaction.isPseudoAction(ac)) 
460                 action = lyxaction.retrieveActionArg(ac, argument);
461         else
462                 action = static_cast<kb_action>(ac);
463         
464         if (action == LFUN_UNKNOWN_ACTION) {
465                 setErrorMessage(N_("Unknown action"));
466                 return LyXFunc::Unknown;
467         }
468         
469         // Check whether we need a buffer
470         if (!lyxaction.funcHasFlag(action, LyXAction::NoBuffer)) {
471                 // Yes we need a buffer, do we have one?
472                 if (buf) {
473                         // yes
474                         // Can we use a readonly buffer?
475                         if (buf->isReadonly() && 
476                             !lyxaction.funcHasFlag(action,
477                                                    LyXAction::ReadOnly)) {
478                                 // no
479                                 setErrorMessage(N_("Document is read-only"));
480                                 flag |= LyXFunc::Disabled;
481                         }
482                 } else {
483                         // no
484                         setErrorMessage(N_("Command not allowed with"
485                                            "out any document open"));
486                         flag |= LyXFunc::Disabled;
487                         return flag;
488                 }
489         }
490
491         // I would really like to avoid having this switch and rather try to
492         // encode this in the function itself.
493         static bool noLaTeX = lyxrc.latex_command == "none";
494         bool disable = false;
495         switch (action) {
496 #ifndef NEW_EXPORT
497         case LFUN_PREVIEW:
498                 disable = noLaTeX || lyxrc.view_dvi_command == "none";
499                 break;
500         case LFUN_PREVIEWPS:
501                 disable = noLaTeX || lyxrc.view_ps_command == "none";
502                 break;
503         case LFUN_RUNLATEX:
504         case LFUN_RUNDVIPS:
505                 disable = noLaTeX;
506                 break;
507 #endif
508         case LFUN_MENUPRINT:
509                 disable = noLaTeX || lyxrc.print_command == "none";
510                 break;
511         case LFUN_FAX:
512                 disable = noLaTeX || lyxrc.fax_command == "none";
513                 break;
514         case LFUN_IMPORT:
515                 if (argument == "latex" || argument == "noweb")
516                         disable = lyxrc.relyx_command == "none";
517                 else if (argument == "linuxdoc")
518                         disable = lyxrc.linuxdoc_to_lyx_command == "none";
519                 break;
520 #ifndef NEW_EXPORT
521         case LFUN_EXPORT:
522                 if (argument == "latex")
523                         disable = (! buf->isLatex() && ! buf->isLiterate()) ;
524                 else if (argument == "linuxdoc")
525                         disable = ! buf->isLinuxDoc();
526                 else if (argument == "docbook")
527                         disable = ! buf->isDocBook();
528                 else if (argument == "dvi" || argument == "postscript")
529                         disable = noLaTeX;
530                 else if (argument == "html")
531                         disable = (buf->isLinuxDoc() 
532                                    && lyxrc.linuxdoc_to_html_command == "none")
533                                 || (buf->isDocBook() 
534                                     && lyxrc.docbook_to_html_command == "none")
535                                 || (! buf->isLinuxDoc() && ! buf->isDocBook() 
536                                     && lyxrc.html_command == "none");
537                 else if (argument == "custom")
538                         disable = (! buf->isLatex() && ! buf->isLiterate());
539                 break;
540 #endif
541         case LFUN_UNDO:
542                 disable = buf->undostack.empty();
543                 break;
544         case LFUN_REDO:
545                 disable = buf->redostack.empty();
546                 break;
547         case LFUN_SPELLCHECK:
548                 disable = lyxrc.isp_command == "none";
549                 break;
550         case LFUN_RUNCHKTEX:
551                 disable = lyxrc.chktex_command == "none";
552                 break;
553         case LFUN_BUILDPROG:
554                 disable = (lyxrc.literate_command == "none" 
555                            || ! buf->isLiterate());
556                 break;
557
558 #ifndef NEW_TABULAR
559         case LFUN_LAYOUT_TABLE:
560                 disable = ! owner->view()->text->cursor.par()->table;
561                 break;
562 #endif
563         case LFUN_LAYOUT_TABULAR:
564                 disable = true;
565                 if (owner->view()->the_locking_inset) {
566                         disable = (owner->view()->the_locking_inset->LyxCode() != Inset::TABULAR_CODE) &&
567                                 !owner->view()->the_locking_inset->GetFirstLockingInsetOfType(Inset::TABULAR_CODE);
568                 }
569                 break;
570
571         case LFUN_TABULAR_FEATURE:
572                 disable = true;
573                 if (owner->view()->the_locking_inset) {
574                         func_status ret = LyXFunc::Disabled;
575                         if (owner->view()->the_locking_inset->LyxCode() == Inset::TABULAR_CODE) {
576                                 ret = static_cast<InsetTabular *>
577                                         (owner->view()->the_locking_inset)->
578                                         getStatus(argument);
579                         } else if (owner->view()->the_locking_inset->GetFirstLockingInsetOfType(Inset::TABULAR_CODE)) {
580                                 ret = static_cast<InsetTabular *>
581                                         (owner->view()->the_locking_inset->
582                                         GetFirstLockingInsetOfType(Inset::TABULAR_CODE))->
583                                         getStatus(argument);
584                         }
585                         flag |= ret;
586                         disable = false;
587                 } else {
588                     static InsetTabular inset(owner->buffer(), 1, 1);
589                     func_status ret;
590
591                     disable = true;
592                     ret = inset.getStatus(argument);
593                     if ((ret & LyXFunc::ToggleOn) ||
594                         (ret & LyXFunc::ToggleOff))
595                         flag |= LyXFunc::ToggleOff;
596                 }
597                 break;
598
599         case LFUN_VC_REGISTER:
600                 disable = buf->lyxvc.inUse();
601                 break;
602         case LFUN_VC_CHECKIN:
603                 disable = !buf->lyxvc.inUse() || buf->isReadonly();
604                 break;
605         case LFUN_VC_CHECKOUT:
606                 disable = !buf->lyxvc.inUse() || !buf->isReadonly();
607                 break;
608         case LFUN_VC_REVERT:
609         case LFUN_VC_UNDO:
610         case LFUN_VC_HISTORY:
611                 disable = !buf->lyxvc.inUse();
612                 break;
613         case LFUN_REF_BACK:
614                 disable = owner->view()->NoSavedPositions();
615                 break;
616         default:
617                 break;
618         }
619         if (disable)
620                 flag |= LyXFunc::Disabled;
621
622         if (buf) {
623                 func_status box = LyXFunc::ToggleOff;
624                 LyXFont font;
625                 if (owner->view()->the_locking_inset &&
626                     owner->view()->the_locking_inset->getLyXText(owner->view()))
627                     font = owner->view()->the_locking_inset->
628                         getLyXText(owner->view())->real_current_font;
629                 else
630                     font = owner->view()->text->real_current_font;
631                 switch (action) {
632                 case LFUN_EMPH:
633                         if (font.emph() == LyXFont::ON)
634                                 box = LyXFunc::ToggleOn;
635                         break;
636                 case LFUN_NOUN:
637                         if (font.noun() == LyXFont::ON)
638                                 box = LyXFunc::ToggleOn;
639                         break;
640                 case LFUN_BOLD:
641                         if (font.series() == LyXFont::BOLD_SERIES)
642                                 box = LyXFunc::ToggleOn;
643                         break;
644                 case LFUN_TEX:
645                         if (font.latex() == LyXFont::ON)
646                                 box = LyXFunc::ToggleOn;
647                         break;
648                 default:
649                         box = LyXFunc::OK;
650                         break;
651                 }
652                 flag |= box;
653         }
654
655         return flag;
656 }
657
658
659 string const LyXFunc::Dispatch(string const & s) 
660 {
661         // Split command string into command and argument
662         string cmd, line = frontStrip(s);
663         string arg = strip(frontStrip(split(line, cmd, ' ')));
664
665         return Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str());
666 }
667
668
669 string const LyXFunc::Dispatch(int ac,
670                          string const & do_not_use_this_arg)
671 {
672         string argument;
673         kb_action action;
674         
675         // we have not done anything wrong yet.
676         errorstat = false;
677         dispatch_buffer.erase();
678         
679         // if action is a pseudo-action, we need the real action
680         if (lyxaction.isPseudoAction(ac)) {
681                 string tmparg;
682                 action = static_cast<kb_action>
683                         (lyxaction.retrieveActionArg(ac, tmparg));
684                 if (!tmparg.empty())
685                         argument = tmparg;
686         } else {
687                 action = static_cast<kb_action>(ac);
688                 if (!do_not_use_this_arg.empty())
689                         argument = do_not_use_this_arg; // except here
690         }
691     
692         selection_possible = false;
693         
694         if (owner->view()->available())
695                 owner->view()->hideCursor();
696
697         // We cannot use this function here
698         if (getStatus(ac) & Disabled)
699                 goto exit_with_message;
700
701         commandshortcut.erase();
702         
703         if (lyxrc.display_shortcuts && show_sc) {
704                 if (action != LFUN_SELFINSERT) {
705                         // Put name of command and list of shortcuts
706                         // for it in minibuffer
707                         string comname = lyxaction.getActionName(action);
708
709                         int pseudoaction = action;
710                         bool argsadded = false;
711
712                         if (!argument.empty()) {
713                                 // If we have the command with argument, 
714                                 // this is better
715                                 pseudoaction = 
716                                         lyxaction.searchActionArg(action,
717                                                                   argument.c_str());
718
719                                 if (pseudoaction == -1) {
720                                         pseudoaction = action;
721                                 } else {
722                                         comname += " " + argument;
723                                         argsadded = true;
724                                 }
725                         }
726
727                         string shortcuts = toplevel_keymap->findbinding(pseudoaction);
728
729                         if (!shortcuts.empty()) {
730                                 comname += ": " + shortcuts;
731                         } else if (!argsadded) {
732                                 comname += " " + argument;
733                         }
734
735                         if (!comname.empty()) {
736                                 comname = strip(comname);
737                                 commandshortcut = "(" + comname + ')';
738                                 owner->getMiniBuffer()->Set(commandshortcut);
739                                 // Here we could even add a small pause,
740                                 // to annoy the user and make him learn
741                                 // the shortcuts.
742                                 // No! That will just annoy, not teach
743                                 // anything. The user will read the messages
744                                 // if they are interested. (Asger)
745                         }
746                 }
747         }
748
749         // If in math mode pass the control to
750         // the math inset [asierra060396]
751         if (owner->view()->available() &&
752             owner->view()->the_locking_inset) {
753                 UpdatableInset::RESULT result;
754                 if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) &&
755                                      (keyseq.length >= -1)))
756                 {
757                         if ((action==LFUN_UNKNOWN_ACTION) && argument.empty()){
758                                 argument = keyseq.getiso();
759                         }
760                         // Undo/Redo pre 0.13 is a bit tricky for insets.
761                         if (action == LFUN_UNDO) {
762                                 int slx, sly;
763                                 UpdatableInset * inset = 
764                                         owner->view()->the_locking_inset;
765                                 inset->GetCursorPos(owner->view(), slx, sly);
766                                 owner->view()->unlockInset(inset);
767                                 owner->view()->menuUndo();
768                                 if (owner->view()->text->cursor.par()->
769                                     IsInset(owner->view()->text->cursor.pos())) {
770                                         inset = static_cast<UpdatableInset*>(
771                                                 owner->view()->text->cursor.par()->
772                                                 GetInset(owner->view()->text->
773                                                          cursor.pos()));
774                                 } else {
775                                         inset = 0;
776                                 }
777                                 if (inset)
778                                         inset->Edit(owner->view(),slx,sly,0);
779                                 return string();
780                         } else if (action == LFUN_REDO) {
781                                 int slx, sly;
782                                 UpdatableInset * inset = owner->view()->
783                                         the_locking_inset;
784                                 inset->GetCursorPos(owner->view(), slx, sly);
785                                 owner->view()->unlockInset(inset);
786                                 owner->view()->menuRedo();
787                                 inset = static_cast<UpdatableInset*>(
788                                         owner->view()->text->cursor.par()->
789                                         GetInset(owner->view()->text->
790                                                  cursor.pos()));
791                                 if (inset)
792                                         inset->Edit(owner->view(),slx,sly,0); 
793                                 return string();
794                         } else if (((result=owner->view()->the_locking_inset->
795                                    LocalDispatch(owner->view(), action,
796                                                  argument)) ==
797                                    UpdatableInset::DISPATCHED) ||
798                                    (result == UpdatableInset::DISPATCHED_NOUPDATE))
799                                 return string();
800                         else {
801                                 setMessage(N_("Text mode"));
802                                 switch(action) {
803                                 case LFUN_UNKNOWN_ACTION:
804                                 case LFUN_BREAKPARAGRAPH:
805                                 case LFUN_BREAKLINE:
806                                         owner->view()->text->CursorRight(owner->view());
807                                         owner->view()->setState();
808                                         owner->showState();
809                                         break;
810                                 case LFUN_RIGHT:
811                                         if (!owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
812                                                 owner->view()->text->CursorRight(owner->view());
813                                                 moveCursorUpdate(false);
814                                                 owner->showState();
815                                         }
816                                         return string();
817                                 case LFUN_LEFT: 
818                                         if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
819                                                 owner->view()->text->CursorRight(owner->view());
820                                                 moveCursorUpdate(false);
821                                                 owner->showState();
822                                         }
823                                         return string();
824                                 case LFUN_DOWN:
825                                         owner->view()->text->CursorDown(owner->view());
826                                         moveCursorUpdate(false);
827                                         owner->showState();
828                                         return string();
829                                 default:
830                                         break;
831                                 }
832                         }
833                 }
834         }
835
836         switch(action) {
837                 // --- Misc -------------------------------------------
838         case LFUN_WORDFINDFORWARD  : 
839         case LFUN_WORDFINDBACKWARD : {
840                 static string last_search;
841                 string searched_string;
842             
843                 if (!argument.empty()) {
844                         last_search = argument;
845                         searched_string = argument;
846                 } else {
847                         searched_string = last_search;
848                 }
849
850                 LyXText * ltCur = owner->view()->text ;
851
852                 if (!searched_string.empty() &&
853                     ((action == LFUN_WORDFINDBACKWARD) ? 
854                      ltCur->SearchBackward(owner->view(), searched_string.c_str()) :
855                      ltCur->SearchForward(owner->view(), searched_string.c_str()))) {
856
857                         // ??? What is that ???
858                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
859
860                         // ??? Needed ???
861                         // clear the selection (if there is any) 
862                         owner->view()->toggleSelection();
863                         owner->view()->text->ClearSelection();
864
865                         // Move cursor so that successive C-s 's will not stand in place. 
866                         if( action == LFUN_WORDFINDFORWARD ) 
867                                 owner->view()->text->CursorRightOneWord(owner->view());
868                         owner->view()->text->FinishUndo();
869                         moveCursorUpdate(false);
870
871                         // ??? Needed ???
872                         // set the new selection 
873                         // SetSelectionOverLenChars(owner->view()->currentBuffer()->text, iLenSelected);
874                         owner->view()->toggleSelection(false);
875                 } else 
876                         LyXBell();      
877          
878                 // REMOVED : if (owner->view()->getWorkArea()->focus)
879                 owner->view()->showCursor();
880         }
881         break;
882
883         case LFUN_PREFIX:
884         {
885                 if (owner->view()->available()) {
886                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
887                 }
888                 string buf;
889                 keyseq.print(buf, true);
890                 owner->getMiniBuffer()->Set(buf, string(), string(), 1);
891         }
892         break;
893
894         // --- Misc -------------------------------------------
895         case LFUN_EXEC_COMMAND:
896                 owner->getMiniBuffer()->ExecCommand(); 
897                 break;
898                 
899         case LFUN_CANCEL:                   // RVDK_PATCH_5
900                 keyseq.reset();
901                 meta_fake_bit = 0;
902                 if(owner->view()->available())
903                         // cancel any selection
904                         Dispatch(LFUN_MARK_OFF, 0);
905                 setMessage(N_("Cancel"));
906                 break;
907
908         case LFUN_META_FAKE:                                 // RVDK_PATCH_5
909         {
910                 meta_fake_bit = Mod1Mask;
911                 string buf;
912                 keyseq.print(buf, true);
913                 string res = string("M-") + buf;
914                 setMessage(buf); // RVDK_PATCH_5
915         }
916         break;  
917
918         case LFUN_READ_ONLY_TOGGLE:
919                 if (owner->buffer()->lyxvc.inUse()) {
920                         owner->buffer()->lyxvc.toggleReadOnly();
921                 } else {
922                         owner->buffer()->setReadonly(
923                                 !owner->buffer()->isReadonly());
924                 }
925                 break;
926                 
927         case LFUN_CENTER: // this is center and redraw.
928                 owner->view()->center();
929                 break;
930                 
931         case LFUN_APPENDIX:
932                 if (owner->view()->available()) {
933                         owner->view()->text->toggleAppendix(owner->view());
934                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
935                 }
936                 break;
937
938                 // --- Menus -----------------------------------------------
939         case LFUN_MENUNEW:
940                 MenuNew(false);
941                 break;
942                 
943         case LFUN_MENUNEWTMPLT:
944                 MenuNew(true);
945                 break;
946                 
947         case LFUN_MENUOPEN:
948                 MenuOpen();
949                 break;
950                 
951         case LFUN_CLOSEBUFFER:
952                 CloseBuffer();
953                 break;
954                 
955         case LFUN_MENUWRITE:
956                 if (!owner->buffer()->isUnnamed()) {
957                         owner->getMiniBuffer()->Set(_("Saving document"),
958                                                     MakeDisplayPath(owner->buffer()->fileName()),
959                                                     "...");
960                         MenuWrite(owner->buffer());
961                         //owner->getMiniBuffer()-> {
962                         //      Set(_("Document saved as"),
963                         //          MakeDisplayPath(owner->buffer()->fileName()));
964                         //} else {
965                         //owner->getMiniBuffer()->Set(_("Save failed!"));
966                         //}
967                 } else {
968                         MenuWriteAs(owner->buffer());
969                 }
970                 break;
971                 
972         case LFUN_MENUWRITEAS:
973                 MenuWriteAs(owner->buffer());
974                 break;
975                 
976         case LFUN_MENURELOAD:
977                 reloadBuffer();
978                 break;
979                 
980 #ifdef NEW_EXPORT
981         case LFUN_UPDATE:
982                 Exporter::Export(owner->buffer(), argument, true);
983                 break;
984
985         case LFUN_PREVIEW:
986                 Exporter::Preview(owner->buffer(), argument);
987                 break;
988 #else
989         case LFUN_PREVIEW:
990                 PreviewDVI(owner->buffer());
991                 break;
992                         
993         case LFUN_PREVIEWPS:
994                 PreviewPostscript(owner->buffer());
995                 break;
996                 
997         case LFUN_RUNLATEX:
998                 MenuRunLaTeX(owner->buffer());
999                 break;
1000
1001         case LFUN_RUNDVIPS:
1002                 CreatePostscript(owner->buffer(), false);
1003                 break;
1004 #endif
1005                 
1006         case LFUN_BUILDPROG:
1007                 MenuBuildProg(owner->buffer());
1008                 break;
1009                 
1010         case LFUN_RUNCHKTEX:
1011                 MenuRunChktex(owner->buffer());
1012                 break;
1013                                 
1014         case LFUN_MENUPRINT:
1015                 owner->getDialogs()->showPrint();
1016                 break;
1017
1018         case LFUN_FAX:
1019                 MenuFax(owner->buffer());
1020                 break;
1021                         
1022         case LFUN_EXPORT:
1023 #ifdef NEW_EXPORT
1024                 Exporter::Export(owner->buffer(), argument, false);
1025 #else
1026                 MenuExport(owner->buffer(), argument);
1027 #endif
1028                 break;
1029
1030         case LFUN_IMPORT:
1031                 doImport(argument);
1032                 break;
1033                 
1034         case LFUN_QUIT:
1035                 QuitLyX();
1036                 break;
1037                 
1038         case LFUN_TOCVIEW:
1039         case LFUN_LOFVIEW:
1040         case LFUN_LOTVIEW:
1041         case LFUN_LOAVIEW:
1042         {
1043                 InsetCommandParams p;
1044                 
1045                 if( action == LFUN_TOCVIEW )
1046                         p.setCmdName( "tableofcontents" );
1047                 else if( action == LFUN_LOAVIEW )
1048                         p.setCmdName( "listofalgorithms" );
1049                 else if( action == LFUN_LOFVIEW )
1050                         p.setCmdName( "listoffigures" );
1051                 else
1052                         p.setCmdName( "listoftables" );
1053
1054                 owner->getDialogs()->createTOC( p.getAsString() );
1055                 break;
1056         }       
1057
1058         case LFUN_TOC_INSERT:
1059         case LFUN_LOA_INSERT:
1060         case LFUN_LOF_INSERT:
1061         case LFUN_LOT_INSERT:
1062         {
1063                 InsetCommandParams p;
1064                 
1065                 if( action == LFUN_TOC_INSERT )
1066                         p.setCmdName( "tableofcontents" );
1067                 else if( action == LFUN_LOA_INSERT )
1068                         p.setCmdName( "listofalgorithms" );
1069                 else if( action == LFUN_LOF_INSERT )
1070                         p.setCmdName( "listoffigures" );
1071                 else
1072                         p.setCmdName( "listoftables" );
1073
1074                 Inset * inset = new InsetTOC( p );
1075                 if( !owner->view()->insertInset( inset, "Standard", true ) )
1076                         delete inset;
1077                 break;
1078         }
1079                 
1080         case LFUN_DIALOG_TABULAR_INSERT:
1081 #ifndef NEW_TABULAR
1082                 Table();
1083 #else
1084                 owner->getDialogs()->showTabularCreate();
1085 #endif
1086                 break;
1087                 
1088         case LFUN_TABULAR_FEATURE:
1089         case LFUN_SCROLL_INSET:
1090                 // this is not handled here as this funktion is only aktive
1091                 // if we have a locking_inset and that one is (or contains)
1092                 // a tabular-inset
1093                 break;
1094
1095         case LFUN_FIGURE:
1096                 Figure();
1097                 break;
1098
1099         case LFUN_INSET_GRAPHICS:
1100         {
1101                 Inset * new_inset = new InsetGraphics;
1102                 if (!owner->view()->insertInset(new_inset)) {
1103                         delete new_inset;
1104                 } else {
1105                         // this is need because you don't use a inset->Edit()
1106                         owner->view()->updateInset(new_inset, true);
1107                         new_inset->Edit(owner->view(), 0, 0, 0);
1108                 }
1109                 break;
1110         }
1111         
1112         case LFUN_AUTOSAVE:
1113                 AutoSave(owner->view());
1114                 break;
1115                 
1116         case LFUN_UNDO:
1117                 owner->view()->menuUndo();
1118                 break;
1119                 
1120         case LFUN_REDO:
1121                 owner->view()->menuRedo();
1122                 break;
1123                 
1124         case LFUN_MENUSEARCH:
1125         {
1126                 // Ok this is one _very_ bad solution, but I think that some
1127                 // of this will be rewritten as part of GUI indep anyway.
1128                 // Lgb
1129                 static LyXFindReplace FR_;
1130                 FR_.StartSearch(owner->view());
1131         }
1132         break;
1133                 
1134         case LFUN_PASTE:
1135                 owner->view()->paste();
1136                 owner->view()->setState();
1137                 break;
1138                 
1139         case LFUN_PASTESELECTION:
1140         {
1141                 bool asPara = false;
1142                 if (argument == "paragraph") asPara = true;
1143                 owner->view()->pasteClipboard(asPara);
1144         }
1145         break;
1146         
1147         case LFUN_CUT:
1148                 owner->view()->cut();
1149                 break;
1150                 
1151         case LFUN_COPY:
1152                 owner->view()->copy();
1153                 break;
1154                 
1155         case LFUN_LAYOUT_COPY:
1156                 owner->view()->copyEnvironment();
1157                 break;
1158                 
1159         case LFUN_LAYOUT_PASTE:
1160                 owner->view()->pasteEnvironment();
1161                 owner->view()->setState();
1162                 break;
1163                 
1164         case LFUN_GOTOERROR:
1165                 owner->view()->gotoError();
1166                 break;
1167                 
1168         case LFUN_REMOVEERRORS:
1169                 if (owner->view()->removeAutoInsets()) {
1170                         owner->view()->redraw();
1171                         owner->view()->fitCursor();
1172                         //owner->view()->updateScrollbar();
1173                 }
1174                 break;
1175                 
1176         case LFUN_GOTONOTE:
1177                 owner->view()->gotoNote();
1178                 break;
1179
1180 #ifndef NEW_INSETS
1181         case LFUN_OPENSTUFF:
1182                 owner->view()->openStuff();
1183                 break;
1184 #endif
1185                 
1186         case LFUN_HYPHENATION:
1187                 owner->view()->hyphenationPoint();
1188                 break;
1189                 
1190         case LFUN_LDOTS:
1191                 owner->view()->ldots();
1192                 break;
1193                 
1194         case LFUN_END_OF_SENTENCE:
1195                 owner->view()->endOfSentenceDot();
1196                 break;
1197
1198         case LFUN_MENU_SEPARATOR:
1199                 owner->view()->menuSeparator();
1200                 break;
1201                 
1202         case LFUN_HFILL:
1203                 owner->view()->hfill();
1204                 break;
1205                 
1206         case LFUN_DEPTH:
1207                 changeDepth(owner->view(), 0);
1208                 break;
1209                 
1210         case LFUN_DEPTH_MIN:
1211                 changeDepth(owner->view(), -1);
1212                 break;
1213                 
1214         case LFUN_DEPTH_PLUS:
1215                 changeDepth(owner->view(), 1);
1216                 break;
1217                 
1218         case LFUN_FREE:
1219                 Free(owner->view());
1220                 owner->view()->setState();
1221                 owner->showState();
1222                 break;
1223                 
1224         case LFUN_TEX:
1225                 Tex(owner->view());
1226                 owner->view()->setState();
1227                 owner->showState();
1228                 break;
1229 #ifndef NEW_INSETS              
1230         case LFUN_MELT:
1231                 Melt(owner->view());
1232                 break;
1233 #endif
1234         case LFUN_RECONFIGURE:
1235                 Reconfigure(owner->view());
1236                 break;
1237 #ifndef NEW_INSETS
1238         case LFUN_FOOTMELT:
1239                 if (owner->view()->available()
1240                     && !owner->view()->text->selection
1241                     && owner->view()->text->cursor.par()->footnoteflag
1242                     != LyXParagraph::NO_FOOTNOTE)
1243                         { // only melt footnotes with FOOTMELT, not margins etc
1244                                 if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::FOOTNOTE)
1245                                         Melt(owner->view());
1246                         }
1247                 else
1248                         Foot(owner->view()); 
1249                 owner->view()->setState();
1250                 break;
1251
1252         case LFUN_MARGINMELT:
1253                 if (owner->view()->available()
1254                     && !owner->view()->text->selection
1255                     && owner->view()->text->cursor.par()->footnoteflag
1256                     != LyXParagraph::NO_FOOTNOTE) {
1257                         // only melt margins
1258                         if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::MARGIN)
1259                                 Melt(owner->view());
1260                 } else
1261                         Margin(owner->view()); 
1262                 owner->view()->setState();
1263                 break;
1264 #endif
1265         case LFUN_HELP_COPYRIGHT:
1266                 owner->getDialogs()->showCopyright();
1267                 break;
1268
1269         case LFUN_HELP_CREDITS:
1270                 owner->getDialogs()->showCredits();
1271                 break;
1272
1273         case LFUN_HELP_OPEN: {
1274                 string arg = argument;
1275                 if (arg.empty()) {
1276                         setErrorMessage(N_("Missing argument"));
1277                         break;
1278                 }
1279                 ProhibitInput(owner->view());
1280                 string fname = i18nLibFileSearch("doc", arg, "lyx");
1281                 if (fname.empty()) {
1282                         lyxerr << "LyX: unable to find documentation file `"
1283                                << arg << "'. Bad installation?" << endl;
1284                         AllowInput(owner->view());
1285                         break;
1286                 }
1287                 owner->getMiniBuffer()->Set(_("Opening help file"),
1288                                             MakeDisplayPath(fname),"...");
1289                 owner->view()->buffer(bufferlist.loadLyXFile(fname,false));
1290                 AllowInput(owner->view());
1291                 break;
1292         }
1293
1294         case LFUN_HELP_VERSION: 
1295                 ProhibitInput(owner->view());
1296                 fl_show_message((string(_("LyX Version ")) + LYX_VERSION 
1297                                  + _(" of ") + LYX_RELEASE).c_str(),
1298                                 (_("Library directory: ")
1299                                  + MakeDisplayPath(system_lyxdir)).c_str(),
1300                                 (_("User directory: ") 
1301                                  + MakeDisplayPath(user_lyxdir)).c_str());
1302                 AllowInput(owner->view());
1303                 break;
1304
1305                 // --- version control -------------------------------
1306         case LFUN_VC_REGISTER:
1307         {
1308                 if (!owner->buffer()->lyxvc.inUse())
1309                         owner->buffer()->lyxvc.registrer();
1310         }
1311         break;
1312                 
1313         case LFUN_VC_CHECKIN:
1314         {
1315                 if (owner->buffer()->lyxvc.inUse()
1316                     && !owner->buffer()->isReadonly())
1317                         owner->buffer()->lyxvc.checkIn();
1318         }
1319         break;
1320                 
1321         case LFUN_VC_CHECKOUT:
1322         {
1323                 if (owner->buffer()->lyxvc.inUse()
1324                     && owner->buffer()->isReadonly())
1325                         owner->buffer()->lyxvc.checkOut();
1326         }
1327         break;
1328         
1329         case LFUN_VC_REVERT:
1330         {
1331                 owner->buffer()->lyxvc.revert();
1332         }
1333         break;
1334                 
1335         case LFUN_VC_UNDO:
1336         {
1337                 owner->buffer()->lyxvc.undoLast();
1338         }
1339         break;
1340                 
1341         case LFUN_VC_HISTORY:
1342         {
1343                 owner->buffer()->lyxvc.showLog();
1344                 break;
1345         }
1346         
1347         // --- buffers ----------------------------------------
1348
1349         case LFUN_SWITCHBUFFER:
1350                 owner->view()->buffer(bufferlist.getBuffer(argument));
1351                 break;
1352
1353
1354         case LFUN_FILE_INSERT:
1355         {
1356                 MenuInsertLyXFile(argument);
1357         }
1358         break;
1359         
1360         case LFUN_FILE_INSERT_ASCII:
1361         {
1362                 bool asPara = (argument == "paragraph");
1363                 InsertAsciiFile(owner->view(), string(), asPara);
1364         }
1365         break;
1366         
1367         case LFUN_FILE_NEW:
1368         {
1369                 // servercmd: argument must be <file>:<template>
1370                 Buffer * tmpbuf = NewLyxFile(argument);
1371                 if (tmpbuf)
1372                         owner->view()->buffer(tmpbuf);
1373         }
1374         break;
1375                         
1376         case LFUN_FILE_OPEN:
1377                 owner->view()->buffer(bufferlist.loadLyXFile(argument));
1378                 break;
1379
1380         case LFUN_LATEX_LOG:
1381                 ShowLatexLog();
1382                 break;
1383                 
1384         case LFUN_LAYOUTNO:
1385         {
1386                 lyxerr.debug() << "LFUN_LAYOUTNO: (arg) " << argument << endl;
1387                 int sel = strToInt(argument);
1388                 lyxerr.debug() << "LFUN_LAYOUTNO: (sel) "<< sel << endl;
1389                 
1390                 // Should this give a setMessage instead?
1391                 if (sel == 0) 
1392                         return string(); // illegal argument
1393
1394                 --sel; // sel 1..., but layout 0...
1395
1396                 // Pretend we got the name instead.
1397                 Dispatch(int(LFUN_LAYOUT), 
1398                          textclasslist.NameOfLayout(owner->view()
1399                                                     ->buffer()->params.textclass,
1400                                                     sel).c_str());
1401                 return string();
1402         }
1403                 
1404         case LFUN_LAYOUT:
1405         {
1406                 lyxerr.debug() << "LFUN_LAYOUT: (arg) "
1407                                << argument << endl;
1408                 
1409                 // Derive layout number from given argument (string)
1410                 // and current buffer's textclass (number). */    
1411                 LyXTextClassList::ClassList::size_type tclass =
1412                         owner->view()->buffer()->params.textclass;
1413                 pair <bool, LyXTextClass::size_type> layout = 
1414                         textclasslist.NumberOfLayout(tclass, argument);
1415
1416                 // If the entry is obsolete, use the new one instead.
1417                 if (layout.first) {
1418                         string obs = textclasslist.Style(tclass,layout.second)
1419                               .obsoleted_by();
1420                         if (!obs.empty()) 
1421                                 layout = 
1422                                   textclasslist.NumberOfLayout(tclass, obs);
1423                 }
1424
1425                 // see if we found the layout number:
1426                 if (!layout.first) {
1427                         setErrorMessage(string(N_("Layout ")) + argument + 
1428                                         N_(" not known"));
1429                         break;
1430                 }
1431
1432                 if (current_layout != layout.second) {
1433                         owner->view()->hideCursor();
1434                         current_layout = layout.second;
1435                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1436                         owner->view()->text->
1437                                 SetLayout(owner->view(), layout.second);
1438                         owner->setLayout(layout.second);
1439                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1440                         owner->view()->setState();
1441                 }
1442         }
1443         break;
1444
1445         case LFUN_LAYOUT_DOCUMENT:
1446 #ifdef USE_OLD_DOCUMENT_LAYOUT
1447                 MenuLayoutDocument();
1448 #else
1449                 owner->getDialogs()->showLayoutDocument();
1450 #endif
1451                 break;
1452                 
1453         case LFUN_LAYOUT_PARAGRAPH:
1454                 MenuLayoutParagraph();
1455                 break;
1456                 
1457         case LFUN_LAYOUT_CHARACTER:
1458                 MenuLayoutCharacter();
1459                 break;
1460                 
1461         case LFUN_LAYOUT_TABLE:
1462         {
1463                 int flag = 0;
1464                 if (argument == "true") flag = 1;
1465                 MenuLayoutTable(flag);
1466         }
1467         break;
1468                 
1469         case LFUN_LAYOUT_TABULAR:
1470             if (owner->view()->the_locking_inset) {
1471                 if (owner->view()->the_locking_inset->LyxCode()==Inset::TABULAR_CODE) {
1472                     InsetTabular * inset = static_cast<InsetTabular *>
1473                         (owner->view()->the_locking_inset);
1474                     inset->OpenLayoutDialog(owner->view());
1475                 } else if (owner->view()->the_locking_inset->
1476                            GetFirstLockingInsetOfType(Inset::TABULAR_CODE)!=0) {
1477                     InsetTabular * inset = static_cast<InsetTabular *>(
1478                         owner->view()->the_locking_inset->GetFirstLockingInsetOfType(Inset::TABULAR_CODE));
1479                     inset->OpenLayoutDialog(owner->view());
1480                 }
1481             }
1482             break;
1483
1484         case LFUN_LAYOUT_PAPER:
1485 #ifdef USE_OLD_DOCUMENT_LAYOUT
1486                 MenuLayoutPaper();
1487 #endif
1488                 break;
1489                 
1490         case LFUN_LAYOUT_QUOTES:
1491 #ifdef USE_OLD_DOCUMENT_LAYOUT
1492                 MenuLayoutQuotes();
1493 #endif
1494                 break;
1495                 
1496         case LFUN_LAYOUT_PREAMBLE:
1497                 MenuLayoutPreamble();
1498                 break;
1499                 
1500         case LFUN_LAYOUT_SAVE_DEFAULT:
1501                 MenuLayoutSave();
1502                 break;
1503                 
1504         case LFUN_DROP_LAYOUTS_CHOICE:
1505                 owner->getToolbar()->openLayoutList();
1506                 break;
1507
1508         case LFUN_LANGUAGE:
1509                 Lang(owner->view(), argument);
1510                 owner->view()->setState();
1511                 owner->showState();
1512                 break;
1513
1514         case LFUN_EMPH:
1515                 Emph(owner->view());
1516                 owner->showState();
1517                 break;
1518
1519         case LFUN_BOLD:
1520                 Bold(owner->view());
1521                 owner->showState();
1522                 break;
1523                 
1524         case LFUN_NOUN:
1525                 Noun(owner->view());
1526                 owner->showState();
1527                 break;
1528                 
1529         case LFUN_CODE:
1530                 Code(owner->view());
1531                 owner->showState();
1532                 break;
1533                 
1534         case LFUN_SANS:
1535                 Sans(owner->view());
1536                 owner->showState();
1537                 break;
1538                 
1539         case LFUN_ROMAN:
1540                 Roman(owner->view());
1541                 owner->showState();
1542                 break;
1543                 
1544         case LFUN_DEFAULT:
1545                 StyleReset(owner->view());
1546                 owner->showState();
1547                 break;
1548                 
1549         case LFUN_UNDERLINE:
1550                 Underline(owner->view());
1551                 owner->showState();
1552                 break;
1553                 
1554         case LFUN_FONT_SIZE:
1555                 FontSize(owner->view(), argument);
1556                 owner->showState();
1557                 break;
1558                 
1559         case LFUN_FONT_STATE:
1560                 setMessage(CurrentState(owner->view()));
1561                 break;
1562                 
1563         case LFUN_UPCASE_WORD:
1564                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1565                 owner->view()->text->ChangeWordCase(owner->view(),
1566                                                     LyXText::text_uppercase);
1567                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1568                 break;
1569                 
1570         case LFUN_LOWCASE_WORD:
1571                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1572                 owner->view()->text->ChangeWordCase(owner->view(),
1573                                                     LyXText::text_lowercase);
1574                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1575                 break;
1576                 
1577         case LFUN_CAPITALIZE_WORD:
1578                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1579                 owner->view()->text->ChangeWordCase(owner->view(),
1580                                                     LyXText::text_capitalization);
1581                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1582                 break;
1583                 
1584         case LFUN_INSERT_LABEL:
1585                 MenuInsertLabel(argument.c_str());
1586                 break;
1587                 
1588         case LFUN_REF_INSERT:
1589                 if (argument.empty()) {
1590                         InsetCommandParams p("ref");
1591                 owner->getDialogs()->createRef(p.getAsString());
1592                 } else {
1593                         InsetCommandParams p;
1594                         p.setFromString(argument);
1595
1596                         InsetRef * inset = new InsetRef(p);
1597                         if (!owner->view()->insertInset(inset))
1598                                 delete inset;
1599                         else
1600                                 owner->view()->updateInset(inset, true);
1601                 }
1602                 break;
1603
1604         case LFUN_REF_BACK:
1605         {
1606                 owner->view()->restorePosition();
1607         }
1608         break;
1609
1610         case LFUN_REF_GOTO:
1611         {
1612                 string label(argument);
1613                 if (label.empty()) {
1614                         InsetRef * inset = 
1615                                 static_cast<InsetRef*>(getInsetByCode(Inset::REF_CODE));
1616                         if (inset)
1617                                 label = inset->getContents();
1618                 }
1619                 
1620                 if (!label.empty()) {
1621                         owner->view()->savePosition();
1622                         if (!owner->view()->gotoLabel(label))
1623                                 WriteAlert(_("Error"), 
1624                                            _("Couldn't find this label"), 
1625                                            _("in current document."));
1626                 }
1627         }
1628         break;
1629                 
1630         case LFUN_MENU_OPEN_BY_NAME:
1631                 owner->getMenubar()->openByName(argument);
1632                 break; // RVDK_PATCH_5
1633                 
1634         case LFUN_SPELLCHECK:
1635                 if (lyxrc.isp_command != "none")
1636                         ShowSpellChecker(owner->view());
1637                 break; // RVDK_PATCH_5
1638                 
1639                 // --- Cursor Movements -----------------------------
1640         case LFUN_RIGHT:
1641         {
1642                 LyXText * tmptext = owner->view()->text;
1643                 bool is_rtl = tmptext->cursor.par()->isRightToLeftPar(owner->buffer()->params);
1644                 if(!tmptext->mark_set)
1645                         owner->view()->beforeChange();
1646                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1647                 if (is_rtl)
1648                         tmptext->CursorLeft(owner->view(), false);
1649                 if (tmptext->cursor.pos() < tmptext->cursor.par()->Last()
1650                     && tmptext->cursor.par()->GetChar(tmptext->cursor.pos())
1651                     == LyXParagraph::META_INSET
1652                     && tmptext->cursor.par()->GetInset(tmptext->cursor.pos())
1653                     && tmptext->cursor.par()->GetInset(tmptext->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE){
1654                         Inset * tmpinset = tmptext->cursor.par()->GetInset(tmptext->cursor.pos());
1655                         setMessage(tmpinset->EditMessage());
1656                         tmpinset->Edit(owner->view(), 0, 0, 0);
1657                         break;
1658                 }
1659                 if (!is_rtl)
1660                         tmptext->CursorRight(owner->view(), false);
1661                 owner->view()->text->FinishUndo();
1662                 moveCursorUpdate(false);
1663                 owner->showState();
1664         }
1665         break;
1666                 
1667         case LFUN_LEFT:
1668         {
1669                 // This is soooo ugly. Isn`t it possible to make
1670                 // it simpler? (Lgb)
1671                 LyXText * txt = owner->view()->text;
1672                 bool is_rtl = txt->cursor.par()->isRightToLeftPar(owner->buffer()->params);
1673                 if(!txt->mark_set) owner->view()->beforeChange();
1674                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1675                 if (!is_rtl)
1676                         txt->CursorLeft(owner->view(), false);
1677                 if (txt->cursor.pos() < txt->cursor.par()->Last()
1678                     && txt->cursor.par()->GetChar(txt->cursor.pos())
1679                     == LyXParagraph::META_INSET
1680                     && txt->cursor.par()->GetInset(txt->cursor.pos())
1681                     && txt->cursor.par()->GetInset(txt->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE) {
1682                         Inset * tmpinset = txt->cursor.par()->GetInset(txt->cursor.pos());
1683                         setMessage(tmpinset->EditMessage());
1684                         LyXFont font = txt->GetFont(owner->view()->buffer(),
1685                                                     txt->cursor.par(),
1686                                                     txt->cursor.pos());
1687                         tmpinset->Edit(owner->view(),
1688                                        tmpinset->x() +
1689                                        tmpinset->width(owner->view(),font),
1690                                        tmpinset->descent(owner->view(),font),
1691                                        0);
1692                         break;
1693                 }
1694                 if  (is_rtl)
1695                         txt->CursorRight(owner->view(), false);
1696
1697                 owner->view()->text->FinishUndo();
1698                 moveCursorUpdate(false);
1699                 owner->showState();
1700         }
1701         break;
1702                 
1703         case LFUN_UP:
1704                 if(!owner->view()->text->mark_set) owner->view()->beforeChange();
1705                 owner->view()->update(BufferView::UPDATE);
1706                 owner->view()->text->CursorUp(owner->view());
1707                 owner->view()->text->FinishUndo();
1708                 moveCursorUpdate(false);
1709                 owner->showState();
1710                 break;
1711                 
1712         case LFUN_DOWN:
1713                 if(!owner->view()->text->mark_set)
1714                         owner->view()->beforeChange();
1715                 owner->view()->update(BufferView::UPDATE);
1716                 owner->view()->text->CursorDown(owner->view());
1717                 owner->view()->text->FinishUndo();
1718                 moveCursorUpdate(false);
1719                 owner->showState();
1720                 break;
1721
1722         case LFUN_UP_PARAGRAPH:
1723                 if(!owner->view()->text->mark_set)
1724                         owner->view()->beforeChange();
1725                 owner->view()->update(BufferView::UPDATE);
1726                 owner->view()->text->CursorUpParagraph(owner->view());
1727                 owner->view()->text->FinishUndo();
1728                 moveCursorUpdate(false);
1729                 owner->showState();
1730                 break;
1731                 
1732         case LFUN_DOWN_PARAGRAPH:
1733                 if(!owner->view()->text->mark_set)
1734                         owner->view()->beforeChange();
1735                 owner->view()->update(BufferView::UPDATE);
1736                 owner->view()->text->CursorDownParagraph(owner->view());
1737                 owner->view()->text->FinishUndo();
1738                 moveCursorUpdate(false);
1739                 owner->showState();
1740                 break;
1741                 
1742         case LFUN_PRIOR:
1743                 if(!owner->view()->text->mark_set)
1744                         owner->view()->beforeChange();
1745                 owner->view()->update(BufferView::UPDATE);
1746                 owner->view()->cursorPrevious();
1747                 owner->view()->text->FinishUndo();
1748                 moveCursorUpdate(false);
1749                 owner->showState();
1750                 break;
1751                 
1752         case LFUN_NEXT:
1753                 if(!owner->view()->text->mark_set)
1754                         owner->view()->beforeChange();
1755                 owner->view()->update(BufferView::UPDATE);
1756                 owner->view()->cursorNext();
1757                 owner->view()->text->FinishUndo();
1758                 moveCursorUpdate(false);
1759                 owner->showState();
1760                 break;
1761                 
1762         case LFUN_HOME:
1763                 if(!owner->view()->text->mark_set)
1764                         owner->view()->beforeChange();
1765                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1766                 owner->view()->text->CursorHome(owner->view());
1767                 owner->view()->text->FinishUndo();
1768                 moveCursorUpdate(false);
1769                 owner->showState();
1770                 break;
1771                 
1772         case LFUN_END:
1773                 if(!owner->view()->text->mark_set)
1774                         owner->view()->beforeChange();
1775                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1776                 owner->view()->text->CursorEnd(owner->view());
1777                 owner->view()->text->FinishUndo();
1778                 moveCursorUpdate(false);
1779                 owner->showState();
1780                 break;
1781                 
1782         case LFUN_SHIFT_TAB:
1783         case LFUN_TAB:
1784                 if(!owner->view()->text->mark_set)
1785                         owner->view()->beforeChange();
1786                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1787                 owner->view()->text->CursorTab(owner->view());
1788                 owner->view()->text->FinishUndo();
1789                 moveCursorUpdate(false);
1790                 owner->showState();
1791                 break;
1792                 
1793         case LFUN_WORDRIGHT:
1794                 if(!owner->view()->text->mark_set)
1795                         owner->view()->beforeChange();
1796                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1797                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1798                         owner->view()->text->CursorLeftOneWord(owner->view());
1799                 else
1800                         owner->view()->text->CursorRightOneWord(owner->view());
1801                 owner->view()->text->FinishUndo();
1802                 moveCursorUpdate(false);
1803                 owner->showState();
1804                 break;
1805                 
1806         case LFUN_WORDLEFT:
1807                 if(!owner->view()->text->mark_set)
1808                         owner->view()->beforeChange();
1809                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1810                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1811                         owner->view()->text->CursorRightOneWord(owner->view());
1812                 else
1813                         owner->view()->text->CursorLeftOneWord(owner->view());
1814                 owner->view()->text->FinishUndo();
1815                 moveCursorUpdate(false);
1816                 owner->showState();
1817                 break;
1818                 
1819         case LFUN_BEGINNINGBUF:
1820                 if(!owner->view()->text->mark_set)
1821                         owner->view()->beforeChange();
1822                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1823                 owner->view()->text->CursorTop(owner->view());
1824                 owner->view()->text->FinishUndo();
1825                 moveCursorUpdate(false);
1826                 owner->showState();
1827                 break;
1828                 
1829         case LFUN_ENDBUF:
1830                 if(!owner->view()->text->mark_set)
1831                         owner->view()->beforeChange();
1832                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1833                 owner->view()->text->CursorBottom(owner->view());
1834                 owner->view()->text->FinishUndo();
1835                 moveCursorUpdate(false);
1836                 owner->showState();
1837                 break;
1838
1839       
1840                 /* cursor selection ---------------------------- */
1841         case LFUN_RIGHTSEL:
1842                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1843                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1844                         owner->view()->text->CursorLeft(owner->view());
1845                 else
1846                         owner->view()->text->CursorRight(owner->view());
1847                 owner->view()->text->FinishUndo();
1848                 moveCursorUpdate(true);
1849                 owner->showState();
1850                 break;
1851                 
1852         case LFUN_LEFTSEL:
1853                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1854                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1855                         owner->view()->text->CursorRight(owner->view());
1856                 else
1857                         owner->view()->text->CursorLeft(owner->view());
1858                 owner->view()->text->FinishUndo();
1859                 moveCursorUpdate(true);
1860                 owner->showState();
1861                 break;
1862                 
1863         case LFUN_UPSEL:
1864                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1865                 owner->view()->text->CursorUp(owner->view());
1866                 owner->view()->text->FinishUndo();
1867                 moveCursorUpdate(true);
1868                 owner->showState();
1869                 break;
1870                 
1871         case LFUN_DOWNSEL:
1872                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1873                 owner->view()->text->CursorDown(owner->view());
1874                 owner->view()->text->FinishUndo();
1875                 moveCursorUpdate(true);
1876                 owner->showState();
1877                 break;
1878
1879         case LFUN_UP_PARAGRAPHSEL:
1880                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1881                 owner->view()->text->CursorUpParagraph(owner->view());
1882                 owner->view()->text->FinishUndo();
1883                 moveCursorUpdate(true);
1884                 owner->showState();
1885                 break;
1886                 
1887         case LFUN_DOWN_PARAGRAPHSEL:
1888                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1889                 owner->view()->text->CursorDownParagraph(owner->view());
1890                 owner->view()->text->FinishUndo();
1891                 moveCursorUpdate(true);
1892                 owner->showState();
1893                 break;
1894                 
1895         case LFUN_PRIORSEL:
1896                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1897                 owner->view()->cursorPrevious();
1898                 owner->view()->text->FinishUndo();
1899                 moveCursorUpdate(true);
1900                 owner->showState();
1901                 break;
1902                 
1903         case LFUN_NEXTSEL:
1904                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1905                 owner->view()->cursorNext();
1906                 owner->view()->text->FinishUndo();
1907                 moveCursorUpdate(true);
1908                 owner->showState();
1909                 break;
1910                 
1911         case LFUN_HOMESEL:
1912                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1913                 owner->view()->text->CursorHome(owner->view());
1914                 owner->view()->text->FinishUndo();
1915                 moveCursorUpdate(true);
1916                 owner->showState();
1917                 break;
1918                 
1919         case LFUN_ENDSEL:
1920                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1921                 owner->view()->text->CursorEnd(owner->view());
1922                 owner->view()->text->FinishUndo();
1923                 moveCursorUpdate(true);
1924                 owner->showState();
1925                 break;
1926                 
1927         case LFUN_WORDRIGHTSEL:
1928                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1929                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1930                         owner->view()->text->CursorLeftOneWord(owner->view());
1931                 else
1932                         owner->view()->text->CursorRightOneWord(owner->view());
1933                 owner->view()->text->FinishUndo();
1934                 moveCursorUpdate(true);
1935                 owner->showState();
1936                 break;
1937                 
1938         case LFUN_WORDLEFTSEL:
1939                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1940                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1941                         owner->view()->text->CursorRightOneWord(owner->view());
1942                 else
1943                         owner->view()->text->CursorLeftOneWord(owner->view());
1944                 owner->view()->text->FinishUndo();
1945                 moveCursorUpdate(true);
1946                 owner->showState();
1947                 break;
1948                 
1949         case LFUN_BEGINNINGBUFSEL:
1950                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1951                 owner->view()->text->CursorTop(owner->view());
1952                 owner->view()->text->FinishUndo();
1953                 moveCursorUpdate(true);
1954                 owner->showState();
1955                 break;
1956                 
1957         case LFUN_ENDBUFSEL:
1958                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1959                 owner->view()->text->CursorBottom(owner->view());
1960                 owner->view()->text->FinishUndo();
1961                 moveCursorUpdate(true);
1962                 owner->showState();
1963                 break;
1964
1965                 // --- text changing commands ------------------------
1966         case LFUN_BREAKLINE:
1967                 owner->view()->beforeChange();
1968                 owner->view()->text->InsertChar(owner->view(), LyXParagraph::META_NEWLINE);
1969                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1970                 moveCursorUpdate(false);
1971                 break;
1972                 
1973         case LFUN_PROTECTEDSPACE:
1974         {
1975                 LyXLayout const & style =
1976                         textclasslist.Style(owner->view()->buffer()->params.textclass,
1977                                             owner->view()->text->cursor.par()->GetLayout());
1978
1979                 if (style.free_spacing) {
1980                         owner->view()->text->InsertChar(owner->view(), ' ');
1981                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1982                 } else {
1983                         owner->view()->protectedBlank();
1984                 }
1985                 moveCursorUpdate(false);
1986         }
1987         break;
1988                 
1989         case LFUN_SETMARK:
1990                 if(owner->view()->text->mark_set) {
1991                         owner->view()->beforeChange();
1992                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1993                         setMessage(N_("Mark removed"));
1994                 } else {
1995                         owner->view()->beforeChange();
1996                         owner->view()->text->mark_set = 1;
1997                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1998                         setMessage(N_("Mark set"));
1999                 }
2000                 owner->view()->text->sel_cursor = 
2001                         owner->view()->text->cursor;
2002                 break;
2003                 
2004         case LFUN_DELETE:
2005                 if (!owner->view()->text->selection) {
2006                         owner->view()->text->Delete(owner->view());
2007                         owner->view()->text->sel_cursor = 
2008                                 owner->view()->text->cursor;
2009                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2010                         // It is possible to make it a lot faster still
2011                         // just comment out the lone below...
2012                         owner->view()->showCursor();
2013                 } else {
2014                         owner->view()->cut();
2015                 }
2016                 moveCursorUpdate(false);
2017                 owner->showState();
2018                 owner->view()->setState();
2019                 break;
2020
2021         case LFUN_DELETE_SKIP:
2022         {
2023                 // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
2024                 
2025                 LyXCursor cursor = owner->view()->text->cursor;
2026
2027                 if (!owner->view()->text->selection) {
2028                         if (cursor.pos() == cursor.par()->Last()) {
2029                                 owner->view()->text->CursorRight(owner->view());
2030                                 cursor = owner->view()->text->cursor;
2031                                 if (cursor.pos() == 0
2032                                     && !(cursor.par()->added_space_top 
2033                                          == VSpace (VSpace::NONE))) {
2034                                         owner->view()->text->SetParagraph
2035                                                 (owner->view(),
2036                                                  cursor.par()->line_top,
2037                                                  cursor.par()->line_bottom,
2038                                                  cursor.par()->pagebreak_top, 
2039                                                  cursor.par()->pagebreak_bottom,
2040                                                  VSpace(VSpace::NONE), 
2041                                                  cursor.par()->added_space_bottom,
2042                                                  cursor.par()->align, 
2043                                                  cursor.par()->labelwidthstring, 0);
2044                                         owner->view()->text->CursorLeft(owner->view());
2045                                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2046                                 } else {
2047                                         owner->view()->text->CursorLeft(owner->view());
2048                                         owner->view()->text->Delete(owner->view());
2049                                         owner->view()->text->sel_cursor = 
2050                                                 owner->view()->text->cursor;
2051                                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2052                                 }
2053                         } else {
2054                                 owner->view()->text->Delete(owner->view());
2055                                 owner->view()->text->sel_cursor = 
2056                                         owner->view()->text->cursor;
2057                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2058                         }
2059                 } else {
2060                         owner->view()->cut();
2061                 }
2062         }
2063         break;
2064
2065         /* -------> Delete word forward. */
2066         case LFUN_DELETE_WORD_FORWARD:
2067                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2068                 owner->view()->text->DeleteWordForward(owner->view());
2069                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2070                 moveCursorUpdate(false);
2071                 owner->showState();
2072                 break;
2073
2074                 /* -------> Delete word backward. */
2075         case LFUN_DELETE_WORD_BACKWARD:
2076                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2077                 owner->view()->text->DeleteWordBackward(owner->view());
2078                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2079                 moveCursorUpdate(false);
2080                 owner->showState();
2081                 break;
2082                 
2083                 /* -------> Kill to end of line. */
2084         case LFUN_DELETE_LINE_FORWARD:
2085                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2086                 owner->view()->text->DeleteLineForward(owner->view());
2087                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2088                 moveCursorUpdate(false);
2089                 break;
2090                 
2091                 /* -------> Set mark off. */
2092         case LFUN_MARK_OFF:
2093                 owner->view()->beforeChange();
2094                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2095                 owner->view()->text->sel_cursor = 
2096                         owner->view()->text->cursor;
2097                 setMessage(N_("Mark off"));
2098                 break;
2099
2100                 /* -------> Set mark on. */
2101         case LFUN_MARK_ON:
2102                 owner->view()->beforeChange();
2103                 owner->view()->text->mark_set = 1;
2104                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2105                 owner->view()->text->sel_cursor = 
2106                         owner->view()->text->cursor;
2107                 setMessage(N_("Mark on"));
2108                 break;
2109                 
2110         case LFUN_BACKSPACE:
2111         {
2112                 if (!owner->view()->text->selection) {
2113                         if (owner->getIntl()->getTrans()->backspace()) {
2114                                 owner->view()->text->Backspace(owner->view());
2115                                 owner->view()->text->sel_cursor = 
2116                                         owner->view()->text->cursor;
2117                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2118                                 // It is possible to make it a lot faster still
2119                                 // just comment out the lone below...
2120                                 owner->view()->showCursor();
2121                         }
2122                 } else {
2123                         owner->view()->cut();
2124                 }
2125                 owner->showState();
2126                 owner->view()->setState();
2127         }
2128         break;
2129
2130         case LFUN_BACKSPACE_SKIP:
2131         {
2132                 // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
2133                 
2134                 LyXCursor cursor = owner->view()->text->cursor;
2135                 
2136                 if (!owner->view()->text->selection) {
2137                         if (cursor.pos() == 0 
2138                             && !(cursor.par()->added_space_top 
2139                                  == VSpace (VSpace::NONE))) {
2140                                 owner->view()->text->SetParagraph 
2141                                         (owner->view(),
2142                                          cursor.par()->line_top,      
2143                                          cursor.par()->line_bottom,
2144                                          cursor.par()->pagebreak_top, 
2145                                          cursor.par()->pagebreak_bottom,
2146                                          VSpace(VSpace::NONE), cursor.par()->added_space_bottom,
2147                                          cursor.par()->align, 
2148                                          cursor.par()->labelwidthstring, 0);
2149                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2150                         } else {
2151                                 owner->view()->text->Backspace(owner->view());
2152                                 owner->view()->text->sel_cursor 
2153                                         = cursor;
2154                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2155                         }
2156                 } else
2157                         owner->view()->cut();
2158         }
2159         break;
2160
2161         case LFUN_BREAKPARAGRAPH:
2162         {
2163                 owner->view()->beforeChange();
2164                 owner->view()->text->BreakParagraph(owner->view(), 0);
2165                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2166                 owner->view()->text->sel_cursor = 
2167                         owner->view()->text->cursor;
2168                 owner->view()->setState();
2169                 owner->showState();
2170                 break;
2171         }
2172
2173         case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
2174         {
2175                 owner->view()->beforeChange();
2176                 owner->view()->text->BreakParagraph(owner->view(), 1);
2177                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2178                 owner->view()->text->sel_cursor = 
2179                         owner->view()->text->cursor;
2180                 owner->view()->setState();
2181                 owner->showState();
2182                 break;
2183         }
2184         
2185         case LFUN_BREAKPARAGRAPH_SKIP:
2186         {
2187                 // When at the beginning of a paragraph, remove
2188                 // indentation and add a "defskip" at the top.
2189                 // Otherwise, do the same as LFUN_BREAKPARAGRAPH.
2190                 
2191                 LyXCursor cursor = owner->view()->text->cursor;
2192                 
2193                 owner->view()->beforeChange();
2194                 if (cursor.pos() == 0) {
2195                         if (cursor.par()->added_space_top == VSpace(VSpace::NONE)) {
2196                                 owner->view()->text->SetParagraph
2197                                         (owner->view(),
2198                                          cursor.par()->line_top,      
2199                                          cursor.par()->line_bottom,
2200                                          cursor.par()->pagebreak_top, 
2201                                          cursor.par()->pagebreak_bottom,
2202                                          VSpace(VSpace::DEFSKIP), cursor.par()->added_space_bottom,
2203                                          cursor.par()->align, 
2204                                          cursor.par()->labelwidthstring, 1);
2205                                 //owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2206                         } 
2207                 }
2208                 else {
2209                         owner->view()->text->BreakParagraph(owner->view(), 0);
2210                         //owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2211                 }
2212
2213                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2214                 owner->view()->text->sel_cursor = cursor;
2215                 owner->view()->setState();
2216                 owner->showState();
2217         }
2218         break;
2219
2220         case LFUN_PARAGRAPH_SPACING:
2221         {
2222                 LyXParagraph * par = owner->view()->text->cursor.par();
2223                 Spacing::Space cur_spacing = par->spacing.getSpace();
2224                 float cur_value = 1.0;
2225                 if (cur_spacing == Spacing::Other) {
2226                         cur_value = par->spacing.getValue();
2227                 }
2228                 
2229 //#ifdef HAVE_SSTREAM
2230                 istringstream istr(argument);
2231 //#else
2232 //              istrstream istr(argument.c_str());
2233 //#endif
2234                 string tmp;
2235                 istr >> tmp;
2236                 Spacing::Space new_spacing = cur_spacing;
2237                 float new_value = cur_value;
2238                 if (tmp.empty()) {
2239                         lyxerr << "Missing argument to `paragraph-spacing'"
2240                                << endl;
2241                 } else if (tmp == "single") {
2242                         new_spacing = Spacing::Single;
2243                 } else if (tmp == "onehalf") {
2244                         new_spacing = Spacing::Onehalf;
2245                 } else if (tmp == "double") {
2246                         new_spacing = Spacing::Double;
2247                 } else if (tmp == "other") {
2248                         new_spacing = Spacing::Other;
2249                         float tmpval = 0.0;
2250                         istr >> tmpval;
2251                         lyxerr << "new_value = " << tmpval << endl;
2252                         if (tmpval != 0.0)
2253                                 new_value = tmpval;
2254                 } else if (tmp == "default") {
2255                         new_spacing = Spacing::Default;
2256                 } else {
2257                         lyxerr << _("Unknown spacing argument: ")
2258                                << argument << endl;
2259                 }
2260                 if (cur_spacing != new_spacing || cur_value != new_value) {
2261                         par->spacing.set(new_spacing, new_value);
2262                         owner->view()->text->RedoParagraph(owner->view());
2263                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2264                 }
2265         }
2266         break;
2267         
2268         case LFUN_QUOTE:
2269                 owner->view()->beforeChange();
2270                 owner->view()->text->InsertChar(owner->view(), '\"');  // This " matches the single quote in the code
2271                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2272                 moveCursorUpdate(false);
2273                 break;
2274
2275         case LFUN_HTMLURL:
2276         case LFUN_URL:
2277         {
2278                 InsetCommandParams p;
2279                 if (action == LFUN_HTMLURL)
2280                         p.setCmdName("htmlurl");
2281                 else
2282                         p.setCmdName("url");
2283                 owner->getDialogs()->createUrl( p.getAsString() );
2284         }
2285         break;
2286                     
2287         case LFUN_INSERT_URL:
2288         {
2289                 InsetCommandParams p;
2290                 p.setFromString( argument );
2291
2292                 InsetUrl * inset = new InsetUrl( p );
2293                 if (!owner->view()->insertInset(inset))
2294                         delete inset;
2295                 else
2296                         owner->view()->updateInset( inset, true );
2297         }
2298         break;
2299                     
2300         case LFUN_INSET_TEXT:
2301         {
2302                 InsetText * new_inset = new InsetText;
2303                 if (owner->view()->insertInset(new_inset))
2304                         new_inset->Edit(owner->view(), 0, 0, 0);
2305                 else
2306                         delete new_inset;
2307         }
2308         break;
2309         
2310         case LFUN_INSET_ERT:
2311         {
2312                 InsetERT * new_inset = new InsetERT;
2313                 if (owner->view()->insertInset(new_inset))
2314                         new_inset->Edit(owner->view(), 0, 0, 0);
2315                 else
2316                         delete new_inset;
2317         }
2318         break;
2319         
2320         case LFUN_INSET_EXTERNAL:
2321         {
2322                 InsetExternal * new_inset = new InsetExternal;
2323                 if (owner->view()->insertInset(new_inset))
2324                         new_inset->Edit(owner->view(), 0, 0, 0);
2325                 else
2326                         delete new_inset;
2327         }
2328         break;
2329         
2330         case LFUN_INSET_FOOTNOTE:
2331         {
2332                 InsetFoot * new_inset = new InsetFoot;
2333                 if (owner->view()->insertInset(new_inset))
2334                         new_inset->Edit(owner->view(), 0, 0, 0);
2335                 else
2336                         delete new_inset;
2337         }
2338         break;
2339
2340         case LFUN_INSET_MARGINAL:
2341         {
2342                 InsetMarginal * new_inset = new InsetMarginal;
2343                 if (owner->view()->insertInset(new_inset))
2344                         new_inset->Edit(owner->view(), 0, 0, 0);
2345                 else
2346                         delete new_inset;
2347         }
2348         break;
2349
2350         case LFUN_INSET_MINIPAGE:
2351         {
2352                 InsetMinipage * new_inset = new InsetMinipage;
2353                 if (owner->view()->insertInset(new_inset))
2354                         new_inset->Edit(owner->view(), 0, 0, 0);
2355                 else
2356                         delete new_inset;
2357         }
2358         break;
2359
2360         case LFUN_INSET_FLOAT:
2361         {
2362                 // check if the float type exist
2363                 if (floatList.typeExist(argument)) {
2364                         InsetFloat * new_inset = new InsetFloat(argument);
2365                         if (owner->view()->insertInset(new_inset))
2366                                 new_inset->Edit(owner->view(), 0, 0, 0);
2367                         else
2368                                 delete new_inset;
2369                 } else {
2370                         lyxerr << "Non-existant float type: "
2371                                << argument << endl;
2372                 }
2373                 
2374         }
2375         break;
2376
2377         case LFUN_INSET_LIST:
2378         {
2379                 InsetList * new_inset = new InsetList;
2380                 if (owner->view()->insertInset(new_inset))
2381                         new_inset->Edit(owner->view(), 0, 0, 0);
2382                 else
2383                         delete new_inset;
2384         }
2385         break;
2386
2387         case LFUN_INSET_THEOREM:
2388         {
2389                 InsetTheorem * new_inset = new InsetTheorem;
2390                 if (owner->view()->insertInset(new_inset))
2391                         new_inset->Edit(owner->view(), 0, 0, 0);
2392                 else
2393                         delete new_inset;
2394         }
2395         break;
2396
2397         case LFUN_INSET_CAPTION:
2398         {
2399                 // Do we have a locking inset...
2400                 if (owner->view()->the_locking_inset) {
2401                         lyxerr << "Locking inset code: "
2402                                << static_cast<int>(owner->view()->the_locking_inset->LyxCode());
2403                         InsetCaption * new_inset = new InsetCaption;
2404                         new_inset->setOwner(owner->view()->the_locking_inset);
2405                         new_inset->SetAutoBreakRows(true);
2406                         new_inset->SetDrawFrame(0, InsetText::LOCKED);
2407                         new_inset->SetFrameColor(0, LColor::footnoteframe);
2408                         if (owner->view()->insertInset(new_inset))
2409                                 new_inset->Edit(owner->view(), 0, 0, 0);
2410                         else
2411                                 delete new_inset;
2412                 }
2413         }
2414         break;
2415         
2416         case LFUN_INSET_TABULAR:
2417         {
2418                 int r = 2, c = 2;
2419                 if (!argument.empty())
2420                         sscanf(argument.c_str(),"%d%d", &r, &c);
2421                 InsetTabular * new_inset =
2422                         new InsetTabular(owner->buffer(), r, c);
2423                 if (owner->view()->insertInset(new_inset))
2424                         new_inset->Edit(owner->view(), 0, 0, 0);
2425                 else
2426                         delete new_inset;
2427         }
2428         break;
2429
2430         // --- lyxserver commands ----------------------------
2431
2432         case LFUN_CHARATCURSOR:
2433         {
2434                 LyXParagraph::size_type pos = 
2435                         owner->view()->text->cursor.pos();
2436                 if(pos < owner->view()->text->cursor.par()->size())
2437                         //dispatch_buffer = owner->view()->text->
2438                         //      cursor.par()->text[pos];
2439                         dispatch_buffer =
2440                                 owner->view()->text->
2441                                 cursor.par()->GetChar(pos);
2442                 else
2443                         dispatch_buffer = "EOF";
2444         }
2445         break;
2446         
2447         case LFUN_GETXY:
2448                 dispatch_buffer = 
2449                         tostr(owner->view()->text->cursor.x()) + ' '
2450                         + tostr(owner->view()->text->cursor.y());
2451                 break;
2452                 
2453         case LFUN_SETXY:
2454         {
2455                 int  x;
2456                 long y;
2457                 sscanf(argument.c_str(), " %d %ld", &x, &y);
2458                 owner->view()->text->SetCursorFromCoordinates(owner->view(), x, y);
2459         }
2460         break;
2461         
2462         case LFUN_GETLAYOUT:
2463                 dispatch_buffer =  
2464                         tostr(owner->view()->text->cursor.par()->layout);
2465                 break;
2466                         
2467         case LFUN_GETFONT:
2468         {
2469                 LyXFont & font = owner->view()->text->current_font;
2470                 if(font.shape() == LyXFont::ITALIC_SHAPE)
2471                         dispatch_buffer = 'E';
2472                 else if(font.shape() == LyXFont::SMALLCAPS_SHAPE)
2473                         dispatch_buffer = 'N';
2474                 else
2475                         dispatch_buffer = '0';
2476
2477         }
2478         break;
2479
2480         case LFUN_GETLATEX:
2481         {
2482                 LyXFont & font = owner->view()->text->current_font;
2483                 if(font.latex() == LyXFont::ON)
2484                         dispatch_buffer = 'L';
2485                 else
2486                         dispatch_buffer = '0';
2487         }
2488         break;
2489
2490         case LFUN_GETNAME:
2491                 setMessage(owner->buffer()->fileName());
2492                 lyxerr.debug() << "FNAME["
2493                                << owner->buffer()->fileName()
2494                                << "] " << endl;
2495                 break;
2496                 
2497         case LFUN_NOTIFY:
2498         {
2499                 string buf;
2500                 keyseq.print(buf);
2501                 dispatch_buffer = buf;
2502                 lyxserver->notifyClient(dispatch_buffer);
2503         }
2504         break;
2505
2506         case LFUN_GOTOFILEROW:
2507         {
2508                 char file_name[100];
2509                 int  row;
2510                 sscanf(argument.c_str(), " %s %d", file_name, &row);
2511
2512                 // Must replace extension of the file to be .lyx and get full path
2513                 string s = ChangeExtension(string(file_name), ".lyx");
2514
2515                 // Either change buffer or load the file
2516                 if (bufferlist.exists(s))
2517                         owner->view()->buffer(bufferlist.getBuffer(s));
2518                 else
2519                         owner->view()->buffer(bufferlist.loadLyXFile(s));
2520
2521                 // Set the cursor  
2522                 owner->view()->setCursorFromRow(row);
2523
2524                 // Recenter screen
2525                 owner->view()->center();
2526         }
2527         break;
2528
2529         case LFUN_GOTO_PARAGRAPH:
2530         {
2531 //#ifdef HAVE_SSTREAM
2532                 istringstream istr(argument);
2533 //#else
2534 //                istrstream istr(argument.c_str());
2535 //#endif
2536
2537                 int id;
2538                 istr >> id;
2539                 LyXParagraph * par = owner->view()->text->GetParFromID(id);
2540
2541                 // Set the cursor
2542                 owner->view()->text->SetCursor(owner->view(), par, 0);
2543                 owner->view()->setState();
2544                 owner->showState();
2545
2546                 // Recenter screen
2547                 owner->view()->center();
2548         }
2549         break;
2550
2551         case LFUN_APROPOS:
2552         case LFUN_GETTIP:
2553         {
2554                 int qa = lyxaction.LookupFunc(argument.c_str());
2555                 setMessage(lyxaction.helpText(static_cast<kb_action>(qa)));
2556         }
2557         break;
2558
2559         // --- accented characters ---------------------------
2560                 
2561         case LFUN_UMLAUT:
2562         case LFUN_CIRCUMFLEX:
2563         case LFUN_GRAVE:
2564         case LFUN_ACUTE:
2565         case LFUN_TILDE:
2566         case LFUN_CEDILLA:
2567         case LFUN_MACRON:
2568         case LFUN_DOT:
2569         case LFUN_UNDERDOT:
2570         case LFUN_UNDERBAR:
2571         case LFUN_CARON:
2572         case LFUN_SPECIAL_CARON:
2573         case LFUN_BREVE:
2574         case LFUN_TIE:
2575         case LFUN_HUNG_UMLAUT:
2576         case LFUN_CIRCLE:
2577         case LFUN_OGONEK:
2578         {
2579                 char c = 0;
2580                 
2581                 if (keyseq.length == -1 && keyseq.getiso() != 0) 
2582                         c = keyseq.getiso();
2583                 
2584                 owner->getIntl()->getTrans()->
2585                         deadkey(c, get_accent(action).accent, 
2586                                 owner->view()->text);
2587                 
2588                 // Need to reset, in case the minibuffer calls these
2589                 // actions
2590                 keyseq.reset();
2591                 keyseq.length = 0;
2592                 
2593                 // copied verbatim from do_accent_char
2594                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2595
2596                 owner->view()->text->sel_cursor = 
2597                         owner->view()->text->cursor;
2598         }   
2599         break;
2600         
2601         // --- toolbar ----------------------------------
2602         case LFUN_PUSH_TOOLBAR:
2603         {
2604                 int nth = strToInt(argument);
2605                 if (nth <= 0) {
2606                         setErrorMessage(N_("Push-toolbar needs argument > 0"));
2607                 } else {
2608                         owner->getToolbar()->push(nth);
2609                 }
2610         }
2611         break;
2612         
2613         case LFUN_ADD_TO_TOOLBAR:
2614         {
2615                 if (lyxerr.debugging(Debug::GUI)) {
2616                         lyxerr << "LFUN_ADD_TO_TOOLBAR:"
2617                                 "argument = `" << argument << '\'' << endl;
2618                 }
2619                 string tmp(argument);
2620                 //lyxerr <<string("Argument: ") + argument);
2621                 //lyxerr <<string("Tmp     : ") + tmp);
2622                 if (tmp.empty()) {
2623                         setErrorMessage(N_("Usage: toolbar-add-to <LyX command>"));
2624                 } else {
2625                         owner->getToolbar()->add(argument, false);
2626                         owner->getToolbar()->set();
2627                 }
2628         }
2629         break;
2630         
2631         // --- insert characters ----------------------------------------
2632
2633         // ---  Mathed stuff. If we are here, there is no locked inset yet.
2634         
2635         // Greek mode     
2636         case LFUN_GREEK:
2637         {
2638                 if (!greek_kb_flag) {
2639                         greek_kb_flag = 1;
2640                         setMessage(N_("Math greek mode on"));
2641                 } else
2642                         greek_kb_flag = 0;
2643         }  
2644         break;
2645       
2646         // Greek keyboard      
2647         case LFUN_GREEK_TOGGLE:
2648         {
2649                 greek_kb_flag = greek_kb_flag ? 0 : 2;
2650                 if (greek_kb_flag) {
2651                         setMessage(N_("Math greek keyboard on"));
2652                 } else {
2653                         setMessage(N_("Math greek keyboard off"));
2654                 }
2655         }
2656         break;
2657         
2658         case LFUN_MATH_DELIM:     
2659         case LFUN_INSERT_MATRIX:
2660         {          
2661                 if (owner->view()->available()) { 
2662                         owner->view()->
2663                                 open_new_inset(new InsetFormula(false));
2664                         owner->view()
2665                                 ->the_locking_inset
2666                                 ->LocalDispatch(owner->view(),
2667                                                 action,
2668                                                 argument);
2669                 }
2670         }          
2671         break;
2672                
2673         case LFUN_INSERT_MATH:
2674         {
2675                 math_insert_symbol(argument.c_str());
2676         }
2677         break;
2678         
2679         case LFUN_MATH_DISPLAY:
2680         {
2681                 if (owner->view()->available())
2682                         owner->view()->open_new_inset(new InsetFormula(true));
2683                 break;
2684         }
2685                     
2686         case LFUN_MATH_MACRO:
2687         {
2688                 if (owner->view()->available()) {
2689                         string s(argument);
2690                         if (s.empty())
2691                                 setErrorMessage(N_("Missing argument"));
2692                         else {
2693                                 string s1 = token(s, ' ', 1);
2694                                 int na = s1.empty() ? 0: atoi(s1.c_str());
2695                                 owner->view()->
2696                                         open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na));
2697                         }
2698                 }
2699         }
2700         break;
2701
2702         case LFUN_MATH_MODE:   // Open or create a math inset
2703         {               
2704                 if (owner->view()->available())
2705                         owner->view()->open_new_inset(new InsetFormula);
2706                 setMessage(N_("Math editor mode"));
2707         }
2708         break;
2709           
2710         case LFUN_MATH_NUMBER:
2711         case LFUN_MATH_LIMITS:
2712         {
2713                 setErrorMessage(N_("This is only allowed in math mode!"));
2714         
2715         }
2716         break;
2717
2718         case LFUN_MATH_PANEL:
2719         {
2720                 show_symbols_form(this);
2721         }
2722         break;
2723         
2724         case LFUN_CITATION_CREATE:
2725         {
2726                 // Should do this "at source"
2727                 InsetCommandParams p( "cite" );
2728                 
2729                 if (contains(argument, "|")) {
2730                         p.setContents( token(argument, '|', 0) );
2731                         p.setOptions(  token(argument, '|', 1) );
2732                 } else {
2733                         p.setContents( argument );
2734                 }
2735
2736                 owner->getDialogs()->createCitation( p.getAsString() );
2737         }
2738         break;
2739                     
2740         case LFUN_CITATION_INSERT:
2741         {
2742                 InsetCommandParams p;
2743                 p.setFromString( argument );
2744
2745                 InsetCitation * inset = new InsetCitation( p );
2746                 if (!owner->view()->insertInset(inset))
2747                         delete inset;
2748                 else
2749                         owner->view()->updateInset( inset, true );
2750         }
2751         break;
2752                     
2753         case LFUN_INSERT_BIBTEX:
2754         {   
2755                 // ale970405+lasgoutt970425
2756                 // The argument can be up to two tokens separated 
2757                 // by a space. The first one is the bibstyle.
2758                 string db       = token(argument, ' ', 0);
2759                 string bibstyle = token(argument, ' ', 1);
2760                 if (bibstyle.empty())
2761                         bibstyle = "plain";
2762
2763                 InsetCommandParams p( "BibTeX", db, bibstyle );
2764                 InsetBibtex * inset = new InsetBibtex(p, owner->buffer());
2765                 
2766                 if (owner->view()->insertInset(inset)) {
2767                         if (argument.empty())
2768                                 inset->Edit(owner->view(), 0, 0, 0);
2769                 } else
2770                         delete inset;
2771         }
2772         break;
2773                 
2774         // BibTeX data bases
2775         case LFUN_BIBDB_ADD:
2776         {
2777                 InsetBibtex * inset = 
2778                         static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
2779                 if (inset) {
2780                         inset->addDatabase(argument);
2781                 }
2782         }
2783         break;
2784                     
2785         case LFUN_BIBDB_DEL:
2786         {
2787                 InsetBibtex * inset = 
2788                         static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
2789                 if (inset) {
2790                         inset->delDatabase(argument);
2791                 }
2792         }
2793         break;
2794         
2795         case LFUN_BIBTEX_STYLE:
2796         {
2797                 InsetBibtex * inset = 
2798                         static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
2799                 if (inset) {
2800                         inset->setOptions(argument);
2801                 }
2802         }
2803         break;
2804                 
2805         case LFUN_INDEX_CREATE:
2806         {
2807                 InsetCommandParams p( "index" );
2808                 
2809                 if( argument.empty() ) {
2810                         // Get the word immediately preceding the cursor
2811                         LyXParagraph::size_type curpos = 
2812                                 owner->view()->text->cursor.pos() - 1;
2813
2814                         string curstring;
2815                         if( curpos >= 0 )
2816                                 curstring = owner->view()->text
2817                                             ->cursor.par()->GetWord(curpos);
2818
2819                         p.setContents( curstring );
2820                 } else {
2821                         p.setContents( argument );
2822                 }
2823
2824                 owner->getDialogs()->createIndex( p.getAsString() );
2825         }
2826         break;
2827                     
2828         case LFUN_INDEX_INSERT:
2829         {
2830                 InsetCommandParams p;
2831                 p.setFromString( argument );
2832                 InsetIndex * inset = new InsetIndex( p );
2833
2834                 if (!owner->view()->insertInset(inset))
2835                         delete inset;
2836                 else
2837                         owner->view()->updateInset( inset, true );
2838         }
2839         break;
2840                     
2841         case LFUN_INDEX_INSERT_LAST:
2842         {
2843                 // Get word immediately preceding the cursor
2844                 LyXParagraph::size_type curpos = 
2845                         owner->view()->text->cursor.pos() - 1;
2846                 // Can't do that at the beginning of a paragraph
2847                 if( curpos < 0 ) break;
2848
2849                 string curstring( owner->view()->text
2850                                   ->cursor.par()->GetWord(curpos) );
2851
2852                 InsetCommandParams p( "index", curstring );
2853                 InsetIndex * inset = new InsetIndex( p );
2854
2855                 if (!owner->view()->insertInset(inset))
2856                         delete inset;
2857                 else
2858                         owner->view()->updateInset( inset, true );
2859         }
2860         break;
2861                     
2862         case LFUN_INDEX_PRINT:
2863         {
2864                 InsetCommandParams p( "printindex" );
2865                 Inset * inset = new InsetPrintIndex(p);
2866                 if (!owner->view()->insertInset(inset, "Standard", true))
2867                         delete inset;
2868         }
2869         break;
2870
2871         case LFUN_PARENTINSERT:
2872         {
2873                 lyxerr << "arg " << argument << endl;
2874                 InsetCommandParams p( "lyxparent", argument );
2875                 Inset * inset = new InsetParent(p, owner->buffer());
2876                 if (!owner->view()->insertInset(inset, "Standard", true))
2877                         delete inset;
2878         }
2879         break;
2880
2881         case LFUN_CHILDINSERT:
2882         {
2883                 InsetCommandParams p( "Include", argument );
2884                 Inset * inset = new InsetInclude(p, owner->buffer());
2885                 if (owner->view()->insertInset(inset, "Standard", true))
2886                         inset->Edit(owner->view(), 0, 0, 0);
2887                 else
2888                         delete inset;
2889         }
2890         break;
2891
2892         case LFUN_CHILDOPEN:
2893         {
2894                 string filename =
2895                         MakeAbsPath(argument, 
2896                                     OnlyPath(owner->buffer()->fileName()));
2897                 setMessage(N_("Opening child document ") +
2898                            MakeDisplayPath(filename) + "...");
2899                 owner->view()->savePosition();
2900                 if (bufferlist.exists(filename))
2901                         owner->view()->buffer(bufferlist.getBuffer(filename));
2902                 else
2903                         owner->view()->buffer(bufferlist.loadLyXFile(filename));
2904         }
2905         break;
2906
2907         case LFUN_INSERT_NOTE:
2908                 owner->view()->insertNote();
2909                 break;
2910 #ifndef NEW_INSETS
2911         case LFUN_INSERTFOOTNOTE: 
2912         {
2913                 LyXParagraph::footnote_kind kind;
2914                 if (argument == "footnote")
2915                         { kind = LyXParagraph::FOOTNOTE; }
2916                 else if (argument == "margin")
2917                         { kind = LyXParagraph::MARGIN; }
2918                 else if (argument == "figure")
2919                         { kind = LyXParagraph::FIG; }
2920                 else if (argument == "table")
2921                         { kind = LyXParagraph::TAB; }
2922                 else if (argument == "wide-fig")
2923                         { kind = LyXParagraph::WIDE_FIG; }
2924                 else if (argument == "wide-tab")
2925                         { kind = LyXParagraph::WIDE_TAB; }
2926                 else if (argument == "algorithm")
2927                         { kind = LyXParagraph::ALGORITHM; }
2928                 else {
2929                         setErrorMessage(N_("Unknown kind of footnote"));
2930                         break;
2931                 }
2932                 owner->view()->text->InsertFootnoteEnvironment(owner->view(), kind);
2933                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2934                 owner->view()->setState();
2935         }
2936         break;
2937 #endif  
2938         case LFUN_BUFFERBULLETSSELECT:
2939                 bulletForm();
2940                 break;
2941                 
2942         case LFUN_TOGGLECURSORFOLLOW:
2943                 cursor_follows_scrollbar = !cursor_follows_scrollbar;
2944                 break;
2945                 
2946         case LFUN_KMAP_OFF:             // keymap off
2947                 owner->getIntl()->KeyMapOn(false);
2948                 break;
2949                 
2950         case LFUN_KMAP_PRIM:    // primary keymap
2951                 owner->getIntl()->KeyMapPrim();
2952                 break;
2953                 
2954         case LFUN_KMAP_SEC:             // secondary keymap
2955                 owner->getIntl()->KeyMapSec();
2956                 break;
2957                 
2958         case LFUN_KMAP_TOGGLE:  // toggle keymap
2959                 owner->getIntl()->ToggleKeyMap();
2960                 break;
2961
2962         case LFUN_SELFINSERT:
2963         {
2964                 for (string::size_type i = 0; i < argument.length(); ++i) {
2965                         owner->view()->text->InsertChar(owner->view(), argument[i]);
2966                         // This needs to be in the loop, or else we
2967                         // won't break lines correctly. (Asger)
2968                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2969                 }
2970                 owner->view()->text->sel_cursor = 
2971                         owner->view()->text->cursor;
2972                 moveCursorUpdate(false);
2973         }
2974         break;
2975
2976         case LFUN_SEQUENCE: 
2977         {
2978                 // argument contains ';'-terminated commands
2979                 while (argument.find(';') != string::npos) {
2980                         string first;
2981                         argument = split(argument, first, ';');
2982                         Dispatch(first);
2983                 }
2984         }
2985         break;
2986
2987         case LFUN_DATE_INSERT:  // jdblair: date-insert cmd
2988         {
2989                 struct tm * now_tm;
2990                 
2991                 time_t now_time_t = time(NULL);
2992                 now_tm = localtime(&now_time_t);
2993                 setlocale(LC_TIME, "");
2994                 string arg;
2995                 if (!argument.empty())
2996                         arg = argument;
2997                 else 
2998                         arg = lyxrc.date_insert_format;
2999                 char datetmp[32];
3000                 int datetmp_len = strftime(datetmp, 32, arg.c_str(), now_tm);
3001                 for (int i = 0; i < datetmp_len; i++) {
3002                         owner->view()->text->InsertChar(owner->view(), datetmp[i]);
3003                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
3004                 }
3005
3006                 owner->view()->text->sel_cursor = owner->view()->text->cursor;
3007                 moveCursorUpdate(false);
3008         }
3009         break;
3010
3011         case LFUN_DIALOG_PREFERENCES:
3012                 owner->getDialogs()->showPreferences();
3013                 break;
3014                 
3015         case LFUN_SAVEPREFERENCES:
3016         {
3017                 Path p(user_lyxdir);
3018                 lyxrc.write("preferences");
3019         }
3020         break;
3021
3022         case LFUN_SCREEN_FONT_UPDATE:
3023         {
3024                 // handle the screen font changes.
3025                 // 
3026                 lyxrc.set_font_norm_type();
3027                 fontloader.update();
3028                 // Of course we should only do the resize and the textcache.clear
3029                 // if values really changed...but not very important right now. (Lgb)
3030                 // All buffers will need resize
3031                 bufferlist.resize();
3032                 // We also need to empty the textcache so that
3033                 // the buffer will be formatted correctly after
3034                 // a zoom change.
3035                 textcache.clear();
3036         }
3037
3038         case LFUN_SET_COLOR:
3039         {
3040                 string lyx_name, x11_name;
3041                 x11_name = split(argument, lyx_name, ' ');
3042                 if (lyx_name.empty() || x11_name.empty()) {
3043                         LyXBell();
3044                         setErrorMessage(N_("Syntax: set-color <lyx_name>"
3045                                                 " <x11_name>"));
3046                         break;
3047                         }
3048
3049                 if (!lcolor.setColor(lyx_name, x11_name)) {
3050                         static string err1 (N_("Set-color \""));
3051                         static string err2 (N_("\" failed - color is undefined "
3052                                                 "or may not be redefined"));
3053                         LyXBell();
3054                         setErrorMessage(err1 + lyx_name + err2);
3055                         break;
3056                 }
3057                 lyxColorHandler->updateColor(lcolor.getFromLyXName(lyx_name));
3058                 owner->view()->redraw();
3059                 break;
3060         }
3061
3062         case LFUN_UNKNOWN_ACTION:
3063         {
3064                 if(!owner->buffer()) {
3065                         LyXBell();
3066                         setErrorMessage(N_("No document open"));
3067                         break;
3068                 }
3069
3070                 if (owner->buffer()->isReadonly()) {
3071                         LyXBell();
3072                         setErrorMessage(N_("Document is read only"));
3073                         break;
3074                 }
3075                          
3076                 if (!argument.empty()) {
3077                         
3078                         /* Automatically delete the currently selected
3079                          * text and replace it with what is being
3080                          * typed in now. Depends on lyxrc settings
3081                          * "auto_region_delete", which defaults to
3082                          * true (on). */
3083                 
3084                         if ( lyxrc.auto_region_delete ) {
3085                                 if (owner->view()->text->selection){
3086                                         owner->view()->text->CutSelection(owner->view(), false);
3087                                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
3088                                 }
3089                         }
3090                         
3091                         owner->view()->beforeChange();
3092                         
3093                         for (string::size_type i = 0;
3094                              i < argument.length(); ++i) {
3095                                 if (greek_kb_flag) {
3096                                         if (!math_insert_greek(argument[i]))
3097                                                 owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text);
3098                                 } else
3099                                         owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text);
3100                         }
3101
3102                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
3103
3104                         owner->view()->text->sel_cursor = 
3105                                 owner->view()->text->cursor;
3106                         moveCursorUpdate(false);
3107                         return string();
3108                 } else {
3109                         // why is an "Unknown action" with empty
3110                         // argument even dispatched in the first
3111                         // place? I`ll probably change that. (Lgb)
3112                         LyXBell();
3113                         setErrorMessage(N_("Unknown action"));
3114                 }
3115                 break;
3116         default:
3117                 lyxerr << "A truly unknown func!" << endl;
3118                 break;
3119         }
3120         } // end of switch
3121   exit_with_message:
3122
3123         string res = getMessage();
3124
3125         if (res.empty()) {
3126                 if (!commandshortcut.empty()) {
3127                         string newbuf = owner->getMiniBuffer()->GetText();
3128                         if (newbuf != commandshortcut) {
3129                                 owner->getMiniBuffer()->Set(newbuf
3130                                                             + " " +
3131                                                             commandshortcut);
3132                         }
3133                 }
3134         } else {
3135                 owner->getMiniBuffer()->Set(string(_(res.c_str()))
3136                                             + " " + commandshortcut);
3137         }
3138
3139         return res;
3140 }
3141
3142
3143 void LyXFunc::setupLocalKeymap()
3144 {
3145         keyseq.stdmap = keyseq.curmap = toplevel_keymap;
3146         cancel_meta_seq.stdmap = cancel_meta_seq.curmap = toplevel_keymap;
3147 }
3148
3149
3150 void LyXFunc::MenuNew(bool fromTemplate)
3151 {
3152         string fname, initpath = lyxrc.document_path;
3153         LyXFileDlg fileDlg;
3154
3155         if (owner->view()->available()) {
3156                 string trypath = owner->buffer()->filepath;
3157                 // If directory is writeable, use this as default.
3158                 if (IsDirWriteable(trypath) == 1)
3159                         initpath = trypath;
3160         }
3161
3162         static int newfile_number = 0;
3163         string s;
3164
3165         if (lyxrc.new_ask_filename) {
3166                 ProhibitInput(owner->view());
3167                 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3168                 fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
3169                 fname = fileDlg.Select(_("Enter Filename for new document"), 
3170                                        initpath, "*.lyx", _("newfile"));
3171                 AllowInput(owner->view());
3172         
3173                 if (fname.empty()) {
3174                         owner->getMiniBuffer()->Set(_("Canceled."));
3175                         lyxerr.debug() << "New Document Cancelled." << endl;
3176                         return;
3177                 }
3178         
3179                 // get absolute path of file and make sure the filename ends
3180                 // with .lyx
3181                 s = MakeAbsPath(fname);
3182                 if (!IsLyXFilename(s))
3183                         s += ".lyx";
3184
3185                 // Check if the document already is open
3186                 if (bufferlist.exists(s)) {
3187                         switch(AskConfirmation(_("Document is already open:"), 
3188                                                MakeDisplayPath(s, 50),
3189                                                _("Do you want to close that document now?\n"
3190                                                  "('No' will just switch to the open version)")))
3191                         {
3192                         case 1: // Yes: close the document
3193                                 if (!bufferlist.close(bufferlist.getBuffer(s)))
3194                                 // If close is canceled, we cancel here too.
3195                                         return;
3196                                 break;
3197                         case 2: // No: switch to the open document
3198                                 owner->view()->buffer(bufferlist.getBuffer(s));
3199                                 return;
3200                         case 3: // Cancel: Do nothing
3201                                 owner->getMiniBuffer()->Set(_("Canceled."));
3202                                 return;
3203                         }
3204                 }
3205                 // Check whether the file already exists
3206                 if (IsLyXFilename(s)) {
3207                         FileInfo fi(s);
3208                         if (fi.readable() &&
3209                             AskQuestion(_("File already exists:"), 
3210                                         MakeDisplayPath(s, 50),
3211                                         _("Do you want to open the document?"))) {
3212                                 // loads document
3213                                 owner->getMiniBuffer()->Set(_("Opening document"), 
3214                                                             MakeDisplayPath(s), "...");
3215                                 XFlush(fl_display);
3216                                 owner->view()->buffer(
3217                                         bufferlist.loadLyXFile(s));
3218                                 owner->getMiniBuffer()->Set(_("Document"),
3219                                                             MakeDisplayPath(s),
3220                                                             _("opened."));
3221                                 return;
3222                         }
3223                 }
3224         } else {
3225                 s = lyxrc.document_path + "newfile" + tostr(++newfile_number);
3226                 FileInfo fi(s);
3227                 while (bufferlist.exists(s) || fi.readable()) {
3228                         ++newfile_number;
3229                         s = lyxrc.document_path + "newfile" +
3230                                 tostr(newfile_number);
3231                         fi.newFile(s);
3232                 }
3233         }
3234
3235         // The template stuff
3236         string templname;
3237         if (fromTemplate) {
3238                 ProhibitInput(owner->view());
3239                 fname = fileDlg.Select(_("Choose template"),
3240                                        lyxrc.template_path,
3241                                        "*.lyx");
3242                 templname = fname;
3243                 AllowInput(owner->view());
3244         }
3245   
3246         // find a free buffer
3247         lyxerr.debug() << "Find a free buffer." << endl;
3248         owner->view()->buffer(bufferlist.newFile(s, templname));
3249 }
3250
3251
3252 void LyXFunc::MenuOpen()
3253 {
3254         string initpath = lyxrc.document_path;
3255         LyXFileDlg fileDlg;
3256   
3257         if (owner->view()->available()) {
3258                 string trypath = owner->buffer()->filepath;
3259                 // If directory is writeable, use this as default.
3260                 if (IsDirWriteable(trypath) == 1)
3261                         initpath = trypath;
3262         }
3263
3264         // launches dialog
3265         ProhibitInput(owner->view());
3266         fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3267         fileDlg.SetButton(1, _("Examples"), 
3268                           AddPath(system_lyxdir, "examples"));
3269         string filename = fileDlg.Select(_("Select Document to Open"),
3270                                          initpath, "*.lyx");
3271         AllowInput(owner->view());
3272  
3273         // check selected filename
3274         if (filename.empty()) {
3275                 owner->getMiniBuffer()->Set(_("Canceled."));
3276                 return;
3277         }
3278
3279         // get absolute path of file and make sure the filename ends
3280         // with .lyx
3281         filename = MakeAbsPath(filename);
3282         if (!IsLyXFilename(filename))
3283                 filename += ".lyx";
3284
3285         // loads document
3286         owner->getMiniBuffer()->Set(_("Opening document"),
3287                                     MakeDisplayPath(filename), "...");
3288         Buffer * openbuf = bufferlist.loadLyXFile(filename);
3289         if (openbuf) {
3290                 owner->view()->buffer(openbuf);
3291                 owner->getMiniBuffer()->Set(_("Document"),
3292                                             MakeDisplayPath(filename),
3293                                             _("opened."));
3294         } else {
3295                 owner->getMiniBuffer()->Set(_("Could not open document"),
3296                                             MakeDisplayPath(filename));
3297         }
3298 }
3299
3300 // returns filename if file must be imported,
3301 // empty string if either file not found or already loaded
3302 // checks for running without gui are missing.
3303
3304 void LyXFunc::doImportHelper(
3305         string const & file,          // filename (possibly empty)
3306         string const & text,          // info when asking for filename
3307         string const & pattern,       // filetype
3308         bool func(BufferView *, string const &)     // the real import function
3309 )
3310 {
3311         string filename = file;
3312
3313         if (filename.empty()) { // need user interaction
3314                 string initpath = lyxrc.document_path;
3315                 LyXFileDlg fileDlg;
3316                 
3317                 if (owner->view()->available()) {
3318                         string trypath = owner->buffer()->filepath;
3319                         // If directory is writeable, use this as default.
3320                         if (IsDirWriteable(trypath) == 1)
3321                                 initpath = trypath;
3322                 }
3323
3324                 // launches dialog
3325                 ProhibitInput(owner->view());
3326                 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3327                 fileDlg.SetButton(1, _("Examples"), 
3328                                         AddPath(system_lyxdir, "examples"));
3329                 filename = fileDlg.Select(text, initpath, pattern);
3330                 AllowInput(owner->view());
3331  
3332                 // check selected filename
3333                 if (filename.empty()) 
3334                         owner->getMiniBuffer()->Set(_("Canceled."));
3335         }
3336
3337         // still no filename? abort
3338         if (filename.empty()) 
3339                 return;
3340
3341         // get absolute path of file
3342         filename = MakeAbsPath(filename);
3343
3344         string lyxfile = ChangeExtension(filename, ".lyx");
3345
3346         // Check if the document already is open
3347         if (bufferlist.exists(lyxfile)) {
3348                 switch(AskConfirmation(_("Document is already open:"), 
3349                                        MakeDisplayPath(lyxfile, 50),
3350                                        _("Do you want to close that document now?\n"
3351                                          "('No' will just switch to the open version)")))
3352                         {
3353                         case 1: // Yes: close the document
3354                                 if (!bufferlist.close(bufferlist.getBuffer(lyxfile)))
3355                                 // If close is canceled, we cancel here too.
3356                                         return;
3357                                 break;
3358                         case 2: // No: switch to the open document
3359                                 owner->view()->buffer(bufferlist.getBuffer(lyxfile));
3360                                 return;
3361                         case 3: // Cancel: Do nothing
3362                                 owner->getMiniBuffer()->Set(_("Canceled."));
3363                                 return;
3364                         }
3365         }
3366
3367         // Check if a LyX document by the same root exists in filesystem
3368         FileInfo f(lyxfile, true);
3369         if (f.exist() && !AskQuestion(_("A document by the name"), 
3370                                       MakeDisplayPath(lyxfile),
3371                                       _("already exists. Overwrite?"))) {
3372                 owner->getMiniBuffer()->Set(_("Canceled."));
3373                 return;
3374         }
3375         // filename should be valid now
3376
3377         // notify user of import ahead
3378         string displaypath = MakeDisplayPath(filename);
3379         owner->getMiniBuffer()->Set(_("Importing"), displaypath, "...");
3380
3381         // call real importer
3382         bool result = func(owner->view(), filename);
3383
3384         // we are done
3385         if (result)
3386                 owner->getMiniBuffer()->Set(displaypath, _("imported."));
3387         else
3388                 owner->getMiniBuffer()->Set(displaypath, _(": import failed."));
3389 }
3390
3391 static
3392 bool doImportASCIIasLines(BufferView * view, string const & filename)
3393 {
3394         view->buffer(bufferlist.newFile(filename, string()));
3395         InsertAsciiFile(view, filename, false);
3396         return true;
3397 }
3398
3399 static
3400 bool doImportASCIIasParagraphs(BufferView * view, string const & filename)
3401 {
3402         view->buffer(bufferlist.newFile(filename, string()));
3403         InsertAsciiFile(view, filename, true);
3404         return true;
3405 }
3406
3407 static
3408 bool doImportLaTeX(BufferView * view, string const & filename)
3409 {
3410         ImportLaTeX myImport(filename);
3411         Buffer * openbuf = myImport.run();
3412         if (openbuf) { 
3413                 view->buffer(openbuf);
3414                 return true;
3415         }
3416         else
3417                 return false;
3418 }
3419
3420 static
3421 bool doImportNoweb(BufferView * view, string const & filename)
3422 {
3423         ImportNoweb myImport(filename);
3424         Buffer * openbuf = myImport.run();
3425         if (openbuf) { 
3426                 view->buffer(openbuf);
3427                 return true;
3428         }
3429         else
3430                 return false;
3431 }
3432
3433 static
3434 bool doImportLinuxDoc(BufferView *, string const & filename)
3435 {
3436         // run sgml2lyx
3437         string tmp = lyxrc.linuxdoc_to_lyx_command + filename;
3438         Systemcalls one;
3439         Buffer * buf = 0;
3440
3441         int result = one.startscript(Systemcalls::System, tmp);
3442         if (result == 0) {
3443                 string filename = ChangeExtension(filename, ".lyx");
3444                 // File was generated without problems. Load it.
3445                 buf = bufferlist.loadLyXFile(filename);
3446         }
3447
3448         return result == 0;
3449 }
3450
3451
3452 void LyXFunc::MenuInsertLyXFile(string const & filen)
3453 {
3454         string filename = filen;
3455
3456         if (filename.empty()) {
3457                 // Launch a file browser
3458                 string initpath = lyxrc.document_path;
3459                 LyXFileDlg fileDlg;
3460
3461                 if (owner->view()->available()) {
3462                         string trypath = owner->buffer()->filepath;
3463                         // If directory is writeable, use this as default.
3464                         if (IsDirWriteable(trypath) == 1)
3465                                 initpath = trypath;
3466                 }
3467
3468                 // launches dialog
3469                 ProhibitInput(owner->view());
3470                 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3471                 fileDlg.SetButton(1, _("Examples"), 
3472                                   AddPath(system_lyxdir, "examples"));
3473                 filename = fileDlg.Select(_("Select Document to Insert"),
3474                                           initpath, "*.lyx");
3475                 AllowInput(owner->view());
3476
3477                 // check selected filename
3478                 if (filename.empty()) {
3479                         owner->getMiniBuffer()->Set(_("Canceled."));
3480                         return;
3481                 }
3482         } 
3483
3484         // get absolute path of file and make sure the filename ends
3485         // with .lyx
3486         filename = MakeAbsPath(filename);
3487         if (!IsLyXFilename(filename))
3488                 filename += ".lyx";
3489
3490         // Inserts document
3491         owner->getMiniBuffer()->Set(_("Inserting document"),
3492                                     MakeDisplayPath(filename), "...");
3493         bool res = owner->view()->insertLyXFile(filename);
3494         if (res) {
3495                 owner->getMiniBuffer()->Set(_("Document"),
3496                                             MakeDisplayPath(filename),
3497                                             _("inserted."));
3498         } else {
3499                 owner->getMiniBuffer()->Set(_("Could not insert document"),
3500                                             MakeDisplayPath(filename));
3501         }
3502 }
3503
3504 void LyXFunc::doImport(string const & argument)
3505 {
3506         string type;
3507         string filename = split(argument, type, ' ');
3508         lyxerr.debug() << "LyXFunc::doImport: " << type 
3509                        << " file: " << filename << endl;
3510
3511         if (type == "latex") 
3512                 doImportHelper(filename,
3513                                _("Select LaTeX file to import"), "*.tex", 
3514                                doImportLaTeX);
3515         else if (type == "ascii") 
3516                 doImportHelper(filename,
3517                                _("Select ASCII file to import"), "*.txt", 
3518                                doImportASCIIasLines);
3519         else if (type == "asciiparagraph") 
3520                 doImportHelper(filename,
3521                                _("Select ASCII file to import"), "*.txt", 
3522                                doImportASCIIasParagraphs);
3523         else if (type == "noweb") 
3524                 doImportHelper(filename,
3525                                _("Select NoWeb file to import"), "*.nw", 
3526                                doImportNoweb);
3527         else if (type == "linuxdoc") 
3528                 doImportHelper(filename,
3529                                _("Select LinuxDoc file to import"), "*.doc", 
3530                                doImportLinuxDoc);
3531         else 
3532                 setErrorMessage(string(N_("Unknown import type: ")) + type);
3533 }
3534
3535 void LyXFunc::reloadBuffer()
3536 {
3537         string fn = owner->buffer()->fileName();
3538         if (bufferlist.close(owner->buffer()))
3539                 owner->view()->buffer(bufferlist.loadLyXFile(fn));
3540 }
3541
3542
3543 void LyXFunc::CloseBuffer()
3544 {
3545         if (bufferlist.close(owner->buffer()) && !quitting) {
3546                 if (bufferlist.empty()) {
3547                         // need this otherwise SEGV may occur while trying to
3548                         // set variables that don't exist
3549                         // since there's no current buffer
3550                         owner->getDialogs()->hideBufferDependent();
3551                 }
3552                 else {
3553                         owner->view()->buffer(bufferlist.first());
3554                 }
3555         }
3556 }
3557
3558
3559 Inset * LyXFunc::getInsetByCode(Inset::Code code)
3560 {
3561         LyXCursor cursor = owner->view()->text->cursor;
3562         Buffer * buffer = owner->view()->buffer();
3563         for (Buffer::inset_iterator it = Buffer::inset_iterator(cursor.par(),
3564                                                                 cursor.pos());
3565              it != buffer->inset_iterator_end(); ++it) {
3566                 if ((*it)->LyxCode() == code)
3567                         return *it;
3568         }
3569         return 0;
3570 }
3571
3572
3573 // Each "owner" should have it's own message method. lyxview and
3574 // the minibuffer would use the minibuffer, but lyxserver would
3575 // send an ERROR signal to its client.  Alejandro 970603
3576 // This func is bit problematic when it comes to NLS, to make the
3577 // lyx servers client be language indepenent we must not translate
3578 // strings sent to this func.
3579 void LyXFunc::setErrorMessage(string const & m) const
3580 {
3581         dispatch_buffer = m;
3582         errorstat = true;
3583 }
3584
3585
3586 void LyXFunc::setMessage(string const & m)
3587 {
3588         dispatch_buffer = m;
3589 }