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