]> git.lyx.org Git - lyx.git/blob - src/lyxfunc.C
1d82d1de9aa69ee002428d78cd7e48b5db24c44e
[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         case LFUN_HELP_COPYRIGHT:
1190                 owner->getDialogs()->showCopyright();
1191                 break;
1192
1193         case LFUN_HELP_CREDITS:
1194                 owner->getDialogs()->showCredits();
1195                 break;
1196
1197         case LFUN_HELP_OPEN: {
1198                 string arg = argument;
1199                 if (arg.empty()) {
1200                         setErrorMessage(N_("Missing argument"));
1201                         break;
1202                 }
1203                 ProhibitInput(owner->view());
1204                 string fname = i18nLibFileSearch("doc", arg, "lyx");
1205                 if (fname.empty()) {
1206                         lyxerr << "LyX: unable to find documentation file `"
1207                                << arg << "'. Bad installation?" << endl;
1208                         AllowInput(owner->view());
1209                         break;
1210                 }
1211                 owner->getMiniBuffer()->Set(_("Opening help file"),
1212                                             MakeDisplayPath(fname),"...");
1213                 owner->view()->buffer(bufferlist.loadLyXFile(fname,false));
1214                 AllowInput(owner->view());
1215                 break;
1216         }
1217
1218         case LFUN_HELP_VERSION: {
1219                 ProhibitInput(owner->view());
1220                 string msg(_("LyX Version "));
1221                 msg += LYX_VERSION;
1222                 msg += " of ";
1223                 msg += LYX_RELEASE;
1224                 fl_show_message(msg.c_str(),
1225                                 (_("Library directory: ")
1226                                  + MakeDisplayPath(system_lyxdir)).c_str(),
1227                                 (_("User directory: ") 
1228                                  + MakeDisplayPath(user_lyxdir)).c_str());
1229                 AllowInput(owner->view());
1230                 break;
1231         }
1232         
1233                 // --- version control -------------------------------
1234         case LFUN_VC_REGISTER:
1235         {
1236                 if (!owner->buffer()->lyxvc.inUse())
1237                         owner->buffer()->lyxvc.registrer();
1238         }
1239         break;
1240                 
1241         case LFUN_VC_CHECKIN:
1242         {
1243                 if (owner->buffer()->lyxvc.inUse()
1244                     && !owner->buffer()->isReadonly())
1245                         owner->buffer()->lyxvc.checkIn();
1246         }
1247         break;
1248                 
1249         case LFUN_VC_CHECKOUT:
1250         {
1251                 if (owner->buffer()->lyxvc.inUse()
1252                     && owner->buffer()->isReadonly())
1253                         owner->buffer()->lyxvc.checkOut();
1254         }
1255         break;
1256         
1257         case LFUN_VC_REVERT:
1258         {
1259                 owner->buffer()->lyxvc.revert();
1260         }
1261         break;
1262                 
1263         case LFUN_VC_UNDO:
1264         {
1265                 owner->buffer()->lyxvc.undoLast();
1266         }
1267         break;
1268                 
1269         case LFUN_VC_HISTORY:
1270         {
1271                 owner->buffer()->lyxvc.showLog();
1272                 break;
1273         }
1274         
1275         // --- buffers ----------------------------------------
1276
1277         case LFUN_SWITCHBUFFER:
1278                 owner->view()->buffer(bufferlist.getBuffer(argument));
1279                 break;
1280
1281
1282         case LFUN_FILE_INSERT:
1283         {
1284                 MenuInsertLyXFile(argument);
1285         }
1286         break;
1287         
1288         case LFUN_FILE_INSERT_ASCII:
1289         {
1290                 bool asPara = (argument == "paragraph");
1291                 InsertAsciiFile(owner->view(), string(), asPara);
1292         }
1293         break;
1294         
1295         case LFUN_FILE_NEW:
1296         {
1297                 // servercmd: argument must be <file>:<template>
1298                 Buffer * tmpbuf = NewLyxFile(argument);
1299                 if (tmpbuf)
1300                         owner->view()->buffer(tmpbuf);
1301         }
1302         break;
1303                         
1304         case LFUN_FILE_OPEN:
1305                 owner->view()->buffer(bufferlist.loadLyXFile(argument));
1306                 break;
1307
1308         case LFUN_LATEX_LOG:
1309                 ShowLatexLog();
1310                 break;
1311                 
1312         case LFUN_LAYOUTNO:
1313         {
1314                 lyxerr.debug() << "LFUN_LAYOUTNO: (arg) " << argument << endl;
1315                 int sel = strToInt(argument);
1316                 lyxerr.debug() << "LFUN_LAYOUTNO: (sel) "<< sel << endl;
1317                 
1318                 // Should this give a setMessage instead?
1319                 if (sel == 0) 
1320                         return string(); // illegal argument
1321
1322                 --sel; // sel 1..., but layout 0...
1323
1324                 // Pretend we got the name instead.
1325                 Dispatch(int(LFUN_LAYOUT), 
1326                          textclasslist.NameOfLayout(owner->view()
1327                                                     ->buffer()->params.textclass,
1328                                                     sel));
1329                 return string();
1330         }
1331                 
1332         case LFUN_LAYOUT:
1333         {
1334                 lyxerr.debug() << "LFUN_LAYOUT: (arg) "
1335                                << argument << endl;
1336                 
1337                 // Derive layout number from given argument (string)
1338                 // and current buffer's textclass (number). */    
1339                 LyXTextClassList::ClassList::size_type tclass =
1340                         owner->view()->buffer()->params.textclass;
1341                 pair <bool, LyXTextClass::size_type> layout = 
1342                         textclasslist.NumberOfLayout(tclass, argument);
1343
1344                 // If the entry is obsolete, use the new one instead.
1345                 if (layout.first) {
1346                         string obs = textclasslist.Style(tclass,layout.second)
1347                               .obsoleted_by();
1348                         if (!obs.empty()) 
1349                                 layout = 
1350                                   textclasslist.NumberOfLayout(tclass, obs);
1351                 }
1352
1353                 // see if we found the layout number:
1354                 if (!layout.first) {
1355                         setErrorMessage(string(N_("Layout ")) + argument + 
1356                                         N_(" not known"));
1357                         break;
1358                 }
1359
1360                 if (current_layout != layout.second) {
1361                         owner->view()->hideCursor();
1362                         current_layout = layout.second;
1363                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1364                         owner->view()->text->
1365                                 SetLayout(owner->view(), layout.second);
1366                         owner->setLayout(layout.second);
1367                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1368                         owner->view()->setState();
1369                 }
1370         }
1371         break;
1372
1373         case LFUN_LAYOUT_DOCUMENT:
1374                 owner->getDialogs()->showLayoutDocument();
1375                 break;
1376                 
1377         case LFUN_LAYOUT_PARAGRAPH:
1378 #ifdef USE_OLD_PARAGRAPH_LAYOUT
1379                 MenuLayoutParagraph();
1380 #else
1381                 owner->getDialogs()->showLayoutParagraph();
1382 #endif
1383                 break;
1384                 
1385         case LFUN_LAYOUT_CHARACTER:
1386                 MenuLayoutCharacter();
1387                 break;
1388
1389         case LFUN_LAYOUT_TABULAR:
1390             if (owner->view()->theLockingInset()) {
1391                 if (owner->view()->theLockingInset()->LyxCode()==Inset::TABULAR_CODE) {
1392                     InsetTabular * inset = static_cast<InsetTabular *>
1393                         (owner->view()->theLockingInset());
1394                     inset->OpenLayoutDialog(owner->view());
1395                 } else if (owner->view()->theLockingInset()->
1396                            GetFirstLockingInsetOfType(Inset::TABULAR_CODE)!=0) {
1397                     InsetTabular * inset = static_cast<InsetTabular *>(
1398                         owner->view()->theLockingInset()->GetFirstLockingInsetOfType(Inset::TABULAR_CODE));
1399                     inset->OpenLayoutDialog(owner->view());
1400                 }
1401             }
1402             break;
1403
1404         case LFUN_LAYOUT_PREAMBLE:
1405                 MenuLayoutPreamble();
1406                 break;
1407                 
1408         case LFUN_LAYOUT_SAVE_DEFAULT:
1409                 MenuLayoutSave();
1410                 break;
1411                 
1412         case LFUN_DROP_LAYOUTS_CHOICE:
1413                 owner->getToolbar()->openLayoutList();
1414                 break;
1415
1416         case LFUN_LANGUAGE:
1417                 Lang(owner->view(), argument);
1418                 owner->view()->setState();
1419                 owner->showState();
1420                 break;
1421
1422         case LFUN_EMPH:
1423                 Emph(owner->view());
1424                 owner->showState();
1425                 break;
1426
1427         case LFUN_BOLD:
1428                 Bold(owner->view());
1429                 owner->showState();
1430                 break;
1431                 
1432         case LFUN_NOUN:
1433                 Noun(owner->view());
1434                 owner->showState();
1435                 break;
1436                 
1437         case LFUN_CODE:
1438                 Code(owner->view());
1439                 owner->showState();
1440                 break;
1441                 
1442         case LFUN_SANS:
1443                 Sans(owner->view());
1444                 owner->showState();
1445                 break;
1446                 
1447         case LFUN_ROMAN:
1448                 Roman(owner->view());
1449                 owner->showState();
1450                 break;
1451                 
1452         case LFUN_DEFAULT:
1453                 StyleReset(owner->view());
1454                 owner->showState();
1455                 break;
1456                 
1457         case LFUN_UNDERLINE:
1458                 Underline(owner->view());
1459                 owner->showState();
1460                 break;
1461                 
1462         case LFUN_FONT_SIZE:
1463                 FontSize(owner->view(), argument);
1464                 owner->showState();
1465                 break;
1466                 
1467         case LFUN_FONT_STATE:
1468                 setMessage(CurrentState(owner->view()));
1469                 break;
1470                 
1471         case LFUN_UPCASE_WORD:
1472                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1473                 text->ChangeWordCase(owner->view(), LyXText::text_uppercase);
1474                 if (text->inset_owner)
1475                     owner->view()->updateInset(text->inset_owner, true);
1476                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1477                 break;
1478                 
1479         case LFUN_LOWCASE_WORD:
1480                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1481                 text->ChangeWordCase(owner->view(), LyXText::text_lowercase);
1482                 if (text->inset_owner)
1483                     owner->view()->updateInset(text->inset_owner, true);
1484                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1485                 break;
1486                 
1487         case LFUN_CAPITALIZE_WORD:
1488                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1489                 text->ChangeWordCase(owner->view(),
1490                                      LyXText::text_capitalization);
1491                 if (text->inset_owner)
1492                     owner->view()->updateInset(text->inset_owner, true);
1493                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1494                 break;
1495                 
1496         case LFUN_INSERT_LABEL:
1497                 MenuInsertLabel(argument);
1498                 break;
1499                 
1500         case LFUN_REF_INSERT:
1501                 if (argument.empty()) {
1502                         InsetCommandParams p("ref");
1503                 owner->getDialogs()->createRef(p.getAsString());
1504                 } else {
1505                         InsetCommandParams p;
1506                         p.setFromString(argument);
1507
1508                         InsetRef * inset = new InsetRef(p, *owner->buffer());
1509                         if (!owner->view()->insertInset(inset))
1510                                 delete inset;
1511                         else
1512                                 owner->view()->updateInset(inset, true);
1513                 }
1514                 break;
1515
1516         case LFUN_REF_BACK:
1517         {
1518                 owner->view()->restorePosition();
1519         }
1520         break;
1521
1522         case LFUN_REF_GOTO:
1523         {
1524                 string label(argument);
1525                 if (label.empty()) {
1526                         InsetRef * inset = 
1527                                 static_cast<InsetRef*>(getInsetByCode(Inset::REF_CODE));
1528                         if (inset)
1529                                 label = inset->getContents();
1530                 }
1531                 
1532                 if (!label.empty()) {
1533                         owner->view()->savePosition();
1534                         if (!owner->view()->gotoLabel(label))
1535                                 WriteAlert(_("Error"), 
1536                                            _("Couldn't find this label"), 
1537                                            _("in current document."));
1538                 }
1539         }
1540         break;
1541                 
1542         case LFUN_MENU_OPEN_BY_NAME:
1543                 owner->getMenubar()->openByName(argument);
1544                 break; // RVDK_PATCH_5
1545                 
1546         case LFUN_SPELLCHECK:
1547                 if (lyxrc.isp_command != "none")
1548                         ShowSpellChecker(owner->view());
1549                 break; // RVDK_PATCH_5
1550                 
1551                 // --- Cursor Movements -----------------------------
1552         case LFUN_RIGHT:
1553         {
1554                 LyXText * tmptext = owner->view()->text;
1555                 bool is_rtl = tmptext->cursor.par()->isRightToLeftPar(owner->buffer()->params);
1556                 if(!tmptext->mark_set)
1557                         owner->view()->beforeChange();
1558                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1559                 if (is_rtl)
1560                         tmptext->CursorLeft(owner->view(), false);
1561                 if (tmptext->cursor.pos() < tmptext->cursor.par()->Last()
1562                     && tmptext->cursor.par()->GetChar(tmptext->cursor.pos())
1563                     == LyXParagraph::META_INSET
1564                     && tmptext->cursor.par()->GetInset(tmptext->cursor.pos())
1565                     && tmptext->cursor.par()->GetInset(tmptext->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE){
1566                         Inset * tmpinset = tmptext->cursor.par()->GetInset(tmptext->cursor.pos());
1567                         setMessage(tmpinset->EditMessage());
1568                         tmpinset->Edit(owner->view(), 0, 0, 0);
1569                         break;
1570                 }
1571                 if (!is_rtl)
1572                         tmptext->CursorRight(owner->view(), false);
1573                 owner->view()->text->FinishUndo();
1574                 moveCursorUpdate(false);
1575                 owner->showState();
1576         }
1577         break;
1578                 
1579         case LFUN_LEFT:
1580         {
1581                 // This is soooo ugly. Isn`t it possible to make
1582                 // it simpler? (Lgb)
1583                 LyXText * txt = owner->view()->text;
1584                 bool is_rtl = txt->cursor.par()->isRightToLeftPar(owner->buffer()->params);
1585                 if(!txt->mark_set) owner->view()->beforeChange();
1586                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1587                 LyXCursor cur = txt->cursor;
1588                 if (!is_rtl)
1589                         txt->CursorLeft(owner->view(), false);
1590                 if ((cur != txt->cursor) && // only if really moved!
1591                     txt->cursor.pos() < txt->cursor.par()->Last() &&
1592                     (txt->cursor.par()->GetChar(txt->cursor.pos()) ==
1593                      LyXParagraph::META_INSET) &&
1594                     txt->cursor.par()->GetInset(txt->cursor.pos()) &&
1595                     (txt->cursor.par()->GetInset(txt->cursor.pos())->Editable()
1596                      == Inset::HIGHLY_EDITABLE))
1597                 {
1598                         Inset * tmpinset = txt->cursor.par()->GetInset(txt->cursor.pos());
1599                         setMessage(tmpinset->EditMessage());
1600                         LyXFont font = txt->GetFont(owner->view()->buffer(),
1601                                                     txt->cursor.par(),
1602                                                     txt->cursor.pos());
1603                         tmpinset->Edit(owner->view(),
1604                                        tmpinset->x() +
1605                                        tmpinset->width(owner->view(),font),
1606                                        tmpinset->descent(owner->view(),font),
1607                                        0);
1608                         break;
1609                 }
1610                 if  (is_rtl)
1611                         txt->CursorRight(owner->view(), false);
1612
1613                 owner->view()->text->FinishUndo();
1614                 moveCursorUpdate(false);
1615                 owner->showState();
1616         }
1617         break;
1618                 
1619         case LFUN_UP:
1620                 if(!owner->view()->text->mark_set) owner->view()->beforeChange();
1621                 owner->view()->update(BufferView::UPDATE);
1622                 owner->view()->text->CursorUp(owner->view());
1623                 owner->view()->text->FinishUndo();
1624                 moveCursorUpdate(false);
1625                 owner->showState();
1626                 break;
1627                 
1628         case LFUN_DOWN:
1629                 if(!owner->view()->text->mark_set)
1630                         owner->view()->beforeChange();
1631                 owner->view()->update(BufferView::UPDATE);
1632                 owner->view()->text->CursorDown(owner->view());
1633                 owner->view()->text->FinishUndo();
1634                 moveCursorUpdate(false);
1635                 owner->showState();
1636                 break;
1637
1638         case LFUN_UP_PARAGRAPH:
1639                 if(!owner->view()->text->mark_set)
1640                         owner->view()->beforeChange();
1641                 owner->view()->update(BufferView::UPDATE);
1642                 owner->view()->text->CursorUpParagraph(owner->view());
1643                 owner->view()->text->FinishUndo();
1644                 moveCursorUpdate(false);
1645                 owner->showState();
1646                 break;
1647                 
1648         case LFUN_DOWN_PARAGRAPH:
1649                 if(!owner->view()->text->mark_set)
1650                         owner->view()->beforeChange();
1651                 owner->view()->update(BufferView::UPDATE);
1652                 owner->view()->text->CursorDownParagraph(owner->view());
1653                 owner->view()->text->FinishUndo();
1654                 moveCursorUpdate(false);
1655                 owner->showState();
1656                 break;
1657                 
1658         case LFUN_PRIOR:
1659                 if(!text->mark_set)
1660                     owner->view()->beforeChange();
1661                 owner->view()->update(BufferView::UPDATE);
1662                 owner->view()->cursorPrevious(text);
1663                 owner->view()->text->FinishUndo();
1664                 if (text->inset_owner)
1665                     owner->view()->updateInset(text->inset_owner, false);
1666                 else
1667                     moveCursorUpdate(false);
1668                 owner->showState();
1669                 break;
1670                 
1671         case LFUN_NEXT:
1672                 if(!text->mark_set)
1673                         owner->view()->beforeChange();
1674                 owner->view()->update(BufferView::UPDATE);
1675                 owner->view()->cursorNext(text);
1676                 owner->view()->text->FinishUndo();
1677                 if (text->inset_owner)
1678                     owner->view()->updateInset(text->inset_owner, false);
1679                 else
1680                     moveCursorUpdate(false);
1681                 owner->showState();
1682                 break;
1683                 
1684         case LFUN_HOME:
1685                 if(!owner->view()->text->mark_set)
1686                         owner->view()->beforeChange();
1687                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1688                 owner->view()->text->CursorHome(owner->view());
1689                 owner->view()->text->FinishUndo();
1690                 moveCursorUpdate(false);
1691                 owner->showState();
1692                 break;
1693                 
1694         case LFUN_END:
1695                 if(!owner->view()->text->mark_set)
1696                         owner->view()->beforeChange();
1697                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1698                 owner->view()->text->CursorEnd(owner->view());
1699                 owner->view()->text->FinishUndo();
1700                 moveCursorUpdate(false);
1701                 owner->showState();
1702                 break;
1703                 
1704         case LFUN_SHIFT_TAB:
1705         case LFUN_TAB:
1706                 if(!owner->view()->text->mark_set)
1707                         owner->view()->beforeChange();
1708                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1709                 owner->view()->text->CursorTab(owner->view());
1710                 owner->view()->text->FinishUndo();
1711                 moveCursorUpdate(false);
1712                 owner->showState();
1713                 break;
1714                 
1715         case LFUN_WORDRIGHT:
1716                 if(!text->mark_set)
1717                         owner->view()->beforeChange();
1718                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1719                 if (text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1720                         text->CursorLeftOneWord(owner->view());
1721                 else
1722                         text->CursorRightOneWord(owner->view());
1723                 owner->view()->text->FinishUndo();
1724                 if (text->inset_owner)
1725                     owner->view()->updateInset(text->inset_owner, true);
1726                 moveCursorUpdate(false);
1727                 owner->showState();
1728                 break;
1729                 
1730         case LFUN_WORDLEFT:
1731                 if(!text->mark_set)
1732                         owner->view()->beforeChange();
1733                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1734                 if (text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1735                         text->CursorRightOneWord(owner->view());
1736                 else
1737                         text->CursorLeftOneWord(owner->view());
1738                 owner->view()->text->FinishUndo();
1739                 if (text->inset_owner)
1740                     owner->view()->updateInset(text->inset_owner, true);
1741                 moveCursorUpdate(false);
1742                 owner->showState();
1743                 break;
1744                 
1745         case LFUN_BEGINNINGBUF:
1746                 if(!owner->view()->text->mark_set)
1747                         owner->view()->beforeChange();
1748                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1749                 owner->view()->text->CursorTop(owner->view());
1750                 owner->view()->text->FinishUndo();
1751                 moveCursorUpdate(false);
1752                 owner->showState();
1753                 break;
1754                 
1755         case LFUN_ENDBUF:
1756                 if(!owner->view()->text->mark_set)
1757                         owner->view()->beforeChange();
1758                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1759                 owner->view()->text->CursorBottom(owner->view());
1760                 owner->view()->text->FinishUndo();
1761                 moveCursorUpdate(false);
1762                 owner->showState();
1763                 break;
1764
1765       
1766                 /* cursor selection ---------------------------- */
1767         case LFUN_RIGHTSEL:
1768                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1769                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1770                         owner->view()->text->CursorLeft(owner->view());
1771                 else
1772                         owner->view()->text->CursorRight(owner->view());
1773                 owner->view()->text->FinishUndo();
1774                 moveCursorUpdate(true);
1775                 owner->showState();
1776                 break;
1777                 
1778         case LFUN_LEFTSEL:
1779                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1780                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1781                         owner->view()->text->CursorRight(owner->view());
1782                 else
1783                         owner->view()->text->CursorLeft(owner->view());
1784                 owner->view()->text->FinishUndo();
1785                 moveCursorUpdate(true);
1786                 owner->showState();
1787                 break;
1788                 
1789         case LFUN_UPSEL:
1790                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1791                 owner->view()->text->CursorUp(owner->view());
1792                 owner->view()->text->FinishUndo();
1793                 moveCursorUpdate(true);
1794                 owner->showState();
1795                 break;
1796                 
1797         case LFUN_DOWNSEL:
1798                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1799                 owner->view()->text->CursorDown(owner->view());
1800                 owner->view()->text->FinishUndo();
1801                 moveCursorUpdate(true);
1802                 owner->showState();
1803                 break;
1804
1805         case LFUN_UP_PARAGRAPHSEL:
1806                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1807                 owner->view()->text->CursorUpParagraph(owner->view());
1808                 owner->view()->text->FinishUndo();
1809                 moveCursorUpdate(true);
1810                 owner->showState();
1811                 break;
1812                 
1813         case LFUN_DOWN_PARAGRAPHSEL:
1814                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1815                 owner->view()->text->CursorDownParagraph(owner->view());
1816                 owner->view()->text->FinishUndo();
1817                 moveCursorUpdate(true);
1818                 owner->showState();
1819                 break;
1820                 
1821         case LFUN_PRIORSEL:
1822                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1823                 owner->view()->cursorPrevious(text);
1824                 owner->view()->text->FinishUndo();
1825                 if (text->inset_owner)
1826                     owner->view()->updateInset(text->inset_owner, false);
1827                 else
1828                     moveCursorUpdate(true);
1829                 owner->showState();
1830                 break;
1831                 
1832         case LFUN_NEXTSEL:
1833                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1834                 owner->view()->cursorNext(text);
1835                 owner->view()->text->FinishUndo();
1836                 if (text->inset_owner)
1837                     owner->view()->updateInset(text->inset_owner, false);
1838                 else
1839                     moveCursorUpdate(true);
1840                 owner->showState();
1841                 break;
1842                 
1843         case LFUN_HOMESEL:
1844                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1845                 owner->view()->text->CursorHome(owner->view());
1846                 owner->view()->text->FinishUndo();
1847                 moveCursorUpdate(true);
1848                 owner->showState();
1849                 break;
1850                 
1851         case LFUN_ENDSEL:
1852                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1853                 owner->view()->text->CursorEnd(owner->view());
1854                 owner->view()->text->FinishUndo();
1855                 moveCursorUpdate(true);
1856                 owner->showState();
1857                 break;
1858                 
1859         case LFUN_WORDRIGHTSEL:
1860                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1861                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1862                         owner->view()->text->CursorLeftOneWord(owner->view());
1863                 else
1864                         owner->view()->text->CursorRightOneWord(owner->view());
1865                 owner->view()->text->FinishUndo();
1866                 moveCursorUpdate(true);
1867                 owner->showState();
1868                 break;
1869                 
1870         case LFUN_WORDLEFTSEL:
1871                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1872                 if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
1873                         owner->view()->text->CursorRightOneWord(owner->view());
1874                 else
1875                         owner->view()->text->CursorLeftOneWord(owner->view());
1876                 owner->view()->text->FinishUndo();
1877                 moveCursorUpdate(true);
1878                 owner->showState();
1879                 break;
1880                 
1881         case LFUN_BEGINNINGBUFSEL:
1882                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1883                 owner->view()->text->CursorTop(owner->view());
1884                 owner->view()->text->FinishUndo();
1885                 moveCursorUpdate(true);
1886                 owner->showState();
1887                 break;
1888                 
1889         case LFUN_ENDBUFSEL:
1890                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1891                 owner->view()->text->CursorBottom(owner->view());
1892                 owner->view()->text->FinishUndo();
1893                 moveCursorUpdate(true);
1894                 owner->showState();
1895                 break;
1896
1897                 // --- text changing commands ------------------------
1898         case LFUN_BREAKLINE:
1899                 owner->view()->beforeChange();
1900                 owner->view()->text->InsertChar(owner->view(), LyXParagraph::META_NEWLINE);
1901                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1902                 moveCursorUpdate(false);
1903                 break;
1904                 
1905         case LFUN_PROTECTEDSPACE:
1906         {
1907                 LyXLayout const & style =
1908                         textclasslist.Style(owner->view()->buffer()->params.textclass,
1909                                             owner->view()->text->cursor.par()->GetLayout());
1910
1911                 if (style.free_spacing) {
1912                         owner->view()->text->InsertChar(owner->view(), ' ');
1913                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1914                 } else {
1915                         owner->view()->protectedBlank();
1916                 }
1917                 moveCursorUpdate(false);
1918         }
1919         break;
1920                 
1921         case LFUN_SETMARK:
1922                 if(text->mark_set) {
1923                         owner->view()->beforeChange();
1924                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1925                         setMessage(N_("Mark removed"));
1926                 } else {
1927                         owner->view()->beforeChange();
1928                         text->mark_set = 1;
1929                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
1930                         setMessage(N_("Mark set"));
1931                 }
1932                 text->sel_cursor = text->cursor;
1933                 if (text->inset_owner)
1934                     owner->view()->updateInset(text->inset_owner, true);
1935                 break;
1936                 
1937         case LFUN_DELETE:
1938                 if (!owner->view()->text->selection) {
1939                         owner->view()->text->Delete(owner->view());
1940                         owner->view()->text->sel_cursor = 
1941                                 owner->view()->text->cursor;
1942                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1943                         // It is possible to make it a lot faster still
1944                         // just comment out the lone below...
1945                         owner->view()->showCursor();
1946                 } else {
1947                         owner->view()->cut();
1948                 }
1949                 moveCursorUpdate(false);
1950                 owner->showState();
1951                 owner->view()->setState();
1952                 break;
1953
1954         case LFUN_DELETE_SKIP:
1955         {
1956                 // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
1957                 
1958                 LyXCursor cursor = owner->view()->text->cursor;
1959
1960                 if (!owner->view()->text->selection) {
1961                         if (cursor.pos() == cursor.par()->Last()) {
1962                                 owner->view()->text->CursorRight(owner->view());
1963                                 cursor = owner->view()->text->cursor;
1964                                 if (cursor.pos() == 0
1965                                     && !(cursor.par()->added_space_top 
1966                                          == VSpace (VSpace::NONE))) {
1967                                         owner->view()->text->SetParagraph
1968                                                 (owner->view(),
1969                                                  cursor.par()->line_top,
1970                                                  cursor.par()->line_bottom,
1971                                                  cursor.par()->pagebreak_top, 
1972                                                  cursor.par()->pagebreak_bottom,
1973                                                  VSpace(VSpace::NONE), 
1974                                                  cursor.par()->added_space_bottom,
1975                                                  cursor.par()->align, 
1976                                                  cursor.par()->labelwidthstring, 0);
1977                                         owner->view()->text->CursorLeft(owner->view());
1978                                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1979                                 } else {
1980                                         owner->view()->text->CursorLeft(owner->view());
1981                                         owner->view()->text->Delete(owner->view());
1982                                         owner->view()->text->sel_cursor = 
1983                                                 owner->view()->text->cursor;
1984                                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1985                                 }
1986                         } else {
1987                                 owner->view()->text->Delete(owner->view());
1988                                 owner->view()->text->sel_cursor = 
1989                                         owner->view()->text->cursor;
1990                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1991                         }
1992                 } else {
1993                         owner->view()->cut();
1994                 }
1995         }
1996         break;
1997
1998         /* -------> Delete word forward. */
1999         case LFUN_DELETE_WORD_FORWARD:
2000                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2001                 text->DeleteWordForward(owner->view());
2002                 if (text->inset_owner)
2003                     owner->view()->updateInset(text->inset_owner, true);
2004                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2005                 moveCursorUpdate(false);
2006                 owner->showState();
2007                 break;
2008
2009                 /* -------> Delete word backward. */
2010         case LFUN_DELETE_WORD_BACKWARD:
2011                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2012                 text->DeleteWordBackward(owner->view());
2013                 if (text->inset_owner)
2014                     owner->view()->updateInset(text->inset_owner, true);
2015                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2016                 moveCursorUpdate(false);
2017                 owner->showState();
2018                 break;
2019                 
2020                 /* -------> Kill to end of line. */
2021         case LFUN_DELETE_LINE_FORWARD:
2022                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2023                 text->DeleteLineForward(owner->view());
2024                 if (text->inset_owner)
2025                     owner->view()->updateInset(text->inset_owner, true);
2026                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2027                 moveCursorUpdate(false);
2028                 break;
2029                 
2030                 /* -------> Set mark off. */
2031         case LFUN_MARK_OFF:
2032                 owner->view()->beforeChange();
2033                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2034                 text->sel_cursor = text->cursor;
2035                 setMessage(N_("Mark off"));
2036                 if (text->inset_owner)
2037                     owner->view()->updateInset(text->inset_owner, true);
2038                 break;
2039
2040                 /* -------> Set mark on. */
2041         case LFUN_MARK_ON:
2042                 owner->view()->beforeChange();
2043                 owner->view()->text->mark_set = 1;
2044                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
2045                 text->sel_cursor = text->cursor;
2046                 if (text->inset_owner)
2047                     owner->view()->updateInset(text->inset_owner, true);
2048                 setMessage(N_("Mark on"));
2049                 break;
2050                 
2051         case LFUN_BACKSPACE:
2052         {
2053                 if (!owner->view()->text->selection) {
2054                         if (owner->getIntl()->getTrans()->backspace()) {
2055                                 owner->view()->text->Backspace(owner->view());
2056                                 owner->view()->text->sel_cursor = 
2057                                         owner->view()->text->cursor;
2058                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2059                                 // It is possible to make it a lot faster still
2060                                 // just comment out the lone below...
2061                                 owner->view()->showCursor();
2062                         }
2063                 } else {
2064                         owner->view()->cut();
2065                 }
2066                 owner->showState();
2067                 owner->view()->setState();
2068         }
2069         break;
2070
2071         case LFUN_BACKSPACE_SKIP:
2072         {
2073                 // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
2074                 
2075                 LyXCursor cursor = owner->view()->text->cursor;
2076                 
2077                 if (!owner->view()->text->selection) {
2078                         if (cursor.pos() == 0 
2079                             && !(cursor.par()->added_space_top 
2080                                  == VSpace (VSpace::NONE))) {
2081                                 owner->view()->text->SetParagraph 
2082                                         (owner->view(),
2083                                          cursor.par()->line_top,      
2084                                          cursor.par()->line_bottom,
2085                                          cursor.par()->pagebreak_top, 
2086                                          cursor.par()->pagebreak_bottom,
2087                                          VSpace(VSpace::NONE), cursor.par()->added_space_bottom,
2088                                          cursor.par()->align, 
2089                                          cursor.par()->labelwidthstring, 0);
2090                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2091                         } else {
2092                                 owner->view()->text->Backspace(owner->view());
2093                                 owner->view()->text->sel_cursor 
2094                                         = cursor;
2095                                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2096                         }
2097                 } else
2098                         owner->view()->cut();
2099         }
2100         break;
2101
2102         case LFUN_BREAKPARAGRAPH:
2103         {
2104                 owner->view()->beforeChange();
2105                 owner->view()->text->BreakParagraph(owner->view(), 0);
2106                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2107                 owner->view()->text->sel_cursor = 
2108                         owner->view()->text->cursor;
2109                 owner->view()->setState();
2110                 owner->showState();
2111                 break;
2112         }
2113
2114         case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
2115         {
2116                 owner->view()->beforeChange();
2117                 owner->view()->text->BreakParagraph(owner->view(), 1);
2118                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2119                 owner->view()->text->sel_cursor = 
2120                         owner->view()->text->cursor;
2121                 owner->view()->setState();
2122                 owner->showState();
2123                 break;
2124         }
2125         
2126         case LFUN_BREAKPARAGRAPH_SKIP:
2127         {
2128                 // When at the beginning of a paragraph, remove
2129                 // indentation and add a "defskip" at the top.
2130                 // Otherwise, do the same as LFUN_BREAKPARAGRAPH.
2131                 
2132                 LyXCursor cursor = owner->view()->text->cursor;
2133                 
2134                 owner->view()->beforeChange();
2135                 if (cursor.pos() == 0) {
2136                         if (cursor.par()->added_space_top == VSpace(VSpace::NONE)) {
2137                                 owner->view()->text->SetParagraph
2138                                         (owner->view(),
2139                                          cursor.par()->line_top,      
2140                                          cursor.par()->line_bottom,
2141                                          cursor.par()->pagebreak_top, 
2142                                          cursor.par()->pagebreak_bottom,
2143                                          VSpace(VSpace::DEFSKIP), cursor.par()->added_space_bottom,
2144                                          cursor.par()->align, 
2145                                          cursor.par()->labelwidthstring, 1);
2146                                 //owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2147                         } 
2148                 }
2149                 else {
2150                         owner->view()->text->BreakParagraph(owner->view(), 0);
2151                         //owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2152                 }
2153
2154                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2155                 owner->view()->text->sel_cursor = cursor;
2156                 owner->view()->setState();
2157                 owner->showState();
2158         }
2159         break;
2160
2161         case LFUN_PARAGRAPH_SPACING:
2162         {
2163                 LyXParagraph * par = owner->view()->text->cursor.par();
2164                 Spacing::Space cur_spacing = par->spacing.getSpace();
2165                 float cur_value = 1.0;
2166                 if (cur_spacing == Spacing::Other) {
2167                         cur_value = par->spacing.getValue();
2168                 }
2169                 
2170                 istringstream istr(argument);
2171
2172                 string tmp;
2173                 istr >> tmp;
2174                 Spacing::Space new_spacing = cur_spacing;
2175                 float new_value = cur_value;
2176                 if (tmp.empty()) {
2177                         lyxerr << "Missing argument to `paragraph-spacing'"
2178                                << endl;
2179                 } else if (tmp == "single") {
2180                         new_spacing = Spacing::Single;
2181                 } else if (tmp == "onehalf") {
2182                         new_spacing = Spacing::Onehalf;
2183                 } else if (tmp == "double") {
2184                         new_spacing = Spacing::Double;
2185                 } else if (tmp == "other") {
2186                         new_spacing = Spacing::Other;
2187                         float tmpval = 0.0;
2188                         istr >> tmpval;
2189                         lyxerr << "new_value = " << tmpval << endl;
2190                         if (tmpval != 0.0)
2191                                 new_value = tmpval;
2192                 } else if (tmp == "default") {
2193                         new_spacing = Spacing::Default;
2194                 } else {
2195                         lyxerr << _("Unknown spacing argument: ")
2196                                << argument << endl;
2197                 }
2198                 if (cur_spacing != new_spacing || cur_value != new_value) {
2199                         par->spacing.set(new_spacing, new_value);
2200                         owner->view()->text->RedoParagraph(owner->view());
2201                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2202                 }
2203         }
2204         break;
2205         
2206         case LFUN_QUOTE:
2207                 owner->view()->beforeChange();
2208                 owner->view()->text->InsertChar(owner->view(), '\"');  // This " matches the single quote in the code
2209                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2210                 moveCursorUpdate(false);
2211                 break;
2212
2213         case LFUN_HTMLURL:
2214         case LFUN_URL:
2215         {
2216                 InsetCommandParams p;
2217                 if (action == LFUN_HTMLURL)
2218                         p.setCmdName("htmlurl");
2219                 else
2220                         p.setCmdName("url");
2221                 owner->getDialogs()->createUrl( p.getAsString() );
2222         }
2223         break;
2224                     
2225         case LFUN_INSERT_URL:
2226         {
2227                 InsetCommandParams p;
2228                 p.setFromString( argument );
2229
2230                 InsetUrl * inset = new InsetUrl( p );
2231                 if (!owner->view()->insertInset(inset))
2232                         delete inset;
2233                 else
2234                         owner->view()->updateInset( inset, true );
2235         }
2236         break;
2237                     
2238         case LFUN_INSET_TEXT:
2239         {
2240                 InsetText * new_inset = new InsetText;
2241                 if (owner->view()->insertInset(new_inset))
2242                         new_inset->Edit(owner->view(), 0, 0, 0);
2243                 else
2244                         delete new_inset;
2245         }
2246         break;
2247         
2248         case LFUN_INSET_ERT:
2249         {
2250                 InsetERT * new_inset = new InsetERT;
2251                 if (owner->view()->insertInset(new_inset))
2252                         new_inset->Edit(owner->view(), 0, 0, 0);
2253                 else
2254                         delete new_inset;
2255         }
2256         break;
2257         
2258         case LFUN_INSET_EXTERNAL:
2259         {
2260                 InsetExternal * new_inset = new InsetExternal;
2261                 if (owner->view()->insertInset(new_inset))
2262                         new_inset->Edit(owner->view(), 0, 0, 0);
2263                 else
2264                         delete new_inset;
2265         }
2266         break;
2267         
2268         case LFUN_INSET_FOOTNOTE:
2269         {
2270                 InsetFoot * new_inset = new InsetFoot;
2271                 if (owner->view()->insertInset(new_inset))
2272                         new_inset->Edit(owner->view(), 0, 0, 0);
2273                 else
2274                         delete new_inset;
2275         }
2276         break;
2277
2278         case LFUN_INSET_MARGINAL:
2279         {
2280                 InsetMarginal * new_inset = new InsetMarginal;
2281                 if (owner->view()->insertInset(new_inset))
2282                         new_inset->Edit(owner->view(), 0, 0, 0);
2283                 else
2284                         delete new_inset;
2285         }
2286         break;
2287
2288         case LFUN_INSET_MINIPAGE:
2289         {
2290                 InsetMinipage * new_inset = new InsetMinipage;
2291                 if (owner->view()->insertInset(new_inset))
2292                         new_inset->Edit(owner->view(), 0, 0, 0);
2293                 else
2294                         delete new_inset;
2295         }
2296         break;
2297
2298         case LFUN_INSET_FLOAT:
2299         {
2300                 // check if the float type exist
2301                 if (floatList.typeExist(argument)) {
2302                         InsetFloat * new_inset = new InsetFloat(argument);
2303                         if (owner->view()->insertInset(new_inset))
2304                                 new_inset->Edit(owner->view(), 0, 0, 0);
2305                         else
2306                                 delete new_inset;
2307                 } else {
2308                         lyxerr << "Non-existant float type: "
2309                                << argument << endl;
2310                 }
2311                 
2312         }
2313         break;
2314
2315         case LFUN_INSET_LIST:
2316         {
2317                 InsetList * new_inset = new InsetList;
2318                 if (owner->view()->insertInset(new_inset))
2319                         new_inset->Edit(owner->view(), 0, 0, 0);
2320                 else
2321                         delete new_inset;
2322         }
2323         break;
2324
2325         case LFUN_INSET_THEOREM:
2326         {
2327                 InsetTheorem * new_inset = new InsetTheorem;
2328                 if (owner->view()->insertInset(new_inset))
2329                         new_inset->Edit(owner->view(), 0, 0, 0);
2330                 else
2331                         delete new_inset;
2332         }
2333         break;
2334
2335         case LFUN_INSET_CAPTION:
2336         {
2337                 // Do we have a locking inset...
2338                 if (owner->view()->theLockingInset()) {
2339                         lyxerr << "Locking inset code: "
2340                                << static_cast<int>(owner->view()->theLockingInset()->LyxCode());
2341                         InsetCaption * new_inset = new InsetCaption;
2342                         new_inset->setOwner(owner->view()->theLockingInset());
2343                         new_inset->SetAutoBreakRows(true);
2344                         new_inset->SetDrawFrame(0, InsetText::LOCKED);
2345                         new_inset->SetFrameColor(0, LColor::footnoteframe);
2346                         if (owner->view()->insertInset(new_inset))
2347                                 new_inset->Edit(owner->view(), 0, 0, 0);
2348                         else
2349                                 delete new_inset;
2350                 }
2351         }
2352         break;
2353         
2354         case LFUN_INSET_TABULAR:
2355         {
2356                 int r = 2, c = 2;
2357                 if (!argument.empty())
2358                         ::sscanf(argument.c_str(),"%d%d", &r, &c);
2359                 InsetTabular * new_inset =
2360                         new InsetTabular(*owner->buffer(), r, c);
2361                 if (owner->view()->insertInset(new_inset))
2362                         new_inset->Edit(owner->view(), 0, 0, 0);
2363                 else
2364                         delete new_inset;
2365         }
2366         break;
2367
2368         // --- lyxserver commands ----------------------------
2369
2370         case LFUN_CHARATCURSOR:
2371         {
2372                 LyXParagraph::size_type pos = 
2373                         owner->view()->text->cursor.pos();
2374                 if(pos < owner->view()->text->cursor.par()->size())
2375                         //dispatch_buffer = owner->view()->text->
2376                         //      cursor.par()->text[pos];
2377                         dispatch_buffer =
2378                                 owner->view()->text->
2379                                 cursor.par()->GetChar(pos);
2380                 else
2381                         dispatch_buffer = "EOF";
2382         }
2383         break;
2384         
2385         case LFUN_GETXY:
2386                 dispatch_buffer = 
2387                         tostr(owner->view()->text->cursor.x()) + ' '
2388                         + tostr(owner->view()->text->cursor.y());
2389                 break;
2390                 
2391         case LFUN_SETXY:
2392         {
2393                 int x;
2394                 int y;
2395                 ::sscanf(argument.c_str(), " %d %d", &x, &y);
2396                 owner->view()->text->SetCursorFromCoordinates(owner->view(), x, y);
2397         }
2398         break;
2399         
2400         case LFUN_GETLAYOUT:
2401                 dispatch_buffer =  
2402                         tostr(owner->view()->text->cursor.par()->layout);
2403                 break;
2404                         
2405         case LFUN_GETFONT:
2406         {
2407                 LyXFont & font = owner->view()->text->current_font;
2408                 if(font.shape() == LyXFont::ITALIC_SHAPE)
2409                         dispatch_buffer = 'E';
2410                 else if(font.shape() == LyXFont::SMALLCAPS_SHAPE)
2411                         dispatch_buffer = 'N';
2412                 else
2413                         dispatch_buffer = '0';
2414
2415         }
2416         break;
2417
2418         case LFUN_GETLATEX:
2419         {
2420                 LyXFont & font = owner->view()->text->current_font;
2421                 if(font.latex() == LyXFont::ON)
2422                         dispatch_buffer = 'L';
2423                 else
2424                         dispatch_buffer = '0';
2425         }
2426         break;
2427
2428         case LFUN_GETNAME:
2429                 setMessage(owner->buffer()->fileName());
2430                 lyxerr.debug() << "FNAME["
2431                                << owner->buffer()->fileName()
2432                                << "] " << endl;
2433                 break;
2434                 
2435         case LFUN_NOTIFY:
2436         {
2437                 string buf;
2438                 keyseq.print(buf);
2439                 dispatch_buffer = buf;
2440                 lyxserver->notifyClient(dispatch_buffer);
2441         }
2442         break;
2443
2444         case LFUN_GOTOFILEROW:
2445         {
2446                 char file_name[100];
2447                 int row;
2448                 ::sscanf(argument.c_str(), " %s %d", file_name, &row);
2449
2450                 // Must replace extension of the file to be .lyx and get full path
2451                 string s = ChangeExtension(string(file_name), ".lyx");
2452
2453                 // Either change buffer or load the file
2454                 if (bufferlist.exists(s))
2455                         owner->view()->buffer(bufferlist.getBuffer(s));
2456                 else
2457                         owner->view()->buffer(bufferlist.loadLyXFile(s));
2458
2459                 // Set the cursor  
2460                 owner->view()->setCursorFromRow(row);
2461
2462                 // Recenter screen
2463                 owner->view()->center();
2464         }
2465         break;
2466
2467         case LFUN_GOTO_PARAGRAPH:
2468         {
2469                 istringstream istr(argument);
2470
2471                 int id;
2472                 istr >> id;
2473                 LyXParagraph * par = owner->view()->text->GetParFromID(id);
2474
2475                 // Set the cursor
2476                 owner->view()->text->SetCursor(owner->view(), par, 0);
2477                 owner->view()->setState();
2478                 owner->showState();
2479
2480                 // Recenter screen
2481                 owner->view()->center();
2482         }
2483         break;
2484
2485         case LFUN_APROPOS:
2486         case LFUN_GETTIP:
2487         {
2488                 int const qa = lyxaction.LookupFunc(argument);
2489                 setMessage(lyxaction.helpText(static_cast<kb_action>(qa)));
2490         }
2491         break;
2492
2493         // --- accented characters ---------------------------
2494                 
2495         case LFUN_UMLAUT:
2496         case LFUN_CIRCUMFLEX:
2497         case LFUN_GRAVE:
2498         case LFUN_ACUTE:
2499         case LFUN_TILDE:
2500         case LFUN_CEDILLA:
2501         case LFUN_MACRON:
2502         case LFUN_DOT:
2503         case LFUN_UNDERDOT:
2504         case LFUN_UNDERBAR:
2505         case LFUN_CARON:
2506         case LFUN_SPECIAL_CARON:
2507         case LFUN_BREVE:
2508         case LFUN_TIE:
2509         case LFUN_HUNG_UMLAUT:
2510         case LFUN_CIRCLE:
2511         case LFUN_OGONEK:
2512         {
2513                 char c = 0;
2514                 
2515                 if (keyseq.length == -1 && keyseq.getiso() != 0) 
2516                         c = keyseq.getiso();
2517                 
2518                 owner->getIntl()->getTrans()->
2519                         deadkey(c, get_accent(action).accent, 
2520                                 owner->view()->text);
2521                 
2522                 // Need to reset, in case the minibuffer calls these
2523                 // actions
2524                 keyseq.reset();
2525                 keyseq.length = 0;
2526                 
2527                 // copied verbatim from do_accent_char
2528                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2529
2530                 owner->view()->text->sel_cursor = 
2531                         owner->view()->text->cursor;
2532         }   
2533         break;
2534         
2535         // --- toolbar ----------------------------------
2536         case LFUN_PUSH_TOOLBAR:
2537         {
2538                 int nth = strToInt(argument);
2539                 if (nth <= 0) {
2540                         setErrorMessage(N_("Push-toolbar needs argument > 0"));
2541                 } else {
2542                         owner->getToolbar()->push(nth);
2543                 }
2544         }
2545         break;
2546         
2547         case LFUN_ADD_TO_TOOLBAR:
2548         {
2549                 if (lyxerr.debugging(Debug::GUI)) {
2550                         lyxerr << "LFUN_ADD_TO_TOOLBAR:"
2551                                 "argument = `" << argument << '\'' << endl;
2552                 }
2553                 string tmp(argument);
2554                 //lyxerr <<string("Argument: ") + argument);
2555                 //lyxerr <<string("Tmp     : ") + tmp);
2556                 if (tmp.empty()) {
2557                         setErrorMessage(N_("Usage: toolbar-add-to <LyX command>"));
2558                 } else {
2559                         owner->getToolbar()->add(argument, false);
2560                         owner->getToolbar()->set();
2561                 }
2562         }
2563         break;
2564         
2565         // --- insert characters ----------------------------------------
2566
2567         // ---  Mathed stuff. If we are here, there is no locked inset yet.
2568         
2569         // Greek mode     
2570         case LFUN_GREEK:
2571         {
2572                 if (!greek_kb_flag) {
2573                         greek_kb_flag = 1;
2574                         setMessage(N_("Math greek mode on"));
2575                 } else
2576                         greek_kb_flag = 0;
2577         }  
2578         break;
2579       
2580         // Greek keyboard      
2581         case LFUN_GREEK_TOGGLE:
2582         {
2583                 greek_kb_flag = greek_kb_flag ? 0 : 2;
2584                 if (greek_kb_flag) {
2585                         setMessage(N_("Math greek keyboard on"));
2586                 } else {
2587                         setMessage(N_("Math greek keyboard off"));
2588                 }
2589         }
2590         break;
2591         
2592         case LFUN_MATH_DELIM:     
2593         case LFUN_INSERT_MATRIX:
2594         {          
2595                 if (owner->view()->available()) { 
2596                         if (owner->view()->
2597                             open_new_inset(new InsetFormula(false)))
2598                         {
2599                                 owner->view()->theLockingInset()
2600                                         ->LocalDispatch(owner->view(),
2601                                                         action,
2602                                                         argument);
2603                         }
2604                 }
2605         }          
2606         break;
2607                
2608         case LFUN_INSERT_MATH:
2609         {
2610                 math_insert_symbol(argument);
2611         }
2612         break;
2613         
2614         case LFUN_MATH_DISPLAY:
2615         {
2616                 if (owner->view()->available())
2617                         owner->view()->open_new_inset(new InsetFormula(true));
2618                 break;
2619         }
2620                     
2621         case LFUN_MATH_MACRO:
2622         {
2623                 if (owner->view()->available()) {
2624                         string s(argument);
2625                         if (s.empty())
2626                                 setErrorMessage(N_("Missing argument"));
2627                         else {
2628                                 string s1 = token(s, ' ', 1);
2629                                 int na = s1.empty() ? 0 : lyx::atoi(s1);
2630                                 owner->view()->
2631                                         open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na));
2632                         }
2633                 }
2634         }
2635         break;
2636
2637         case LFUN_MATH_MODE:   // Open or create a math inset
2638         {               
2639                 if (owner->view()->available())
2640                         owner->view()->open_new_inset(new InsetFormula);
2641                 setMessage(N_("Math editor mode"));
2642         }
2643         break;
2644           
2645         case LFUN_MATH_NUMBER:
2646         case LFUN_MATH_LIMITS:
2647         {
2648                 setErrorMessage(N_("This is only allowed in math mode!"));
2649         
2650         }
2651         break;
2652
2653         case LFUN_MATH_PANEL:
2654         {
2655                 show_symbols_form(this);
2656         }
2657         break;
2658         
2659         case LFUN_CITATION_CREATE:
2660         {
2661                 // Should do this "at source"
2662                 InsetCommandParams p( "cite" );
2663                 
2664                 if (contains(argument, "|")) {
2665                         p.setContents( token(argument, '|', 0) );
2666                         p.setOptions(  token(argument, '|', 1) );
2667                 } else {
2668                         p.setContents( argument );
2669                 }
2670
2671                 owner->getDialogs()->createCitation( p.getAsString() );
2672         }
2673         break;
2674                     
2675         case LFUN_CITATION_INSERT:
2676         {
2677                 InsetCommandParams p;
2678                 p.setFromString( argument );
2679
2680                 InsetCitation * inset = new InsetCitation( p );
2681                 if (!owner->view()->insertInset(inset))
2682                         delete inset;
2683                 else
2684                         owner->view()->updateInset( inset, true );
2685         }
2686         break;
2687                     
2688         case LFUN_INSERT_BIBTEX:
2689         {   
2690                 // ale970405+lasgoutt970425
2691                 // The argument can be up to two tokens separated 
2692                 // by a space. The first one is the bibstyle.
2693                 string db       = token(argument, ' ', 0);
2694                 string bibstyle = token(argument, ' ', 1);
2695                 if (bibstyle.empty())
2696                         bibstyle = "plain";
2697
2698                 InsetCommandParams p( "BibTeX", db, bibstyle );
2699                 InsetBibtex * inset = new InsetBibtex(p);
2700                 
2701                 if (owner->view()->insertInset(inset)) {
2702                         if (argument.empty())
2703                                 inset->Edit(owner->view(), 0, 0, 0);
2704                 } else
2705                         delete inset;
2706         }
2707         break;
2708                 
2709         // BibTeX data bases
2710         case LFUN_BIBDB_ADD:
2711         {
2712                 InsetBibtex * inset = 
2713                         static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
2714                 if (inset) {
2715                         inset->addDatabase(argument);
2716                 }
2717         }
2718         break;
2719                     
2720         case LFUN_BIBDB_DEL:
2721         {
2722                 InsetBibtex * inset = 
2723                         static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
2724                 if (inset) {
2725                         inset->delDatabase(argument);
2726                 }
2727         }
2728         break;
2729         
2730         case LFUN_BIBTEX_STYLE:
2731         {
2732                 InsetBibtex * inset = 
2733                         static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
2734                 if (inset) {
2735                         inset->setOptions(argument);
2736                 }
2737         }
2738         break;
2739                 
2740         case LFUN_INDEX_CREATE:
2741         {
2742                 InsetCommandParams p( "index" );
2743                 
2744                 if( argument.empty() ) {
2745                         // Get the word immediately preceding the cursor
2746                         LyXParagraph::size_type curpos = 
2747                                 owner->view()->text->cursor.pos() - 1;
2748
2749                         string curstring;
2750                         if( curpos >= 0 )
2751                                 curstring = owner->view()->text
2752                                             ->cursor.par()->GetWord(curpos);
2753
2754                         p.setContents( curstring );
2755                 } else {
2756                         p.setContents( argument );
2757                 }
2758
2759                 owner->getDialogs()->createIndex( p.getAsString() );
2760         }
2761         break;
2762                     
2763         case LFUN_INDEX_INSERT:
2764         {
2765                 InsetCommandParams p;
2766                 p.setFromString( argument );
2767                 InsetIndex * inset = new InsetIndex( p );
2768
2769                 if (!owner->view()->insertInset(inset))
2770                         delete inset;
2771                 else
2772                         owner->view()->updateInset( inset, true );
2773         }
2774         break;
2775                     
2776         case LFUN_INDEX_INSERT_LAST:
2777         {
2778                 // Get word immediately preceding the cursor
2779                 LyXParagraph::size_type curpos = 
2780                         owner->view()->text->cursor.pos() - 1;
2781                 // Can't do that at the beginning of a paragraph
2782                 if( curpos < 0 ) break;
2783
2784                 string curstring( owner->view()->text
2785                                   ->cursor.par()->GetWord(curpos) );
2786
2787                 InsetCommandParams p( "index", curstring );
2788                 InsetIndex * inset = new InsetIndex( p );
2789
2790                 if (!owner->view()->insertInset(inset))
2791                         delete inset;
2792                 else
2793                         owner->view()->updateInset( inset, true );
2794         }
2795         break;
2796                     
2797         case LFUN_INDEX_PRINT:
2798         {
2799                 InsetCommandParams p( "printindex" );
2800                 Inset * inset = new InsetPrintIndex(p);
2801                 if (!owner->view()->insertInset(inset, "Standard", true))
2802                         delete inset;
2803         }
2804         break;
2805
2806         case LFUN_PARENTINSERT:
2807         {
2808                 lyxerr << "arg " << argument << endl;
2809                 InsetCommandParams p( "lyxparent", argument );
2810                 Inset * inset = new InsetParent(p, *owner->buffer());
2811                 if (!owner->view()->insertInset(inset, "Standard", true))
2812                         delete inset;
2813         }
2814         break;
2815
2816         case LFUN_CHILDINSERT:
2817         {
2818                 InsetCommandParams p( "Include", argument );
2819                 Inset * inset = new InsetInclude(p, *owner->buffer());
2820                 if (owner->view()->insertInset(inset, "Standard", true))
2821                         inset->Edit(owner->view(), 0, 0, 0);
2822                 else
2823                         delete inset;
2824         }
2825         break;
2826
2827         case LFUN_CHILDOPEN:
2828         {
2829                 string filename =
2830                         MakeAbsPath(argument, 
2831                                     OnlyPath(owner->buffer()->fileName()));
2832                 setMessage(N_("Opening child document ") +
2833                            MakeDisplayPath(filename) + "...");
2834                 owner->view()->savePosition();
2835                 if (bufferlist.exists(filename))
2836                         owner->view()->buffer(bufferlist.getBuffer(filename));
2837                 else
2838                         owner->view()->buffer(bufferlist.loadLyXFile(filename));
2839         }
2840         break;
2841
2842         case LFUN_INSERT_NOTE:
2843                 owner->view()->insertNote();
2844                 break;
2845 #ifndef NEW_INSETS
2846         case LFUN_INSERTFOOTNOTE: 
2847         {
2848                 LyXParagraph::footnote_kind kind;
2849                 if (argument == "footnote")
2850                         { kind = LyXParagraph::FOOTNOTE; }
2851                 else if (argument == "margin")
2852                         { kind = LyXParagraph::MARGIN; }
2853                 else if (argument == "figure")
2854                         { kind = LyXParagraph::FIG; }
2855                 else if (argument == "table")
2856                         { kind = LyXParagraph::TAB; }
2857                 else if (argument == "wide-fig")
2858                         { kind = LyXParagraph::WIDE_FIG; }
2859                 else if (argument == "wide-tab")
2860                         { kind = LyXParagraph::WIDE_TAB; }
2861                 else if (argument == "algorithm")
2862                         { kind = LyXParagraph::ALGORITHM; }
2863                 else {
2864                         setErrorMessage(N_("Unknown kind of footnote"));
2865                         break;
2866                 }
2867                 owner->view()->text->InsertFootnoteEnvironment(owner->view(), kind);
2868                 owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2869                 owner->view()->setState();
2870         }
2871         break;
2872 #endif
2873         case LFUN_TOGGLECURSORFOLLOW:
2874                 lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar;
2875                 break;
2876                 
2877         case LFUN_KMAP_OFF:             // keymap off
2878                 owner->getIntl()->KeyMapOn(false);
2879                 break;
2880                 
2881         case LFUN_KMAP_PRIM:    // primary keymap
2882                 owner->getIntl()->KeyMapPrim();
2883                 break;
2884                 
2885         case LFUN_KMAP_SEC:             // secondary keymap
2886                 owner->getIntl()->KeyMapSec();
2887                 break;
2888                 
2889         case LFUN_KMAP_TOGGLE:  // toggle keymap
2890                 owner->getIntl()->ToggleKeyMap();
2891                 break;
2892
2893         case LFUN_SELFINSERT:
2894         {
2895                 LyXFont old_font(owner->view()->text->real_current_font);
2896                 for (string::size_type i = 0; i < argument.length(); ++i) {
2897                         owner->view()->text->InsertChar(owner->view(), argument[i]);
2898                         // This needs to be in the loop, or else we
2899                         // won't break lines correctly. (Asger)
2900                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2901                 }
2902                 owner->view()->text->sel_cursor = 
2903                         owner->view()->text->cursor;
2904                 moveCursorUpdate(false);
2905
2906                 // real_current_font.number can change so we need to 
2907                 // update the minibuffer
2908                 if (old_font != owner->view()->text->real_current_font)
2909                         owner->showState();
2910         }
2911         break;
2912
2913         case LFUN_SEQUENCE: 
2914         {
2915                 // argument contains ';'-terminated commands
2916                 while (argument.find(';') != string::npos) {
2917                         string first;
2918                         argument = split(argument, first, ';');
2919                         Dispatch(first);
2920                 }
2921         }
2922         break;
2923
2924         case LFUN_DATE_INSERT:  // jdblair: date-insert cmd
2925         {
2926                 struct tm * now_tm;
2927                 
2928                 time_t now_time_t = time(NULL);
2929                 now_tm = localtime(&now_time_t);
2930                 setlocale(LC_TIME, "");
2931                 string arg;
2932                 if (!argument.empty())
2933                         arg = argument;
2934                 else 
2935                         arg = lyxrc.date_insert_format;
2936                 char datetmp[32];
2937                 int datetmp_len = ::strftime(datetmp, 32, arg.c_str(), now_tm);
2938                 for (int i = 0; i < datetmp_len; i++) {
2939                         owner->view()->text->InsertChar(owner->view(), datetmp[i]);
2940                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2941                 }
2942
2943                 owner->view()->text->sel_cursor = owner->view()->text->cursor;
2944                 moveCursorUpdate(false);
2945         }
2946         break;
2947
2948         case LFUN_DIALOG_PREFERENCES:
2949                 owner->getDialogs()->showPreferences();
2950                 break;
2951                 
2952         case LFUN_SAVEPREFERENCES:
2953         {
2954                 Path p(user_lyxdir);
2955                 lyxrc.write("preferences");
2956         }
2957         break;
2958
2959         case LFUN_SCREEN_FONT_UPDATE:
2960         {
2961                 // handle the screen font changes.
2962                 // 
2963                 lyxrc.set_font_norm_type();
2964                 fontloader.update();
2965                 // Of course we should only do the resize and the textcache.clear
2966                 // if values really changed...but not very important right now. (Lgb)
2967                 // All buffers will need resize
2968                 bufferlist.resize();
2969                 // We also need to empty the textcache so that
2970                 // the buffer will be formatted correctly after
2971                 // a zoom change.
2972                 textcache.clear();
2973         }
2974         break;
2975
2976         case LFUN_SET_COLOR:
2977         {
2978                 string lyx_name, x11_name;
2979                 x11_name = split(argument, lyx_name, ' ');
2980                 if (lyx_name.empty() || x11_name.empty()) {
2981                         LyXBell();
2982                         setErrorMessage(N_("Syntax: set-color <lyx_name>"
2983                                                 " <x11_name>"));
2984                         break;
2985                         }
2986
2987                 if (!lcolor.setColor(lyx_name, x11_name)) {
2988                         static string err1 (N_("Set-color \""));
2989                         static string err2 (N_("\" failed - color is undefined "
2990                                                 "or may not be redefined"));
2991                         LyXBell();
2992                         setErrorMessage(err1 + lyx_name + err2);
2993                         break;
2994                 }
2995                 lyxColorHandler->updateColor(lcolor.getFromLyXName(lyx_name));
2996                 owner->view()->redraw();
2997                 break;
2998         }
2999
3000         case LFUN_UNKNOWN_ACTION:
3001         {
3002                 if(!owner->buffer()) {
3003                         LyXBell();
3004                         setErrorMessage(N_("No document open"));
3005                         break;
3006                 }
3007
3008                 if (owner->buffer()->isReadonly()) {
3009                         LyXBell();
3010                         setErrorMessage(N_("Document is read only"));
3011                         break;
3012                 }
3013                          
3014                 if (!argument.empty()) {
3015                         
3016                         /* Automatically delete the currently selected
3017                          * text and replace it with what is being
3018                          * typed in now. Depends on lyxrc settings
3019                          * "auto_region_delete", which defaults to
3020                          * true (on). */
3021                 
3022                         if ( lyxrc.auto_region_delete ) {
3023                                 if (owner->view()->text->selection){
3024                                         owner->view()->text->CutSelection(owner->view(), false);
3025                                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
3026                                 }
3027                         }
3028                         
3029                         owner->view()->beforeChange();
3030                         LyXFont old_font(owner->view()->text->real_current_font);
3031                         for (string::size_type i = 0;
3032                              i < argument.length(); ++i) {
3033                                 if (greek_kb_flag) {
3034                                         if (!math_insert_greek(argument[i]))
3035                                                 owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text);
3036                                 } else
3037                                         owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text);
3038                         }
3039
3040                         owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
3041
3042                         owner->view()->text->sel_cursor = 
3043                                 owner->view()->text->cursor;
3044                         moveCursorUpdate(false);
3045
3046                         // real_current_font.number can change so we need to
3047                         // update the minibuffer
3048                         if (old_font != owner->view()->text->real_current_font)
3049                                 owner->showState();
3050                         return string();
3051                 } else {
3052                         // why is an "Unknown action" with empty
3053                         // argument even dispatched in the first
3054                         // place? I`ll probably change that. (Lgb)
3055                         LyXBell();
3056                         setErrorMessage(N_("Unknown action"));
3057                 }
3058                 break;
3059         }
3060
3061         default:
3062                 lyxerr << "A truly unknown func!" << endl;
3063                 break;
3064         } // end of switch
3065   exit_with_message:
3066
3067         string res = getMessage();
3068
3069         if (res.empty()) {
3070                 if (!commandshortcut.empty()) {
3071                         string newbuf = owner->getMiniBuffer()->GetText();
3072                         if (newbuf != commandshortcut) {
3073                                 owner->getMiniBuffer()->Set(newbuf
3074                                                             + " " +
3075                                                             commandshortcut);
3076                         }
3077                 }
3078         } else {
3079                 string msg(_(res));
3080                 msg += " ";
3081                 msg += commandshortcut;
3082                 owner->getMiniBuffer()->Set(msg);
3083         }
3084
3085         return res;
3086 }
3087
3088
3089 void LyXFunc::setupLocalKeymap()
3090 {
3091         keyseq.stdmap = keyseq.curmap = toplevel_keymap;
3092         cancel_meta_seq.stdmap = cancel_meta_seq.curmap = toplevel_keymap;
3093 }
3094
3095
3096 void LyXFunc::MenuNew(bool fromTemplate)
3097 {
3098         string initpath = lyxrc.document_path;
3099         LyXFileDlg fileDlg;
3100
3101         if (owner->view()->available()) {
3102                 string trypath = owner->buffer()->filepath;
3103                 // If directory is writeable, use this as default.
3104                 if (IsDirWriteable(trypath) == 1)
3105                         initpath = trypath;
3106         }
3107
3108         static int newfile_number = 0;
3109         string s;
3110
3111         if (lyxrc.new_ask_filename) {
3112                 ProhibitInput(owner->view());
3113                 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3114                 fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
3115                 string fname = fileDlg.Select(_("Enter Filename for new document"), 
3116                                        initpath, "*.lyx", _("newfile"));
3117                 AllowInput(owner->view());
3118         
3119                 if (fname.empty()) {
3120                         owner->getMiniBuffer()->Set(_("Canceled."));
3121                         lyxerr.debug() << "New Document Cancelled." << endl;
3122                         return;
3123                 }
3124         
3125                 // get absolute path of file and make sure the filename ends
3126                 // with .lyx
3127                 s = MakeAbsPath(fname);
3128                 if (!IsLyXFilename(s))
3129                         s += ".lyx";
3130
3131                 // Check if the document already is open
3132                 if (bufferlist.exists(s)) {
3133                         switch(AskConfirmation(_("Document is already open:"), 
3134                                                MakeDisplayPath(s, 50),
3135                                                _("Do you want to close that document now?\n"
3136                                                  "('No' will just switch to the open version)")))
3137                         {
3138                         case 1: // Yes: close the document
3139                                 if (!bufferlist.close(bufferlist.getBuffer(s)))
3140                                 // If close is canceled, we cancel here too.
3141                                         return;
3142                                 break;
3143                         case 2: // No: switch to the open document
3144                                 owner->view()->buffer(bufferlist.getBuffer(s));
3145                                 return;
3146                         case 3: // Cancel: Do nothing
3147                                 owner->getMiniBuffer()->Set(_("Canceled."));
3148                                 return;
3149                         }
3150                 }
3151                 // Check whether the file already exists
3152                 if (IsLyXFilename(s)) {
3153                         FileInfo fi(s);
3154                         if (fi.readable() &&
3155                             AskQuestion(_("File already exists:"), 
3156                                         MakeDisplayPath(s, 50),
3157                                         _("Do you want to open the document?"))) {
3158                                 // loads document
3159                                 owner->getMiniBuffer()->Set(_("Opening document"), 
3160                                                             MakeDisplayPath(s), "...");
3161                                 XFlush(fl_get_display());
3162                                 owner->view()->buffer(
3163                                         bufferlist.loadLyXFile(s));
3164                                 owner->getMiniBuffer()->Set(_("Document"),
3165                                                             MakeDisplayPath(s),
3166                                                             _("opened."));
3167                                 return;
3168                         }
3169                 }
3170         } else {
3171                 s = AddName(lyxrc.document_path,
3172                             "newfile" + tostr(++newfile_number) + ".lyx");
3173                 FileInfo fi(s);
3174                 while (bufferlist.exists(s) || fi.readable()) {
3175                         ++newfile_number;
3176                         s = AddName(lyxrc.document_path,
3177                                     "newfile" + tostr(newfile_number) +
3178                                     ".lyx");
3179                         fi.newFile(s);
3180                 }
3181         }
3182
3183         // The template stuff
3184         string templname;
3185         if (fromTemplate) {
3186                 ProhibitInput(owner->view());
3187                 string fname = fileDlg.Select(_("Choose template"),
3188                                        lyxrc.template_path,
3189                                        "*.lyx");
3190                 AllowInput(owner->view());
3191                 if (fname.empty()) return;
3192                 templname = fname;
3193         }
3194   
3195         // find a free buffer
3196         lyxerr.debug() << "Find a free buffer." << endl;
3197         owner->view()->buffer(bufferlist.newFile(s, templname));
3198 }
3199
3200
3201 void LyXFunc::MenuOpen()
3202 {
3203         string initpath = lyxrc.document_path;
3204         LyXFileDlg fileDlg;
3205   
3206         if (owner->view()->available()) {
3207                 string trypath = owner->buffer()->filepath;
3208                 // If directory is writeable, use this as default.
3209                 if (IsDirWriteable(trypath) == 1)
3210                         initpath = trypath;
3211         }
3212
3213         // launches dialog
3214         ProhibitInput(owner->view());
3215         fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3216         fileDlg.SetButton(1, _("Examples"), 
3217                           AddPath(system_lyxdir, "examples"));
3218         string filename = fileDlg.Select(_("Select Document to Open"),
3219                                          initpath, "*.lyx");
3220         AllowInput(owner->view());
3221  
3222         // check selected filename
3223         if (filename.empty()) {
3224                 owner->getMiniBuffer()->Set(_("Canceled."));
3225                 return;
3226         }
3227
3228         // get absolute path of file and make sure the filename ends
3229         // with .lyx
3230         filename = MakeAbsPath(filename);
3231         if (!IsLyXFilename(filename))
3232                 filename += ".lyx";
3233
3234         // loads document
3235         owner->getMiniBuffer()->Set(_("Opening document"),
3236                                     MakeDisplayPath(filename), "...");
3237         Buffer * openbuf = bufferlist.loadLyXFile(filename);
3238         if (openbuf) {
3239                 owner->view()->buffer(openbuf);
3240                 owner->getMiniBuffer()->Set(_("Document"),
3241                                             MakeDisplayPath(filename),
3242                                             _("opened."));
3243         } else {
3244                 owner->getMiniBuffer()->Set(_("Could not open document"),
3245                                             MakeDisplayPath(filename));
3246         }
3247 }
3248
3249 // checks for running without gui are missing.
3250 void LyXFunc::doImport(string const & argument)
3251 {
3252         string format;
3253         string filename = split(argument, format, ' ');
3254         lyxerr.debug() << "LyXFunc::doImport: " << format 
3255                        << " file: " << filename << endl;
3256
3257         if (filename.empty()) { // need user interaction
3258                 string initpath = lyxrc.document_path;
3259                 LyXFileDlg fileDlg;
3260                 
3261                 if (owner->view()->available()) {
3262                         string trypath = owner->buffer()->filepath;
3263                         // If directory is writeable, use this as default.
3264                         if (IsDirWriteable(trypath) == 1)
3265                                 initpath = trypath;
3266                 }
3267
3268                 // launches dialog
3269                 ProhibitInput(owner->view());
3270                 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3271                 fileDlg.SetButton(1, _("Examples"), 
3272                                         AddPath(system_lyxdir, "examples"));
3273                 string text = _("Select ") + Formats::PrettyName(format)
3274                         + _(" file to import");
3275                 string format2 = (format == "textparagraph") ? "text" : format;
3276                 string extension = "*." + Formats::Extension(format2);
3277                 filename = fileDlg.Select(text, initpath, extension);
3278                 AllowInput(owner->view());
3279  
3280                 // check selected filename
3281                 if (filename.empty()) 
3282                         owner->getMiniBuffer()->Set(_("Canceled."));
3283         }
3284
3285         // still no filename? abort
3286         if (filename.empty()) 
3287                 return;
3288
3289         // get absolute path of file
3290         filename = MakeAbsPath(filename);
3291
3292         string lyxfile = ChangeExtension(filename, ".lyx");
3293
3294         // Check if the document already is open
3295         if (bufferlist.exists(lyxfile)) {
3296                 switch(AskConfirmation(_("Document is already open:"), 
3297                                        MakeDisplayPath(lyxfile, 50),
3298                                        _("Do you want to close that document now?\n"
3299                                          "('No' will just switch to the open version)")))
3300                         {
3301                         case 1: // Yes: close the document
3302                                 if (!bufferlist.close(bufferlist.getBuffer(lyxfile)))
3303                                 // If close is canceled, we cancel here too.
3304                                         return;
3305                                 break;
3306                         case 2: // No: switch to the open document
3307                                 owner->view()->buffer(bufferlist.getBuffer(lyxfile));
3308                                 return;
3309                         case 3: // Cancel: Do nothing
3310                                 owner->getMiniBuffer()->Set(_("Canceled."));
3311                                 return;
3312                         }
3313         }
3314
3315         // Check if a LyX document by the same root exists in filesystem
3316         FileInfo f(lyxfile, true);
3317         if (f.exist() && !AskQuestion(_("A document by the name"), 
3318                                       MakeDisplayPath(lyxfile),
3319                                       _("already exists. Overwrite?"))) {
3320                 owner->getMiniBuffer()->Set(_("Canceled."));
3321                 return;
3322         }
3323         // filename should be valid now
3324
3325         Importer::Import(owner, filename, format);
3326 }
3327
3328
3329 void LyXFunc::MenuInsertLyXFile(string const & filen)
3330 {
3331         string filename = filen;
3332
3333         if (filename.empty()) {
3334                 // Launch a file browser
3335                 string initpath = lyxrc.document_path;
3336                 LyXFileDlg fileDlg;
3337
3338                 if (owner->view()->available()) {
3339                         string trypath = owner->buffer()->filepath;
3340                         // If directory is writeable, use this as default.
3341                         if (IsDirWriteable(trypath) == 1)
3342                                 initpath = trypath;
3343                 }
3344
3345                 // launches dialog
3346                 ProhibitInput(owner->view());
3347                 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
3348                 fileDlg.SetButton(1, _("Examples"), 
3349                                   AddPath(system_lyxdir, "examples"));
3350                 filename = fileDlg.Select(_("Select Document to Insert"),
3351                                           initpath, "*.lyx");
3352                 AllowInput(owner->view());
3353
3354                 // check selected filename
3355                 if (filename.empty()) {
3356                         owner->getMiniBuffer()->Set(_("Canceled."));
3357                         return;
3358                 }
3359         } 
3360
3361         // get absolute path of file and make sure the filename ends
3362         // with .lyx
3363         filename = MakeAbsPath(filename);
3364         if (!IsLyXFilename(filename))
3365                 filename += ".lyx";
3366
3367         // Inserts document
3368         owner->getMiniBuffer()->Set(_("Inserting document"),
3369                                     MakeDisplayPath(filename), "...");
3370         bool res = owner->view()->insertLyXFile(filename);
3371         if (res) {
3372                 owner->getMiniBuffer()->Set(_("Document"),
3373                                             MakeDisplayPath(filename),
3374                                             _("inserted."));
3375         } else {
3376                 owner->getMiniBuffer()->Set(_("Could not insert document"),
3377                                             MakeDisplayPath(filename));
3378         }
3379 }
3380
3381
3382 void LyXFunc::reloadBuffer()
3383 {
3384         string fn = owner->buffer()->fileName();
3385         if (bufferlist.close(owner->buffer()))
3386                 owner->view()->buffer(bufferlist.loadLyXFile(fn));
3387 }
3388
3389
3390 void LyXFunc::CloseBuffer()
3391 {
3392         if (bufferlist.close(owner->buffer()) && !quitting) {
3393                 if (bufferlist.empty()) {
3394                         // need this otherwise SEGV may occur while trying to
3395                         // set variables that don't exist
3396                         // since there's no current buffer
3397                         owner->getDialogs()->hideBufferDependent();
3398                 }
3399                 else {
3400                         owner->view()->buffer(bufferlist.first());
3401                 }
3402         }
3403 }
3404
3405
3406 Inset * LyXFunc::getInsetByCode(Inset::Code code)
3407 {
3408         LyXCursor cursor = owner->view()->text->cursor;
3409         Buffer * buffer = owner->view()->buffer();
3410         Buffer::inset_iterator it =
3411                 find_if(Buffer::inset_iterator(cursor.par(),
3412                                                cursor.pos()),
3413                         buffer->inset_iterator_end(),
3414                         compare_memfun(&Inset::LyxCode, code));
3415         return it != buffer->inset_iterator_end() ? (*it) : 0;
3416 }
3417
3418
3419 // Each "owner" should have it's own message method. lyxview and
3420 // the minibuffer would use the minibuffer, but lyxserver would
3421 // send an ERROR signal to its client.  Alejandro 970603
3422 // This func is bit problematic when it comes to NLS, to make the
3423 // lyx servers client be language indepenent we must not translate
3424 // strings sent to this func.
3425 void LyXFunc::setErrorMessage(string const & m) const
3426 {
3427         dispatch_buffer = m;
3428         errorstat = true;
3429 }
3430
3431
3432 void LyXFunc::setMessage(string const & m)
3433 {
3434         dispatch_buffer = m;
3435 }