X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=ddd80299e411b62e6ce3cb83e4ff3c605d07640f;hb=8d3a4fd463f6865eecf7fb9e2bd63c43f9438cfe;hp=a3b0734b34a998b8da9c3d862073707fe8f0bd4c;hpb=dc05712c01be328a21b7364b03cbb12f09817a70;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index a3b0734b34..ddd80299e4 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -1,14 +1,16 @@ /* This file is part of - * ====================================================== + * ====================================================== * * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-1999 The LyX Team. + * Copyright 1995-2000 The LyX Team. * - * ======================================================*/ + * ====================================================== */ #include +#include +#include #include #include @@ -18,7 +20,6 @@ #pragma implementation #endif -#include "definitions.h" #include "lyxlookup.h" #include "kbmap.h" #include "lyxfunc.h" @@ -28,7 +29,7 @@ #include "intl.h" #include "lyx_main.h" #include "lyx_cb.h" -#include "insets/insetlatex.h" +#include "LyXAction.h" #include "insets/inseturl.h" #include "insets/insetlatexaccent.h" #include "insets/insettoc.h" @@ -37,20 +38,26 @@ #include "insets/insetlot.h" #include "insets/insetref.h" #include "insets/insetparent.h" +#include "insets/insetindex.h" +#include "insets/insetinclude.h" +#include "insets/insetbib.h" +#include "insets/insettext.h" +#include "insets/insetert.h" +#include "insets/insetgraphics.h" +#include "insets/insetfoot.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 "lyxscreen.h" +#include "support/syscall.h" +#include "support/lstrings.h" +#include "support/path.h" #include "debug.h" #include "lyxrc.h" #include "lyxtext.h" @@ -58,63 +65,45 @@ #include "trans_mgr.h" #include "ImportLaTeX.h" #include "ImportNoweb.h" -#include "support/syscall.h" -#include "support/lstrings.h" +#include "layout.h" +#include "WorkArea.h" +#include "lyxfr1.h" extern bool cursor_follows_scrollbar; -extern void InsertAsciiFile(string const &, bool); -extern void math_insert_symbol(char const*); +extern void InsertAsciiFile(BufferView *, 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 LyXServer * lyxserver; extern short greek_kb_flag; -extern FD_form_toc *fd_form_toc; +extern FD_form_toc * fd_form_toc; extern bool selection_possible; -extern kb_keymap *toplevel_keymap; +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 MenuWrite(Buffer *); +extern void MenuWriteAs(Buffer *); +extern int MenuRunLaTeX(Buffer *); +extern int MenuBuildProg(Buffer *); +extern int MenuRunChktex(Buffer *); +extern bool CreatePostscript(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 MenuExport(Buffer *, string const &); 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 SetUpdateTimer(float timer = 0.3); extern void FreeUpdateTimer(); -extern bool MenuPreview(Buffer*); -extern bool MenuPreviewPS(Buffer*); -extern void MenuInsertLabel(const char *); +extern bool PreviewDVI(Buffer *); +extern bool PreviewPostscript(Buffer *); +extern void MenuInsertLabel(char const *); extern void MenuInsertRef(); extern void MenuLayoutCharacter(); extern void MenuLayoutParagraph(); @@ -128,24 +117,20 @@ extern void bulletForm(); extern Buffer * NewLyxFile(string const &); extern void LoadLyXFile(string const &); -extern void Reconfigure(); +extern void Reconfigure(BufferView *); -extern int current_layout; +extern LyXTextClass::size_type 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) +LyXFunc::LyXFunc(LyXView * o) + : owner(o) { meta_fake_bit = 0; lyx_dead_action = LFUN_NOACTION; @@ -154,11 +139,6 @@ LyXFunc::LyXFunc(LyXView *o) } -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 @@ -167,37 +147,39 @@ LyXFunc::~LyXFunc() 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); + if (selecting || owner->view()->text->mark_set) { + owner->view()->text->SetSelection(); + owner->view()->toggleToggle(); + owner->view()->update(0); } else { - owner->currentBuffer()->update(-2); // this IS necessary + owner->view()->update(-2); // this IS necessary // (Matthias) } - owner->currentView()->getScreen()->ShowCursor(); + + owner->view()->showCursor(); /* ---> Everytime the cursor is moved, show the current font state. */ // should this too me moved out of this func? //owner->getMiniBuffer()->Set(CurrentState()); + owner->view()->setState(); } -int LyXFunc::processKeyEvent(XEvent *ev) +int LyXFunc::processKeyEvent(XEvent * ev) { char s_r[10]; - s_r[9] = '\0'; - int num_bytes; - int action; string argument; - XKeyEvent *keyevent = &ev->xkey; + XKeyEvent * keyevent = &ev->xkey; KeySym keysym_return; - num_bytes = LyXLookupString(ev, s_r, 10, &keysym_return); + 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 " - << XKeysymToString(keysym_return) + << stm << "[" << keysym_return << "]" << " and num_bytes is " @@ -213,11 +195,13 @@ int LyXFunc::processKeyEvent(XEvent *ev) } // this function should be used always [asierra060396] - if (owner->currentView()->available() && - owner->currentBuffer()->the_locking_inset && + if (owner->view()->available() && + owner->view()->the_locking_inset && keysym_return == XK_Escape) { - UnlockInset(owner->currentBuffer()->the_locking_inset); - owner->currentBuffer()->text->CursorRight(); + owner->view()->unlockInset(owner->view()->the_locking_inset); + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); return 0; } @@ -233,9 +217,9 @@ int LyXFunc::processKeyEvent(XEvent *ev) // cancel and meta-fake keys. RVDK_PATCH_5 cancel_meta_seq.reset(); - action = cancel_meta_seq.addkey(keysym_return, keyevent->state - &(ShiftMask|ControlMask - |Mod1Mask)); + 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. @@ -254,8 +238,8 @@ int LyXFunc::processKeyEvent(XEvent *ev) if (action == 0) action = LFUN_PREFIX; if (lyxerr.debugging(Debug::KEY)) { - char buf[100]; - keyseq.print(buf,100); + string buf; + keyseq.print(buf); lyxerr << "Key [" << action << "][" << buf << "][" @@ -266,18 +250,18 @@ int LyXFunc::processKeyEvent(XEvent *ev) // 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); + 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... - char buf[100]; + if (action == -1) { + if (keyseq.length < -1) { // unknown key sequence... + string buf; LyXBell(); - keyseq.print(buf,100); - owner->getMiniBuffer()->Set(_("Unknown sequence:"),buf); + keyseq.print(buf); + owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf); return 0; } @@ -294,7 +278,7 @@ int LyXFunc::processKeyEvent(XEvent *ev) return 0; } } else - if (action==LFUN_SELFINSERT) { + if (action == LFUN_SELFINSERT) { argument = s_r[0]; } @@ -303,90 +287,185 @@ int LyXFunc::processKeyEvent(XEvent *ev) Dispatch(action, argument.c_str()); show_sc = tmp_sc; - // Need this for deadkeys (alkis) - //keyseq.length=0; - // ...but that breaks the minibuffer's display of "M-"... -#ifdef WITH_WARNINGS -#warning How does the deadkeys react to this? -#endif return 0; } -string LyXFunc::Dispatch(string const &cmd, string const &arg) +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; + } + } + + if (flag & LyXFunc::Disabled) + return flag; + + // I would really like to avoid having this switch and rather try to + // encode this in the function itself. + static bool noLaTeX = lyxrc.latex_command == "none"; + bool disable = false; + switch (action) { + case LFUN_PREVIEW: + disable = noLaTeX || lyxrc.view_dvi_command == "none"; + break; + case LFUN_PREVIEWPS: + disable = noLaTeX || lyxrc.view_ps_command == "none"; + break; + case LFUN_RUNLATEX: + case LFUN_RUNDVIPS: + disable = noLaTeX; + break; + case LFUN_MENUPRINT: + disable = noLaTeX || lyxrc.print_command == "none"; + break; + case LFUN_FAX: + disable = noLaTeX || lyxrc.fax_command == "none"; + break; + case LFUN_IMPORT: + if (argument == "latex") + disable = lyxrc.relyx_command == "none"; + if (argument == "linuxdoc") + disable = lyxrc.linuxdoc_to_lyx_command == "none"; + break; + case LFUN_EXPORT: + if (argument == "dvi" || argument == "postscript") + disable = noLaTeX; + if (argument == "html") + disable = lyxrc.html_command == "none"; + if (argument == "html-linuxdoc") + disable = lyxrc.linuxdoc_to_html_command == "none"; + if (argument == "html-docbook") + disable = lyxrc.docbook_to_html_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_LAYOUT_TABLE: + disable = ! owner->view()->text->cursor.par->table; + break; + default: + break; + } + if (disable) + flag |= LyXFunc::Disabled; + + if (buf) { + func_status box = LyXFunc::ToggleOff; + LyXFont 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 LyXFunc::Dispatch(string const & s) { - return Dispatch(lyxaction.LookupFunc(cmd.c_str()), - arg.c_str()); + // Split command string into command and argument + string cmd, line = frontStrip(s); + string arg = strip(frontStrip(split(line, cmd, ' '))); + + return Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str()); } string LyXFunc::Dispatch(int ac, - char const *do_not_use_this_arg) + 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(); + dispatch_buffer.clear(); // 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) + string tmparg; + action = static_cast + (lyxaction.retrieveActionArg(ac, tmparg)); + if (!tmparg.empty()) argument = tmparg; } else { - action = (kb_action)ac; + action = static_cast(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: + if (owner->view()->available()) + owner->view()->hideCursor(); - 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(); + // We cannot use this function here + if (getStatus(action) & Disabled) + goto exit_with_message; + + commandshortcut.clear(); - if (lyxrc->display_shortcuts && show_sc) { + if (lyxrc.display_shortcuts && show_sc) { if (action != LFUN_SELFINSERT) { // Put name of command and list of shortcuts // for it in minibuffer @@ -432,65 +511,81 @@ string LyXFunc::Dispatch(int ac, } } - // 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()) { + if (owner->view()->available() && + owner->view()->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) { + // 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; + UpdatableInset * inset = + owner->view()->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); + owner->view()->unlockInset(inset); + owner->view()->menuUndo(); + 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 (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); + } else if (action == LFUN_REDO) { + int slx, sly; + UpdatableInset * inset = owner->view()-> + the_locking_inset; + inset->GetCursorPos(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 (owner->view()->the_locking_inset-> + LocalDispatch(owner->view(), action, + argument) == + UpdatableInset::DISPATCHED) + return string(); + else { + setMessage(N_("Text mode")); + LyXDirection direction = owner->view()->text-> + cursor.par->getParDirection(); + if ((action == -1) || + ((action == LFUN_RIGHT) && + (direction == LYX_DIR_LEFT_TO_RIGHT))) { + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()-> + Set(CurrentState()); + } + if ((action == LFUN_LEFT) && + (direction == LYX_DIR_RIGHT_TO_LEFT)) { + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()-> + Set(CurrentState()); + } + if ((action == LFUN_LEFT) || + (action == LFUN_RIGHT)) 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; + case LFUN_WORDFINDBACKWARD : { static string last_search; string searched_string; @@ -501,48 +596,46 @@ string LyXFunc::Dispatch(int ac, searched_string = last_search; } - ltCur = owner->currentView()->currentBuffer()->text ; + LyXText * ltCur = owner->view()->text ; if (!searched_string.empty() && - ( (action == LFUN_WORDFINDBACKWARD) ? - ltCur->SearchBackward( searched_string.c_str() ) : - ltCur->SearchForward( searched_string.c_str() ) - )){ + ((action == LFUN_WORDFINDBACKWARD) ? + ltCur->SearchBackward(searched_string.c_str()) : + ltCur->SearchForward(searched_string.c_str()))) { // ??? What is that ??? - owner->currentView()->currentBuffer()->update(-2); + owner->view()->update(-2); // ??? Needed ??? // clear the selection (if there is any) - owner->currentView()->getScreen()->ToggleSelection(); - owner->currentView()->currentBuffer()->text->ClearSelection(); + 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->currentBuffer()->text->CursorRightOneWord(); - owner->currentBuffer()->text->FinishUndo(); + owner->view()->text->CursorRightOneWord(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); // ??? Needed ??? // set the new selection - // SetSelectionOverLenChars(owner->currentView()->currentBuffer()->text, iLenSelected); - owner->currentView()->getScreen()->ToggleSelection(false); + // SetSelectionOverLenChars(owner->view()->currentBuffer()->text, iLenSelected); + owner->view()->toggleSelection(false); } else LyXBell(); - // REMOVED : if (owner->currentView()->getWorkArea()->focus) - owner->currentView()->getScreen()->ShowCursor(); + // REMOVED : if (owner->view()->getWorkArea()->focus) + owner->view()->showCursor(); } break; case LFUN_PREFIX: { - if (owner->currentView()->available() - && owner->currentView()->getScreen()) { - owner->currentBuffer()->update(-2); + if (owner->view()->available()) { + owner->view()->update(-2); } - char buf[100]; - keyseq.print(buf,100, true); + string buf; + keyseq.print(buf, true); owner->getMiniBuffer()->Set(buf, string(), string(), 1); } break; @@ -555,54 +648,43 @@ string LyXFunc::Dispatch(int ac, case LFUN_CANCEL: // RVDK_PATCH_5 keyseq.reset(); meta_fake_bit = 0; - if(owner->currentView()->available()) + if(owner->view()->available()) // cancel any selection - Dispatch(int(LFUN_MARK_OFF), 0); + Dispatch(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 buf; + keyseq.print(buf, 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(); + if (owner->buffer()->lyxvc.inUse()) { + owner->buffer()->lyxvc.toggleReadOnly(); } else { - owner->currentBuffer()->setReadonly( - !owner->currentBuffer()->isReadonly()); + owner->buffer()->setReadonly( + !owner->buffer()->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(); + owner->view()->center(); break; case LFUN_APPENDIX: - if (owner->currentView()->available()) { - owner->currentBuffer()->text->toggleAppendix(); - owner->currentBuffer()->update(1); + if (owner->view()->available()) { + owner->view()->text->toggleAppendix(); + owner->view()->update(1); } break; - // --- Menus ----------------------------------------------- + // --- Menus ----------------------------------------------- case LFUN_MENUNEW: MenuNew(false); break; @@ -620,11 +702,20 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_MENUWRITE: - MenuWrite(owner->currentBuffer()); + 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!")); + //} break; case LFUN_MENUWRITEAS: - MenuWriteAs(owner->currentBuffer()); + MenuWriteAs(owner->buffer()); break; case LFUN_MENURELOAD: @@ -632,117 +723,45 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_PREVIEW: - MenuPreview(owner->currentBuffer()); + PreviewDVI(owner->buffer()); break; case LFUN_PREVIEWPS: - MenuPreviewPS(owner->currentBuffer()); + PreviewPostscript(owner->buffer()); break; case LFUN_RUNLATEX: - MenuRunLaTeX(owner->currentBuffer()); + MenuRunLaTeX(owner->buffer()); break; case LFUN_BUILDPROG: - MenuBuildProg(owner->currentBuffer()); + MenuBuildProg(owner->buffer()); break; case LFUN_RUNCHKTEX: - MenuRunChktex(owner->currentBuffer()); + MenuRunChktex(owner->buffer()); break; case LFUN_RUNDVIPS: - MenuRunDvips(owner->currentBuffer(), false); + CreatePostscript(owner->buffer(), false); break; case LFUN_MENUPRINT: - MenuPrint(owner->currentBuffer()); + MenuPrint(owner->buffer()); break; case LFUN_FAX: - MenuFax(owner->currentBuffer()); + MenuFax(owner->buffer()); 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") { - // First, create LaTeX file - MenuMakeLaTeX(owner->currentBuffer()); - - // And now, run tth - string file = owner->currentBuffer()->getFileName(); - file = ChangeExtension(file, ".tex", false); - string result = ChangeExtension(file, ".html", false); - string tmp = lyxrc->tth_command + " < " + file - + " > " + result ; - Systemcalls one; - int res = one.startscript(Systemcalls::System, tmp); - if (res == 0) { - setMessage(string( - N_("Document exported as HTML to file: ")) + result); - } else { - setErrorMessage(string( - N_("An unexpected error occured while converting document to HTML in file:")) + result); - } - } - else { - setErrorMessage(string(N_("Unknown export type: ")) - + extyp); - } - } - break; + MenuExport(owner->buffer(), argument); + break; case LFUN_IMPORT: { //needs argument as string - string imtyp=argument; + string imtyp = argument; // latex if (imtyp == "latex") { @@ -753,9 +772,11 @@ string LyXFunc::Dispatch(int ac, doImportASCII(false); } else if (imtyp == "asciiparagraph") { doImportASCII(true); - // noweb + // noweb } else if (imtyp == "noweb") { doImportLaTeX(true); + } else if (imtyp == "linuxdoc") { + doImportLinuxDoc(); } else { setErrorMessage(string(N_("Unknown import type: ")) + imtyp); @@ -768,258 +789,258 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_TOCVIEW: - TocUpdateCB(ob, 0); + TocUpdateCB(0, 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); + Inset * new_inset = new InsetTOC(owner->buffer()); + owner->view()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOF_INSERT: { - Inset *new_inset = - new InsetLOF(owner->currentBuffer()); - owner->currentBuffer()->insertInset(new_inset, - "Standard", true); + Inset * new_inset = new InsetLOF(owner->buffer()); + owner->view()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOA_INSERT: { - Inset *new_inset = - new InsetLOA(owner->currentBuffer()); - owner->currentBuffer()->insertInset(new_inset, - "Standard", true); + Inset * new_inset = new InsetLOA(owner->buffer()); + owner->view()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOT_INSERT: { - Inset *new_inset = - new InsetLOT(owner->currentBuffer()); - owner->currentBuffer()->insertInset(new_inset, - "Standard", true); + Inset * new_inset = new InsetLOT(owner->buffer()); + owner->view()->insertInset(new_inset, "Standard", true); break; } case LFUN_TABLE: - TableCB(ob, 0); + Table(); break; case LFUN_FIGURE: - FigureCB(ob, 0); + Figure(); break; - + + case LFUN_INSERT_GRAPHICS: + { + Inset * new_inset = new InsetGraphics; + owner->view()->insertInset(new_inset); + break; + } + case LFUN_AUTOSAVE: AutoSave(); break; case LFUN_UNDO: - MenuUndo(); + owner->view()->menuUndo(); break; case LFUN_REDO: - MenuRedo(); + owner->view()->menuRedo(); break; case LFUN_MENUSEARCH: - 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: - PasteCB(); + owner->view()->paste(); break; case LFUN_PASTESELECTION: { bool asPara = false; - if (string(argument) == "paragraph") asPara = true; + if (argument == "paragraph") asPara = true; MenuPasteSelection(asPara); break; } case LFUN_CUT: - CutCB(); + owner->view()->cut(); break; case LFUN_COPY: - CopyCB(); + owner->view()->copy(); break; case LFUN_LAYOUT_COPY: - CopyEnvironmentCB(); + owner->view()->copyEnvironment(); break; case LFUN_LAYOUT_PASTE: - PasteEnvironmentCB(); + owner->view()->pasteEnvironment(); break; case LFUN_GOTOERROR: - owner->currentView()->gotoError(); + owner->view()->gotoError(); break; case LFUN_REMOVEERRORS: - if (owner->currentBuffer()->removeAutoInsets()) { - owner->currentView()->redraw(); - owner->currentView()->fitCursor(); - owner->currentView()->updateScrollbar(); + if (owner->view()->removeAutoInsets()) { + owner->view()->redraw(); + owner->view()->fitCursor(); + owner->view()->updateScrollbar(); } break; case LFUN_GOTONOTE: - GotoNote(); + owner->view()->gotoNote(); break; case LFUN_OPENSTUFF: - OpenStuff(); + owner->view()->openStuff(); break; case LFUN_HYPHENATION: - HyphenationPoint(); + owner->view()->hyphenationPoint(); break; case LFUN_LDOTS: - Ldots(); + owner->view()->ldots(); break; case LFUN_END_OF_SENTENCE: - EndOfSentenceDot(); + owner->view()->endOfSentenceDot(); break; case LFUN_MENU_SEPARATOR: - MenuSeparator(); + owner->view()->menuSeparator(); break; case LFUN_HFILL: - HFill(); + owner->view()->hfill(); break; case LFUN_DEPTH: - DepthCB(ob, 0); + changeDepth(owner->view(), 0); break; case LFUN_DEPTH_MIN: - DepthCB(ob, -1); + changeDepth(owner->view(), -1); break; case LFUN_DEPTH_PLUS: - DepthCB(ob, 1); + changeDepth(owner->view(), 1); break; case LFUN_FREE: - FreeCB(); + Free(); break; case LFUN_TEX: - TexCB(); + Tex(); + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_MELT: - MeltCB(ob, 0); + Melt(owner->view()); break; case LFUN_RECONFIGURE: - Reconfigure(); + Reconfigure(owner->view()); break; case LFUN_FOOTMELT: - if (owner->currentView()->available() - && !owner->currentBuffer()->text->selection - && owner->currentBuffer()->text->cursor.par->footnoteflag + 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->currentBuffer()->text->cursor.par->footnotekind == LyXParagraph::FOOTNOTE) - MeltCB(ob,0); - } + { // only melt footnotes with FOOTMELT, not margins etc + if(owner->view()->text->cursor.par->footnotekind == LyXParagraph::FOOTNOTE) + Melt(owner->view()); + } else - FootCB(ob, 0); + Foot(owner->view()); + owner->view()->setState(); 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); + 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; // --- version control ------------------------------- case LFUN_VC_REGISTER: { - if (!owner->currentBuffer()->lyxvc.inUse()) - owner->currentBuffer()->lyxvc.registrer(); + if (!owner->buffer()->lyxvc.inUse()) + owner->buffer()->lyxvc.registrer(); } break; case LFUN_VC_CHECKIN: { - if (owner->currentBuffer()->lyxvc.inUse() - && !owner->currentBuffer()->isReadonly()) - owner->currentBuffer()->lyxvc.checkIn(); + if (owner->buffer()->lyxvc.inUse() + && !owner->buffer()->isReadonly()) + owner->buffer()->lyxvc.checkIn(); } break; case LFUN_VC_CHECKOUT: { - if (owner->currentBuffer()->lyxvc.inUse() - && owner->currentBuffer()->isReadonly()) - owner->currentBuffer()->lyxvc.checkOut(); + if (owner->buffer()->lyxvc.inUse() + && owner->buffer()->isReadonly()) + owner->buffer()->lyxvc.checkOut(); } break; case LFUN_VC_REVERT: { - owner->currentBuffer()->lyxvc.revert(); + owner->buffer()->lyxvc.revert(); } break; case LFUN_VC_UNDO: { - owner->currentBuffer()->lyxvc.undoLast(); + owner->buffer()->lyxvc.undoLast(); } break; case LFUN_VC_HISTORY: { - owner->currentBuffer()->lyxvc.showLog(); + owner->buffer()->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); @@ -1028,25 +1049,22 @@ string LyXFunc::Dispatch(int ac, case LFUN_FILE_INSERT_ASCII: { - bool asPara = false; - asPara = (string(argument) == "paragraph"); - InsertAsciiFile(string(), asPara); + bool asPara = (argument == "paragraph"); + InsertAsciiFile(owner->view(), string(), asPara); } break; case LFUN_FILE_NEW: { // servercmd: argument must be :