X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=d9f7e28269bffacf920d40246472989ef8cfa34f;hb=a410ecbf08a934e5abacda7b233f97a5e9ecc6a9;hp=ee19d7e66fadeef54887b8194c05804acf1d27a7;hpb=ef59101fe7f9231107b32b753fc9690474f58785;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index ee19d7e66f..d9f7e28269 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -10,12 +10,7 @@ #include -#ifdef HAVE_SSTREAM -#include -using std::istringstream; -#else -#include -#endif +#include "Lsstream.h" #include #include @@ -29,7 +24,6 @@ using std::istringstream; #endif #include "version.h" -#include "lyxlookup.h" #include "kbmap.h" #include "lyxfunc.h" #include "bufferlist.h" @@ -43,9 +37,6 @@ using std::istringstream; #include "insets/inseturl.h" #include "insets/insetlatexaccent.h" #include "insets/insettoc.h" -#include "insets/insetlof.h" -#include "insets/insetloa.h" -#include "insets/insetlot.h" #include "insets/insetref.h" #include "insets/insetparent.h" #include "insets/insetindex.h" @@ -76,80 +67,49 @@ using std::istringstream; #include "support/syscall.h" #include "support/lstrings.h" #include "support/path.h" +#include "support/lyxfunctional.h" #include "debug.h" #include "lyxrc.h" #include "lyxtext.h" #include "gettext.h" #include "trans_mgr.h" -#include "ImportLaTeX.h" -#include "ImportNoweb.h" #include "layout.h" #include "WorkArea.h" #include "lyxfr1.h" #include "bufferview_funcs.h" #include "frontends/Dialogs.h" #include "frontends/Toolbar.h" -#ifdef NEW_MENUBAR #include "frontends/Menubar.h" -#else -#include "menus.h" -#endif #include "FloatList.h" +#include "converter.h" +#include "exporter.h" +#include "importer.h" +#include "FontLoader.h" +#include "TextCache.h" using std::pair; using std::endl; +using std::find_if; -extern bool cursor_follows_scrollbar; - -extern void InsertAsciiFile(BufferView *, string const &, bool); -extern void math_insert_symbol(char const *); -extern bool math_insert_greek(char); +extern void math_insert_symbol(BufferView *, string const &); +extern bool math_insert_greek(BufferView *, char); extern BufferList bufferlist; extern LyXServer * lyxserver; extern int greek_kb_flag; -extern FD_form_toc * fd_form_toc; extern bool selection_possible; extern kb_keymap * toplevel_keymap; -extern void MenuWrite(Buffer *); -extern bool 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(); +#if 0 extern void MenuFax(Buffer *); -extern void MenuExport(Buffer *, string const &); +#endif extern void show_symbols_form(LyXFunc *); extern LyXAction lyxaction; // (alkis) extern tex_accent_struct get_accent(kb_action action); -extern void AutoSave(BufferView *); -extern bool PreviewDVI(Buffer *); -extern bool PreviewPostscript(Buffer *); -extern void MenuInsertLabel(char const *); -extern void MenuInsertRef(); -extern void MenuLayoutCharacter(); -extern void MenuLayoutParagraph(); -extern void MenuLayoutDocument(); -extern void MenuLayoutPaper(); -extern void MenuLayoutTable(int flag); -extern void MenuLayoutQuotes(); -extern void MenuLayoutPreamble(); -extern void MenuLayoutSave(); -extern void bulletForm(); - -extern Buffer * NewLyxFile(string const &); -extern void LoadLyXFile(string const &); -extern void Reconfigure(BufferView *); - extern LyXTextClass::size_type current_layout; -extern int getISOCodeFromLaTeX(char *); extern void ShowLatexLog(); @@ -190,76 +150,80 @@ void LyXFunc::moveCursorUpdate(bool selecting) } -int LyXFunc::processKeyEvent(XEvent * ev) +int LyXFunc::processKeySym(KeySym keysym, unsigned int state) { - char s_r[10]; string argument; - XKeyEvent * keyevent = &ev->xkey; - KeySym keysym_return = 0; - - 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 : ""); + char * tmp = XKeysymToString(keysym); + string const stm = (tmp ? tmp : ""); lyxerr << "KeySym is " << stm << "[" - << keysym_return << "]" - << " and num_bytes is " - << num_bytes - << " the string returned is \"" - << s_r << '\"' << endl; + << keysym << "] State is [" + << state << "]" + << endl; } // Do nothing if we have nothing (JMarc) - if (num_bytes == 0 && keysym_return == NoSymbol) { + if (keysym == NoSymbol) { lyxerr[Debug::KEY] << "Empty kbd action (probably composing)" << endl; - return 0; + //return 0; + return FL_PREEMPT; } - - // this function should be used always [asierra060396] - 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(owner->view()); - moveCursorUpdate(false); - owner->showState(); - } else { - tli->UnlockInsetInInset(owner->view(), - tli->GetLockingInset(),true); + + if (owner->view()->available()) { + // this function should be used always [asierra060396] + UpdatableInset * tli = owner->view()->theLockingInset(); + if (tli && (keysym == XK_Escape)) { + if (tli == tli->GetLockingInset()) { + owner->view()->unlockInset(tli); + owner->view()->text->CursorRight(owner->view()); + moveCursorUpdate(false); + owner->showState(); + } else { + tli->UnlockInsetInInset(owner->view(), + tli->GetLockingInset(),true); + } + //return 0; + return FL_PREEMPT; } - return 0; } - + // Can we be sure that this will work for all X-Windows // implementations? (Lgb) // This code snippet makes lyx ignore some keys. Perhaps // all of them should be explictly mentioned? - if((keysym_return >= XK_Shift_L && keysym_return <= XK_Hyper_R) - || keysym_return == XK_Mode_switch || keysym_return == 0x0) + if ((keysym >= XK_Shift_L && keysym <= XK_Hyper_R) + || keysym == XK_Mode_switch || keysym == 0x0) return 0; // Do a one-deep top-level lookup for // cancel and meta-fake keys. RVDK_PATCH_5 cancel_meta_seq.reset(); - int action = cancel_meta_seq.addkey(keysym_return, keyevent->state + int action = cancel_meta_seq.addkey(keysym, state &(ShiftMask|ControlMask |Mod1Mask)); - + if (lyxerr.debugging(Debug::KEY)) { + lyxerr << "action first set to [" << action << "]" << endl; + } + // When not cancel or meta-fake, do the normal lookup. // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards. // Mostly, meta_fake_bit = 0. RVDK_PATCH_5. - if ( (action != LFUN_CANCEL) && (action != LFUN_META_FAKE) ) { - + if ((action != LFUN_CANCEL) && (action != LFUN_META_FAKE)) { + if (lyxerr.debugging(Debug::KEY)) { + lyxerr << "meta_fake_bit is [" << meta_fake_bit << "]" << endl; + } // remove Caps Lock and Mod2 as a modifiers - action = keyseq.addkey(keysym_return, - (keyevent->state | meta_fake_bit) + action = keyseq.addkey(keysym, + (state | meta_fake_bit) &(ShiftMask|ControlMask - |Mod1Mask)); + |Mod1Mask)); + if (lyxerr.debugging(Debug::KEY)) { + lyxerr << "action now set to [" << action << "]" << endl; + } } // Dont remove this unless you know what you are doing. meta_fake_bit = 0; @@ -271,15 +235,15 @@ int LyXFunc::processKeyEvent(XEvent * ev) keyseq.print(buf); lyxerr << "Key [" << action << "][" - << buf << "][" - << num_bytes << "]" << endl; + << buf << "]" + << endl; } // already here we know if it any point in going further // why not return already here if action == -1 and // num_bytes == 0? (Lgb) - if(keyseq.length > 1 || keyseq.length < -1) { + if (keyseq.length > 1 || keyseq.length < -1) { string buf; keyseq.print(buf); owner->getMiniBuffer()->Set(buf); @@ -288,16 +252,15 @@ int LyXFunc::processKeyEvent(XEvent * ev) if (action == -1) { if (keyseq.length < -1) { // unknown key sequence... string buf; - LyXBell(); keyseq.print(buf); owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf); return 0; } - char isochar = keyseq.getiso(); - if (!(keyevent->state&ControlMask) && - !(keyevent->state&Mod1Mask) && - (isochar && keysym_return < 0xF000)) { + char const isochar = keyseq.getiso(); + if (!(state & ControlMask) && + !(state & Mod1Mask) && + (isochar && keysym < 0xF000)) { argument += isochar; } if (argument.empty()) { @@ -306,14 +269,42 @@ int LyXFunc::processKeyEvent(XEvent * ev) // so we`ll skip the dispatch. return 0; } - } else - if (action == LFUN_SELFINSERT) { - argument = s_r[0]; - } - + } else if (action == LFUN_SELFINSERT) { + // We must set the argument to the char looked up by + // XKeysymToString + XKeyEvent xke; + xke.type = KeyPress; + xke.serial = 0; + xke.send_event = False; + xke.display = fl_get_display(); + xke.window = 0; + xke.root = 0; + xke.subwindow = 0; + xke.time = 0; + xke.x = 0; + xke.y = 0; + xke.x_root = 0; + xke.y_root = 0; + xke.state = state; + xke.keycode = XKeysymToKeycode(fl_get_display(), keysym); + xke.same_screen = True; + char ret[10]; + KeySym tmpkeysym; + int res = XLookupString(&xke, ret, 10, &tmpkeysym, 0); + //Assert(keysym == tmpkeysym); + lyxerr[Debug::KEY] << "TmpKeysym [" + << tmpkeysym << "]" << endl; + + if (res > 0) + argument = string(ret, res); + lyxerr[Debug::KEY] << "SelfInsert arg[" + << argument << "]" << endl; + } + + bool tmp_sc = show_sc; show_sc = false; - Dispatch(action, argument.c_str()); + Dispatch(action, argument); show_sc = tmp_sc; return 0; @@ -361,50 +352,23 @@ 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"; 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"; + disable = !Exporter::IsExportable(buf, "dvi") + || lyxrc.print_command == "none"; break; +#if 0 case LFUN_FAX: - disable = noLaTeX || lyxrc.fax_command == "none"; - break; - case LFUN_IMPORT: - if (argument == "latex" || argument == "noweb") - disable = lyxrc.relyx_command == "none"; - else if (argument == "linuxdoc") - disable = lyxrc.linuxdoc_to_lyx_command == "none"; + disable = !Exporter::IsExportable(buf, "ps") + || lyxrc.fax_command == "none"; break; +#else case LFUN_EXPORT: - if (argument == "latex") - disable = ! buf->isLatex(); - else if (argument == "linuxdoc") - disable = ! buf->isLinuxDoc(); - else if (argument == "docbook") - disable = ! buf->isDocBook(); - else if (argument == "dvi" || argument == "postscript") - disable = noLaTeX; - else if (argument == "html") - disable = (buf->isLinuxDoc() - && lyxrc.linuxdoc_to_html_command == "none") - || (buf->isDocBook() - && lyxrc.docbook_to_html_command == "none") - || (! buf->isLinuxDoc() && ! buf->isDocBook() - && lyxrc.html_command == "none"); - else if (argument == "custom") - disable = ! buf->isLatex(); + disable = argument == "fax" && + !Exporter::IsExportable(buf, argument); break; +#endif case LFUN_UNDO: disable = buf->undostack.empty(); break; @@ -418,13 +382,56 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const disable = lyxrc.chktex_command == "none"; break; case LFUN_BUILDPROG: - disable = (lyxrc.literate_command == "none" - || ! buf->isLiterate()); -#ifndef NEW_TABULAR - case LFUN_LAYOUT_TABLE: - disable = ! owner->view()->text->cursor.par()->table; + disable = !Exporter::IsExportable(buf, "program"); break; -#endif + + case LFUN_INSERTFOOTNOTE: + case LFUN_FOOTMELT: + case LFUN_MARGINMELT: + // Disable insertion of floats in a tabular. + disable = false; + if (owner->view()->theLockingInset()) { + disable = (owner->view()->theLockingInset()->LyxCode() == Inset::TABULAR_CODE) || + owner->view()->theLockingInset()->GetFirstLockingInsetOfType(Inset::TABULAR_CODE); + } + break; + + case LFUN_LAYOUT_TABULAR: + disable = true; + if (owner->view()->theLockingInset()) { + disable = (owner->view()->theLockingInset()->LyxCode() != Inset::TABULAR_CODE) && + !owner->view()->theLockingInset()->GetFirstLockingInsetOfType(Inset::TABULAR_CODE); + } + break; + + case LFUN_TABULAR_FEATURE: + disable = true; + if (owner->view()->theLockingInset()) { + func_status ret = LyXFunc::Disabled; + if (owner->view()->theLockingInset()->LyxCode() == Inset::TABULAR_CODE) { + ret = static_cast + (owner->view()->theLockingInset())-> + getStatus(argument); + } else if (owner->view()->theLockingInset()->GetFirstLockingInsetOfType(Inset::TABULAR_CODE)) { + ret = static_cast + (owner->view()->theLockingInset()-> + GetFirstLockingInsetOfType(Inset::TABULAR_CODE))-> + getStatus(argument); + } + flag |= ret; + disable = false; + } else { + static InsetTabular inset(*owner->buffer(), 1, 1); + func_status ret; + + disable = true; + ret = inset.getStatus(argument); + if ((ret & LyXFunc::ToggleOn) || + (ret & LyXFunc::ToggleOff)) + flag |= LyXFunc::ToggleOff; + } + break; + case LFUN_VC_REGISTER: disable = buf->lyxvc.inUse(); break; @@ -439,6 +446,9 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const case LFUN_VC_HISTORY: disable = !buf->lyxvc.inUse(); break; + case LFUN_REF_BACK: + disable = owner->view()->NoSavedPositions(); + break; default: break; } @@ -447,7 +457,8 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const if (buf) { func_status box = LyXFunc::ToggleOff; - LyXFont font = owner->view()->text->real_current_font; + LyXFont const & font = + owner->view()->getLyXText()->real_current_font; switch (action) { case LFUN_EMPH: if (font.emph() == LyXFont::ON) @@ -476,19 +487,23 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const } -string LyXFunc::Dispatch(string const & s) +string const LyXFunc::Dispatch(string const & s) { // Split command string into command and argument - string cmd, line = frontStrip(s); + string cmd; + string line = frontStrip(s); string arg = strip(frontStrip(split(line, cmd, ' '))); - return Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str()); + return Dispatch(lyxaction.LookupFunc(cmd), arg); } -string LyXFunc::Dispatch(int ac, - char const * do_not_use_this_arg) +string const LyXFunc::Dispatch(int ac, + string const & do_not_use_this_arg) { + lyxerr[Debug::ACTION] << "LyXFunc::Dispatch: action[" << ac + <<"] arg[" << do_not_use_this_arg << "]" << endl; + string argument; kb_action action; @@ -505,7 +520,7 @@ string LyXFunc::Dispatch(int ac, argument = tmparg; } else { action = static_cast(ac); - if (do_not_use_this_arg) + if (!do_not_use_this_arg.empty()) argument = do_not_use_this_arg; // except here } @@ -514,8 +529,11 @@ string LyXFunc::Dispatch(int ac, if (owner->view()->available()) owner->view()->hideCursor(); + // We have to do this heare because of te goto below. (Lgb) + LyXText * text = owner->view()->getLyXText(); + // We cannot use this function here - if (getStatus(action) & Disabled) + if (getStatus(ac) & Disabled) goto exit_with_message; commandshortcut.erase(); @@ -534,7 +552,7 @@ string LyXFunc::Dispatch(int ac, // this is better pseudoaction = lyxaction.searchActionArg(action, - argument.c_str()); + argument); if (pseudoaction == -1) { pseudoaction = action; @@ -544,7 +562,8 @@ string LyXFunc::Dispatch(int ac, } } - string shortcuts = toplevel_keymap->findbinding(pseudoaction); + string const shortcuts = + toplevel_keymap->findbinding(pseudoaction); if (!shortcuts.empty()) { comname += ": " + shortcuts; @@ -566,10 +585,7 @@ string LyXFunc::Dispatch(int ac, } } - // If in math mode pass the control to - // the math inset [asierra060396] - if (owner->view()->available() && - owner->view()->the_locking_inset) { + if (owner->view()->available() && owner->view()->theLockingInset()) { UpdatableInset::RESULT result; if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) && (keyseq.length >= -1))) @@ -579,9 +595,10 @@ string LyXFunc::Dispatch(int ac, } // Undo/Redo pre 0.13 is a bit tricky for insets. if (action == LFUN_UNDO) { - int slx, sly; + int slx; + int sly; UpdatableInset * inset = - owner->view()->the_locking_inset; + owner->view()->theLockingInset(); inset->GetCursorPos(owner->view(), slx, sly); owner->view()->unlockInset(inset); owner->view()->menuUndo(); @@ -598,9 +615,10 @@ string LyXFunc::Dispatch(int ac, inset->Edit(owner->view(),slx,sly,0); return string(); } else if (action == LFUN_REDO) { - int slx, sly; + int slx; + int sly; UpdatableInset * inset = owner->view()-> - the_locking_inset; + theLockingInset(); inset->GetCursorPos(owner->view(), slx, sly); owner->view()->unlockInset(inset); owner->view()->menuRedo(); @@ -611,15 +629,15 @@ string LyXFunc::Dispatch(int ac, if (inset) inset->Edit(owner->view(),slx,sly,0); return string(); - } else if (((result=owner->view()->the_locking_inset-> + } else if (((result=owner->view()->theLockingInset()-> LocalDispatch(owner->view(), action, argument)) == UpdatableInset::DISPATCHED) || (result == UpdatableInset::DISPATCHED_NOUPDATE)) return string(); else { - setMessage(N_("Text mode")); - switch(action) { + //setMessage(N_("Text mode")); + switch (action) { case LFUN_UNKNOWN_ACTION: case LFUN_BREAKPARAGRAPH: case LFUN_BREAKLINE: @@ -653,7 +671,7 @@ string LyXFunc::Dispatch(int ac, } } - switch(action) { + switch (action) { // --- Misc ------------------------------------------- case LFUN_WORDFINDFORWARD : case LFUN_WORDFINDBACKWARD : { @@ -671,8 +689,8 @@ string LyXFunc::Dispatch(int ac, if (!searched_string.empty() && ((action == LFUN_WORDFINDBACKWARD) ? - ltCur->SearchBackward(owner->view(), searched_string.c_str()) : - ltCur->SearchForward(owner->view(), searched_string.c_str()))) { + ltCur->SearchBackward(owner->view(), searched_string) : + ltCur->SearchForward(owner->view(), searched_string))) { // ??? What is that ??? owner->view()->update(BufferView::SELECT|BufferView::FITCUR); @@ -683,7 +701,7 @@ string LyXFunc::Dispatch(int ac, owner->view()->text->ClearSelection(); // Move cursor so that successive C-s 's will not stand in place. - if( action == LFUN_WORDFINDFORWARD ) + if (action == LFUN_WORDFINDFORWARD ) owner->view()->text->CursorRightOneWord(owner->view()); owner->view()->text->FinishUndo(); moveCursorUpdate(false); @@ -692,8 +710,7 @@ string LyXFunc::Dispatch(int ac, // set the new selection // SetSelectionOverLenChars(owner->view()->currentBuffer()->text, iLenSelected); owner->view()->toggleSelection(false); - } else - LyXBell(); + } // REMOVED : if (owner->view()->getWorkArea()->focus) owner->view()->showCursor(); @@ -713,15 +730,15 @@ string LyXFunc::Dispatch(int ac, // --- Misc ------------------------------------------- case LFUN_EXEC_COMMAND: - owner->getMiniBuffer()->ExecCommand(); + owner->getMiniBuffer()->PrepareForCommand(); break; case LFUN_CANCEL: // RVDK_PATCH_5 keyseq.reset(); meta_fake_bit = 0; - if(owner->view()->available()) + if (owner->view()->available()) // cancel any selection - Dispatch(LFUN_MARK_OFF, 0); + Dispatch(LFUN_MARK_OFF); setMessage(N_("Cancel")); break; @@ -730,7 +747,6 @@ string LyXFunc::Dispatch(int ac, meta_fake_bit = Mod1Mask; string buf; keyseq.print(buf, true); - string res = string("M-") + buf; setMessage(buf); // RVDK_PATCH_5 } break; @@ -777,7 +793,7 @@ string LyXFunc::Dispatch(int ac, owner->getMiniBuffer()->Set(_("Saving document"), MakeDisplayPath(owner->buffer()->fileName()), "..."); - MenuWrite(owner->buffer()); + MenuWrite(owner->view(), owner->buffer()); //owner->getMiniBuffer()-> { // Set(_("Document saved as"), // MakeDisplayPath(owner->buffer()->fileName())); @@ -785,52 +801,46 @@ string LyXFunc::Dispatch(int ac, //owner->getMiniBuffer()->Set(_("Save failed!")); //} } else { - MenuWriteAs(owner->buffer()); + MenuWriteAs(owner->view(), owner->buffer()); } break; case LFUN_MENUWRITEAS: - MenuWriteAs(owner->buffer()); + MenuWriteAs(owner->view(), owner->buffer()); break; case LFUN_MENURELOAD: reloadBuffer(); break; - case LFUN_PREVIEW: - PreviewDVI(owner->buffer()); - break; - - case LFUN_PREVIEWPS: - PreviewPostscript(owner->buffer()); + case LFUN_UPDATE: + Exporter::Export(owner->buffer(), argument, true); break; - - case LFUN_RUNLATEX: - MenuRunLaTeX(owner->buffer()); + + case LFUN_PREVIEW: + Exporter::Preview(owner->buffer(), argument); break; case LFUN_BUILDPROG: - MenuBuildProg(owner->buffer()); + Exporter::Export(owner->buffer(), "program", true); break; case LFUN_RUNCHKTEX: MenuRunChktex(owner->buffer()); break; - - case LFUN_RUNDVIPS: - CreatePostscript(owner->buffer(), false); - break; - + case LFUN_MENUPRINT: owner->getDialogs()->showPrint(); break; +#if 0 case LFUN_FAX: MenuFax(owner->buffer()); break; - +#endif + case LFUN_EXPORT: - MenuExport(owner->buffer(), argument); + Exporter::Export(owner->buffer(), argument, false); break; case LFUN_IMPORT: @@ -846,71 +856,54 @@ string LyXFunc::Dispatch(int ac, case LFUN_LOTVIEW: case LFUN_LOAVIEW: { - Buffer::TocType type = Buffer::TOC_TOC; - if (action == LFUN_LOFVIEW) - type = Buffer::TOC_LOF; - else if (action == LFUN_LOTVIEW) - type = Buffer::TOC_LOT; - else if (action == LFUN_LOAVIEW) - type = Buffer::TOC_LOA; - fl_set_choice(fd_form_toc->toctype,type + 1); - TocUpdateCB(0, 0); - if (fd_form_toc->form_toc->visible) { - fl_raise_form(fd_form_toc->form_toc); - } else { - static int ow = -1, oh; - fl_show_form(fd_form_toc->form_toc, - FL_PLACE_MOUSE | - FL_FREE_SIZE, FL_FULLBORDER, - _("Table of Contents")); - if (ow < 0) { - ow = fd_form_toc->form_toc->w; - oh = fd_form_toc->form_toc->h; - } - fl_set_form_minsize(fd_form_toc->form_toc, ow, oh); - } + InsetCommandParams p; + + if (action == LFUN_TOCVIEW ) + p.setCmdName( "tableofcontents" ); + else if (action == LFUN_LOAVIEW ) + p.setCmdName( "listofalgorithms" ); + else if (action == LFUN_LOFVIEW ) + p.setCmdName( "listoffigures" ); + else + p.setCmdName( "listoftables" ); + + owner->getDialogs()->createTOC( p.getAsString() ); break; } + case LFUN_TOC_INSERT: - { - Inset * new_inset = new InsetTOC(owner->buffer()); - if (!owner->view()->insertInset(new_inset, "Standard", true)) - delete new_inset; - break; - } - - case LFUN_LOF_INSERT: - { - Inset * new_inset = new InsetLOF(owner->buffer()); - if (!owner->view()->insertInset(new_inset, "Standard", true)) - delete new_inset; - break; - } - case LFUN_LOA_INSERT: - { - Inset * new_inset = new InsetLOA(owner->buffer()); - if (!owner->view()->insertInset(new_inset, "Standard", true)) - delete new_inset; - break; - } - + case LFUN_LOF_INSERT: case LFUN_LOT_INSERT: { - Inset * new_inset = new InsetLOT(owner->buffer()); - if (!owner->view()->insertInset(new_inset, "Standard", true)) - delete new_inset; + InsetCommandParams p; + + if (action == LFUN_TOC_INSERT ) + p.setCmdName( "tableofcontents" ); + else if (action == LFUN_LOA_INSERT ) + p.setCmdName( "listofalgorithms" ); + else if (action == LFUN_LOF_INSERT ) + p.setCmdName( "listoffigures" ); + else + p.setCmdName( "listoftables" ); + + Inset * inset = new InsetTOC( p ); + if (!owner->view()->insertInset( inset, "Standard", true ) ) + delete inset; break; } - case LFUN_TABLE: -#ifndef NEW_TABULAR - Table(); -#else + case LFUN_DIALOG_TABULAR_INSERT: owner->getDialogs()->showTabularCreate(); -#endif break; + case LFUN_TABULAR_FEATURE: + case LFUN_SCROLL_INSET: + // this is not handled here as this funktion is only aktive + // if we have a locking_inset and that one is (or contains) + // a tabular-inset + break; + case LFUN_FIGURE: Figure(); break; @@ -918,8 +911,13 @@ string LyXFunc::Dispatch(int ac, case LFUN_INSET_GRAPHICS: { Inset * new_inset = new InsetGraphics; - if (!owner->view()->insertInset(new_inset)) + if (!owner->view()->insertInset(new_inset)) { delete new_inset; + } else { + // this is need because you don't use a inset->Edit() + owner->view()->updateInset(new_inset, true); + new_inset->Edit(owner->view(), 0, 0, 0); + } break; } @@ -976,21 +974,29 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_GOTOERROR: - owner->view()->gotoError(); + owner->view()->gotoInset(Inset::ERROR_CODE, false); break; case LFUN_REMOVEERRORS: if (owner->view()->removeAutoInsets()) { owner->view()->redraw(); - owner->view()->fitCursor(); - //owner->view()->updateScrollbar(); + owner->view()->fitCursor(owner->view()->text); } break; case LFUN_GOTONOTE: - owner->view()->gotoNote(); + owner->view()->gotoInset(Inset::IGNORE_CODE, false); break; + case LFUN_REFERENCE_GOTO: + { + vector tmp; + tmp.push_back(Inset::LABEL_CODE); + tmp.push_back(Inset::REF_CODE); + owner->view()->gotoInset(tmp, true); + break; + } + #ifndef NEW_INSETS case LFUN_OPENSTUFF: owner->view()->openStuff(); @@ -1018,15 +1024,15 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_DEPTH: - changeDepth(owner->view(), 0); + changeDepth(owner->view(), text, 0); break; case LFUN_DEPTH_MIN: - changeDepth(owner->view(), -1); + changeDepth(owner->view(), text, -1); break; case LFUN_DEPTH_PLUS: - changeDepth(owner->view(), 1); + changeDepth(owner->view(), text, 1); break; case LFUN_FREE: @@ -1055,7 +1061,7 @@ string LyXFunc::Dispatch(int ac, && owner->view()->text->cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) { // only melt footnotes with FOOTMELT, not margins etc - if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::FOOTNOTE) + if (owner->view()->text->cursor.par()->footnotekind == LyXParagraph::FOOTNOTE) Melt(owner->view()); } else @@ -1069,12 +1075,26 @@ string LyXFunc::Dispatch(int ac, && owner->view()->text->cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) { // only melt margins - if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::MARGIN) + if (owner->view()->text->cursor.par()->footnotekind == LyXParagraph::MARGIN) Melt(owner->view()); } else Margin(owner->view()); owner->view()->setState(); break; +#endif +#ifndef NEW_INSETS + case LFUN_FLOATSOPERATE: + if (argument == "openfoot") + owner->view()->allFloats(1,0); + else if (argument == "closefoot") + owner->view()->allFloats(0,0); + else if (argument == "openfig") + owner->view()->allFloats(1,1); + else if (argument == "closefig") + owner->view()->allFloats(0,1); + break; +#else +#warning Find another implementation here (or another lyxfunc)! #endif case LFUN_HELP_COPYRIGHT: owner->getDialogs()->showCopyright(); @@ -1105,17 +1125,21 @@ string LyXFunc::Dispatch(int ac, break; } - case LFUN_HELP_VERSION: + case LFUN_HELP_VERSION: { ProhibitInput(owner->view()); - fl_show_message((string(_("LyX Version ")) + LYX_VERSION - + _(" of ") + LYX_RELEASE).c_str(), + string msg(_("LyX Version ")); + msg += LYX_VERSION; + msg += " of "; + msg += LYX_RELEASE; + fl_show_message(msg.c_str(), (_("Library directory: ") + MakeDisplayPath(system_lyxdir)).c_str(), (_("User directory: ") + MakeDisplayPath(user_lyxdir)).c_str()); AllowInput(owner->view()); break; - + } + // --- version control ------------------------------- case LFUN_VC_REGISTER: { @@ -1211,7 +1235,7 @@ string LyXFunc::Dispatch(int ac, Dispatch(int(LFUN_LAYOUT), textclasslist.NameOfLayout(owner->view() ->buffer()->params.textclass, - sel).c_str()); + sel)); return string(); } @@ -1257,39 +1281,42 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_LAYOUT_DOCUMENT: - MenuLayoutDocument(); + owner->getDialogs()->showLayoutDocument(); break; case LFUN_LAYOUT_PARAGRAPH: +#ifdef USE_OLD_PARAGRAPH_LAYOUT MenuLayoutParagraph(); +#else + owner->getDialogs()->showLayoutParagraph(); +#endif break; case LFUN_LAYOUT_CHARACTER: MenuLayoutCharacter(); break; - - case LFUN_LAYOUT_TABLE: - { - int flag = 0; - if (argument == "true") flag = 1; - MenuLayoutTable(flag); - } - break; - - case LFUN_LAYOUT_PAPER: - MenuLayoutPaper(); - break; - - case LFUN_LAYOUT_QUOTES: - MenuLayoutQuotes(); - break; - + + case LFUN_LAYOUT_TABULAR: + if (owner->view()->theLockingInset()) { + if (owner->view()->theLockingInset()->LyxCode()==Inset::TABULAR_CODE) { + InsetTabular * inset = static_cast + (owner->view()->theLockingInset()); + inset->OpenLayoutDialog(owner->view()); + } else if (owner->view()->theLockingInset()-> + GetFirstLockingInsetOfType(Inset::TABULAR_CODE)!=0) { + InsetTabular * inset = static_cast( + owner->view()->theLockingInset()->GetFirstLockingInsetOfType(Inset::TABULAR_CODE)); + inset->OpenLayoutDialog(owner->view()); + } + } + break; + case LFUN_LAYOUT_PREAMBLE: MenuLayoutPreamble(); break; case LFUN_LAYOUT_SAVE_DEFAULT: - MenuLayoutSave(); + MenuLayoutSave(owner->view()); break; case LFUN_DROP_LAYOUTS_CHOICE: @@ -1353,53 +1380,56 @@ string LyXFunc::Dispatch(int ac, case LFUN_UPCASE_WORD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->ChangeWordCase(owner->view(), - LyXText::text_uppercase); + text->ChangeWordCase(owner->view(), LyXText::text_uppercase); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); break; case LFUN_LOWCASE_WORD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->ChangeWordCase(owner->view(), - LyXText::text_lowercase); + text->ChangeWordCase(owner->view(), LyXText::text_lowercase); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); break; case LFUN_CAPITALIZE_WORD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->ChangeWordCase(owner->view(), - LyXText::text_capitalization); + text->ChangeWordCase(owner->view(), + LyXText::text_capitalization); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); break; case LFUN_INSERT_LABEL: - MenuInsertLabel(argument.c_str()); - break; - - case LFUN_INSERT_REF: - MenuInsertRef(); + MenuInsertLabel(owner->view(), argument); break; - case LFUN_REFTOGGLE: - { - InsetRef * inset = - static_cast(getInsetByCode(Inset::REF_CODE)); - if (inset) { - inset->Toggle(); - owner->view()->updateInset(inset, true); + case LFUN_REF_INSERT: + if (argument.empty()) { + InsetCommandParams p("ref"); + owner->getDialogs()->createRef(p.getAsString()); } else { - setErrorMessage(N_("No cross-reference to toggle")); + InsetCommandParams p; + p.setFromString(argument); + + InsetRef * inset = new InsetRef(p, *owner->buffer()); + if (!owner->view()->insertInset(inset)) + delete inset; + else + owner->view()->updateInset(inset, true); } - } - break; - - case LFUN_REFBACK: + break; + + case LFUN_REF_BACK: { owner->view()->restorePosition(); } break; - case LFUN_REFGOTO: + case LFUN_REF_GOTO: { string label(argument); if (label.empty()) { @@ -1420,11 +1450,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_MENU_OPEN_BY_NAME: -#ifdef NEW_MENUBAR owner->getMenubar()->openByName(argument); -#else - owner->getMenus()->openByName(argument); -#endif break; // RVDK_PATCH_5 case LFUN_SPELLCHECK: @@ -1437,7 +1463,7 @@ string LyXFunc::Dispatch(int ac, { LyXText * tmptext = owner->view()->text; bool is_rtl = tmptext->cursor.par()->isRightToLeftPar(owner->buffer()->params); - if(!tmptext->mark_set) + if (!tmptext->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); if (is_rtl) @@ -1449,7 +1475,15 @@ string LyXFunc::Dispatch(int ac, && 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(owner->view(), 0, 0, 0); + int y = 0; + if (is_rtl) { + LyXFont font = + tmptext->GetFont(owner->view()->buffer(), + tmptext->cursor.par(), + tmptext->cursor.pos()); + y = tmpinset->descent(owner->view(),font); + } + tmpinset->Edit(owner->view(), 0, y, 0); break; } if (!is_rtl) @@ -1466,25 +1500,30 @@ string LyXFunc::Dispatch(int ac, // it simpler? (Lgb) LyXText * txt = owner->view()->text; bool is_rtl = txt->cursor.par()->isRightToLeftPar(owner->buffer()->params); - if(!txt->mark_set) owner->view()->beforeChange(); + if (!txt->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); + LyXCursor cur = txt->cursor; if (!is_rtl) txt->CursorLeft(owner->view(), false); - 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() == Inset::HIGHLY_EDITABLE) { + if ((is_rtl || cur != txt->cursor) && // only if really moved! + 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() + == Inset::HIGHLY_EDITABLE)) + { Inset * tmpinset = txt->cursor.par()->GetInset(txt->cursor.pos()); setMessage(tmpinset->EditMessage()); LyXFont font = txt->GetFont(owner->view()->buffer(), txt->cursor.par(), txt->cursor.pos()); + int y = is_rtl ? 0 + : tmpinset->descent(owner->view(),font); tmpinset->Edit(owner->view(), tmpinset->x() + tmpinset->width(owner->view(),font), - tmpinset->descent(owner->view(),font), - 0); + y, 0); break; } if (is_rtl) @@ -1497,7 +1536,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_UP: - if(!owner->view()->text->mark_set) owner->view()->beforeChange(); + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::UPDATE); owner->view()->text->CursorUp(owner->view()); owner->view()->text->FinishUndo(); @@ -1506,7 +1545,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_DOWN: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::UPDATE); owner->view()->text->CursorDown(owner->view()); @@ -1516,7 +1555,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_UP_PARAGRAPH: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::UPDATE); owner->view()->text->CursorUpParagraph(owner->view()); @@ -1526,7 +1565,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_DOWN_PARAGRAPH: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::UPDATE); owner->view()->text->CursorDownParagraph(owner->view()); @@ -1536,27 +1575,33 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_PRIOR: - if(!owner->view()->text->mark_set) - owner->view()->beforeChange(); + if (!text->mark_set) + owner->view()->beforeChange(); owner->view()->update(BufferView::UPDATE); - owner->view()->cursorPrevious(); + owner->view()->cursorPrevious(text); owner->view()->text->FinishUndo(); - moveCursorUpdate(false); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, false); + else + moveCursorUpdate(false); owner->showState(); break; case LFUN_NEXT: - if(!owner->view()->text->mark_set) + if (!text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::UPDATE); - owner->view()->cursorNext(); + owner->view()->cursorNext(text); owner->view()->text->FinishUndo(); - moveCursorUpdate(false); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, false); + else + moveCursorUpdate(false); owner->showState(); break; case LFUN_HOME: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); owner->view()->text->CursorHome(owner->view()); @@ -1566,7 +1611,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_END: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); owner->view()->text->CursorEnd(owner->view()); @@ -1577,7 +1622,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_SHIFT_TAB: case LFUN_TAB: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); owner->view()->text->CursorTab(owner->view()); @@ -1587,33 +1632,37 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_WORDRIGHT: - if(!owner->view()->text->mark_set) + if (!text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) - owner->view()->text->CursorLeftOneWord(owner->view()); + if (text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) + text->CursorLeftOneWord(owner->view()); else - owner->view()->text->CursorRightOneWord(owner->view()); + text->CursorRightOneWord(owner->view()); owner->view()->text->FinishUndo(); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); moveCursorUpdate(false); owner->showState(); break; case LFUN_WORDLEFT: - if(!owner->view()->text->mark_set) + if (!text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) - owner->view()->text->CursorRightOneWord(owner->view()); + if (text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) + text->CursorRightOneWord(owner->view()); else - owner->view()->text->CursorLeftOneWord(owner->view()); + text->CursorLeftOneWord(owner->view()); owner->view()->text->FinishUndo(); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); moveCursorUpdate(false); owner->showState(); break; case LFUN_BEGINNINGBUF: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); owner->view()->text->CursorTop(owner->view()); @@ -1623,7 +1672,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_ENDBUF: - if(!owner->view()->text->mark_set) + if (!owner->view()->text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); owner->view()->text->CursorBottom(owner->view()); @@ -1690,17 +1739,23 @@ string LyXFunc::Dispatch(int ac, case LFUN_PRIORSEL: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->cursorPrevious(); + owner->view()->cursorPrevious(text); owner->view()->text->FinishUndo(); - moveCursorUpdate(true); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, false); + else + moveCursorUpdate(true); owner->showState(); break; case LFUN_NEXTSEL: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->cursorNext(); + owner->view()->cursorNext(text); owner->view()->text->FinishUndo(); - moveCursorUpdate(true); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, false); + else + moveCursorUpdate(true); owner->showState(); break; @@ -1783,18 +1838,19 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_SETMARK: - if(owner->view()->text->mark_set) { + if (text->mark_set) { owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); setMessage(N_("Mark removed")); } else { owner->view()->beforeChange(); - owner->view()->text->mark_set = 1; + text->mark_set = 1; owner->view()->update(BufferView::SELECT|BufferView::FITCUR); setMessage(N_("Mark set")); } - owner->view()->text->sel_cursor = - owner->view()->text->cursor; + text->sel_cursor = text->cursor; + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); break; case LFUN_DELETE: @@ -1804,7 +1860,7 @@ string LyXFunc::Dispatch(int ac, owner->view()->text->cursor; owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); // It is possible to make it a lot faster still - // just comment out the lone below... + // just comment out the line below... owner->view()->showCursor(); } else { owner->view()->cut(); @@ -1861,7 +1917,9 @@ string LyXFunc::Dispatch(int ac, /* -------> Delete word forward. */ case LFUN_DELETE_WORD_FORWARD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->DeleteWordForward(owner->view()); + text->DeleteWordForward(owner->view()); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); moveCursorUpdate(false); owner->showState(); @@ -1870,7 +1928,9 @@ string LyXFunc::Dispatch(int ac, /* -------> Delete word backward. */ case LFUN_DELETE_WORD_BACKWARD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->DeleteWordBackward(owner->view()); + text->DeleteWordBackward(owner->view()); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); moveCursorUpdate(false); owner->showState(); @@ -1879,7 +1939,9 @@ string LyXFunc::Dispatch(int ac, /* -------> Kill to end of line. */ case LFUN_DELETE_LINE_FORWARD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->DeleteLineForward(owner->view()); + text->DeleteLineForward(owner->view()); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); moveCursorUpdate(false); break; @@ -1888,9 +1950,10 @@ string LyXFunc::Dispatch(int ac, case LFUN_MARK_OFF: owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->sel_cursor = - owner->view()->text->cursor; + text->sel_cursor = text->cursor; setMessage(N_("Mark off")); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); break; /* -------> Set mark on. */ @@ -1898,21 +1961,26 @@ string LyXFunc::Dispatch(int ac, owner->view()->beforeChange(); owner->view()->text->mark_set = 1; owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->sel_cursor = - owner->view()->text->cursor; + text->sel_cursor = text->cursor; + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); setMessage(N_("Mark on")); break; case LFUN_BACKSPACE: { if (!owner->view()->text->selection) { +#if 0 if (owner->getIntl()->getTrans()->backspace()) { +#else + if (owner->getIntl()->getTrans().backspace()) { +#endif owner->view()->text->Backspace(owner->view()); owner->view()->text->sel_cursor = owner->view()->text->cursor; owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); // It is possible to make it a lot faster still - // just comment out the lone below... + // just comment out the line below... owner->view()->showCursor(); } } else { @@ -2022,11 +2090,8 @@ string LyXFunc::Dispatch(int ac, cur_value = par->spacing.getValue(); } -#ifdef HAVE_SSTREAM - istringstream istr(argument); -#else - istrstream istr(argument.c_str()); -#endif + istringstream istr(argument.c_str()); + string tmp; istr >> tmp; Spacing::Space new_spacing = cur_spacing; @@ -2193,11 +2258,11 @@ string LyXFunc::Dispatch(int ac, case LFUN_INSET_CAPTION: { // Do we have a locking inset... - if (owner->view()->the_locking_inset) { + if (owner->view()->theLockingInset()) { lyxerr << "Locking inset code: " - << static_cast(owner->view()->the_locking_inset->LyxCode()); + << static_cast(owner->view()->theLockingInset()->LyxCode()); InsetCaption * new_inset = new InsetCaption; - new_inset->setOwner(owner->view()->the_locking_inset); + new_inset->setOwner(owner->view()->theLockingInset()); new_inset->SetAutoBreakRows(true); new_inset->SetDrawFrame(0, InsetText::LOCKED); new_inset->SetFrameColor(0, LColor::footnoteframe); @@ -2213,12 +2278,12 @@ string LyXFunc::Dispatch(int ac, { int r = 2, c = 2; if (!argument.empty()) - sscanf(argument.c_str(),"%d%d", &r, &c); + ::sscanf(argument.c_str(),"%d%d", &r, &c); InsetTabular * new_inset = - new InsetTabular(owner->buffer(), r, c); - if (owner->view()->insertInset(new_inset)) - new_inset->Edit(owner->view(), 0, 0, 0); - else + new InsetTabular(*owner->buffer(), r, c); + bool rtl = + owner->view()->getLyXText()->real_current_font.isRightToLeft(); + if (!owner->view()->open_new_inset(new_inset, rtl)) delete new_inset; } break; @@ -2229,7 +2294,7 @@ string LyXFunc::Dispatch(int ac, { LyXParagraph::size_type pos = owner->view()->text->cursor.pos(); - if(pos < owner->view()->text->cursor.par()->size()) + if (pos < owner->view()->text->cursor.par()->size()) //dispatch_buffer = owner->view()->text-> // cursor.par()->text[pos]; dispatch_buffer = @@ -2248,9 +2313,9 @@ string LyXFunc::Dispatch(int ac, case LFUN_SETXY: { - int x; - long y; - sscanf(argument.c_str(), " %d %ld", &x, &y); + int x; + int y; + ::sscanf(argument.c_str(), " %d %d", &x, &y); owner->view()->text->SetCursorFromCoordinates(owner->view(), x, y); } break; @@ -2263,9 +2328,9 @@ string LyXFunc::Dispatch(int ac, case LFUN_GETFONT: { LyXFont & font = owner->view()->text->current_font; - if(font.shape() == LyXFont::ITALIC_SHAPE) + if (font.shape() == LyXFont::ITALIC_SHAPE) dispatch_buffer = 'E'; - else if(font.shape() == LyXFont::SMALLCAPS_SHAPE) + else if (font.shape() == LyXFont::SMALLCAPS_SHAPE) dispatch_buffer = 'N'; else dispatch_buffer = '0'; @@ -2276,7 +2341,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_GETLATEX: { LyXFont & font = owner->view()->text->current_font; - if(font.latex() == LyXFont::ON) + if (font.latex() == LyXFont::ON) dispatch_buffer = 'L'; else dispatch_buffer = '0'; @@ -2302,8 +2367,8 @@ string LyXFunc::Dispatch(int ac, case LFUN_GOTOFILEROW: { char file_name[100]; - int row; - sscanf(argument.c_str(), " %s %d", file_name, &row); + int row; + ::sscanf(argument.c_str(), " %s %d", file_name, &row); // Must replace extension of the file to be .lyx and get full path string s = ChangeExtension(string(file_name), ".lyx"); @@ -2322,10 +2387,28 @@ string LyXFunc::Dispatch(int ac, } break; + case LFUN_GOTO_PARAGRAPH: + { + istringstream istr(argument.c_str()); + + int id; + istr >> id; + LyXParagraph * par = owner->view()->text->GetParFromID(id); + + // Set the cursor + owner->view()->text->SetCursor(owner->view(), par, 0); + owner->view()->setState(); + owner->showState(); + + // Recenter screen + owner->view()->center(); + } + break; + case LFUN_APROPOS: case LFUN_GETTIP: { - int qa = lyxaction.LookupFunc(argument.c_str()); + int const qa = lyxaction.LookupFunc(argument); setMessage(lyxaction.helpText(static_cast(qa))); } break; @@ -2354,10 +2437,16 @@ string LyXFunc::Dispatch(int ac, if (keyseq.length == -1 && keyseq.getiso() != 0) c = keyseq.getiso(); - + +#if 0 owner->getIntl()->getTrans()-> deadkey(c, get_accent(action).accent, owner->view()->text); +#else + owner->getIntl()->getTrans() + .deadkey(c, get_accent(action).accent, + owner->view()->text); +#endif // Need to reset, in case the minibuffer calls these // actions @@ -2433,20 +2522,21 @@ string LyXFunc::Dispatch(int ac, case LFUN_INSERT_MATRIX: { if (owner->view()->available()) { - owner->view()-> - open_new_inset(new InsetFormula(false)); - owner->view() - ->the_locking_inset - ->LocalDispatch(owner->view(), - action, - argument); + if (owner->view()-> + open_new_inset(new InsetFormula(false))) + { + owner->view()->theLockingInset() + ->LocalDispatch(owner->view(), + action, + argument); + } } } break; case LFUN_INSERT_MATH: { - math_insert_symbol(argument.c_str()); + math_insert_symbol(owner->view(), argument); } break; @@ -2464,8 +2554,8 @@ string LyXFunc::Dispatch(int ac, if (s.empty()) setErrorMessage(N_("Missing argument")); else { - string s1 = token(s, ' ', 1); - int na = s1.empty() ? 0: atoi(s1.c_str()); + string const s1 = token(s, ' ', 1); + int const na = s1.empty() ? 0 : lyx::atoi(s1); owner->view()-> open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na)); } @@ -2495,13 +2585,28 @@ string LyXFunc::Dispatch(int ac, } break; - case LFUN_CREATE_CITATION: + case LFUN_CITATION_CREATE: { - owner->getDialogs()->createCitation( argument ); + InsetCommandParams p( "cite" ); + + if (!argument.empty()) { + // This should be set at source, ie when typing + // "citation-insert foo" in the minibuffer. + // Question: would pybibliographer also need to be + // changed. Suspect so. Leave as-is therefore. + if (contains(argument, "|")) { + p.setContents( token(argument, '|', 0) ); + p.setOptions( token(argument, '|', 1) ); + } else { + p.setContents( argument ); + } + Dispatch(LFUN_CITATION_INSERT, p.getAsString()); + } else + owner->getDialogs()->createCitation( p.getAsString() ); } break; - case LFUN_INSERT_CITATION: + case LFUN_CITATION_INSERT: { InsetCommandParams p; p.setFromString( argument ); @@ -2519,20 +2624,19 @@ string LyXFunc::Dispatch(int ac, // ale970405+lasgoutt970425 // The argument can be up to two tokens separated // by a space. The first one is the bibstyle. - string lsarg(argument); - string bibstyle = token(lsarg, ' ', 1); + string const db = token(argument, ' ', 0); + string bibstyle = token(argument, ' ', 1); if (bibstyle.empty()) bibstyle = "plain"; - InsetBibtex * new_inset - = new InsetBibtex(token(lsarg, ' ', 0), - bibstyle, - owner->buffer()); + + InsetCommandParams p( "BibTeX", db, bibstyle ); + InsetBibtex * inset = new InsetBibtex(p); - if (owner->view()->insertInset(new_inset)) { - if (lsarg.empty()) - new_inset->Edit(owner->view(), 0, 0, 0); + if (owner->view()->insertInset(inset)) { + if (argument.empty()) + inset->Edit(owner->view(), 0, 0, 0); } else - delete new_inset; + delete inset; } break; @@ -2567,87 +2671,96 @@ string LyXFunc::Dispatch(int ac, } break; - case LFUN_INDEX_INSERT: - case LFUN_INDEX_INSERT_LAST: + case LFUN_INDEX_CREATE: { - // Can't do that at the beginning of a paragraph. - if (owner->view()->text->cursor.pos() - 1 < 0) - break; + InsetCommandParams p( "index" ); + + if (argument.empty()) { + // Get the word immediately preceding the cursor + LyXParagraph::size_type curpos = + owner->view()->text->cursor.pos() - 1; - InsetIndex * new_inset = new InsetIndex(); - if (!argument.empty()) { - string lsarg(argument); - new_inset->setContents(lsarg); - if (!owner->view()->insertInset(new_inset)) - delete new_inset; + string curstring; + if (curpos >= 0 ) + curstring = owner->view()->text + ->cursor.par()->GetWord(curpos); + + p.setContents( curstring ); } else { - //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)); + p.setContents( argument ); + } - //make the new inset and write the current word into it - InsetIndex * new_inset = new InsetIndex(); + owner->getDialogs()->createIndex( p.getAsString() ); + } + break; + + case LFUN_INDEX_INSERT: + { + InsetCommandParams p; + p.setFromString(argument); + InsetIndex * inset = new InsetIndex(p); - new_inset->setContents(curstring); + if (!owner->view()->insertInset(inset)) + delete inset; + else + owner->view()->updateInset(inset, true); + } + break; + + case LFUN_INDEX_INSERT_LAST: + { + // Get word immediately preceding the cursor + LyXParagraph::size_type curpos = + owner->view()->text->cursor.pos() - 1; + // Can't do that at the beginning of a paragraph + if (curpos < 0) break; - //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. + string const curstring(owner->view()->text + ->cursor.par()->GetWord(curpos)); - // move the cursor to the returned value of lastpos - // but only for the auto-insert - owner->view()->text->cursor.pos(lastpos); - } + InsetCommandParams p("index", curstring); + InsetIndex * inset = new InsetIndex(p); - //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 - if (!owner->view()->insertInset(new_inset)) - delete new_inset; - } + if (!owner->view()->insertInset(inset)) + delete inset; + else + owner->view()->updateInset(inset, true); } break; - + case LFUN_INDEX_PRINT: { - Inset * new_inset = new InsetPrintIndex(owner->buffer()); - if (!owner->view()->insertInset(new_inset, "Standard", true)) - delete new_inset; + InsetCommandParams p("printindex"); + Inset * inset = new InsetPrintIndex(p); + if (!owner->view()->insertInset(inset, "Standard", true)) + delete inset; } break; case LFUN_PARENTINSERT: { lyxerr << "arg " << argument << endl; - Inset * new_inset = new InsetParent(argument, owner->buffer()); - if (!owner->view()->insertInset(new_inset, "Standard", true)) - delete new_inset; + InsetCommandParams p( "lyxparent", argument ); + Inset * inset = new InsetParent(p, *owner->buffer()); + if (!owner->view()->insertInset(inset, "Standard", true)) + delete inset; } break; case LFUN_CHILDINSERT: { - Inset * new_inset = new InsetInclude(argument, - owner->buffer()); - if (owner->view()->insertInset(new_inset, "Standard", true)) - new_inset->Edit(owner->view(), 0, 0, 0); + InsetCommandParams p( "include", argument ); + Inset * inset = new InsetInclude(p, *owner->buffer()); + if (owner->view()->insertInset(inset, "Standard", true)) + inset->Edit(owner->view(), 0, 0, 0); else - delete new_inset; + delete inset; } break; case LFUN_CHILDOPEN: { - string filename = + string const filename = MakeAbsPath(argument, OnlyPath(owner->buffer()->fileName())); setMessage(N_("Opening child document ") + @@ -2667,21 +2780,21 @@ string LyXFunc::Dispatch(int ac, case LFUN_INSERTFOOTNOTE: { LyXParagraph::footnote_kind kind; - if (argument == "footnote") - { kind = LyXParagraph::FOOTNOTE; } - else if (argument == "margin") - { kind = LyXParagraph::MARGIN; } - else if (argument == "figure") - { kind = LyXParagraph::FIG; } - else if (argument == "table") - { kind = LyXParagraph::TAB; } - else if (argument == "wide-fig") - { kind = LyXParagraph::WIDE_FIG; } - else if (argument == "wide-tab") - { kind = LyXParagraph::WIDE_TAB; } - else if (argument == "algorithm") - { kind = LyXParagraph::ALGORITHM; } - else { + if (argument == "footnote") { + kind = LyXParagraph::FOOTNOTE; + } else if (argument == "margin") { + kind = LyXParagraph::MARGIN; + } else if (argument == "figure") { + kind = LyXParagraph::FIG; + } else if (argument == "table") { + kind = LyXParagraph::TAB; + } else if (argument == "wide-fig") { + kind = LyXParagraph::WIDE_FIG; + } else if (argument == "wide-tab") { + kind = LyXParagraph::WIDE_TAB; + } else if (argument == "algorithm") { + kind = LyXParagraph::ALGORITHM; + } else { setErrorMessage(N_("Unknown kind of footnote")); break; } @@ -2690,13 +2803,9 @@ string LyXFunc::Dispatch(int ac, owner->view()->setState(); } break; -#endif - case LFUN_BUFFERBULLETSSELECT: - bulletForm(); - break; - +#endif case LFUN_TOGGLECURSORFOLLOW: - cursor_follows_scrollbar = !cursor_follows_scrollbar; + lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar; break; case LFUN_KMAP_OFF: // keymap off @@ -2717,6 +2826,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_SELFINSERT: { + LyXFont const old_font(owner->view()->text->real_current_font); for (string::size_type i = 0; i < argument.length(); ++i) { owner->view()->text->InsertChar(owner->view(), argument[i]); // This needs to be in the loop, or else we @@ -2726,6 +2836,11 @@ string LyXFunc::Dispatch(int ac, owner->view()->text->sel_cursor = owner->view()->text->cursor; moveCursorUpdate(false); + + // real_current_font.number can change so we need to + // update the minibuffer + if (old_font != owner->view()->text->real_current_font) + owner->showState(); } break; @@ -2753,7 +2868,8 @@ string LyXFunc::Dispatch(int ac, else arg = lyxrc.date_insert_format; char datetmp[32]; - int datetmp_len = strftime(datetmp, 32, arg.c_str(), now_tm); + int const datetmp_len = + ::strftime(datetmp, 32, arg.c_str(), now_tm); for (int i = 0; i < datetmp_len; i++) { owner->view()->text->InsertChar(owner->view(), datetmp[i]); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); @@ -2775,23 +2891,39 @@ string LyXFunc::Dispatch(int ac, } break; + case LFUN_SCREEN_FONT_UPDATE: + { + // handle the screen font changes. + // + lyxrc.set_font_norm_type(); + fontloader.update(); + // Of course we should only do the resize and the textcache.clear + // if values really changed...but not very important right now. (Lgb) + // All buffers will need resize + bufferlist.resize(); + // We also need to empty the textcache so that + // the buffer will be formatted correctly after + // a zoom change. + textcache.clear(); + } + break; + case LFUN_SET_COLOR: { - string lyx_name, x11_name; - x11_name = split(argument, lyx_name, ' '); + string lyx_name; + string const x11_name = split(argument, lyx_name, ' '); if (lyx_name.empty() || x11_name.empty()) { - LyXBell(); setErrorMessage(N_("Syntax: set-color " " ")); break; } if (!lcolor.setColor(lyx_name, x11_name)) { - static string err1 (N_("Set-color \"")); - static string err2 (N_("\" failed - color is undefined " - "or may not be redefined")); - LyXBell(); - setErrorMessage(err1 + lyx_name + err2); + static string const err1 (N_("Set-color \"")); + static string const err2 ( + N_("\" failed - color is undefined " + "or may not be redefined")); + setErrorMessage(_(err1) + lyx_name + _(err2)); break; } lyxColorHandler->updateColor(lcolor.getFromLyXName(lyx_name)); @@ -2801,14 +2933,12 @@ string LyXFunc::Dispatch(int ac, case LFUN_UNKNOWN_ACTION: { - if(!owner->buffer()) { - LyXBell(); + if (!owner->buffer()) { setErrorMessage(N_("No document open")); break; } if (owner->buffer()->isReadonly()) { - LyXBell(); setErrorMessage(N_("Document is read only")); break; } @@ -2821,7 +2951,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(owner->view(), false); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); @@ -2829,14 +2959,23 @@ string LyXFunc::Dispatch(int ac, } owner->view()->beforeChange(); - + LyXFont const old_font(owner->view()->text->real_current_font); for (string::size_type i = 0; i < argument.length(); ++i) { if (greek_kb_flag) { - if (!math_insert_greek(argument[i])) + if (!math_insert_greek(owner->view(), + argument[i])) +#if 0 owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text); +#else + owner->getIntl()->getTrans().TranslateAndInsert(argument[i], owner->view()->text); +#endif } else +#if 0 owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text); +#else + owner->getIntl()->getTrans().TranslateAndInsert(argument[i], owner->view()->text); +#endif } owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); @@ -2844,27 +2983,33 @@ string LyXFunc::Dispatch(int ac, owner->view()->text->sel_cursor = owner->view()->text->cursor; moveCursorUpdate(false); + + // real_current_font.number can change so we need to + // update the minibuffer + if (old_font != owner->view()->text->real_current_font) + owner->showState(); return string(); } else { // why is an "Unknown action" with empty // argument even dispatched in the first // place? I`ll probably change that. (Lgb) - LyXBell(); setErrorMessage(N_("Unknown action")); } break; + } + default: lyxerr << "A truly unknown func!" << endl; break; - } } // end of switch exit_with_message: - string res = getMessage(); + string const res = getMessage(); if (res.empty()) { if (!commandshortcut.empty()) { - string newbuf = owner->getMiniBuffer()->GetText(); + string const newbuf = + owner->getMiniBuffer()->GetText(); if (newbuf != commandshortcut) { owner->getMiniBuffer()->Set(newbuf + " " + @@ -2872,8 +3017,10 @@ string LyXFunc::Dispatch(int ac, } } } else { - owner->getMiniBuffer()->Set(string(_(res.c_str())) - + " " + commandshortcut); + string msg(_(res)); + msg += " "; + msg += commandshortcut; + owner->getMiniBuffer()->Set(msg); } return res; @@ -2889,42 +3036,45 @@ void LyXFunc::setupLocalKeymap() void LyXFunc::MenuNew(bool fromTemplate) { - string fname, initpath = lyxrc.document_path; + string initpath = lyxrc.document_path; LyXFileDlg fileDlg; if (owner->view()->available()) { - string trypath = owner->buffer()->filepath; + string const trypath = owner->buffer()->filepath; // If directory is writeable, use this as default. if (IsDirWriteable(trypath) == 1) initpath = trypath; } -#ifdef NEW_WITH_FILENAME - ProhibitInput(owner->view()); - 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(owner->view()); + static int newfile_number = 0; + string s; - if (fname.empty()) { - owner->getMiniBuffer()->Set(_("Canceled.")); - lyxerr.debug() << "New Document Cancelled." << endl; - return; - } + if (lyxrc.new_ask_filename) { + ProhibitInput(owner->view()); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); + fileDlg.SetButton(1, _("Templates"), lyxrc.template_path); + string fname = fileDlg.Select(_("Enter Filename for new document"), + initpath, "*.lyx", _("newfile")); + AllowInput(owner->view()); - // get absolute path of file and make sure the filename ends - // with .lyx - string s = MakeAbsPath(fname); - if (!IsLyXFilename(s)) - s += ".lyx"; - - // Check if the document already is open - 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)"))) + if (fname.empty()) { + owner->getMiniBuffer()->Set(_("Canceled.")); + lyxerr.debug() << "New Document Cancelled." << endl; + return; + } + + // get absolute path of file and make sure the filename ends + // with .lyx + s = MakeAbsPath(fname); + if (!IsLyXFilename(s)) + s += ".lyx"; + + // Check if the document already is open + 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))) @@ -2938,47 +3088,49 @@ void LyXFunc::MenuNew(bool fromTemplate) owner->getMiniBuffer()->Set(_("Canceled.")); return; } - } - - // Check whether the file already exists - if (IsLyXFilename(s)) { + } + // Check whether the file already exists + if (IsLyXFilename(s)) { + FileInfo fi(s); + if (fi.readable() && + AskQuestion(_("File already exists:"), + MakeDisplayPath(s, 50), + _("Do you want to open the document?"))) { + // loads document + owner->getMiniBuffer()->Set(_("Opening document"), + MakeDisplayPath(s), "..."); + XFlush(fl_get_display()); + owner->view()->buffer( + bufferlist.loadLyXFile(s)); + owner->getMiniBuffer()->Set(_("Document"), + MakeDisplayPath(s), + _("opened.")); + return; + } + } + } else { + s = AddName(lyxrc.document_path, + "newfile" + tostr(++newfile_number) + ".lyx"); FileInfo fi(s); - if (fi.readable() && - AskQuestion(_("File already exists:"), - MakeDisplayPath(s, 50), - _("Do you want to open the document?"))) { - // loads document - owner->getMiniBuffer()->Set(_("Opening document"), - MakeDisplayPath(s), "..."); - XFlush(fl_display); - owner->view()->buffer( - bufferlist.loadLyXFile(s)); - owner->getMiniBuffer()->Set(_("Document"), - MakeDisplayPath(s), - _("opened.")); - return; + while (bufferlist.exists(s) || fi.readable()) { + ++newfile_number; + s = AddName(lyxrc.document_path, + "newfile" + tostr(newfile_number) + + ".lyx"); + fi.newFile(s); } } -#else - static int newfile_number = 0; - string s = "/lyx/dummy/dirname/newfile ["+tostr(++newfile_number)+"]"; - FileInfo fi(s); - while (bufferlist.exists(s) || fi.readable()) { - ++newfile_number; - s = "/lyx/dummy/dirname/newfile ["+tostr(newfile_number)+"]"; - fi.newFile(s); - } -#endif // The template stuff string templname; if (fromTemplate) { ProhibitInput(owner->view()); - fname = fileDlg.Select(_("Choose template"), - lyxrc.template_path, - "*.lyx"); - templname = fname; + string const fname = fileDlg.Select(_("Choose template"), + lyxrc.template_path, + "*.lyx"); AllowInput(owner->view()); + if (fname.empty()) return; + templname = fname; } // find a free buffer @@ -2993,7 +3145,7 @@ void LyXFunc::MenuOpen() LyXFileDlg fileDlg; if (owner->view()->available()) { - string trypath = owner->buffer()->filepath; + string const trypath = owner->buffer()->filepath; // If directory is writeable, use this as default. if (IsDirWriteable(trypath) == 1) initpath = trypath; @@ -3035,25 +3187,21 @@ void LyXFunc::MenuOpen() } } -// returns filename if file must be imported, -// empty string if either file not found or already loaded -// checks for running without gui are missing. -void LyXFunc::doImportHelper( - string const & file, // filename (possibly empty) - string const & text, // info when asking for filename - string const & pattern, // filetype - bool func(BufferView *, string const &) // the real import function -) +// checks for running without gui are missing. +void LyXFunc::doImport(string const & argument) { - string filename = file; + string format; + string filename = split(argument, format, ' '); + lyxerr.debug() << "LyXFunc::doImport: " << format + << " file: " << filename << endl; if (filename.empty()) { // need user interaction string initpath = lyxrc.document_path; LyXFileDlg fileDlg; if (owner->view()->available()) { - string trypath = owner->buffer()->filepath; + string const trypath = owner->buffer()->filepath; // If directory is writeable, use this as default. if (IsDirWriteable(trypath) == 1) initpath = trypath; @@ -3064,7 +3212,10 @@ void LyXFunc::doImportHelper( fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); fileDlg.SetButton(1, _("Examples"), AddPath(system_lyxdir, "examples")); - filename = fileDlg.Select(text, initpath, pattern); + string const text = _("Select ") + formats.PrettyName(format) + + _(" file to import"); + string const extension = "*." + formats.Extension(format); + filename = fileDlg.Select(text, initpath, extension); AllowInput(owner->view()); // check selected filename @@ -3079,11 +3230,11 @@ void LyXFunc::doImportHelper( // get absolute path of file filename = MakeAbsPath(filename); - string lyxfile = ChangeExtension(filename, ".lyx"); + string const lyxfile = ChangeExtension(filename, ".lyx"); // Check if the document already is open if (bufferlist.exists(lyxfile)) { - switch(AskConfirmation(_("Document is already open:"), + switch (AskConfirmation(_("Document is already open:"), MakeDisplayPath(lyxfile, 50), _("Do you want to close that document now?\n" "('No' will just switch to the open version)"))) @@ -3103,7 +3254,7 @@ void LyXFunc::doImportHelper( } // Check if a LyX document by the same root exists in filesystem - FileInfo f(lyxfile, true); + FileInfo const f(lyxfile, true); if (f.exist() && !AskQuestion(_("A document by the name"), MakeDisplayPath(lyxfile), _("already exists. Overwrite?"))) { @@ -3112,78 +3263,7 @@ void LyXFunc::doImportHelper( } // filename should be valid now - // notify user of import ahead - string displaypath = MakeDisplayPath(filename); - owner->getMiniBuffer()->Set(_("Importing"), displaypath, "..."); - - // call real importer - bool result = func(owner->view(), filename); - - // we are done - if (result) - owner->getMiniBuffer()->Set(displaypath, _("imported.")); - else - owner->getMiniBuffer()->Set(displaypath, _(": import failed.")); -} - -static -bool doImportASCIIasLines(BufferView * view, string const & filename) -{ - view->buffer(bufferlist.newFile(filename, string())); - InsertAsciiFile(view, filename, false); - return true; -} - -static -bool doImportASCIIasParagraphs(BufferView * view, string const & filename) -{ - view->buffer(bufferlist.newFile(filename, string())); - InsertAsciiFile(view, filename, true); - return true; -} - -static -bool doImportLaTeX(BufferView * view, string const & filename) -{ - ImportLaTeX myImport(filename); - Buffer * openbuf = myImport.run(); - if (openbuf) { - view->buffer(openbuf); - return true; - } - else - return false; -} - -static -bool doImportNoweb(BufferView * view, string const & filename) -{ - ImportNoweb myImport(filename); - Buffer * openbuf = myImport.run(); - if (openbuf) { - view->buffer(openbuf); - return true; - } - else - return false; -} - -static -bool doImportLinuxDoc(BufferView *, string const & 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"); - // File was generated without problems. Load it. - buf = bufferlist.loadLyXFile(filename); - } - - return result == 0; + Importer::Import(owner, filename, format); } @@ -3197,7 +3277,7 @@ void LyXFunc::MenuInsertLyXFile(string const & filen) LyXFileDlg fileDlg; if (owner->view()->available()) { - string trypath = owner->buffer()->filepath; + string const trypath = owner->buffer()->filepath; // If directory is writeable, use this as default. if (IsDirWriteable(trypath) == 1) initpath = trypath; @@ -3228,7 +3308,7 @@ void LyXFunc::MenuInsertLyXFile(string const & filen) // Inserts document owner->getMiniBuffer()->Set(_("Inserting document"), MakeDisplayPath(filename), "..."); - bool res = owner->view()->insertLyXFile(filename); + bool const res = owner->view()->insertLyXFile(filename); if (res) { owner->getMiniBuffer()->Set(_("Document"), MakeDisplayPath(filename), @@ -3239,40 +3319,10 @@ void LyXFunc::MenuInsertLyXFile(string const & filen) } } -void LyXFunc::doImport(string const & argument) -{ - string type; - string filename = split(argument, type, ' '); - lyxerr.debug() << "LyXFunc::doImport: " << type - << " file: " << filename << endl; - - if (type == "latex") - doImportHelper(filename, - _("Select LaTeX file to import"), "*.tex", - doImportLaTeX); - else if (type == "ascii") - doImportHelper(filename, - _("Select ASCII file to import"), "*.txt", - doImportASCIIasLines); - else if (type == "asciiparagraph") - doImportHelper(filename, - _("Select ASCII file to import"), "*.txt", - doImportASCIIasParagraphs); - else if (type == "noweb") - doImportHelper(filename, - _("Select NoWeb file to import"), "*.nw", - doImportNoweb); - else if (type == "linuxdoc") - doImportHelper(filename, - _("Select LinuxDoc file to import"), "*.doc", - doImportLinuxDoc); - else - setErrorMessage(string(N_("Unknown import type: ")) + type); -} void LyXFunc::reloadBuffer() { - string fn = owner->buffer()->fileName(); + string const fn = owner->buffer()->fileName(); if (bufferlist.close(owner->buffer())) owner->view()->buffer(bufferlist.loadLyXFile(fn)); } @@ -3286,8 +3336,7 @@ void LyXFunc::CloseBuffer() // set variables that don't exist // since there's no current buffer owner->getDialogs()->hideBufferDependent(); - } - else { + } else { owner->view()->buffer(bufferlist.first()); } } @@ -3298,13 +3347,12 @@ Inset * LyXFunc::getInsetByCode(Inset::Code code) { LyXCursor cursor = owner->view()->text->cursor; Buffer * buffer = owner->view()->buffer(); - for (Buffer::inset_iterator it = Buffer::inset_iterator(cursor.par(), - cursor.pos()); - it != buffer->inset_iterator_end(); ++it) { - if ((*it)->LyxCode() == code) - return *it; - } - return 0; + Buffer::inset_iterator it = + find_if(Buffer::inset_iterator(cursor.par(), + cursor.pos()), + buffer->inset_iterator_end(), + compare_memfun(&Inset::LyxCode, code)); + return it != buffer->inset_iterator_end() ? (*it) : 0; }