/* This file is part of * ====================================================== * * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich * Copyright 1995-1999 The LyX Team. * * ======================================================*/ #include #include #include #include #ifdef __GNUG__ #pragma implementation #endif #include "definitions.h" #include "lyxlookup.h" #include "kbmap.h" #include "lyxfunc.h" #include "bufferlist.h" #include "lyxserver.h" #include "lyx.h" #include "intl.h" #include "lyx_main.h" #include "lyx_cb.h" #include "insets/insetlatex.h" #include "insets/inseturl.h" #include "insets/insetlatexaccent.h" #include "insets/insettoc.h" #include "insets/insetlof.h" #include "insets/insetloa.h" #include "insets/insetlot.h" #include "insets/insetref.h" #include "insets/insetparent.h" #include "mathed/formulamacro.h" #include "toolbar.h" #include "spellchecker.h" // RVDK_PATCH_5 #include "minibuffer.h" #include "vspace.h" #include "insets/insetbib.h" #include "LyXView.h" #include "insets/insetindex.h" #include "insets/insetinclude.h" #include "filedlg.h" #include "lyx_gui_misc.h" #include "support/filetools.h" #include "support/FileInfo.h" #include "support/LAssert.h" #include "lyxscreen.h" #include "debug.h" #include "lyxrc.h" #include "lyxtext.h" #include "gettext.h" #include "trans_mgr.h" #include "ImportLaTeX.h" #include "ImportNoweb.h" #include "support/syscall.h" #include "support/lstrings.h" #include "support/path.h" #include "layout.h" extern bool cursor_follows_scrollbar; extern void InsertAsciiFile(string const &, bool); extern void math_insert_symbol(char const*); extern Bool math_insert_greek(char const); // why "Bool"? extern BufferList bufferlist; extern LyXServer * lyxserver; extern short greek_kb_flag; extern FD_form_toc * fd_form_toc; extern bool selection_possible; extern kb_keymap * toplevel_keymap; extern void BeforeChange(); extern void MenuWrite(Buffer*); extern void MenuWriteAs(Buffer*); extern int MenuRunLaTeX(Buffer*); extern int MenuBuildProg(Buffer*); extern int MenuRunChktex(Buffer*); extern bool MenuRunDvips(Buffer *,bool); extern void MenuPrint(Buffer*); extern void MenuSendto(); extern void QuitLyX(); extern void MenuFax(Buffer *); extern void MenuMakeLaTeX(Buffer *); extern void MenuMakeLinuxDoc(Buffer *); extern void MenuMakeDocBook(Buffer *); extern void MenuMakeAscii(Buffer *); extern void MenuPasteSelection(char at); extern LyXAction lyxaction; // (alkis) extern tex_accent_struct get_accent(kb_action action); extern void AutoSave(); extern void MenuSearch(); extern void CopyCB(); extern void CopyEnvironmentCB(); extern void PasteEnvironmentCB(); extern void GotoNote(); extern void NoteCB(); extern void OpenStuff(); extern void HyphenationPoint(); extern void Ldots(); extern void EndOfSentenceDot(); extern void MenuSeparator(); extern void HFill(); extern void MenuUndo(); extern void MenuRedo(); extern void SmallUpdate(signed char); extern void SetUpdateTimer(float timer= 0.3); extern void FreeUpdateTimer(); extern bool MenuPreview(Buffer*); extern bool MenuPreviewPS(Buffer*); extern void MenuInsertLabel(const char *); extern void MenuInsertRef(); extern void MenuLayoutCharacter(); extern void MenuLayoutParagraph(); extern void MenuLayoutDocument(); extern void MenuLayoutPaper(); extern void MenuLayoutTable(int flag); extern void MenuLayoutQuotes(); extern void MenuLayoutPreamble(); extern void MenuLayoutSave(); extern void bulletForm(); extern Buffer * NewLyxFile(string const &); extern void LoadLyXFile(string const &); extern void Reconfigure(); extern int current_layout; extern int getISOCodeFromLaTeX(char *); extern int UnlockInset(UpdatableInset*); extern void ShowLatexLog(); extern void UpdateInset(Inset* inset, bool mark_dirty = true); /* === globals =========================================================== */ bool LyXFunc::show_sc = true; LyXFunc::LyXFunc(LyXView *o) :owner(o) { meta_fake_bit = 0; lyx_dead_action = LFUN_NOACTION; lyx_calling_dead_action = LFUN_NOACTION; setupLocalKeymap(); } LyXFunc::~LyXFunc() { } // I changed this func slightly. I commented out the ...FinishUndo(), // this means that all places that used to have a moveCursorUpdate, now // have a ...FinishUndo() as the preceeding statement. I have also added // a moveCursorUpdate to some of the functions that updated the cursor, but // that did not show its new position. inline void LyXFunc::moveCursorUpdate(bool selecting) { if (selecting || owner->currentBuffer()->text->mark_set) { owner->currentBuffer()->text->SetSelection(); owner->currentView()->getScreen()->ToggleToggle(); owner->currentBuffer()->update(0); } else { owner->currentBuffer()->update(-2); // this IS necessary // (Matthias) } owner->currentView()->getScreen()->ShowCursor(); /* ---> Everytime the cursor is moved, show the current font state. */ // should this too me moved out of this func? //owner->getMiniBuffer()->Set(CurrentState()); } int LyXFunc::processKeyEvent(XEvent *ev) { char s_r[10]; s_r[9] = '\0'; int num_bytes; int action; string argument; XKeyEvent *keyevent = &ev->xkey; KeySym keysym_return; num_bytes = LyXLookupString(ev, s_r, 10, &keysym_return); if (lyxerr.debugging(Debug::KEY)) { lyxerr << "KeySym is " << XKeysymToString(keysym_return) << "[" << keysym_return << "]" << " and num_bytes is " << num_bytes << " the string returned is \"" << s_r << '\"' << endl; } // Do nothing if we have nothing (JMarc) if (num_bytes == 0 && keysym_return == NoSymbol) { lyxerr[Debug::KEY] << "Empty kbd action (probably composing)" << endl; return 0; } // this function should be used always [asierra060396] if (owner->currentView()->available() && owner->currentBuffer()->the_locking_inset && keysym_return == XK_Escape) { UnlockInset(owner->currentBuffer()->the_locking_inset); owner->currentBuffer()->text->CursorRight(); return 0; } // Can we be sure that this will work for all X-Windows // implementations? (Lgb) // This code snippet makes lyx ignore some keys. Perhaps // all of them should be explictly mentioned? if((keysym_return >= XK_Shift_L && keysym_return <= XK_Hyper_R) || keysym_return == XK_Mode_switch || keysym_return == 0x0) return 0; // Do a one-deep top-level lookup for // cancel and meta-fake keys. RVDK_PATCH_5 cancel_meta_seq.reset(); action = cancel_meta_seq.addkey(keysym_return, keyevent->state &(ShiftMask|ControlMask |Mod1Mask)); // When not cancel or meta-fake, do the normal lookup. // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards. // Mostly, meta_fake_bit = 0. RVDK_PATCH_5. if ( (action != LFUN_CANCEL) && (action != LFUN_META_FAKE) ) { // remove Caps Lock and Mod2 as a modifiers action = keyseq.addkey(keysym_return, (keyevent->state | meta_fake_bit) &(ShiftMask|ControlMask |Mod1Mask)); } // Dont remove this unless you know what you are doing. meta_fake_bit = 0; if (action == 0) action = LFUN_PREFIX; if (lyxerr.debugging(Debug::KEY)) { char buf[100]; keyseq.print(buf,100); lyxerr << "Key [" << action << "][" << buf << "][" << num_bytes << "]" << endl; } // already here we know if it any point in going further // why not return already here if action == -1 and // num_bytes == 0? (Lgb) if(keyseq.length>1 || keyseq.length<-1){ char buf[100]; keyseq.print(buf,100); owner->getMiniBuffer()->Set(buf); } if (action==-1) { if (keyseq.length<-1) { // unknown key sequence... char buf[100]; LyXBell(); keyseq.print(buf,100); owner->getMiniBuffer()->Set(_("Unknown sequence:"),buf); return 0; } char isochar = keyseq.getiso(); if (!(keyevent->state&ControlMask) && !(keyevent->state&Mod1Mask) && (isochar && keysym_return < 0xF000)) { argument += isochar; } if (argument.empty()) { lyxerr.debug() << "Empty argument!" << endl; // This can`t possibly be of any use // so we`ll skip the dispatch. return 0; } } else if (action==LFUN_SELFINSERT) { argument = s_r[0]; } bool tmp_sc = show_sc; show_sc = false; Dispatch(action, argument.c_str()); show_sc = tmp_sc; return 0; } string LyXFunc::Dispatch(string const &cmd, string const &arg) { return Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str()); } string LyXFunc::Dispatch(int ac, char const *do_not_use_this_arg) { string argument; kb_action action; FL_OBJECT *ob = 0; // This will disapear soon // we have not done anything wrong yet. errorstat = false; dispatch_buffer = string(); // if action is a pseudo-action, we need the real action if (lyxaction.isPseudoAction(ac)) { char const *tmparg = 0; action = (kb_action)lyxaction.retrieveActionArg(ac, &tmparg); if (tmparg) argument = tmparg; } else { action = (kb_action)ac; if (do_not_use_this_arg) argument = do_not_use_this_arg; // except here } selection_possible = false; if (owner->currentView()->available() && owner->currentView()->getScreen()) owner->currentView()->getScreen()->HideCursor(); if(!owner->currentView()->available()) { // This lists the allowed funcs when we have no // buffer loaded switch(action){ case LFUN_MENU_OPEN_BY_NAME: case LFUN_PREFIX: case LFUN_MENUNEW: case LFUN_MENUNEWTMPLT: case LFUN_MENUOPEN: case LFUN_QUIT: case LFUN_PUSH_TOOLBAR: case LFUN_ADD_TO_TOOLBAR: case LFUN_EXEC_COMMAND: case LFUN_DROP_LAYOUTS_CHOICE: case LFUN_FILE_NEW: case LFUN_FILE_OPEN: case LFUN_IMPORT: case LFUN_RECONFIGURE: case LFUN_CANCEL: case LFUN_APROPOS: case LFUN_META_FAKE: break; case LFUN_UNKNOWN_ACTION: setErrorMessage(N_("Unknown action")); goto exit_with_message; default: setErrorMessage(N_("Command not allowed with" "out any document open")); goto exit_with_message; // action not allowed } } commandshortcut = string(); if (lyxrc->display_shortcuts && show_sc) { if (action != LFUN_SELFINSERT) { // Put name of command and list of shortcuts // for it in minibuffer string comname = lyxaction.getActionName(action); int pseudoaction = action; bool argsadded = false; if (!argument.empty()) { // If we have the command with argument, // this is better pseudoaction = lyxaction.searchActionArg(action, argument.c_str()); if (pseudoaction == -1) { pseudoaction = action; } else { comname += " " + argument; argsadded = true; } } string shortcuts = toplevel_keymap->findbinding(pseudoaction); if (!shortcuts.empty()) { comname += ": " + shortcuts; } else if (!argsadded) { comname += " " + argument; } if (!comname.empty()) { comname = strip(comname); commandshortcut = "(" + comname + ')'; owner->getMiniBuffer()->Set(commandshortcut); // Here we could even add a small pause, // to annoy the user and make him learn // the shortcuts. // No! That will just annoy, not teach // anything. The user will read the messages // if they are interested. (Asger) } } } // Now that we know which action, if the buffer is RO let's check // whether the action is legal. Alejandro 970603 if (owner->currentView()->available() && owner->currentBuffer()->isReadonly() && lyxaction.isFuncRO(action)) { setErrorMessage(N_("Document is read-only")); lyxerr.debug() << "Error: Document is read-only." << endl; goto exit_with_message; } // If in math mode pass the control to // the math inset [asierra060396] if (owner->currentView()->available() && owner->currentBuffer()->the_locking_inset) { if (action>1 || (action==LFUN_UNKNOWN_ACTION && keyseq.length>=-1)) { if (action==LFUN_UNKNOWN_ACTION && argument.empty()) { argument = keyseq.getiso(); } // Undo/Redo pre 0.13 is a bit tricky for insets. if (action==LFUN_UNDO) { int slx, sly; UpdatableInset* inset = owner->currentBuffer()->the_locking_inset; inset->GetCursorPos(slx, sly); UnlockInset(inset); MenuUndo(); inset = (UpdatableInset*)owner->currentBuffer()->text->cursor.par->GetInset(owner->currentBuffer()->text->cursor.pos); if (inset) inset->Edit(slx, sly); return string(); } else if (action==LFUN_REDO) { int slx, sly; UpdatableInset* inset = owner->currentBuffer()->the_locking_inset; inset->GetCursorPos(slx, sly); UnlockInset(inset); MenuRedo(); inset = (UpdatableInset*)owner->currentBuffer()->text->cursor.par->GetInset(owner->currentBuffer()->text->cursor.pos); if (inset) inset->Edit(slx, sly); return string(); } else if (owner->currentBuffer()->the_locking_inset->LocalDispatch(action, argument.c_str())) return string(); else { setMessage(N_("Text mode")); if (action==LFUN_RIGHT || action==-1) owner->currentBuffer()->text->CursorRight(); if (action==LFUN_LEFT || action==LFUN_RIGHT) return string(); } } } switch(action) { // --- Misc ------------------------------------------- case LFUN_WORDFINDFORWARD : case LFUN_WORDFINDBACKWARD : { LyXText *ltCur; static string last_search; string searched_string; if (!argument.empty()) { last_search = argument; searched_string = argument; } else { searched_string = last_search; } ltCur = owner->currentView()->currentBuffer()->text ; if (!searched_string.empty() && ( (action == LFUN_WORDFINDBACKWARD) ? ltCur->SearchBackward( searched_string.c_str() ) : ltCur->SearchForward( searched_string.c_str() ) )){ // ??? What is that ??? owner->currentView()->currentBuffer()->update(-2); // ??? Needed ??? // clear the selection (if there is any) owner->currentView()->getScreen()->ToggleSelection(); owner->currentView()->currentBuffer()->text->ClearSelection(); // Move cursor so that successive C-s 's will not stand in place. if( action == LFUN_WORDFINDFORWARD ) owner->currentBuffer()->text->CursorRightOneWord(); owner->currentBuffer()->text->FinishUndo(); moveCursorUpdate(false); // ??? Needed ??? // set the new selection // SetSelectionOverLenChars(owner->currentView()->currentBuffer()->text, iLenSelected); owner->currentView()->getScreen()->ToggleSelection(false); } else LyXBell(); // REMOVED : if (owner->currentView()->getWorkArea()->focus) owner->currentView()->getScreen()->ShowCursor(); } break; case LFUN_PREFIX: { if (owner->currentView()->available() && owner->currentView()->getScreen()) { owner->currentBuffer()->update(-2); } char buf[100]; keyseq.print(buf,100, true); owner->getMiniBuffer()->Set(buf, string(), string(), 1); } break; // --- Misc ------------------------------------------- case LFUN_EXEC_COMMAND: owner->getMiniBuffer()->ExecCommand(); break; case LFUN_CANCEL: // RVDK_PATCH_5 keyseq.reset(); meta_fake_bit = 0; if(owner->currentView()->available()) // cancel any selection Dispatch(int(LFUN_MARK_OFF), 0); setMessage(N_("Cancel")); break; case LFUN_META_FAKE: // RVDK_PATCH_5 { meta_fake_bit = Mod1Mask; char buf[100]; keyseq.print(buf, 98, true); string res = string("M-") + buf; setMessage(buf); // RVDK_PATCH_5 } break; case LFUN_READ_ONLY_TOGGLE: if (owner->currentBuffer()->lyxvc.inUse()) { owner->currentBuffer()->lyxvc.toggleReadOnly(); } else { owner->currentBuffer()->setReadonly( !owner->currentBuffer()->isReadonly()); } break; case LFUN_CENTER: // this is center and redraw. BeforeChange(); if (owner->currentBuffer()->text->cursor.y > owner->currentView()->getWorkArea()->h / 2) { owner->currentView()->getScreen()-> Draw(owner->currentBuffer()->text->cursor.y - owner->currentView()->getWorkArea()->h/2); } else { // <= owner->currentView()->getScreen()-> Draw(0); } owner->currentBuffer()->update(0); owner->currentView()->redraw(); break; case LFUN_APPENDIX: if (owner->currentView()->available()) { owner->currentBuffer()->text->toggleAppendix(); owner->currentBuffer()->update(1); } break; // --- Menus ----------------------------------------------- case LFUN_MENUNEW: MenuNew(false); break; case LFUN_MENUNEWTMPLT: MenuNew(true); break; case LFUN_MENUOPEN: MenuOpen(); break; case LFUN_CLOSEBUFFER: CloseBuffer(); break; case LFUN_MENUWRITE: MenuWrite(owner->currentBuffer()); break; case LFUN_MENUWRITEAS: MenuWriteAs(owner->currentBuffer()); break; case LFUN_MENURELOAD: reloadBuffer(); break; case LFUN_PREVIEW: MenuPreview(owner->currentBuffer()); break; case LFUN_PREVIEWPS: MenuPreviewPS(owner->currentBuffer()); break; case LFUN_RUNLATEX: MenuRunLaTeX(owner->currentBuffer()); break; case LFUN_BUILDPROG: MenuBuildProg(owner->currentBuffer()); break; case LFUN_RUNCHKTEX: MenuRunChktex(owner->currentBuffer()); break; case LFUN_RUNDVIPS: MenuRunDvips(owner->currentBuffer(), false); break; case LFUN_MENUPRINT: MenuPrint(owner->currentBuffer()); break; case LFUN_FAX: MenuFax(owner->currentBuffer()); break; case LFUN_EXPORT: { //needs argument as string string extyp=argument; // latex if (extyp == "latex") { // make sure that this buffer is not linuxdoc MenuMakeLaTeX(owner->currentBuffer()); } // linuxdoc else if (extyp == "linuxdoc") { // make sure that this buffer is not latex MenuMakeLinuxDoc(owner->currentBuffer()); } // docbook else if (extyp == "docbook") { // make sure that this buffer is not latex or linuxdoc MenuMakeDocBook(owner->currentBuffer()); } // dvi else if (extyp == "dvi") { // Run LaTeX as "Update dvi..." Bernhard. // We want the dvi in the current directory. This // is achieved by temporarily disabling use of // temp directory. As a side-effect, we get // *.log and *.aux files also. (Asger) bool flag = lyxrc->use_tempdir; lyxrc->use_tempdir = false; MenuRunLaTeX(owner->currentBuffer()); lyxrc->use_tempdir = flag; } // postscript else if (extyp == "postscript") { // Start Print-dialog. Not as good as dvi... Bernhard. MenuPrint(owner->currentBuffer()); // Since the MenuPrint is a pop-up, we can't use // the same trick as above. (Asger) // MISSING: Move of ps-file :-( } // ascii else if (extyp == "ascii") { MenuMakeAscii(owner->currentBuffer()); } else if (extyp == "custom") { MenuSendto(); break; } // HTML else if (extyp == "html" && lyxrc->html_command != "none") { // First, create LaTeX file MenuMakeLaTeX(owner->currentBuffer()); // And now, run the converter string file = owner->currentBuffer()->getFileName(); Path path(OnlyPath(file)); // the tex file name has to be correct for // latex, but the html file name can be // anything. string result = ChangeExtension(file, ".html", false); file = ChangeExtension(SpaceLess(file), ".tex", false); string tmp = lyxrc->html_command; tmp = subst(tmp, "$$FName", file); tmp = subst(tmp, "$$OutName", result); Systemcalls one; int res = one.startscript(Systemcalls::System, tmp); if (res == 0) { setMessage(_("Document exported as HTML to file `") + MakeDisplayPath(result) +'\''); } else { setErrorMessage(_("Unable to convert to HTML the file `") + MakeDisplayPath(file) + '\''); } } else { setErrorMessage(_("Unknown export type: ") + extyp); } } break; case LFUN_IMPORT: { //needs argument as string string imtyp=argument; // latex if (imtyp == "latex") { doImportLaTeX(false); } // ascii else if (imtyp == "ascii") { doImportASCII(false); } else if (imtyp == "asciiparagraph") { doImportASCII(true); // noweb } else if (imtyp == "noweb") { doImportLaTeX(true); } else { setErrorMessage(string(N_("Unknown import type: ")) + imtyp); } break; } case LFUN_QUIT: QuitLyX(); break; case LFUN_TOCVIEW: TocUpdateCB(ob, 0); if (fd_form_toc->form_toc->visible) { fl_raise_form(fd_form_toc->form_toc); } else { static int ow = -1, oh; fl_show_form(fd_form_toc->form_toc, FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER, _("Table of Contents")); if (ow < 0) { ow = fd_form_toc->form_toc->w; oh = fd_form_toc->form_toc->h; } fl_set_form_minsize(fd_form_toc->form_toc, ow, oh); } break; case LFUN_TOC_INSERT: { Inset *new_inset = new InsetTOC(owner->currentBuffer()); owner->currentBuffer()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOF_INSERT: { Inset *new_inset = new InsetLOF(owner->currentBuffer()); owner->currentBuffer()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOA_INSERT: { Inset *new_inset = new InsetLOA(owner->currentBuffer()); owner->currentBuffer()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOT_INSERT: { Inset *new_inset = new InsetLOT(owner->currentBuffer()); owner->currentBuffer()->insertInset(new_inset, "Standard", true); break; } case LFUN_TABLE: TableCB(ob, 0); break; case LFUN_FIGURE: FigureCB(ob, 0); break; case LFUN_AUTOSAVE: AutoSave(); break; case LFUN_UNDO: MenuUndo(); break; case LFUN_REDO: MenuRedo(); break; case LFUN_MENUSEARCH: MenuSearch(); break; case LFUN_PASTE: PasteCB(); break; case LFUN_PASTESELECTION: { bool asPara = false; if (string(argument) == "paragraph") asPara = true; MenuPasteSelection(asPara); break; } case LFUN_CUT: CutCB(); break; case LFUN_COPY: CopyCB(); break; case LFUN_LAYOUT_COPY: CopyEnvironmentCB(); break; case LFUN_LAYOUT_PASTE: PasteEnvironmentCB(); break; case LFUN_GOTOERROR: owner->currentView()->gotoError(); break; case LFUN_REMOVEERRORS: if (owner->currentBuffer()->removeAutoInsets()) { owner->currentView()->redraw(); owner->currentView()->fitCursor(); owner->currentView()->updateScrollbar(); } break; case LFUN_GOTONOTE: GotoNote(); break; case LFUN_OPENSTUFF: OpenStuff(); break; case LFUN_HYPHENATION: HyphenationPoint(); break; case LFUN_LDOTS: Ldots(); break; case LFUN_END_OF_SENTENCE: EndOfSentenceDot(); break; case LFUN_MENU_SEPARATOR: MenuSeparator(); break; case LFUN_HFILL: HFill(); break; case LFUN_DEPTH: DepthCB(ob, 0); break; case LFUN_DEPTH_MIN: DepthCB(ob, -1); break; case LFUN_DEPTH_PLUS: DepthCB(ob, 1); break; case LFUN_FREE: FreeCB(); break; case LFUN_TEX: TexCB(); break; case LFUN_MELT: MeltCB(ob, 0); break; case LFUN_RECONFIGURE: Reconfigure(); break; case LFUN_FOOTMELT: if (owner->currentView()->available() && !owner->currentBuffer()->text->selection && owner->currentBuffer()->text->cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) { // only melt footnotes with FOOTMELT, not margins etc if(owner->currentBuffer()->text->cursor.par->footnotekind == LyXParagraph::FOOTNOTE) MeltCB(ob,0); } else FootCB(ob, 0); break; case LFUN_MARGINMELT: if (owner->currentView()->available() && !owner->currentBuffer()->text->selection && owner->currentBuffer()->text->cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) { // only melt margins if(owner->currentBuffer()->text->cursor.par->footnotekind == LyXParagraph::MARGIN) MeltCB(ob,0); } else MarginCB(ob, 0); break; // --- version control ------------------------------- case LFUN_VC_REGISTER: { if (!owner->currentBuffer()->lyxvc.inUse()) owner->currentBuffer()->lyxvc.registrer(); } break; case LFUN_VC_CHECKIN: { if (owner->currentBuffer()->lyxvc.inUse() && !owner->currentBuffer()->isReadonly()) owner->currentBuffer()->lyxvc.checkIn(); } break; case LFUN_VC_CHECKOUT: { if (owner->currentBuffer()->lyxvc.inUse() && owner->currentBuffer()->isReadonly()) owner->currentBuffer()->lyxvc.checkOut(); } break; case LFUN_VC_REVERT: { owner->currentBuffer()->lyxvc.revert(); } break; case LFUN_VC_UNDO: { owner->currentBuffer()->lyxvc.undoLast(); } break; case LFUN_VC_HISTORY: { owner->currentBuffer()->lyxvc.showLog(); break; } // --- buffers ---------------------------------------- case LFUN_PREVBUFFER: #ifdef WITH_WARNINGS #warning fix this please #endif // it is the LyXView or the BufferView that should // remember the previous buffer, not bufferlist. // if (owner->currentView()->available()){ // BeforeChange(); // owner->currentBuffer()->update(-2); // } // owner->currentView()->setBuffer(bufferlist.prev()); // owner->currentView()-> // resizeCurrentBufferPseudoExpose(); break; case LFUN_FILE_INSERT: { MenuInsertLyXFile(argument); } break; case LFUN_FILE_INSERT_ASCII: { bool asPara = false; asPara = (string(argument) == "paragraph"); InsertAsciiFile(string(), asPara); } break; case LFUN_FILE_NEW: { // servercmd: argument must be :