/* This file is part of * ====================================================== * * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich * Copyright 1995-2000 The LyX Team. * * ====================================================== */ #include #include "Lsstream.h" #include #include #include #include #include #ifdef __GNUG__ #pragma implementation #endif #include "version.h" #include "lyxlookup.h" #include "kbmap.h" #include "lyxfunc.h" #include "bufferlist.h" #include "ColorHandler.h" #include "lyxserver.h" #include "lyx.h" #include "intl.h" #include "lyx_main.h" #include "lyx_cb.h" #include "LyXAction.h" #include "insets/inseturl.h" #include "insets/insetlatexaccent.h" #include "insets/insettoc.h" #include "insets/insetref.h" #include "insets/insetparent.h" #include "insets/insetindex.h" #include "insets/insetinclude.h" #include "insets/insetbib.h" #include "insets/insetcite.h" #include "insets/insettext.h" #include "insets/insetert.h" #include "insets/insetexternal.h" #include "insets/insetgraphics.h" #include "insets/insetfoot.h" #include "insets/insetmarginal.h" #include "insets/insetminipage.h" #include "insets/insetfloat.h" #include "insets/insetlist.h" #include "insets/insettabular.h" #include "insets/insettheorem.h" #include "insets/insetcaption.h" #include "mathed/formulamacro.h" #include "spellchecker.h" // RVDK_PATCH_5 #include "minibuffer.h" #include "vspace.h" #include "LyXView.h" #include "filedlg.h" #include "lyx_gui_misc.h" #include "support/filetools.h" #include "support/FileInfo.h" #include "support/syscall.h" #include "support/lstrings.h" #include "support/path.h" #include "support/lyxfunctional.h" #include "debug.h" #include "lyxrc.h" #include "lyxtext.h" #include "gettext.h" #include "trans_mgr.h" #include "ImportLaTeX.h" #include "ImportNoweb.h" #include "layout.h" #include "WorkArea.h" #include "lyxfr1.h" #include "bufferview_funcs.h" #include "frontends/Dialogs.h" #include "frontends/Toolbar.h" #include "frontends/Menubar.h" #include "FloatList.h" #include "exporter.h" #include "FontLoader.h" #include "TextCache.h" using std::pair; using std::endl; extern void InsertAsciiFile(BufferView *, string const &, bool); extern void math_insert_symbol(string const &); extern bool math_insert_greek(char); extern BufferList bufferlist; extern LyXServer * lyxserver; extern int greek_kb_flag; extern bool selection_possible; extern kb_keymap * toplevel_keymap; extern bool MenuWrite(Buffer *); extern bool MenuWriteAs(Buffer *); extern int MenuRunLaTeX(Buffer *); extern int MenuBuildProg(Buffer *); extern int MenuRunChktex(Buffer *); extern void MenuPrint(Buffer *); extern void MenuSendto(); extern void QuitLyX(); extern void MenuFax(Buffer *); extern void show_symbols_form(LyXFunc *); extern LyXAction lyxaction; // (alkis) extern tex_accent_struct get_accent(kb_action action); extern void AutoSave(BufferView *); extern void MenuInsertLabel(string const &); extern void MenuLayoutCharacter(); extern void MenuLayoutParagraph(); extern void MenuLayoutPreamble(); extern void MenuLayoutSave(); extern Buffer * NewLyxFile(string const &); extern void LoadLyXFile(string const &); extern void Reconfigure(BufferView *); extern LyXTextClass::size_type current_layout; extern int getISOCodeFromLaTeX(char *); extern void ShowLatexLog(); /* === 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(); } // 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->view()->text->mark_set) { owner->view()->text->SetSelection(); owner->view()->toggleToggle(); } owner->view()->update(BufferView::SELECT|BufferView::FITCUR); owner->view()->showCursor(); /* ---> Everytime the cursor is moved, show the current font state. */ // should this too me moved out of this func? //owner->showState(); owner->view()->setState(); } int LyXFunc::processKeySym(KeySym keysym, unsigned int state) { string argument; if (lyxerr.debugging(Debug::KEY)) { char * tmp = XKeysymToString(keysym); string stm = (tmp ? tmp : ""); lyxerr << "KeySym is " << stm << "[" << keysym << "]" << endl; } // Do nothing if we have nothing (JMarc) if (keysym == NoSymbol) { lyxerr[Debug::KEY] << "Empty kbd action (probably composing)" << endl; //return 0; return FL_PREEMPT; } // this function should be used always [asierra060396] UpdatableInset * tli = owner->view()->theLockingInset(); if (owner->view()->available() && tli && (keysym == XK_Escape)) { if (tli == tli->GetLockingInset()) { owner->view()->unlockInset(tli); owner->view()->text->CursorRight(owner->view()); moveCursorUpdate(false); owner->showState(); } else { tli->UnlockInsetInInset(owner->view(), tli->GetLockingInset(),true); } //return 0; return FL_PREEMPT; } // 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 >= XK_Shift_L && keysym <= XK_Hyper_R) || keysym == XK_Mode_switch || keysym == 0x0) return 0; // Do a one-deep top-level lookup for // cancel and meta-fake keys. RVDK_PATCH_5 cancel_meta_seq.reset(); int action = cancel_meta_seq.addkey(keysym, 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, (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)) { string buf; keyseq.print(buf); lyxerr << "Key [" << action << "][" << buf << "]" << 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) { string buf; keyseq.print(buf); owner->getMiniBuffer()->Set(buf); } if (action == -1) { if (keyseq.length < -1) { // unknown key sequence... string buf; LyXBell(); keyseq.print(buf); owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf); return 0; } char isochar = keyseq.getiso(); if (!(state & ControlMask) && !(state & Mod1Mask) && (isochar && keysym < 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; } } bool tmp_sc = show_sc; show_sc = false; Dispatch(action, argument); show_sc = tmp_sc; return 0; } #if 0 int LyXFunc::processKeyEvent(XEvent * ev) { char s_r[10]; KeySym keysym_return = 0; string argument; XKeyEvent * keyevent = &ev->xkey; int num_bytes = LyXLookupString(ev, s_r, 10, &keysym_return); s_r[num_bytes] = '\0'; if (lyxerr.debugging(Debug::KEY)) { char * tmp = XKeysymToString(keysym_return); string stm = (tmp ? tmp : ""); lyxerr << "KeySym is " << stm << "[" << 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] UpdatableInset * tli = owner->view()->theLockingInset(); if (owner->view()->available() && tli && (keysym_return==XK_Escape)) { if (tli == tli->GetLockingInset()) { owner->view()->unlockInset(tli); owner->view()->text->CursorRight(owner->view()); moveCursorUpdate(false); owner->showState(); } else { tli->UnlockInsetInInset(owner->view(), tli->GetLockingInset(),true); } 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(); int 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)) { string buf; keyseq.print(buf); 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) { string buf; keyseq.print(buf); owner->getMiniBuffer()->Set(buf); } if (action == -1) { if (keyseq.length < -1) { // unknown key sequence... string buf; LyXBell(); keyseq.print(buf); 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); show_sc = tmp_sc; return 0; } #endif LyXFunc::func_status LyXFunc::getStatus(int ac) const { kb_action action; func_status flag = LyXFunc::OK; string argument; Buffer * buf = owner->buffer(); if (lyxaction.isPseudoAction(ac)) action = lyxaction.retrieveActionArg(ac, argument); else action = static_cast(ac); if (action == LFUN_UNKNOWN_ACTION) { setErrorMessage(N_("Unknown action")); return LyXFunc::Unknown; } // Check whether we need a buffer if (!lyxaction.funcHasFlag(action, LyXAction::NoBuffer)) { // Yes we need a buffer, do we have one? if (buf) { // yes // Can we use a readonly buffer? if (buf->isReadonly() && !lyxaction.funcHasFlag(action, LyXAction::ReadOnly)) { // no setErrorMessage(N_("Document is read-only")); flag |= LyXFunc::Disabled; } } else { // no setErrorMessage(N_("Command not allowed with" "out any document open")); flag |= LyXFunc::Disabled; return flag; } } // I would really like to avoid having this switch and rather try to // encode this in the function itself. bool disable = false; switch (action) { case LFUN_MENUPRINT: disable = !Exporter::IsExportable(buf, "dvi") || lyxrc.print_command == "none"; break; case LFUN_FAX: disable = !Exporter::IsExportable(buf, "ps") || lyxrc.fax_command == "none"; break; case LFUN_IMPORT: if (argument == "latex" || argument == "noweb") disable = lyxrc.relyx_command == "none"; else if (argument == "linuxdoc") disable = lyxrc.linuxdoc_to_lyx_command == "none"; break; case LFUN_UNDO: disable = buf->undostack.empty(); break; case LFUN_REDO: disable = buf->redostack.empty(); break; case LFUN_SPELLCHECK: disable = lyxrc.isp_command == "none"; break; case LFUN_RUNCHKTEX: disable = lyxrc.chktex_command == "none"; break; case LFUN_BUILDPROG: disable = !Exporter::IsExportable(buf, "Program"); break; case LFUN_LAYOUT_TABULAR: disable = true; if (owner->view()->theLockingInset()) { disable = (owner->view()->theLockingInset()->LyxCode() != Inset::TABULAR_CODE) && !owner->view()->theLockingInset()->GetFirstLockingInsetOfType(Inset::TABULAR_CODE); } break; case LFUN_TABULAR_FEATURE: disable = true; if (owner->view()->theLockingInset()) { func_status ret = LyXFunc::Disabled; if (owner->view()->theLockingInset()->LyxCode() == Inset::TABULAR_CODE) { ret = static_cast (owner->view()->theLockingInset())-> getStatus(argument); } else if (owner->view()->theLockingInset()->GetFirstLockingInsetOfType(Inset::TABULAR_CODE)) { ret = static_cast (owner->view()->theLockingInset()-> GetFirstLockingInsetOfType(Inset::TABULAR_CODE))-> getStatus(argument); } flag |= ret; disable = false; } else { static InsetTabular inset(*owner->buffer(), 1, 1); func_status ret; disable = true; ret = inset.getStatus(argument); if ((ret & LyXFunc::ToggleOn) || (ret & LyXFunc::ToggleOff)) flag |= LyXFunc::ToggleOff; } break; case LFUN_VC_REGISTER: disable = buf->lyxvc.inUse(); break; case LFUN_VC_CHECKIN: disable = !buf->lyxvc.inUse() || buf->isReadonly(); break; case LFUN_VC_CHECKOUT: disable = !buf->lyxvc.inUse() || !buf->isReadonly(); break; case LFUN_VC_REVERT: case LFUN_VC_UNDO: case LFUN_VC_HISTORY: disable = !buf->lyxvc.inUse(); break; case LFUN_REF_BACK: disable = owner->view()->NoSavedPositions(); break; default: break; } if (disable) flag |= LyXFunc::Disabled; if (buf) { func_status box = LyXFunc::ToggleOff; LyXFont font; if (owner->view()->theLockingInset() && owner->view()->theLockingInset()->getLyXText(owner->view())) font = owner->view()->theLockingInset()-> getLyXText(owner->view())->real_current_font; else font = owner->view()->text->real_current_font; switch (action) { case LFUN_EMPH: if (font.emph() == LyXFont::ON) box = LyXFunc::ToggleOn; break; case LFUN_NOUN: if (font.noun() == LyXFont::ON) box = LyXFunc::ToggleOn; break; case LFUN_BOLD: if (font.series() == LyXFont::BOLD_SERIES) box = LyXFunc::ToggleOn; break; case LFUN_TEX: if (font.latex() == LyXFont::ON) box = LyXFunc::ToggleOn; break; default: box = LyXFunc::OK; break; } flag |= box; } return flag; } string const LyXFunc::Dispatch(string const & s) { // Split command string into command and argument string cmd; string line = frontStrip(s); string arg = strip(frontStrip(split(line, cmd, ' '))); return Dispatch(lyxaction.LookupFunc(cmd), arg); } string const LyXFunc::Dispatch(int ac, string const & do_not_use_this_arg) { string argument; kb_action action; LyXText * text = 0; // we have not done anything wrong yet. errorstat = false; dispatch_buffer.erase(); // if action is a pseudo-action, we need the real action if (lyxaction.isPseudoAction(ac)) { string tmparg; action = static_cast (lyxaction.retrieveActionArg(ac, tmparg)); if (!tmparg.empty()) argument = tmparg; } else { action = static_cast(ac); if (!do_not_use_this_arg.empty()) argument = do_not_use_this_arg; // except here } selection_possible = false; if (owner->view()->available()) owner->view()->hideCursor(); // We cannot use this function here if (getStatus(ac) & Disabled) goto exit_with_message; commandshortcut.erase(); 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); 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) } } } if (owner->view()->available() && owner->view()->theLockingInset()) { UpdatableInset::RESULT result; 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; int sly; UpdatableInset * inset = owner->view()->theLockingInset(); inset->GetCursorPos(owner->view(), slx, sly); owner->view()->unlockInset(inset); owner->view()->menuUndo(); if (owner->view()->text->cursor.par()-> IsInset(owner->view()->text->cursor.pos())) { inset = static_cast( owner->view()->text->cursor.par()-> GetInset(owner->view()->text-> cursor.pos())); } else { inset = 0; } if (inset) inset->Edit(owner->view(),slx,sly,0); return string(); } else if (action == LFUN_REDO) { int slx; int sly; UpdatableInset * inset = owner->view()-> theLockingInset(); inset->GetCursorPos(owner->view(), slx, sly); owner->view()->unlockInset(inset); owner->view()->menuRedo(); inset = static_cast( owner->view()->text->cursor.par()-> GetInset(owner->view()->text-> cursor.pos())); if (inset) inset->Edit(owner->view(),slx,sly,0); return string(); } else if (((result=owner->view()->theLockingInset()-> LocalDispatch(owner->view(), action, argument)) == UpdatableInset::DISPATCHED) || (result == UpdatableInset::DISPATCHED_NOUPDATE)) return string(); else { setMessage(N_("Text mode")); switch(action) { case LFUN_UNKNOWN_ACTION: case LFUN_BREAKPARAGRAPH: case LFUN_BREAKLINE: owner->view()->text->CursorRight(owner->view()); owner->view()->setState(); owner->showState(); break; case LFUN_RIGHT: if (!owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { owner->view()->text->CursorRight(owner->view()); moveCursorUpdate(false); owner->showState(); } return string(); case LFUN_LEFT: if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { owner->view()->text->CursorRight(owner->view()); moveCursorUpdate(false); owner->showState(); } return string(); case LFUN_DOWN: owner->view()->text->CursorDown(owner->view()); moveCursorUpdate(false); owner->showState(); return string(); default: break; } } } if (owner->view()->theLockingInset()) text = owner->view()->theLockingInset()-> getLyXText(owner->view()); } if (!text) text = owner->view()->text; switch(action) { // --- Misc ------------------------------------------- case LFUN_WORDFINDFORWARD : case LFUN_WORDFINDBACKWARD : { static string last_search; string searched_string; if (!argument.empty()) { last_search = argument; searched_string = argument; } else { searched_string = last_search; } LyXText * ltCur = owner->view()->text ; if (!searched_string.empty() && ((action == LFUN_WORDFINDBACKWARD) ? ltCur->SearchBackward(owner->view(), searched_string) : ltCur->SearchForward(owner->view(), searched_string))) { // ??? What is that ??? owner->view()->update(BufferView::SELECT|BufferView::FITCUR); // ??? Needed ??? // clear the selection (if there is any) owner->view()->toggleSelection(); owner->view()->text->ClearSelection(); // Move cursor so that successive C-s 's will not stand in place. if( action == LFUN_WORDFINDFORWARD ) owner->view()->text->CursorRightOneWord(owner->view()); owner->view()->text->FinishUndo(); moveCursorUpdate(false); // ??? Needed ??? // set the new selection // SetSelectionOverLenChars(owner->view()->currentBuffer()->text, iLenSelected); owner->view()->toggleSelection(false); } else LyXBell(); // REMOVED : if (owner->view()->getWorkArea()->focus) owner->view()->showCursor(); } break; case LFUN_PREFIX: { if (owner->view()->available()) { owner->view()->update(BufferView::SELECT|BufferView::FITCUR); } string buf; keyseq.print(buf, 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->view()->available()) // cancel any selection Dispatch(LFUN_MARK_OFF); setMessage(N_("Cancel")); break; case LFUN_META_FAKE: // RVDK_PATCH_5 { meta_fake_bit = Mod1Mask; string buf; keyseq.print(buf, true); setMessage(buf); // RVDK_PATCH_5 } break; case LFUN_READ_ONLY_TOGGLE: if (owner->buffer()->lyxvc.inUse()) { owner->buffer()->lyxvc.toggleReadOnly(); } else { owner->buffer()->setReadonly( !owner->buffer()->isReadonly()); } break; case LFUN_CENTER: // this is center and redraw. owner->view()->center(); break; case LFUN_APPENDIX: if (owner->view()->available()) { owner->view()->text->toggleAppendix(owner->view()); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } 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: if (!owner->buffer()->isUnnamed()) { owner->getMiniBuffer()->Set(_("Saving document"), MakeDisplayPath(owner->buffer()->fileName()), "..."); MenuWrite(owner->buffer()); //owner->getMiniBuffer()-> { // Set(_("Document saved as"), // MakeDisplayPath(owner->buffer()->fileName())); //} else { //owner->getMiniBuffer()->Set(_("Save failed!")); //} } else { MenuWriteAs(owner->buffer()); } break; case LFUN_MENUWRITEAS: MenuWriteAs(owner->buffer()); break; case LFUN_MENURELOAD: reloadBuffer(); break; case LFUN_UPDATE: Exporter::Export(owner->buffer(), argument, true); break; case LFUN_PREVIEW: Exporter::Preview(owner->buffer(), argument); break; case LFUN_BUILDPROG: Exporter::Export(owner->buffer(), "Program", true); break; case LFUN_RUNCHKTEX: MenuRunChktex(owner->buffer()); break; case LFUN_MENUPRINT: owner->getDialogs()->showPrint(); break; case LFUN_FAX: MenuFax(owner->buffer()); break; case LFUN_EXPORT: Exporter::Export(owner->buffer(), argument, false); break; case LFUN_IMPORT: doImport(argument); break; case LFUN_QUIT: QuitLyX(); break; case LFUN_TOCVIEW: case LFUN_LOFVIEW: case LFUN_LOTVIEW: case LFUN_LOAVIEW: { InsetCommandParams p; if( action == LFUN_TOCVIEW ) p.setCmdName( "tableofcontents" ); else if( action == LFUN_LOAVIEW ) p.setCmdName( "listofalgorithms" ); else if( action == LFUN_LOFVIEW ) p.setCmdName( "listoffigures" ); else p.setCmdName( "listoftables" ); owner->getDialogs()->createTOC( p.getAsString() ); break; } case LFUN_TOC_INSERT: case LFUN_LOA_INSERT: case LFUN_LOF_INSERT: case LFUN_LOT_INSERT: { InsetCommandParams p; if( action == LFUN_TOC_INSERT ) p.setCmdName( "tableofcontents" ); else if( action == LFUN_LOA_INSERT ) p.setCmdName( "listofalgorithms" ); else if( action == LFUN_LOF_INSERT ) p.setCmdName( "listoffigures" ); else p.setCmdName( "listoftables" ); Inset * inset = new InsetTOC( p ); if( !owner->view()->insertInset( inset, "Standard", true ) ) delete inset; break; } case LFUN_DIALOG_TABULAR_INSERT: owner->getDialogs()->showTabularCreate(); break; case LFUN_TABULAR_FEATURE: case LFUN_SCROLL_INSET: // this is not handled here as this funktion is only aktive // if we have a locking_inset and that one is (or contains) // a tabular-inset break; case LFUN_FIGURE: Figure(); break; case LFUN_INSET_GRAPHICS: { Inset * new_inset = new InsetGraphics; if (!owner->view()->insertInset(new_inset)) { delete new_inset; } else { // this is need because you don't use a inset->Edit() owner->view()->updateInset(new_inset, true); new_inset->Edit(owner->view(), 0, 0, 0); } break; } case LFUN_AUTOSAVE: AutoSave(owner->view()); break; case LFUN_UNDO: owner->view()->menuUndo(); break; case LFUN_REDO: owner->view()->menuRedo(); break; case LFUN_MENUSEARCH: { // Ok this is one _very_ bad solution, but I think that some // of this will be rewritten as part of GUI indep anyway. // Lgb static LyXFindReplace FR_; FR_.StartSearch(owner->view()); } break; case LFUN_PASTE: owner->view()->paste(); owner->view()->setState(); break; case LFUN_PASTESELECTION: { bool asPara = false; if (argument == "paragraph") asPara = true; owner->view()->pasteClipboard(asPara); } break; case LFUN_CUT: owner->view()->cut(); break; case LFUN_COPY: owner->view()->copy(); break; case LFUN_LAYOUT_COPY: owner->view()->copyEnvironment(); break; case LFUN_LAYOUT_PASTE: owner->view()->pasteEnvironment(); owner->view()->setState(); break; case LFUN_GOTOERROR: owner->view()->gotoError(); break; case LFUN_REMOVEERRORS: if (owner->view()->removeAutoInsets()) { owner->view()->redraw(); owner->view()->fitCursor(owner->view()->text); } break; case LFUN_GOTONOTE: owner->view()->gotoNote(); break; #ifndef NEW_INSETS case LFUN_OPENSTUFF: owner->view()->openStuff(); break; #endif case LFUN_HYPHENATION: owner->view()->hyphenationPoint(); break; case LFUN_LDOTS: owner->view()->ldots(); break; case LFUN_END_OF_SENTENCE: owner->view()->endOfSentenceDot(); break; case LFUN_MENU_SEPARATOR: owner->view()->menuSeparator(); break; case LFUN_HFILL: owner->view()->hfill(); break; case LFUN_DEPTH: changeDepth(owner->view(), 0); break; case LFUN_DEPTH_MIN: changeDepth(owner->view(), -1); break; case LFUN_DEPTH_PLUS: changeDepth(owner->view(), 1); break; case LFUN_FREE: Free(owner->view()); owner->view()->setState(); owner->showState(); break; case LFUN_TEX: Tex(owner->view()); owner->view()->setState(); owner->showState(); break; #ifndef NEW_INSETS case LFUN_MELT: Melt(owner->view()); break; #endif case LFUN_RECONFIGURE: Reconfigure(owner->view()); break; #ifndef NEW_INSETS case LFUN_FOOTMELT: if (owner->view()->available() && !owner->view()->text->selection && owner->view()->text->cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) { // only melt footnotes with FOOTMELT, not margins etc if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::FOOTNOTE) Melt(owner->view()); } else Foot(owner->view()); owner->view()->setState(); break; case LFUN_MARGINMELT: if (owner->view()->available() && !owner->view()->text->selection && owner->view()->text->cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) { // only melt margins if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::MARGIN) Melt(owner->view()); } else Margin(owner->view()); owner->view()->setState(); break; #endif case LFUN_HELP_COPYRIGHT: owner->getDialogs()->showCopyright(); break; case LFUN_HELP_CREDITS: owner->getDialogs()->showCredits(); break; case LFUN_HELP_OPEN: { string arg = argument; if (arg.empty()) { setErrorMessage(N_("Missing argument")); break; } ProhibitInput(owner->view()); string fname = i18nLibFileSearch("doc", arg, "lyx"); if (fname.empty()) { lyxerr << "LyX: unable to find documentation file `" << arg << "'. Bad installation?" << endl; AllowInput(owner->view()); break; } owner->getMiniBuffer()->Set(_("Opening help file"), MakeDisplayPath(fname),"..."); owner->view()->buffer(bufferlist.loadLyXFile(fname,false)); AllowInput(owner->view()); break; } case LFUN_HELP_VERSION: { ProhibitInput(owner->view()); string msg(_("LyX Version ")); msg += LYX_VERSION; msg += " of "; msg += LYX_RELEASE; fl_show_message(msg.c_str(), (_("Library directory: ") + MakeDisplayPath(system_lyxdir)).c_str(), (_("User directory: ") + MakeDisplayPath(user_lyxdir)).c_str()); AllowInput(owner->view()); break; } // --- version control ------------------------------- case LFUN_VC_REGISTER: { if (!owner->buffer()->lyxvc.inUse()) owner->buffer()->lyxvc.registrer(); } break; case LFUN_VC_CHECKIN: { if (owner->buffer()->lyxvc.inUse() && !owner->buffer()->isReadonly()) owner->buffer()->lyxvc.checkIn(); } break; case LFUN_VC_CHECKOUT: { if (owner->buffer()->lyxvc.inUse() && owner->buffer()->isReadonly()) owner->buffer()->lyxvc.checkOut(); } break; case LFUN_VC_REVERT: { owner->buffer()->lyxvc.revert(); } break; case LFUN_VC_UNDO: { owner->buffer()->lyxvc.undoLast(); } break; case LFUN_VC_HISTORY: { owner->buffer()->lyxvc.showLog(); break; } // --- buffers ---------------------------------------- case LFUN_SWITCHBUFFER: owner->view()->buffer(bufferlist.getBuffer(argument)); break; case LFUN_FILE_INSERT: { MenuInsertLyXFile(argument); } break; case LFUN_FILE_INSERT_ASCII: { bool asPara = (argument == "paragraph"); InsertAsciiFile(owner->view(), string(), asPara); } break; case LFUN_FILE_NEW: { // servercmd: argument must be :