X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flyxfunc.C;h=ddd80299e411b62e6ce3cb83e4ff3c605d07640f;hb=8d3a4fd463f6865eecf7fb9e2bd63c43f9438cfe;hp=d674a6dd87657f5322575e2ec57d10299b48e39c;hpb=65b49997597efd5a5ba920c739ba6cd8384e1eeb;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index d674a6dd87..ddd80299e4 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -4,11 +4,13 @@ * 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 @@ -28,9 +30,6 @@ #include "lyx_main.h" #include "lyx_cb.h" #include "LyXAction.h" -#if 0 -#include "insets/insetlatex.h" -#endif #include "insets/inseturl.h" #include "insets/insetlatexaccent.h" #include "insets/insettoc.h" @@ -42,6 +41,10 @@ #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 @@ -52,11 +55,9 @@ #include "lyx_gui_misc.h" #include "support/filetools.h" #include "support/FileInfo.h" -#include "support/LAssert.h" #include "support/syscall.h" #include "support/lstrings.h" #include "support/path.h" -#include "lyxscreen.h" #include "debug.h" #include "lyxrc.h" #include "lyxtext.h" @@ -65,11 +66,13 @@ #include "ImportLaTeX.h" #include "ImportNoweb.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; @@ -79,46 +82,27 @@ 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 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 bool PreviewDVI(Buffer *); +extern bool PreviewPostscript(Buffer *); extern void MenuInsertLabel(char const *); extern void MenuInsertRef(); extern void MenuLayoutCharacter(); @@ -133,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) + : owner(o) { meta_fake_bit = 0; lyx_dead_action = LFUN_NOACTION; @@ -167,37 +147,39 @@ LyXFunc::LyXFunc(LyXView * o) inline void LyXFunc::moveCursorUpdate(bool selecting) { - if (selecting || owner->buffer()->text->mark_set) { - owner->buffer()->text->SetSelection(); - owner->view()->getScreen()->ToggleToggle(); - owner->buffer()->update(0); + if (selecting || owner->view()->text->mark_set) { + owner->view()->text->SetSelection(); + owner->view()->toggleToggle(); + owner->view()->update(0); } else { - owner->buffer()->update(-2); // this IS necessary + owner->view()->update(-2); // this IS necessary // (Matthias) } - owner->view()->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) { 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); + 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 " @@ -214,10 +196,12 @@ int LyXFunc::processKeyEvent(XEvent * ev) // this function should be used always [asierra060396] if (owner->view()->available() && - owner->buffer()->the_locking_inset && + owner->view()->the_locking_inset && keysym_return == XK_Escape) { - UnlockInset(owner->buffer()->the_locking_inset); - owner->buffer()->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,17 +250,17 @@ 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 (keyseq.length < -1) { // unknown key sequence... + string buf; LyXBell(); - keyseq.print(buf, 100); + keyseq.print(buf); owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf); return 0; } @@ -335,94 +319,103 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const LyXAction::ReadOnly)) { // no setErrorMessage(N_("Document is read-only")); - flag = func_status(flag | LyXFunc::Disabled); + flag |= LyXFunc::Disabled; } } else { // no setErrorMessage(N_("Command not allowed with" "out any document open")); - flag = func_status(flag | LyXFunc::Disabled); + flag |= LyXFunc::Disabled; } } if (flag & LyXFunc::Disabled) return flag; - static bool noLaTeX = lyxrc->latex_command == "none"; + // 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"; - break; - case LFUN_EXPORT: - if (argument == "dvi" || argument == "postscript") - disable = noLaTeX; - 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: -#warning change this and font code once it is possible to get to cursor - // disable = ! buf->text->cursor.par->table; - break; - default: - break; - } - if (disable) - flag = func_status(flag | LyXFunc::Disabled); - - func_status box = LyXFunc::ToggleOff; - // LyXFont font = buf->text->real_current_font; - LyXFont font; - switch (action) { - case LFUN_EMPH: - if (font.emph() == LyXFont::ON) - box = LyXFunc::ToggleOn; + case LFUN_PREVIEW: + disable = noLaTeX || lyxrc.view_dvi_command == "none"; + break; + case LFUN_PREVIEWPS: + disable = noLaTeX || lyxrc.view_ps_command == "none"; break; - case LFUN_NOUN: - if (font.noun() == LyXFont::ON) - box = LyXFunc::ToggleOn; + case LFUN_RUNLATEX: + case LFUN_RUNDVIPS: + disable = noLaTeX; break; - case LFUN_BOLD: - if (font.series() == LyXFont::BOLD_SERIES) - box = LyXFunc::ToggleOn; + case LFUN_MENUPRINT: + disable = noLaTeX || lyxrc.print_command == "none"; break; - case LFUN_TEX: - if (font.latex() == LyXFont::ON) - box = LyXFunc::ToggleOn; + 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: - box = LyXFunc::OK; 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; } - flag |= box; - return flag; } @@ -439,13 +432,11 @@ string LyXFunc::Dispatch(string const & s) 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.clear(); @@ -465,9 +456,8 @@ string LyXFunc::Dispatch(int ac, selection_possible = false; - if (owner->view()->available() - && owner->view()->getScreen()) - owner->view()->getScreen()->HideCursor(); + if (owner->view()->available()) + owner->view()->hideCursor(); // We cannot use this function here if (getStatus(action) & Disabled) @@ -475,7 +465,7 @@ string LyXFunc::Dispatch(int ac, 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 @@ -524,45 +514,71 @@ string LyXFunc::Dispatch(int ac, // If in math mode pass the control to // the math inset [asierra060396] if (owner->view()->available() && - owner->buffer()->the_locking_inset) { + owner->view()->the_locking_inset) { if (action > 1 - || (action == LFUN_UNKNOWN_ACTION && keyseq.length>= -1)) { - if (action == LFUN_UNKNOWN_ACTION && argument.empty()) { + || (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->buffer()->the_locking_inset; + owner->view()->the_locking_inset; inset->GetCursorPos(slx, sly); - UnlockInset(inset); - MenuUndo(); - inset = static_cast(owner->buffer()->text->cursor.par->GetInset(owner->buffer()->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->buffer()->the_locking_inset; - inset->GetCursorPos(slx, sly); - UnlockInset(inset); - MenuRedo(); - inset = static_cast(owner->buffer()->text->cursor.par->GetInset(owner->buffer()->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->buffer()->the_locking_inset->LocalDispatch(action, argument.c_str())) - return string(); - else { - setMessage(N_("Text mode")); - if (action == LFUN_RIGHT || action == -1) - owner->buffer()->text->CursorRight(); - if (action == LFUN_LEFT || action == LFUN_RIGHT) - return string(); - } + } } } @@ -580,7 +596,7 @@ string LyXFunc::Dispatch(int ac, searched_string = last_search; } - LyXText * ltCur = owner->view()->buffer()->text ; + LyXText * ltCur = owner->view()->text ; if (!searched_string.empty() && ((action == LFUN_WORDFINDBACKWARD) ? @@ -588,39 +604,38 @@ string LyXFunc::Dispatch(int ac, ltCur->SearchForward(searched_string.c_str()))) { // ??? What is that ??? - owner->view()->buffer()->update(-2); + owner->view()->update(-2); // ??? Needed ??? // clear the selection (if there is any) - owner->view()->getScreen()->ToggleSelection(); - owner->view()->buffer()->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->buffer()->text->CursorRightOneWord(); - owner->buffer()->text->FinishUndo(); + owner->view()->text->CursorRightOneWord(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); // ??? Needed ??? // set the new selection // SetSelectionOverLenChars(owner->view()->currentBuffer()->text, iLenSelected); - owner->view()->getScreen()->ToggleSelection(false); + owner->view()->toggleSelection(false); } else LyXBell(); // REMOVED : if (owner->view()->getWorkArea()->focus) - owner->view()->getScreen()->ShowCursor(); + owner->view()->showCursor(); } break; case LFUN_PREFIX: { - if (owner->view()->available() - && owner->view()->getScreen()) { - owner->buffer()->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; @@ -642,8 +657,8 @@ string LyXFunc::Dispatch(int ac, 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 } @@ -659,28 +674,17 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_CENTER: // this is center and redraw. - BeforeChange(); - if (owner->buffer()->text->cursor.y > - owner->view()->getWorkArea()->h / 2) { - owner->view()->getScreen()-> - Draw(owner->buffer()->text->cursor.y - - owner->view()->getWorkArea()->h/2); - } else { // <= - owner->view()->getScreen()-> - Draw(0); - } - owner->buffer()->update(0); - owner->view()->redraw(); + owner->view()->center(); break; case LFUN_APPENDIX: if (owner->view()->available()) { - owner->buffer()->text->toggleAppendix(); - owner->buffer()->update(1); + owner->view()->text->toggleAppendix(); + owner->view()->update(1); } break; - // --- Menus ----------------------------------------------- + // --- Menus ----------------------------------------------- case LFUN_MENUNEW: MenuNew(false); break; @@ -698,7 +702,16 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_MENUWRITE: + 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: @@ -710,11 +723,11 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_PREVIEW: - MenuPreview(owner->buffer()); + PreviewDVI(owner->buffer()); break; case LFUN_PREVIEWPS: - MenuPreviewPS(owner->buffer()); + PreviewPostscript(owner->buffer()); break; case LFUN_RUNLATEX: @@ -730,7 +743,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_RUNDVIPS: - MenuRunDvips(owner->buffer(), false); + CreatePostscript(owner->buffer(), false); break; case LFUN_MENUPRINT: @@ -742,86 +755,8 @@ string LyXFunc::Dispatch(int ac, 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->buffer()); - } - // linuxdoc - else if (extyp == "linuxdoc") { - // make sure that this buffer is not latex - MenuMakeLinuxDoc(owner->buffer()); - } - // docbook - else if (extyp == "docbook") { - // make sure that this buffer is not latex or linuxdoc - MenuMakeDocBook(owner->buffer()); - } - // 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->buffer()); - lyxrc->use_tempdir = flag; - } - // postscript - else if (extyp == "postscript") { - // Start Print-dialog. Not as good as dvi... Bernhard. - MenuPrint(owner->buffer()); - // 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->buffer()); - } - else if (extyp == "custom") { - MenuSendto(); - break; - } - // HTML - else if (extyp == "html" && lyxrc->html_command != "none") { - // First, create LaTeX file - MenuMakeLaTeX(owner->buffer()); - - // And now, run the converter - string file = owner->buffer()->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(N_("Document exported as HTML to file `") - + MakeDisplayPath(result) +'\''); - } else { - setErrorMessage(N_("Unable to convert to HTML the file `") - + MakeDisplayPath(file) - + '\''); - } - } - else { - setErrorMessage(N_("Unknown export type: ") - + extyp); - } - } - break; + MenuExport(owner->buffer(), argument); + break; case LFUN_IMPORT: { @@ -837,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); @@ -852,7 +789,7 @@ 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 { @@ -872,57 +809,71 @@ string LyXFunc::Dispatch(int ac, case LFUN_TOC_INSERT: { Inset * new_inset = new InsetTOC(owner->buffer()); - owner->buffer()->insertInset(new_inset, "Standard", true); + owner->view()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOF_INSERT: { Inset * new_inset = new InsetLOF(owner->buffer()); - owner->buffer()->insertInset(new_inset, "Standard", true); + owner->view()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOA_INSERT: { Inset * new_inset = new InsetLOA(owner->buffer()); - owner->buffer()->insertInset(new_inset, "Standard", true); + owner->view()->insertInset(new_inset, "Standard", true); break; } case LFUN_LOT_INSERT: { Inset * new_inset = new InsetLOT(owner->buffer()); - owner->buffer()->insertInset(new_inset, "Standard", true); + 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: @@ -934,19 +885,19 @@ string LyXFunc::Dispatch(int ac, } 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: @@ -954,7 +905,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_REMOVEERRORS: - if (owner->buffer()->removeAutoInsets()) { + if (owner->view()->removeAutoInsets()) { owner->view()->redraw(); owner->view()->fitCursor(); owner->view()->updateScrollbar(); @@ -962,85 +913,88 @@ string LyXFunc::Dispatch(int ac, 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->view()->available() - && !owner->buffer()->text->selection - && owner->buffer()->text->cursor.par->footnoteflag + && !owner->view()->text->selection + && owner->view()->text->cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) - { // only melt footnotes with FOOTMELT, not margins etc - if(owner->buffer()->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->view()->available() - && !owner->buffer()->text->selection - && owner->buffer()->text->cursor.par->footnoteflag + && !owner->view()->text->selection + && owner->view()->text->cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) { // only melt margins - if(owner->buffer()->text->cursor.par->footnotekind == LyXParagraph::MARGIN) - MeltCB(ob, 0); - } - else - MarginCB(ob, 0); + if(owner->view()->text->cursor.par->footnotekind == LyXParagraph::MARGIN) + Melt(owner->view()); + } else + Margin(owner->view()); + owner->view()->setState(); break; // --- version control ------------------------------- @@ -1086,22 +1040,7 @@ string LyXFunc::Dispatch(int ac, } // --- 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->view()->available()){ -// BeforeChange(); -// owner->buffer()->update(-2); -// } -// owner->view()->setBuffer(bufferlist.prev()); -// owner->view()-> -// resizeCurrentBufferPseudoExpose(); - break; - case LFUN_FILE_INSERT: { MenuInsertLyXFile(argument); @@ -1111,7 +1050,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_FILE_INSERT_ASCII: { bool asPara = (argument == "paragraph"); - InsertAsciiFile(string(), asPara); + InsertAsciiFile(owner->view(), string(), asPara); } break; @@ -1122,11 +1061,10 @@ string LyXFunc::Dispatch(int ac, if (tmpbuf) owner->view()->buffer(tmpbuf); } - break; + break; case LFUN_FILE_OPEN: - owner->view()->buffer( - bufferlist.loadLyXFile(argument)); + owner->view()->buffer(bufferlist.loadLyXFile(argument)); break; case LFUN_LATEX_LOG: @@ -1143,14 +1081,14 @@ string LyXFunc::Dispatch(int ac, if (sel == 0) return string(); // illegal argument - sel--; // sel 1..., but layout 0... + --sel; // sel 1..., but layout 0... // Pretend we got the name instead. Dispatch(int(LFUN_LAYOUT), - textclasslist.NameOfLayout(owner->buffer()-> - text->parameters-> - textclass, - sel).c_str()); + textclasslist.NameOfLayout(owner->view()-> + text->parameters-> + textclass, + sel).c_str()); return string(); } @@ -1161,31 +1099,38 @@ string LyXFunc::Dispatch(int ac, // Derive layout number from given argument (string) // and current buffer's textclass (number). */ - int layoutno = - textclasslist.NumberOfLayout(owner-> - buffer()-> - text->parameters-> - textclass, - argument).second; + LyXTextClassList::ClassList::size_type tclass = + owner->view()->text->parameters->textclass; + pair layout = + textclasslist.NumberOfLayout(tclass, argument); + + // If the entry is obsolete, use the new one instead. + if (layout.first) { + string obs = textclasslist.Style(tclass,layout.second) + .obsoleted_by(); + if (!obs.empty()) + layout = + textclasslist.NumberOfLayout(tclass, obs); + } // see if we found the layout number: - if (layoutno == -1) { + if (!layout.first) { setErrorMessage(string(N_("Layout ")) + argument + N_(" not known")); break; } - - if (current_layout != layoutno) { - owner->view()->getScreen()->HideCursor(); - current_layout = layoutno; - owner->buffer()->update(-2); - owner->buffer()->text-> - SetLayout(layoutno); + + if (current_layout != layout.second) { + owner->view()->hideCursor(); + current_layout = layout.second; + owner->view()->update(-2); + owner->view()->text-> + SetLayout(layout.second); owner->getToolbar()->combox-> - select(owner->buffer()-> + select(owner->view()-> text->cursor.par-> GetLayout() + 1); - owner->buffer()->update(1); + owner->view()->update(1); } } break; @@ -1230,40 +1175,48 @@ string LyXFunc::Dispatch(int ac, owner->getToolbar()->combox->Show(); break; + case LFUN_LANGUAGE: + { + LangCB(argument); + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); + } + break; + case LFUN_EMPH: - EmphCB(); + Emph(); break; case LFUN_BOLD: - BoldCB(); + Bold(); break; case LFUN_NOUN: - NounCB(); + Noun(); break; case LFUN_CODE: - CodeCB(); + Code(); break; case LFUN_SANS: - SansCB(); + Sans(); break; case LFUN_ROMAN: - RomanCB(); + Roman(); break; case LFUN_DEFAULT: - StyleResetCB(); + StyleReset(); break; case LFUN_UNDERLINE: - UnderlineCB(); + Underline(); break; case LFUN_FONT_SIZE: - FontSizeCB(argument); + FontSize(argument); break; case LFUN_FONT_STATE: @@ -1271,26 +1224,26 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_UPCASE_WORD: - owner->buffer()->update(-2); + owner->view()->update(-2); FreeUpdateTimer(); - owner->buffer()->text->ChangeWordCase(LyXText::text_uppercase); - owner->buffer()->update(1); + owner->view()->text->ChangeWordCase(LyXText::text_uppercase); + owner->view()->update(1); SetUpdateTimer(); break; case LFUN_LOWCASE_WORD: - owner->buffer()->update(-2); + owner->view()->update(-2); FreeUpdateTimer(); - owner->buffer()->text->ChangeWordCase(LyXText::text_lowercase); - owner->buffer()->update(1); + owner->view()->text->ChangeWordCase(LyXText::text_lowercase); + owner->view()->update(1); SetUpdateTimer(); break; case LFUN_CAPITALIZE_WORD: - owner->buffer()->update(-2); + owner->view()->update(-2); FreeUpdateTimer(); - owner->buffer()->text->ChangeWordCase(LyXText::text_capitalization); - owner->buffer()->update(1); + owner->view()->text->ChangeWordCase(LyXText::text_capitalization); + owner->view()->update(1); SetUpdateTimer(); break; @@ -1311,7 +1264,7 @@ string LyXFunc::Dispatch(int ac, inset->setFlag(InsetRef::PAGE_REF); else inset->setFlag(InsetRef::REF); - UpdateInset(inset); + owner->view()->updateInset(inset, true); } else { setErrorMessage(N_("No cross-reference to toggle")); } @@ -1336,7 +1289,7 @@ string LyXFunc::Dispatch(int ac, if (!label.empty()) { owner->view()->savePosition(); - owner->buffer()->gotoLabel(label.c_str()); + owner->view()->gotoLabel(label.c_str()); } } break; @@ -1346,30 +1299,34 @@ string LyXFunc::Dispatch(int ac, break; // RVDK_PATCH_5 case LFUN_SPELLCHECK: - if (lyxrc->isp_command != "none") - ShowSpellChecker(); + if (lyxrc.isp_command != "none") + ShowSpellChecker(owner->view()); break; // RVDK_PATCH_5 // --- Cursor Movements ----------------------------- case LFUN_RIGHT: { - Buffer * tmpbuffer = owner->buffer(); - LyXText * tmptext = owner->buffer()->text; + LyXText * tmptext = owner->view()->text; + LyXDirection direction = + tmptext->cursor.par->getParDirection(); if(!tmptext->mark_set) - BeforeChange(); - tmpbuffer->update(-2); + owner->view()->beforeChange(); + owner->view()->update(-2); + if (direction == LYX_DIR_RIGHT_TO_LEFT) + tmptext->CursorLeft(); if (tmptext->cursor.pos < tmptext->cursor.par->Last() && tmptext->cursor.par->GetChar(tmptext->cursor.pos) == LyXParagraph::META_INSET && tmptext->cursor.par->GetInset(tmptext->cursor.pos) - && tmptext->cursor.par->GetInset(tmptext->cursor.pos)->Editable() == 2){ + && tmptext->cursor.par->GetInset(tmptext->cursor.pos)->Editable() == Inset::HIGHLY_EDITABLE){ Inset * tmpinset = tmptext->cursor.par->GetInset(tmptext->cursor.pos); setMessage(tmpinset->EditMessage()); - tmpinset->Edit(0, 0); + tmpinset->Edit(owner->view(), 0, 0, 0); break; } - tmptext->CursorRight(); - owner->buffer()->text->FinishUndo(); + if (direction == LYX_DIR_LEFT_TO_RIGHT) + tmptext->CursorRight(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); } @@ -1379,152 +1336,168 @@ string LyXFunc::Dispatch(int ac, { // This is soooo ugly. Isn`t it possible to make // it simpler? (Lgb) - LyXText * txt = owner->buffer()->text; - if(!txt->mark_set) BeforeChange(); - owner->buffer()->update(-2); - txt->CursorLeft(); + LyXText * txt = owner->view()->text; + LyXDirection direction = txt->cursor.par->getParDirection(); + if(!txt->mark_set) owner->view()->beforeChange(); + owner->view()->update(-2); + if (direction == LYX_DIR_LEFT_TO_RIGHT) + txt->CursorLeft(); if (txt->cursor.pos < txt->cursor.par->Last() && txt->cursor.par->GetChar(txt->cursor.pos) == LyXParagraph::META_INSET && txt->cursor.par->GetInset(txt->cursor.pos) - && txt->cursor.par->GetInset(txt->cursor.pos)->Editable() == 2) { + && txt->cursor.par->GetInset(txt->cursor.pos)->Editable() == Inset::HIGHLY_EDITABLE) { Inset * tmpinset = txt->cursor.par->GetInset(txt->cursor.pos); setMessage(tmpinset->EditMessage()); - tmpinset->Edit(tmpinset->Width(txt->GetFont(txt->cursor.par, - txt->cursor.pos)), 0); + tmpinset->Edit(owner->view(), + tmpinset->width(owner->view()->painter(), + txt->GetFont(txt->cursor.par, + txt->cursor.pos)), + 0, 0); break; } - owner->buffer()->text->FinishUndo(); + if (direction == LYX_DIR_RIGHT_TO_LEFT) + txt->CursorRight(); + + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); } break; case LFUN_UP: - if(!owner->buffer()->text->mark_set) BeforeChange(); - owner->buffer()->update(-3); - owner->buffer()->text->CursorUp(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) owner->view()->beforeChange(); + owner->view()->update(-3); + owner->view()->text->CursorUp(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_DOWN: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-3); - owner->buffer()->text->CursorDown(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-3); + owner->view()->text->CursorDown(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_UP_PARAGRAPH: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-3); - owner->buffer()->text->CursorUpParagraph(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-3); + owner->view()->text->CursorUpParagraph(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_DOWN_PARAGRAPH: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-3); - owner->buffer()->text->CursorDownParagraph(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-3); + owner->view()->text->CursorDownParagraph(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_PRIOR: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-3); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-3); owner->view()->cursorPrevious(); - owner->buffer()->text->FinishUndo(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_NEXT: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-3); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-3); owner->view()->cursorNext(); - owner->buffer()->text->FinishUndo(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_HOME: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-2); - owner->buffer()->text->CursorHome(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-2); + owner->view()->text->CursorHome(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_END: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-2); - owner->buffer()->text->CursorEnd(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-2); + owner->view()->text->CursorEnd(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_TAB: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-2); - owner->buffer()->text->CursorTab(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-2); + owner->view()->text->CursorTab(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_WORDRIGHT: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-2); - owner->buffer()->text->CursorRightOneWord(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-2); + if (owner->view()->text->cursor.par->getParDirection() + == LYX_DIR_LEFT_TO_RIGHT) + owner->view()->text->CursorRightOneWord(); + else + owner->view()->text->CursorLeftOneWord(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_WORDLEFT: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-2); - owner->buffer()->text->CursorLeftOneWord(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-2); + if (owner->view()->text->cursor.par->getParDirection() + == LYX_DIR_LEFT_TO_RIGHT) + owner->view()->text->CursorLeftOneWord(); + else + owner->view()->text->CursorRightOneWord(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_BEGINNINGBUF: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-2); - owner->buffer()->text->CursorTop(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-2); + owner->view()->text->CursorTop(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_ENDBUF: - if(!owner->buffer()->text->mark_set) - BeforeChange(); - owner->buffer()->update(-2); - owner->buffer()->text->CursorBottom(); - owner->buffer()->text->FinishUndo(); + if(!owner->view()->text->mark_set) + owner->view()->beforeChange(); + owner->view()->update(-2); + owner->view()->text->CursorBottom(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); break; @@ -1532,181 +1505,220 @@ string LyXFunc::Dispatch(int ac, /* cursor selection ---------------------------- */ case LFUN_RIGHTSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorRight(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + if (owner->view()->text->cursor.par->getParDirection() + == LYX_DIR_LEFT_TO_RIGHT) + owner->view()->text->CursorRight(); + else + owner->view()->text->CursorLeft(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_LEFTSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorLeft(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + if (owner->view()->text->cursor.par->getParDirection() + == LYX_DIR_LEFT_TO_RIGHT) + owner->view()->text->CursorLeft(); + else + owner->view()->text->CursorRight(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_UPSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorUp(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorUp(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_DOWNSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorDown(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorDown(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_UP_PARAGRAPHSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorUpParagraph(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorUpParagraph(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_DOWN_PARAGRAPHSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorDownParagraph(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorDownParagraph(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_PRIORSEL: - owner->buffer()->update(-2); + owner->view()->update(-2); owner->view()->cursorPrevious(); - owner->buffer()->text->FinishUndo(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_NEXTSEL: - owner->buffer()->update(-2); + owner->view()->update(-2); owner->view()->cursorNext(); - owner->buffer()->text->FinishUndo(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_HOMESEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorHome(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorHome(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_ENDSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorEnd(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorEnd(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_WORDRIGHTSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorRightOneWord(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + if (owner->view()->text->cursor.par->getParDirection() + == LYX_DIR_LEFT_TO_RIGHT) + owner->view()->text->CursorRightOneWord(); + else + owner->view()->text->CursorLeftOneWord(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_WORDLEFTSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorLeftOneWord(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + if (owner->view()->text->cursor.par->getParDirection() + == LYX_DIR_LEFT_TO_RIGHT) + owner->view()->text->CursorLeftOneWord(); + else + owner->view()->text->CursorRightOneWord(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_BEGINNINGBUFSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorTop(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorTop(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_ENDBUFSEL: - owner->buffer()->update(-2); - owner->buffer()->text->CursorBottom(); - owner->buffer()->text->FinishUndo(); + owner->view()->update(-2); + owner->view()->text->CursorBottom(); + owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); break; // --- text changing commands ------------------------ case LFUN_BREAKLINE: - BeforeChange(); - owner->buffer()->text->InsertChar(LyXParagraph::META_NEWLINE); - SmallUpdate(1); +#if 1 + owner->view()->beforeChange(); + owner->view()->text->InsertChar(LyXParagraph::META_NEWLINE); + owner->view()->smallUpdate(1); SetUpdateTimer(0.01); moveCursorUpdate(false); +#else + owner->view()->newline(); +#endif break; case LFUN_PROTECTEDSPACE: - BeforeChange(); - owner->buffer()->text-> +#if 1 + { + LyXLayout const & style = + textclasslist.Style(owner->view()->buffer()->params.textclass, + owner->view()->text->cursor.par->GetLayout()); + + if (style.free_spacing) { + owner->view()->text->InsertChar(' '); + owner->view()->update(-1); + } else { + owner->view()->protectedBlank(); + } + moveCursorUpdate(false); + } +#else + owner->view()->beforeChange(); + owner->view()->text-> InsertChar(LyXParagraph::META_PROTECTED_SEPARATOR); - SmallUpdate(1); + owner->view()->smallUpdate(1); SetUpdateTimer(); moveCursorUpdate(false); +#endif break; case LFUN_SETMARK: - if(owner->buffer()->text->mark_set) { - BeforeChange(); - owner->buffer()->update(0); + if(owner->view()->text->mark_set) { + owner->view()->beforeChange(); + owner->view()->update(0); setMessage(N_("Mark removed")); } else { - BeforeChange(); - owner->buffer()->text->mark_set = 1; - owner->buffer()->update(0); + owner->view()->beforeChange(); + owner->view()->text->mark_set = 1; + owner->view()->update(0); setMessage(N_("Mark set")); } - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->text->sel_cursor = + owner->view()->text->cursor; break; case LFUN_DELETE: FreeUpdateTimer(); - if (!owner->buffer()->text->selection) { - owner->buffer()->text->Delete(); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; - SmallUpdate(1); + if (!owner->view()->text->selection) { + owner->view()->text->Delete(); + owner->view()->text->sel_cursor = + owner->view()->text->cursor; + owner->view()->smallUpdate(1); // It is possible to make it a lot faster still // just comment out the lone below... - owner->view()->getScreen()->ShowCursor(); + owner->view()->showCursor(); } else { - CutCB(); + owner->view()->cut(); } SetUpdateTimer(); + moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); + owner->view()->setState(); break; case LFUN_DELETE_SKIP: { // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP. - LyXCursor cursor = owner->buffer()->text->cursor; + LyXCursor cursor = owner->view()->text->cursor; FreeUpdateTimer(); - if (!owner->buffer()->text->selection) { + if (!owner->view()->text->selection) { if (cursor.pos == cursor.par->Last()) { - owner->buffer()->text->CursorRight(); - cursor = owner->buffer()->text->cursor; + owner->view()->text->CursorRight(); + cursor = owner->view()->text->cursor; if (cursor.pos == 0 && !(cursor.par->added_space_top == VSpace (VSpace::NONE))) { - owner->buffer()->text->SetParagraph + owner->view()->text->SetParagraph (cursor.par->line_top, cursor.par->line_bottom, cursor.par->pagebreak_top, @@ -1715,23 +1727,23 @@ string LyXFunc::Dispatch(int ac, cursor.par->added_space_bottom, cursor.par->align, cursor.par->labelwidthstring, 0); - owner->buffer()->text->CursorLeft(); - owner->buffer()->update (1); + owner->view()->text->CursorLeft(); + owner->view()->update (1); } else { - owner->buffer()->text->CursorLeft(); - owner->buffer()->text->Delete(); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; - SmallUpdate(1); + owner->view()->text->CursorLeft(); + owner->view()->text->Delete(); + owner->view()->text->sel_cursor = + owner->view()->text->cursor; + owner->view()->smallUpdate(1); } } else { - owner->buffer()->text->Delete(); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; - SmallUpdate(1); + owner->view()->text->Delete(); + owner->view()->text->sel_cursor = + owner->view()->text->cursor; + owner->view()->smallUpdate(1); } } else { - CutCB(); + owner->view()->cut(); } SetUpdateTimer(); } @@ -1739,70 +1751,74 @@ string LyXFunc::Dispatch(int ac, /* -------> Delete word forward. */ case LFUN_DELETE_WORD_FORWARD: - owner->buffer()->update(-2); + owner->view()->update(-2); FreeUpdateTimer(); - owner->buffer()->text->DeleteWordForward(); - owner->buffer()->update( 1 ); + owner->view()->text->DeleteWordForward(); + owner->view()->update( 1 ); SetUpdateTimer(); moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); break; /* -------> Delete word backward. */ case LFUN_DELETE_WORD_BACKWARD: - owner->buffer()->update(-2); + owner->view()->update(-2); FreeUpdateTimer(); - owner->buffer()->text->DeleteWordBackward(); - owner->buffer()->update( 1 ); + owner->view()->text->DeleteWordBackward(); + owner->view()->update( 1 ); SetUpdateTimer(); moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); break; /* -------> Kill to end of line. */ case LFUN_DELETE_LINE_FORWARD: FreeUpdateTimer(); - owner->buffer()->update(-2); - owner->buffer()->text->DeleteLineForward(); - owner->buffer()->update( 1 ); + owner->view()->update(-2); + owner->view()->text->DeleteLineForward(); + owner->view()->update( 1 ); SetUpdateTimer(); moveCursorUpdate(false); break; /* -------> Set mark off. */ case LFUN_MARK_OFF: - BeforeChange(); - owner->buffer()->update(0); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->beforeChange(); + owner->view()->update(0); + owner->view()->text->sel_cursor = + owner->view()->text->cursor; setMessage(N_("Mark off")); break; /* -------> Set mark on. */ case LFUN_MARK_ON: - BeforeChange(); - owner->buffer()->text->mark_set = 1; - owner->buffer()->update( 0 ); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->beforeChange(); + owner->view()->text->mark_set = 1; + owner->view()->update( 0 ); + owner->view()->text->sel_cursor = + owner->view()->text->cursor; setMessage(N_("Mark on")); break; case LFUN_BACKSPACE: { FreeUpdateTimer(); - if (!owner->buffer()->text->selection) { + if (!owner->view()->text->selection) { if (owner->getIntl()->getTrans()->backspace()) { - owner->buffer()->text->Backspace(); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; - SmallUpdate(1); + owner->view()->text->Backspace(); + owner->view()->text->sel_cursor = + owner->view()->text->cursor; + owner->view()->smallUpdate(1); // It is possible to make it a lot faster still // just comment out the lone below... - owner->view()->getScreen()->ShowCursor(); + owner->view()->showCursor(); } } else { - CutCB(); + owner->view()->cut(); } SetUpdateTimer(); + owner->getMiniBuffer()->Set(CurrentState()); + owner->view()->setState(); } break; @@ -1810,14 +1826,14 @@ string LyXFunc::Dispatch(int ac, { // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP. - LyXCursor cursor = owner->buffer()->text->cursor; + LyXCursor cursor = owner->view()->text->cursor; FreeUpdateTimer(); - if (!owner->buffer()->text->selection) { + if (!owner->view()->text->selection) { if (cursor.pos == 0 && !(cursor.par->added_space_top == VSpace (VSpace::NONE))) { - owner->buffer()->text->SetParagraph + owner->view()->text->SetParagraph (cursor.par->line_top, cursor.par->line_bottom, cursor.par->pagebreak_top, @@ -1825,38 +1841,42 @@ string LyXFunc::Dispatch(int ac, VSpace(VSpace::NONE), cursor.par->added_space_bottom, cursor.par->align, cursor.par->labelwidthstring, 0); - owner->buffer()->update (1); + owner->view()->update (1); } else { - owner->buffer()->text->Backspace(); - owner->buffer()->text->sel_cursor + owner->view()->text->Backspace(); + owner->view()->text->sel_cursor = cursor; - SmallUpdate (1); + owner->view()->smallUpdate (1); } } else - CutCB(); + owner->view()->cut(); SetUpdateTimer(); } break; case LFUN_BREAKPARAGRAPH: { - BeforeChange(); - owner->buffer()->text->BreakParagraph(0); - SmallUpdate(1); + owner->view()->beforeChange(); + owner->view()->text->BreakParagraph(0); + owner->view()->smallUpdate(1); SetUpdateTimer(0.01); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->text->sel_cursor = + owner->view()->text->cursor; + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); break; } case LFUN_BREAKPARAGRAPHKEEPLAYOUT: { - BeforeChange(); - owner->buffer()->text->BreakParagraph(1); - SmallUpdate(1); + owner->view()->beforeChange(); + owner->view()->text->BreakParagraph(1); + owner->view()->smallUpdate(1); SetUpdateTimer(0.01); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->text->sel_cursor = + owner->view()->text->cursor; + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); break; } @@ -1866,12 +1886,12 @@ string LyXFunc::Dispatch(int ac, // indentation and add a "defskip" at the top. // Otherwise, do the same as LFUN_BREAKPARAGRAPH. - LyXCursor cursor = owner->buffer()->text->cursor; + LyXCursor cursor = owner->view()->text->cursor; - BeforeChange(); + owner->view()->beforeChange(); if (cursor.pos == 0) { if (cursor.par->added_space_top == VSpace(VSpace::NONE)) { - owner->buffer()->text->SetParagraph + owner->view()->text->SetParagraph (cursor.par->line_top, cursor.par->line_bottom, cursor.par->pagebreak_top, @@ -1879,22 +1899,24 @@ string LyXFunc::Dispatch(int ac, VSpace(VSpace::DEFSKIP), cursor.par->added_space_bottom, cursor.par->align, cursor.par->labelwidthstring, 1); - owner->buffer()->update(1); + owner->view()->update(1); } } else { - owner->buffer()->text->BreakParagraph(0); - SmallUpdate(1); + owner->view()->text->BreakParagraph(0); + owner->view()->smallUpdate(1); } SetUpdateTimer(0.01); - owner->buffer()->text->sel_cursor = cursor; + owner->view()->text->sel_cursor = cursor; + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); } break; case LFUN_QUOTE: - BeforeChange(); - owner->buffer()->text->InsertChar('\"'); // This " matches the single quote in the code - SmallUpdate(1); + owner->view()->beforeChange(); + owner->view()->text->InsertChar('\"'); // This " matches the single quote in the code + owner->view()->smallUpdate(1); SetUpdateTimer(); moveCursorUpdate(false); break; @@ -1907,8 +1929,29 @@ string LyXFunc::Dispatch(int ac, new_inset = new InsetUrl("htmlurl", "", ""); else new_inset = new InsetUrl("url", "", ""); - owner->buffer()->insertInset(new_inset); - new_inset->Edit(0, 0); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); + } + break; + case LFUN_INSET_TEXT: + { + InsetText * new_inset = new InsetText(owner->buffer()); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); + } + break; + case LFUN_INSET_ERT: + { + InsetERT * new_inset = new InsetERT(owner->buffer()); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); + } + break; + case LFUN_INSET_FOOTNOTE: + { + InsetFoot * new_inset = new InsetFoot(owner->buffer()); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); } break; @@ -1917,10 +1960,13 @@ string LyXFunc::Dispatch(int ac, case LFUN_CHARATCURSOR: { LyXParagraph::size_type pos = - owner->buffer()->text->cursor.pos; - if(pos < owner->buffer()->text->cursor.par->size()) - dispatch_buffer = owner->buffer()->text-> - cursor.par->text[pos]; + owner->view()->text->cursor.pos; + if(pos < owner->view()->text->cursor.par->size()) + //dispatch_buffer = owner->view()->text-> + // cursor.par->text[pos]; + dispatch_buffer = + owner->view()->text-> + cursor.par->GetChar(pos); else dispatch_buffer = "EOF"; } @@ -1928,8 +1974,8 @@ string LyXFunc::Dispatch(int ac, case LFUN_GETXY: dispatch_buffer = - tostr(owner->buffer()->text->cursor.x) + ' ' - + tostr(owner->buffer()->text->cursor.y); + tostr(owner->view()->text->cursor.x) + ' ' + + tostr(owner->view()->text->cursor.y); break; case LFUN_SETXY: @@ -1937,18 +1983,18 @@ string LyXFunc::Dispatch(int ac, int x; long y; sscanf(argument.c_str(), " %d %ld", &x, &y); - owner->buffer()->text->SetCursorFromCoordinates(x, y); + owner->view()->text->SetCursorFromCoordinates(x, y); } break; case LFUN_GETLAYOUT: dispatch_buffer = - tostr(owner->buffer()->text->cursor.par->layout); + tostr(owner->view()->text->cursor.par->layout); break; case LFUN_GETFONT: { - LyXFont *font = &(owner->buffer()->text->current_font); + LyXFont * font = &(owner->view()->text->current_font); if(font->shape() == LyXFont::ITALIC_SHAPE) dispatch_buffer = 'E'; else if(font->shape() == LyXFont::SMALLCAPS_SHAPE) @@ -1961,7 +2007,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_GETLATEX: { - LyXFont *font = &(owner->buffer()->text->current_font); + LyXFont * font = &(owner->view()->text->current_font); if(font->latex() == LyXFont::ON) dispatch_buffer = 'L'; else @@ -1970,16 +2016,16 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_GETNAME: - setMessage(owner->buffer()->getFileName()); + setMessage(owner->buffer()->fileName()); lyxerr.debug() << "FNAME[" - << owner->buffer()->getFileName() + << owner->buffer()->fileName() << "] " << endl; break; case LFUN_NOTIFY: { - char buf[100]; - keyseq.print(buf, 100); + string buf; + keyseq.print(buf); dispatch_buffer = buf; lyxserver->notifyClient(dispatch_buffer); } @@ -2001,21 +2047,10 @@ string LyXFunc::Dispatch(int ac, owner->view()->buffer(bufferlist.loadLyXFile(s)); // Set the cursor - owner->buffer()->setCursorFromRow(row); + owner->view()->setCursorFromRow(row); // Recenter screen - BeforeChange(); - if (owner->buffer()->text->cursor.y > - owner->view()->getWorkArea()->h / 2) { - owner->view()->getScreen()-> - Draw(owner->buffer()->text->cursor.y - - owner->view()->getWorkArea()->h/2); - } else { // <= - owner->view()->getScreen()-> - Draw(0); - } - owner->buffer()->update(0); - owner->view()->redraw(); + owner->view()->center(); } break; @@ -2023,7 +2058,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_GETTIP: { int qa = lyxaction.LookupFunc(argument.c_str()); - setMessage(lyxaction.helpText((kb_action)qa)); + setMessage(lyxaction.helpText(static_cast(qa))); } break; @@ -2049,25 +2084,25 @@ string LyXFunc::Dispatch(int ac, { char c; - if (keyseq.length == -1 && keyseq.getiso()!= 0) - c= keyseq.getiso(); + if (keyseq.length == -1 && keyseq.getiso() != 0) + c = keyseq.getiso(); else - c= 0; + c = 0; owner->getIntl()->getTrans()-> deadkey(c, get_accent(action).accent, - owner->buffer()->text); + owner->view()->text); // Need to reset, in case the minibuffer calls these // actions keyseq.reset(); - keyseq.length= 0; + keyseq.length = 0; // copied verbatim from do_accent_char - SmallUpdate(1); + owner->view()->smallUpdate(1); SetUpdateTimer(); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->text->sel_cursor = + owner->view()->text->cursor; } break; @@ -2111,14 +2146,7 @@ string LyXFunc::Dispatch(int ac, break; // --- insert characters ---------------------------------------- -#if 0 - case LFUN_INSERT_INSET_LATEX: - { - Inset *new_inset = new InsetLatex(argument); - owner->buffer()->insertInset(new_inset); - } - break; -#endif + // --- Mathed stuff. If we are here, there is no locked inset yet. // Greek mode @@ -2135,7 +2163,7 @@ string LyXFunc::Dispatch(int ac, // Greek keyboard case LFUN_GREEK_TOGGLE: { - greek_kb_flag = (greek_kb_flag) ? 0: 2; + greek_kb_flag = greek_kb_flag ? 0 : 2; if (greek_kb_flag) { setMessage(N_("Math greek keyboard on")); } else { @@ -2148,10 +2176,13 @@ string LyXFunc::Dispatch(int ac, case LFUN_INSERT_MATRIX: { if (owner->view()->available()) { - owner->buffer()-> + owner->view()-> open_new_inset(new InsetFormula(false)); - owner->buffer()-> - the_locking_inset->LocalDispatch(action, argument.c_str()); + owner->view() + ->the_locking_inset + ->LocalDispatch(owner->view(), + action, + argument); } } break; @@ -2165,7 +2196,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_MATH_DISPLAY: { if (owner->view()->available()) - owner->buffer()->open_new_inset(new InsetFormula(true)); + owner->view()->open_new_inset(new InsetFormula(true)); break; } @@ -2174,12 +2205,12 @@ string LyXFunc::Dispatch(int ac, if (owner->view()->available()) { string s(argument); if (s.empty()) - setErrorMessage(N_("Missing argument")); + setErrorMessage(N_("Missing argument")); else { - string s1 = token(s, ' ', 1); - int na = s1.empty() ? 0: atoi(s1.c_str()); - owner->buffer()-> - open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na)); + string s1 = token(s, ' ', 1); + int na = s1.empty() ? 0: atoi(s1.c_str()); + owner->view()-> + open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na)); } } } @@ -2189,7 +2220,7 @@ string LyXFunc::Dispatch(int ac, { if (owner->view()->available()) - owner->buffer()->open_new_inset(new InsetFormula); + owner->view()->open_new_inset(new InsetFormula); setMessage(N_("Math editor mode")); } break; @@ -2214,10 +2245,10 @@ string LyXFunc::Dispatch(int ac, new_inset->setOptions(token(lsarg, '|', 1)); } else new_inset->setContents(lsarg); - owner->buffer()->insertInset(new_inset); + owner->view()->insertInset(new_inset); } else { - owner->buffer()->insertInset(new_inset); - new_inset->Edit(0, 0); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); } } break; @@ -2236,9 +2267,9 @@ string LyXFunc::Dispatch(int ac, bibstyle, owner->buffer()); - owner->buffer()->insertInset(new_inset); + owner->view()->insertInset(new_inset); if (lsarg.empty()) { - new_inset->Edit(0, 0); + new_inset->Edit(owner->view(), 0, 0, 0); } } break; @@ -2277,50 +2308,47 @@ string LyXFunc::Dispatch(int ac, case LFUN_INDEX_INSERT: case LFUN_INDEX_INSERT_LAST: { + // Can't do that at the beginning of a paragraph. + if (owner->view()->text->cursor.pos - 1 < 0) + break; + InsetIndex * new_inset = new InsetIndex(); if (!argument.empty()) { string lsarg(argument); new_inset->setContents(lsarg); - owner->buffer()->insertInset(new_inset); + owner->view()->insertInset(new_inset); } else { - //reh 98/09/21 - //get the current word for an argument - - - // grab a word - - LyXParagraph::size_type lastpos = - owner->buffer()->text->cursor.pos - 1; - // If this can't happen, let's make sure that it really don't - Assert(owner->buffer()->text->cursor.pos - 1 >= 0); - // get the current word - // note that this must be done before - // inserting the inset, or the inset will break - // the word - string curstring(owner->buffer() - ->text->cursor.par->GetWord(lastpos)); - - //make the new inset and write the current word into it - InsetIndex * new_inset = new InsetIndex(); - - new_inset->setContents(curstring); - - //don't edit it if the call was to INSERT_LAST - if(action!= LFUN_INDEX_INSERT_LAST) { - new_inset->Edit(0, 0); - } else { - //it looks blank on the screen unless - //we do something. put it here. - - // move the cursor to the returned value of lastpos - // but only for the auto-insert - owner->buffer()->text->cursor.pos= lastpos; - } - - //put the new inset into the buffer. - // there should be some way of knowing the user - //cancelled & avoiding this, but i don't know how - owner->buffer()->insertInset(new_inset); + //reh 98/09/21 + //get the current word for an argument + LyXParagraph::size_type lastpos = + owner->view()->text->cursor.pos - 1; + // Get the current word. note that this must be done + // before inserting the inset, or the inset will + // break the word + string curstring(owner->view() + ->text->cursor.par->GetWord(lastpos)); + + //make the new inset and write the current word into it + InsetIndex * new_inset = new InsetIndex(); + + new_inset->setContents(curstring); + + //don't edit it if the call was to INSERT_LAST + if(action != LFUN_INDEX_INSERT_LAST) { + new_inset->Edit(owner->view(), 0, 0, 0); + } else { + //it looks blank on the screen unless + //we do something. put it here. + + // move the cursor to the returned value of lastpos + // but only for the auto-insert + owner->view()->text->cursor.pos = lastpos; + } + + //put the new inset into the buffer. + // there should be some way of knowing the user + //cancelled & avoiding this, but i don't know how + owner->view()->insertInset(new_inset); } } break; @@ -2328,7 +2356,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_INDEX_PRINT: { Inset * new_inset = new InsetPrintIndex(owner->buffer()); - owner->buffer()->insertInset(new_inset, "Standard", true); + owner->view()->insertInset(new_inset, "Standard", true); } break; @@ -2336,7 +2364,7 @@ string LyXFunc::Dispatch(int ac, { lyxerr << "arg " << argument << endl; Inset * new_inset = new InsetParent(argument, owner->buffer()); - owner->buffer()->insertInset(new_inset, "Standard", true); + owner->view()->insertInset(new_inset, "Standard", true); } break; @@ -2344,8 +2372,8 @@ string LyXFunc::Dispatch(int ac, { Inset * new_inset = new InsetInclude(argument, owner->buffer()); - owner->buffer()->insertInset(new_inset, "Standard", true); - new_inset->Edit(0, 0); + owner->view()->insertInset(new_inset, "Standard", true); + new_inset->Edit(owner->view(), 0, 0, 0); } break; @@ -2353,19 +2381,19 @@ string LyXFunc::Dispatch(int ac, { string filename = MakeAbsPath(argument, - OnlyPath(owner->buffer()->getFileName())); + OnlyPath(owner->buffer()->fileName())); setMessage(N_("Opening child document ") + MakeDisplayPath(filename) + "..."); owner->view()->savePosition(); if (bufferlist.exists(filename)) - owner->view()->buffer(bufferlist.getBuffer(filename)); + owner->view()->buffer(bufferlist.getBuffer(filename)); else - owner->view()->buffer(bufferlist.loadLyXFile(filename)); + owner->view()->buffer(bufferlist.loadLyXFile(filename)); } break; case LFUN_INSERT_NOTE: - NoteCB(); + owner->view()->insertNote(); break; case LFUN_INSERTFOOTNOTE: @@ -2389,8 +2417,9 @@ string LyXFunc::Dispatch(int ac, setErrorMessage(N_("Unknown kind of footnote")); break; } - owner->buffer()->text->InsertFootnoteEnvironment(kind); - owner->buffer()->update(1); + owner->view()->text->InsertFootnoteEnvironment(kind); + owner->view()->update(1); + owner->view()->setState(); } break; @@ -2421,14 +2450,14 @@ string LyXFunc::Dispatch(int ac, case LFUN_SELFINSERT: { for (string::size_type i = 0; i < argument.length(); ++i) { - owner->buffer()->text->InsertChar(argument[i]); + owner->view()->text->InsertChar(argument[i]); // This needs to be in the loop, or else we // won't break lines correctly. (Asger) - SmallUpdate(1); + owner->view()->smallUpdate(1); } SetUpdateTimer(); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->text->sel_cursor = + owner->view()->text->cursor; moveCursorUpdate(false); } break; @@ -2444,8 +2473,47 @@ string LyXFunc::Dispatch(int ac, } break; + case LFUN_DATE_INSERT: // jdblair: date-insert cmd + { + char datetmp[32]; + int datetmp_len; + time_t now_time_t; + struct tm *now_tm; + static string arg; + + now_time_t = time(NULL); + now_tm = localtime(&now_time_t); + (void)setlocale(LC_TIME, ""); + if (!argument.empty()) + arg = argument; + else if (arg.empty()) + arg = lyxrc.date_insert_format; + datetmp_len = (int) strftime(datetmp, 32, arg.c_str(), now_tm); + for (int i = 0; i < datetmp_len; i++) { + owner->view()->text->InsertChar(datetmp[i]); + owner->view()->smallUpdate(1); + } + SetUpdateTimer(); + owner->view()->text->sel_cursor = owner->view()->text->cursor; + moveCursorUpdate(false); + } + break; + + case LFUN_SAVEPREFERENCES: + { + Path p(user_lyxdir); + lyxrc.write("preferences"); + } + break; + case LFUN_UNKNOWN_ACTION: { + if(!owner->buffer()) { + LyXBell(); + setErrorMessage(N_("No document open")); + break; + } + if (owner->buffer()->isReadonly()) { LyXBell(); setErrorMessage(N_("Document is read only")); @@ -2460,28 +2528,56 @@ string LyXFunc::Dispatch(int ac, * "auto_region_delete", which defaults to * true (on). */ - if ( lyxrc->auto_region_delete ) { - if (owner->buffer()->text->selection){ - owner->buffer()->text->CutSelection(false); - owner->buffer()->update(-1); + if ( lyxrc.auto_region_delete ) { + if (owner->view()->text->selection){ + owner->view()->text->CutSelection(false); + owner->view()->update(-1); } } - BeforeChange(); + owner->view()->beforeChange(); + + if (isdigit(argument[0]) && + (lyxrc.auto_mathmode == "true" || + (lyxrc.auto_mathmode == "rtl" && + owner->view()->text->real_current_font.isVisibleRightToLeft() + ))) { + UpdatableInset * tmpinset = new InsetFormula; + LyXCursor & cursor = owner->view()->text->cursor; + if (cursor.pos > 0 && + cursor.par->GetChar(cursor.pos - 1) == '-' && + (cursor.pos == 1 || + cursor.par->IsSeparator(cursor.pos - 2) || + cursor.par->IsNewline(cursor.pos - 2) ) + ) { + owner->view()->text->Backspace(); + owner->view()->open_new_inset(tmpinset); + tmpinset->LocalDispatch(owner->view(), + LFUN_UNKNOWN_ACTION, + "-"); + } else { + owner->view()->open_new_inset(tmpinset); + } + tmpinset->LocalDispatch(owner->view(), + LFUN_UNKNOWN_ACTION, + argument); + return string(); + } + for (string::size_type i = 0; i < argument.length(); ++i) { if (greek_kb_flag) { if (!math_insert_greek(argument[i])) - owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->buffer()->text); + owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text); } else - owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->buffer()->text); + owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text); } - SmallUpdate(1); + owner->view()->smallUpdate(1); SetUpdateTimer(); - owner->buffer()->text->sel_cursor = - owner->buffer()->text->cursor; + owner->view()->text->sel_cursor = + owner->view()->text->cursor; moveCursorUpdate(false); return string(); } else { @@ -2517,7 +2613,7 @@ string LyXFunc::Dispatch(int ac, return res; } - + void LyXFunc::setupLocalKeymap() { @@ -2528,7 +2624,7 @@ void LyXFunc::setupLocalKeymap() void LyXFunc::MenuNew(bool fromTemplate) { - string fname, initpath = lyxrc->document_path; + string fname, initpath = lyxrc.document_path; LyXFileDlg fileDlg; if (owner->view()->available()) { @@ -2539,8 +2635,8 @@ void LyXFunc::MenuNew(bool fromTemplate) } ProhibitInput(); - fileDlg.SetButton(0, _("Documents"), lyxrc->document_path); - fileDlg.SetButton(1, _("Templates"), lyxrc->template_path); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); + fileDlg.SetButton(1, _("Templates"), lyxrc.template_path); fname = fileDlg.Select(_("Enter Filename for new document"), initpath, "*.lyx", _("newfile")); AllowInput(); @@ -2563,19 +2659,19 @@ void LyXFunc::MenuNew(bool fromTemplate) MakeDisplayPath(s, 50), _("Do you want to close that document now?\n" "('No' will just switch to the open version)"))) - { - case 1: // Yes: close the document - if (!bufferlist.close(bufferlist.getBuffer(s))) + { + case 1: // Yes: close the document + if (!bufferlist.close(bufferlist.getBuffer(s))) // If close is canceled, we cancel here too. + return; + break; + case 2: // No: switch to the open document + owner->view()->buffer(bufferlist.getBuffer(s)); return; - break; - case 2: // No: switch to the open document - owner->view()->buffer(bufferlist.getBuffer(s)); - return; - case 3: // Cancel: Do nothing - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } + case 3: // Cancel: Do nothing + owner->getMiniBuffer()->Set(_("Canceled.")); + return; + } } // Check whether the file already exists @@ -2603,7 +2699,7 @@ void LyXFunc::MenuNew(bool fromTemplate) if (fromTemplate) { ProhibitInput(); fname = fileDlg.Select(_("Choose template"), - lyxrc->template_path, + lyxrc.template_path, "*.lyx"); templname = fname; AllowInput(); @@ -2617,7 +2713,7 @@ void LyXFunc::MenuNew(bool fromTemplate) void LyXFunc::MenuOpen() { - string initpath = lyxrc->document_path; + string initpath = lyxrc.document_path; LyXFileDlg fileDlg; if (owner->view()->available()) { @@ -2629,11 +2725,11 @@ void LyXFunc::MenuOpen() // launches dialog ProhibitInput(); - fileDlg.SetButton(0, _("Documents"), lyxrc->document_path); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); fileDlg.SetButton(1, _("Examples"), AddPath(system_lyxdir, "examples")); string filename = fileDlg.Select(_("Select Document to Open"), - initpath, "*.lyx"); + initpath, "*.lyx"); AllowInput(); // check selected filename @@ -2666,7 +2762,7 @@ void LyXFunc::MenuOpen() void LyXFunc::doImportASCII(bool linorpar) { - string initpath = lyxrc->document_path; + string initpath = lyxrc.document_path; LyXFileDlg fileDlg; if (owner->view()->available()) { @@ -2678,11 +2774,11 @@ void LyXFunc::doImportASCII(bool linorpar) // launches dialog ProhibitInput(); - fileDlg.SetButton(0, _("Documents"), lyxrc->document_path); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); fileDlg.SetButton(1, _("Examples"), AddPath(system_lyxdir, "examples")); string filename = fileDlg.Select(_("Select ASCII file to Import"), - initpath, "*.txt"); + initpath, "*.txt"); AllowInput(); // check selected filename @@ -2697,24 +2793,24 @@ void LyXFunc::doImportASCII(bool linorpar) string s = ChangeExtension(filename, ".lyx", false); // Check if the document already is open - if (bufferlist.exists(s)){ + if (bufferlist.exists(s)) { switch(AskConfirmation(_("Document is already open:"), MakeDisplayPath(s, 50), _("Do you want to close that document now?\n" "('No' will just switch to the open version)"))) - { - case 1: // Yes: close the document - if (!bufferlist.close(bufferlist.getBuffer(s))) + { + case 1: // Yes: close the document + if (!bufferlist.close(bufferlist.getBuffer(s))) // If close is canceled, we cancel here too. + return; + break; + case 2: // No: switch to the open document + owner->view()->buffer(bufferlist.getBuffer(s)); return; - break; - case 2: // No: switch to the open document - owner->view()->buffer(bufferlist.getBuffer(s)); - return; - case 3: // Cancel: Do nothing - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } + case 3: // Cancel: Do nothing + owner->getMiniBuffer()->Set(_("Canceled.")); + return; + } } // Check if a LyX document by the same root exists in filesystem @@ -2730,7 +2826,7 @@ void LyXFunc::doImportASCII(bool linorpar) owner->getMiniBuffer()->Set(_("Importing ASCII file"), MakeDisplayPath(filename), "..."); // Insert ASCII file - InsertAsciiFile(filename, linorpar); + InsertAsciiFile(owner->view(), filename, linorpar); owner->getMiniBuffer()->Set(_("ASCII file "), MakeDisplayPath(filename), _("imported.")); @@ -2739,7 +2835,7 @@ void LyXFunc::doImportASCII(bool linorpar) void LyXFunc::doImportLaTeX(bool isnoweb) { - string initpath = lyxrc->document_path; + string initpath = lyxrc.document_path; LyXFileDlg fileDlg; if (owner->view()->available()) { @@ -2751,7 +2847,7 @@ void LyXFunc::doImportLaTeX(bool isnoweb) // launches dialog ProhibitInput(); - fileDlg.SetButton(0, _("Documents"), lyxrc->document_path); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); fileDlg.SetButton(1, _("Examples"), AddPath(system_lyxdir, "examples")); string filename; @@ -2781,20 +2877,20 @@ void LyXFunc::doImportLaTeX(bool isnoweb) MakeDisplayPath(LyXfilename, 50), _("Do you want to close that document now?\n" "('No' will just switch to the open version)"))) - { - case 1: // Yes: close the document - if (!bufferlist.close(bufferlist.getBuffer(LyXfilename))) + { + case 1: // Yes: close the document + if (!bufferlist.close(bufferlist.getBuffer(LyXfilename))) // If close is canceled, we cancel here too. + return; + break; + case 2: // No: switch to the open document + owner->view()->buffer( + bufferlist.getBuffer(LyXfilename)); return; - break; - case 2: // No: switch to the open document - owner->view()->buffer( - bufferlist.getBuffer(LyXfilename)); - return; - case 3: // Cancel: Do nothing - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } + case 3: // Cancel: Do nothing + owner->getMiniBuffer()->Set(_("Canceled.")); + return; + } } // Check if a LyX document by the same root exists in filesystem @@ -2834,13 +2930,102 @@ void LyXFunc::doImportLaTeX(bool isnoweb) } +void LyXFunc::doImportLinuxDoc() +{ + string initpath = lyxrc.document_path; + LyXFileDlg fileDlg; + + if (owner->view()->available()) { + string trypath = owner->buffer()->filepath; + // If directory is writeable, use this as default. + if (IsDirWriteable(trypath) == 1) + initpath = trypath; + } + + // launches dialog + ProhibitInput(); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); + fileDlg.SetButton(1, _("Examples"), + AddPath(system_lyxdir, "examples")); + + string filename = fileDlg.Select(_("Select LinuxDoc file to Import"), + initpath, "*.sgml"); + + AllowInput(); + + // check selected filename + if (filename.empty()) { + owner->getMiniBuffer()->Set(_("Canceled.")); + return; + } + + // get absolute path of file + filename = MakeAbsPath(filename); + + // Check if the document already is open + string LyXfilename = ChangeExtension(filename, ".lyx", false); + if (bufferlist.exists(LyXfilename)){ + switch(AskConfirmation(_("Document is already open:"), + MakeDisplayPath(LyXfilename, 50), + _("Do you want to close that document now?\n" + "('No' will just switch to the open version)"))) + { + case 1: // Yes: close the document + if (!bufferlist.close(bufferlist.getBuffer(LyXfilename))) + // If close is canceled, we cancel here too. + return; + break; + case 2: // No: switch to the open document + owner->view()->buffer( + bufferlist.getBuffer(LyXfilename)); + return; + case 3: // Cancel: Do nothing + owner->getMiniBuffer()->Set(_("Canceled.")); + return; + } + } + + // Check if a LyX document by the same root exists in filesystem + FileInfo f(LyXfilename, true); + if (f.exist() && !AskQuestion(_("A document by the name"), + MakeDisplayPath(LyXfilename), + _("already exists. Overwrite?"))) { + owner->getMiniBuffer()->Set(_("Canceled.")); + return; + } + + // loads document + owner->getMiniBuffer()->Set(_("Importing LinuxDoc file"), + MakeDisplayPath(filename), "..."); + + // run sgml2lyx + string tmp = lyxrc.linuxdoc_to_lyx_command + filename; + Systemcalls one; + Buffer * buf = 0; + + int result = one.startscript(Systemcalls::System, tmp); + if (result == 0) { + string filename = ChangeExtension(filename, ".lyx", false); + // File was generated without problems. Load it. + buf = bufferlist.loadLyXFile(filename); + owner->view()->buffer(buf); + owner->getMiniBuffer()->Set(_("LinuxDoc file "), + MakeDisplayPath(filename), + _("imported.")); + } else { + owner->getMiniBuffer()->Set(_("Could not import LinuxDoc file"), + MakeDisplayPath(filename)); + } +} + + void LyXFunc::MenuInsertLyXFile(string const & filen) { string filename = filen; if (filename.empty()) { // Launch a file browser - string initpath = lyxrc->document_path; + string initpath = lyxrc.document_path; LyXFileDlg fileDlg; if (owner->view()->available()) { @@ -2852,7 +3037,7 @@ void LyXFunc::MenuInsertLyXFile(string const & filen) // launches dialog ProhibitInput(); - fileDlg.SetButton(0, _("Documents"), lyxrc->document_path); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); fileDlg.SetButton(1, _("Examples"), AddPath(system_lyxdir, "examples")); filename = fileDlg.Select(_("Select Document to Insert"), @@ -2875,7 +3060,7 @@ void LyXFunc::MenuInsertLyXFile(string const & filen) // Inserts document owner->getMiniBuffer()->Set(_("Inserting document"), MakeDisplayPath(filename), "..."); - bool res = owner->buffer()->insertLyXFile(filename); + bool res = owner->view()->insertLyXFile(filename); if (res) { owner->getMiniBuffer()->Set(_("Document"), MakeDisplayPath(filename), @@ -2889,7 +3074,7 @@ void LyXFunc::MenuInsertLyXFile(string const & filen) void LyXFunc::reloadBuffer() { - string fn = owner->buffer()->getFileName(); + string fn = owner->buffer()->fileName(); if (bufferlist.close(owner->buffer())) owner->view()->buffer(bufferlist.loadLyXFile(fn)); } @@ -2915,7 +3100,7 @@ Inset * LyXFunc::getInsetByCode(Inset::Code code) { bool found = false; Inset * inset = 0; - LyXCursor cursor = owner->buffer()->text->cursor; + LyXCursor cursor = owner->view()->text->cursor; LyXParagraph::size_type pos = cursor.pos; LyXParagraph * par = cursor.par; @@ -2925,11 +3110,11 @@ Inset * LyXFunc::getInsetByCode(Inset::Code code) found = true; break; } - pos++; + ++pos; } par = par->next; } - return (found) ? inset: 0; + return found ? inset : 0; }