X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=31d3f28c0328e8b8ee3cd1a8cdab7ee64b5446df;hb=3df345c9383480f68fad51feae8b9c64425c8729;hp=3f2eb953f0861179a53898702727784f5db4d21b;hpb=d8b96c598c7cc488518c5b63907899400a789d56;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 3f2eb953f0..31d3f28c03 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,11 @@ #include "insets/insetindex.h" #include "insets/insetinclude.h" #include "insets/insetbib.h" +#include "insets/insettext.h" +//#include "insets/insetnumber.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 @@ -55,7 +59,6 @@ #include "support/syscall.h" #include "support/lstrings.h" #include "support/path.h" -#include "lyxscreen.h" #include "debug.h" #include "lyxrc.h" #include "lyxtext.h" @@ -64,10 +67,16 @@ #include "ImportLaTeX.h" #include "ImportNoweb.h" #include "layout.h" +#include "WorkArea.h" +#include "lyxfr1.h" +#include "menus.h" + +using std::pair; +using std::endl; extern bool cursor_follows_scrollbar; -extern void InsertAsciiFile(string const &, bool); +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; @@ -95,7 +104,6 @@ extern LyXAction lyxaction; extern tex_accent_struct get_accent(kb_action action); extern void AutoSave(); -extern void MenuSearch(); extern void SetUpdateTimer(float timer = 0.3); extern void FreeUpdateTimer(); extern bool PreviewDVI(Buffer *); @@ -114,17 +122,13 @@ 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; @@ -150,34 +154,37 @@ void LyXFunc::moveCursorUpdate(bool selecting) { if (selecting || owner->view()->text->mark_set) { owner->view()->text->SetSelection(); - owner->view()->getScreen()->ToggleToggle(); + owner->view()->toggleToggle(); owner->view()->update(0); } else { 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'; string argument; XKeyEvent * keyevent = &ev->xkey; KeySym 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 " @@ -193,11 +200,17 @@ int LyXFunc::processKeyEvent(XEvent * ev) } // this function should be used always [asierra060396] - if (owner->view()->available() && - owner->view()->the_locking_inset && - keysym_return == XK_Escape) { - owner->view()->unlockInset(owner->view()->the_locking_inset); - owner->view()->text->CursorRight(); + UpdatableInset * tli = owner->view()->the_locking_inset; + if (owner->view()->available() && tli && (keysym_return==XK_Escape)) { + if (tli == tli->GetLockingInset()) { + owner->view()->unlockInset(tli); + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); + } else { + tli->UnlockInsetInInset(owner->view(), + tli->GetLockingInset()); + } return 0; } @@ -246,7 +259,7 @@ 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){ + if(keyseq.length > 1 || keyseq.length < -1) { string buf; keyseq.print(buf); owner->getMiniBuffer()->Set(buf); @@ -330,34 +343,40 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const // 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"; + static bool noLaTeX = lyxrc.latex_command == "none"; bool disable = false; switch (action) { case LFUN_PREVIEW: - disable = noLaTeX || lyxrc->view_dvi_command == "none"; + disable = noLaTeX || lyxrc.view_dvi_command == "none"; break; case LFUN_PREVIEWPS: - disable = noLaTeX || lyxrc->view_ps_command == "none"; + 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"; + disable = noLaTeX || lyxrc.print_command == "none"; break; case LFUN_FAX: - disable = noLaTeX || lyxrc->fax_command == "none"; + disable = noLaTeX || lyxrc.fax_command == "none"; break; case LFUN_IMPORT: if (argument == "latex") - disable = lyxrc->relyx_command == "none"; + 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"; + 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(); @@ -366,10 +385,10 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const disable = buf->redostack.empty(); break; case LFUN_SPELLCHECK: - disable = lyxrc->isp_command == "none"; + disable = lyxrc.isp_command == "none"; break; case LFUN_RUNCHKTEX: - disable = lyxrc->chktex_command == "none"; + disable = lyxrc.chktex_command == "none"; break; case LFUN_LAYOUT_TABLE: disable = ! owner->view()->text->cursor.par->table; @@ -427,8 +446,6 @@ string LyXFunc::Dispatch(int ac, 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(); @@ -448,9 +465,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) @@ -458,7 +474,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 @@ -523,31 +539,67 @@ string LyXFunc::Dispatch(int ac, inset->GetCursorPos(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(slx, sly); + if (owner->view()->text->cursor.par-> + IsInset(owner->view()->text->cursor.pos)) { + inset = static_cast( + owner->view()->text->cursor.par-> + GetInset(owner->view()->text-> + cursor.pos)); + } else { + inset = 0; + } + if (inset) + inset->Edit(owner->view(),slx,sly,0); return string(); - } else - if (action == LFUN_REDO) { - int slx, 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(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")); + switch(action) { + case LFUN_UNKNOWN_ACTION: + case LFUN_BREAKPARAGRAPH: + case LFUN_BREAKLINE: + owner->view()->text->CursorRight(); + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); + break; + case LFUN_RIGHT: + if (!owner->view()->text->cursor.par->isRightToLeftPar()) { + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()-> + Set(CurrentState()); + } return string(); - } else - if (owner->view()->the_locking_inset->LocalDispatch(action, argument.c_str())) - return string(); - else { - setMessage(N_("Text mode")); - if (action == LFUN_RIGHT || action == -1) - owner->view()->text->CursorRight(); - if (action == LFUN_LEFT || action == LFUN_RIGHT) - return string(); + case LFUN_LEFT: + if (owner->view()->text->cursor.par->isRightToLeftPar()) { + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()-> + Set(CurrentState()); } + return string(); + default: + break; + } + } } } @@ -577,7 +629,7 @@ string LyXFunc::Dispatch(int ac, // ??? Needed ??? // clear the selection (if there is any) - owner->view()->getScreen()->ToggleSelection(); + owner->view()->toggleSelection(); owner->view()->text->ClearSelection(); // Move cursor so that successive C-s 's will not stand in place. @@ -589,19 +641,18 @@ string LyXFunc::Dispatch(int ac, // ??? 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()) { + if (owner->view()->available()) { owner->view()->update(-2); } string buf; @@ -644,18 +695,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_CENTER: // this is center and redraw. - owner->view()->beforeChange(); - if (owner->view()->text->cursor.y > - owner->view()->getWorkArea()->h / 2) { - owner->view()->getScreen()-> - Draw(owner->view()->text->cursor.y - - owner->view()->getWorkArea()->h / 2); - } else { // <= - owner->view()->getScreen()-> - Draw(0); - } - owner->view()->update(0); - owner->view()->redraw(); + owner->view()->center(); break; case LFUN_APPENDIX: @@ -683,7 +723,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: @@ -747,6 +796,8 @@ string LyXFunc::Dispatch(int ac, // noweb } else if (imtyp == "noweb") { doImportLaTeX(true); + } else if (imtyp == "linuxdoc") { + doImportLinuxDoc(); } else { setErrorMessage(string(N_("Unknown import type: ")) + imtyp); @@ -759,7 +810,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 { @@ -805,13 +856,20 @@ string LyXFunc::Dispatch(int ac, } 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; @@ -825,11 +883,19 @@ string LyXFunc::Dispatch(int ac, 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: owner->view()->paste(); + owner->view()->setState(); break; case LFUN_PASTESELECTION: @@ -854,6 +920,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_LAYOUT_PASTE: owner->view()->pasteEnvironment(); + owner->view()->setState(); break; case LFUN_GOTOERROR: @@ -897,31 +964,33 @@ string LyXFunc::Dispatch(int ac, 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: @@ -931,10 +1000,11 @@ string LyXFunc::Dispatch(int ac, != LyXParagraph::NO_FOOTNOTE) { // only melt footnotes with FOOTMELT, not margins etc if(owner->view()->text->cursor.par->footnotekind == LyXParagraph::FOOTNOTE) - MeltCB(ob, 0); + Melt(owner->view()); } else - FootCB(ob, 0); + Foot(owner->view()); + owner->view()->setState(); break; case LFUN_MARGINMELT: @@ -944,10 +1014,10 @@ string LyXFunc::Dispatch(int ac, != LyXParagraph::NO_FOOTNOTE) { // only melt margins if(owner->view()->text->cursor.par->footnotekind == LyXParagraph::MARGIN) - MeltCB(ob, 0); - } - else - MarginCB(ob, 0); + Melt(owner->view()); + } else + Margin(owner->view()); + owner->view()->setState(); break; // --- version control ------------------------------- @@ -993,22 +1063,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()){ -// owner->view()->beforeChange(); -// owner->buffer()->update(-2); -// } -// owner->view()->setBuffer(bufferlist.prev()); -// owner->view()-> -// resizeCurrentBufferPseudoExpose(); - break; - case LFUN_FILE_INSERT: { MenuInsertLyXFile(argument); @@ -1018,7 +1073,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_FILE_INSERT_ASCII: { bool asPara = (argument == "paragraph"); - InsertAsciiFile(string(), asPara); + InsertAsciiFile(owner->view(), string(), asPara); } break; @@ -1054,7 +1109,7 @@ string LyXFunc::Dispatch(int ac, // Pretend we got the name instead. Dispatch(int(LFUN_LAYOUT), textclasslist.NameOfLayout(owner->view()-> - text->parameters-> + text->bparams-> textclass, sel).c_str()); return string(); @@ -1067,31 +1122,39 @@ string LyXFunc::Dispatch(int ac, // Derive layout number from given argument (string) // and current buffer's textclass (number). */ - int layoutno = - textclasslist.NumberOfLayout(owner-> - view()-> - text->parameters-> - textclass, - argument).second; + LyXTextClassList::ClassList::size_type tclass = + owner->view()->text->bparams->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; + + if (current_layout != layout.second) { + owner->view()->hideCursor(); + current_layout = layout.second; owner->view()->update(-2); owner->view()->text-> - SetLayout(layoutno); + SetLayout(layout.second); owner->getToolbar()->combox-> select(owner->view()-> text->cursor.par-> GetLayout() + 1); owner->view()->update(1); + owner->view()->setState(); } } break; @@ -1136,40 +1199,57 @@ 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(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_BOLD: - BoldCB(); + Bold(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_NOUN: - NounCB(); + Noun(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_CODE: - CodeCB(); + Code(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_SANS: - SansCB(); + Sans(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_ROMAN: - RomanCB(); + Roman(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_DEFAULT: - StyleResetCB(); + StyleReset(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_UNDERLINE: - UnderlineCB(); + Underline(); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_FONT_SIZE: - FontSizeCB(argument); + FontSize(argument); + owner->getMiniBuffer()->Set(CurrentState()); break; case LFUN_FONT_STATE: @@ -1217,7 +1297,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")); } @@ -1252,28 +1332,32 @@ 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: { LyXText * tmptext = owner->view()->text; + bool is_rtl = tmptext->cursor.par->isRightToLeftPar(); if(!tmptext->mark_set) owner->view()->beforeChange(); owner->view()->update(-2); + if (is_rtl) + 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(); + if (!is_rtl) + tmptext->CursorRight(); owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); @@ -1285,20 +1369,28 @@ string LyXFunc::Dispatch(int ac, // This is soooo ugly. Isn`t it possible to make // it simpler? (Lgb) LyXText * txt = owner->view()->text; + bool is_rtl = txt->cursor.par->isRightToLeftPar(); if(!txt->mark_set) owner->view()->beforeChange(); owner->view()->update(-2); - txt->CursorLeft(); + if (!is_rtl) + 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; } + if (is_rtl) + txt->CursorRight(); + owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); @@ -1398,7 +1490,10 @@ string LyXFunc::Dispatch(int ac, if(!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(-2); - owner->view()->text->CursorRightOneWord(); + if (owner->view()->text->cursor.par->isRightToLeftPar()) + owner->view()->text->CursorLeftOneWord(); + else + owner->view()->text->CursorRightOneWord(); owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); @@ -1408,7 +1503,10 @@ string LyXFunc::Dispatch(int ac, if(!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(-2); - owner->view()->text->CursorLeftOneWord(); + if (owner->view()->text->cursor.par->isRightToLeftPar()) + owner->view()->text->CursorRightOneWord(); + else + owner->view()->text->CursorLeftOneWord(); owner->view()->text->FinishUndo(); moveCursorUpdate(false); owner->getMiniBuffer()->Set(CurrentState()); @@ -1438,7 +1536,10 @@ string LyXFunc::Dispatch(int ac, /* cursor selection ---------------------------- */ case LFUN_RIGHTSEL: owner->view()->update(-2); - owner->view()->text->CursorRight(); + if (owner->view()->text->cursor.par->isRightToLeftPar()) + owner->view()->text->CursorLeft(); + else + owner->view()->text->CursorRight(); owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); @@ -1446,7 +1547,10 @@ string LyXFunc::Dispatch(int ac, case LFUN_LEFTSEL: owner->view()->update(-2); - owner->view()->text->CursorLeft(); + if (owner->view()->text->cursor.par->isRightToLeftPar()) + owner->view()->text->CursorRight(); + else + owner->view()->text->CursorLeft(); owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); @@ -1518,7 +1622,10 @@ string LyXFunc::Dispatch(int ac, case LFUN_WORDRIGHTSEL: owner->view()->update(-2); - owner->view()->text->CursorRightOneWord(); + if (owner->view()->text->cursor.par->isRightToLeftPar()) + owner->view()->text->CursorLeftOneWord(); + else + owner->view()->text->CursorRightOneWord(); owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); @@ -1526,7 +1633,10 @@ string LyXFunc::Dispatch(int ac, case LFUN_WORDLEFTSEL: owner->view()->update(-2); - owner->view()->text->CursorLeftOneWord(); + if (owner->view()->text->cursor.par->isRightToLeftPar()) + owner->view()->text->CursorRightOneWord(); + else + owner->view()->text->CursorLeftOneWord(); owner->view()->text->FinishUndo(); moveCursorUpdate(true); owner->getMiniBuffer()->Set(CurrentState()); @@ -1550,20 +1660,40 @@ string LyXFunc::Dispatch(int ac, // --- text changing commands ------------------------ case LFUN_BREAKLINE: +#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: +#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); owner->view()->smallUpdate(1); SetUpdateTimer(); moveCursorUpdate(false); +#endif break; case LFUN_SETMARK: @@ -1590,11 +1720,14 @@ string LyXFunc::Dispatch(int ac, 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 { owner->view()->cut(); } SetUpdateTimer(); + moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); + owner->view()->setState(); break; case LFUN_DELETE_SKIP: @@ -1650,6 +1783,7 @@ string LyXFunc::Dispatch(int ac, owner->view()->update( 1 ); SetUpdateTimer(); moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); break; /* -------> Delete word backward. */ @@ -1660,6 +1794,7 @@ string LyXFunc::Dispatch(int ac, owner->view()->update( 1 ); SetUpdateTimer(); moveCursorUpdate(false); + owner->getMiniBuffer()->Set(CurrentState()); break; /* -------> Kill to end of line. */ @@ -1702,12 +1837,14 @@ string LyXFunc::Dispatch(int ac, 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 { owner->view()->cut(); } SetUpdateTimer(); + owner->getMiniBuffer()->Set(CurrentState()); + owner->view()->setState(); } break; @@ -1751,6 +1888,8 @@ string LyXFunc::Dispatch(int ac, SetUpdateTimer(0.01); owner->view()->text->sel_cursor = owner->view()->text->cursor; + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); break; } @@ -1762,6 +1901,8 @@ string LyXFunc::Dispatch(int ac, SetUpdateTimer(0.01); owner->view()->text->sel_cursor = owner->view()->text->cursor; + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); break; } @@ -1793,6 +1934,8 @@ string LyXFunc::Dispatch(int ac, } SetUpdateTimer(0.01); owner->view()->text->sel_cursor = cursor; + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); } break; @@ -1813,7 +1956,37 @@ string LyXFunc::Dispatch(int ac, else new_inset = new InsetUrl("url", "", ""); owner->view()->insertInset(new_inset); - new_inset->Edit(0, 0); + 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; +#if 0 + case LFUN_INSET_NUMBER: + { + InsetNumber * new_inset = new InsetNumber(owner->buffer()); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); + } + break; +#endif + 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; @@ -1824,8 +1997,11 @@ string LyXFunc::Dispatch(int ac, LyXParagraph::size_type 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->text[pos]; + dispatch_buffer = + owner->view()->text-> + cursor.par->GetChar(pos); else dispatch_buffer = "EOF"; } @@ -1909,18 +2085,7 @@ string LyXFunc::Dispatch(int ac, owner->view()->setCursorFromRow(row); // Recenter screen - owner->view()->beforeChange(); - if (owner->view()->text->cursor.y > - owner->view()->getWorkArea()->h / 2) { - owner->view()->getScreen()-> - Draw(owner->view()->text->cursor.y - - owner->view()->getWorkArea()->h/2); - } else { // <= - owner->view()->getScreen()-> - Draw(0); - } - owner->view()->update(0); - owner->view()->redraw(); + owner->view()->center(); } break; @@ -2016,14 +2181,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 @@ -2055,8 +2213,11 @@ string LyXFunc::Dispatch(int ac, if (owner->view()->available()) { owner->view()-> open_new_inset(new InsetFormula(false)); - owner->view()-> - the_locking_inset->LocalDispatch(action, argument.c_str()); + owner->view() + ->the_locking_inset + ->LocalDispatch(owner->view(), + action, + argument); } } break; @@ -2122,7 +2283,7 @@ string LyXFunc::Dispatch(int ac, owner->view()->insertInset(new_inset); } else { owner->view()->insertInset(new_inset); - new_inset->Edit(0, 0); + new_inset->Edit(owner->view(), 0, 0, 0); } } break; @@ -2143,7 +2304,7 @@ string LyXFunc::Dispatch(int ac, owner->view()->insertInset(new_inset); if (lsarg.empty()) { - new_inset->Edit(0, 0); + new_inset->Edit(owner->view(), 0, 0, 0); } } break; @@ -2209,7 +2370,7 @@ string LyXFunc::Dispatch(int ac, //don't edit it if the call was to INSERT_LAST if(action != LFUN_INDEX_INSERT_LAST) { - new_inset->Edit(0, 0); + new_inset->Edit(owner->view(), 0, 0, 0); } else { //it looks blank on the screen unless //we do something. put it here. @@ -2247,7 +2408,7 @@ string LyXFunc::Dispatch(int ac, Inset * new_inset = new InsetInclude(argument, owner->buffer()); owner->view()->insertInset(new_inset, "Standard", true); - new_inset->Edit(0, 0); + new_inset->Edit(owner->view(), 0, 0, 0); } break; @@ -2293,6 +2454,7 @@ string LyXFunc::Dispatch(int ac, } owner->view()->text->InsertFootnoteEnvironment(kind); owner->view()->update(1); + owner->view()->setState(); } break; @@ -2346,10 +2508,36 @@ 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"); + lyxrc.write("preferences"); } break; @@ -2375,7 +2563,7 @@ string LyXFunc::Dispatch(int ac, * "auto_region_delete", which defaults to * true (on). */ - if ( lyxrc->auto_region_delete ) { + if ( lyxrc.auto_region_delete ) { if (owner->view()->text->selection){ owner->view()->text->CutSelection(false); owner->view()->update(-1); @@ -2383,6 +2571,21 @@ string LyXFunc::Dispatch(int ac, } owner->view()->beforeChange(); + +#if 0 + if (isdigit(argument[0]) && + (lyxrc.number_inset == "true" || + (lyxrc.number_inset == "rtl" && + owner->view()->text->real_current_font.isVisibleRightToLeft() + ))) { + UpdatableInset * tmpinset = new InsetNumber(owner->buffer()); + owner->view()->open_new_inset(tmpinset); + tmpinset->LocalDispatch(owner->view(), action, + argument); + return string(); + } +#endif + for (string::size_type i = 0; i < argument.length(); ++i) { if (greek_kb_flag) { @@ -2443,7 +2646,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()) { @@ -2454,8 +2657,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(); @@ -2518,7 +2721,7 @@ void LyXFunc::MenuNew(bool fromTemplate) if (fromTemplate) { ProhibitInput(); fname = fileDlg.Select(_("Choose template"), - lyxrc->template_path, + lyxrc.template_path, "*.lyx"); templname = fname; AllowInput(); @@ -2532,7 +2735,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()) { @@ -2544,7 +2747,7 @@ 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"), @@ -2581,7 +2784,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()) { @@ -2593,7 +2796,7 @@ 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"), @@ -2645,7 +2848,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.")); @@ -2654,7 +2857,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()) { @@ -2666,7 +2869,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; @@ -2749,13 +2952,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()) { @@ -2767,7 +3059,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"),