X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=bf551cd8b55ba52548abb52d28b459770eb39c6b;hb=a9713c5563c924f4ab98bde3d9f24a5c1e4dd50e;hp=2f0ed634a3c8ffde43663daf34a9488319f0b09a;hpb=1ea1f923a88caf2d7ae05ba8617f57d3f85c800d;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 2f0ed634a3..bf551cd8b5 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -15,6 +15,7 @@ #include "kbmap.h" #include "lyxrow.h" #include "bufferlist.h" +#include "buffer.h" #include "BufferView.h" #include "lyxserver.h" #include "intl.h" @@ -43,8 +44,7 @@ #include "ParagraphParameters.h" #include "insets/insetcommand.h" -#include "insets/inseterror.h" -#include "insets/insetert.h" +#include "insets/insetexternal.h" #include "insets/insettabular.h" #include "mathed/formulamacro.h" @@ -65,11 +65,10 @@ #include "support/FileInfo.h" #include "support/forkedcontr.h" #include "support/lstrings.h" +#include "support/tostr.h" #include "support/path.h" #include "support/lyxfunctional.h" -#include "BoostFormat.h" - #include #include #include @@ -85,6 +84,7 @@ using std::find_if; using std::vector; using std::transform; using std::back_inserter; +using namespace bv_funcs; extern BufferList bufferlist; extern LyXServer * lyxserver; @@ -121,12 +121,11 @@ inline void LyXFunc::moveCursorUpdate(bool flag, bool selecting) { if (selecting || TEXT(flag)->selection.mark()) { - TEXT(flag)->setSelection(view()); - if (TEXT(flag)->isTopLevel()) + TEXT(flag)->setSelection(); + if (!TEXT(flag)->isInInset()) view()->toggleToggle(); } - view()->update(TEXT(flag), BufferView::SELECT|BufferView::FITCUR); - view()->showCursor(); + view()->update(TEXT(flag), BufferView::SELECT); view()->switchKeyMap(); } @@ -146,8 +145,7 @@ void LyXFunc::handleKeyFunc(kb_action action) // actions keyseq.clear(); // copied verbatim from do_accent_char - view()->update(TEXT(false), - BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + view()->update(TEXT(false), BufferView::SELECT); TEXT(false)->selection.cursor = TEXT(false)->cursor; } @@ -349,7 +347,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const disable = !mathcursor && !view()->getLyXText()->selection.set(); break; case LFUN_RUNCHKTEX: - disable = lyxrc.chktex_command == "none"; + disable = !buf->isLatex() || lyxrc.chktex_command == "none"; break; case LFUN_BUILDPROG: disable = !Exporter::IsExportable(buf, "program"); @@ -365,6 +363,14 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const && !tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE)); break; + case LFUN_DEPTH_MIN: + disable = !changeDepth(view(), TEXT(false), DEC_DEPTH, true); + break; + + case LFUN_DEPTH_PLUS: + disable = !changeDepth(view(), TEXT(false), INC_DEPTH, true); + break; + case LFUN_LAYOUT: case LFUN_LAYOUT_PARAGRAPH: { Inset * inset = TEXT(false)->cursor.par()->inInset(); @@ -424,13 +430,17 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const if (tli->lyxCode() == Inset::TABULAR_CODE) { ret = static_cast(tli) ->getStatus(ev.argument); + flag |= ret; + disable = false; } else if (tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE)) { ret = static_cast (tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE)) ->getStatus(ev.argument); + flag |= ret; + disable = false; + } else { + disable = true; } - flag |= ret; - disable = false; } else { static InsetTabular inset(*owner->buffer(), 1, 1); FuncStatus ret; @@ -478,6 +488,45 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const && lt->inset_owner->owner()->isOpen())); break; } + + case LFUN_INSET_SETTINGS: { + disable = true; + UpdatableInset * inset = view()->theLockingInset(); + + if (!inset) + break; + + // get the innermost inset + inset = inset->getLockingInset(); + + // jump back to owner if an InsetText, so + // we get back to the InsetTabular or whatever + if (inset->lyxCode() == Inset::TEXT_CODE) + inset = inset->owner(); + + Inset::Code code = inset->lyxCode(); + switch (code) { + case Inset::TABULAR_CODE: + disable = ev.argument != "tabular"; + break; + case Inset::ERT_CODE: + disable = ev.argument != "ert"; + break; + case Inset::FLOAT_CODE: + disable = ev.argument != "float"; + break; + case Inset::MINIPAGE_CODE: + disable = ev.argument != "minipage"; + break; + case Inset::WRAP_CODE: + disable = ev.argument != "wrap"; + break; + default: + break; + } + break; + } + case LFUN_LATEX_LOG: disable = !IsFileReadable(buf->getLogName().second); break; @@ -597,9 +646,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const case LFUN_TOC_INSERT: code = Inset::TOC_CODE; break; - case LFUN_PARENTINSERT: - code = Inset::PARENT_CODE; - break; case LFUN_HTMLURL: case LFUN_URL: code = Inset::URL_CODE; @@ -616,10 +662,10 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const case LFUN_END_OF_SENTENCE: code = Inset::SPECIALCHAR_CODE; break; - case LFUN_PROTECTEDSPACE: + case LFUN_SPACE_INSERT: // slight hack: we know this is allowed in math mode if (!mathcursor) - code = Inset::SPECIALCHAR_CODE; + code = Inset::SPACE_CODE; break; default: break; @@ -725,15 +771,7 @@ void LyXFunc::dispatch(string const & s, bool verbose) int const action = lyxaction.LookupFunc(s); if (action == LFUN_UNKNOWN_ACTION) { -#if USE_BOOST_FORMAT -boost::format fmt(_("Unknown function (%1$s)")); -fmt % s; -owner->message(fmt.str()); -#else - string const msg = string(_("Unknown function (")) - + s + ')'; - owner->message(msg); -#endif + owner->message(bformat(_("Unknown function (%1$s)"), s)); return; } @@ -766,9 +804,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) selection_possible = false; - if (view()->available()) - view()->hideCursor(); - string argument = ev.argument; kb_action action = ev.action; @@ -782,6 +817,9 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) goto exit_with_message; } + if (view()->available()) + view()->hideCursor(); + if (view()->available() && view()->theLockingInset()) { Inset::RESULT result; if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) && @@ -797,6 +835,19 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) && argument.empty()) { argument = encoded_last_key; } + + // the insets can't try to handle this, + // a table cell in the dummy position will + // lock its insettext, the insettext will + // pass it the bufferview, and succeed, + // so it will stay not locked. Not good + // if we've just done LFUN_ESCAPE (which + // injects an LFUN_PARAGRAPH_UPDATE) + if (action == LFUN_PARAGRAPH_UPDATE) { + view()->dispatch(ev); + goto exit_with_message; + } + // Undo/Redo is a bit tricky for insets. if (action == LFUN_UNDO) { view()->undo(); @@ -812,6 +863,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) goto exit_with_message; // If UNDISPATCHED, just soldier on else if (result == FINISHED) { + owner->clearMessage(); goto exit_with_message; // We do not need special RTL handling here: // FINISHED means that the cursor should be @@ -819,13 +871,13 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) } else if (result == FINISHED_RIGHT) { TEXT()->cursorRight(view()); moveCursorUpdate(true, false); - owner->view_state_changed(); + owner->clearMessage(); goto exit_with_message; } else if (result == FINISHED_UP) { - if (TEXT()->cursor.irow()->previous()) { + if (TEXT()->cursor.irow() != TEXT()->rows().begin()) { #if 1 TEXT()->setCursorFromCoordinates( - view(), TEXT()->cursor.ix() + inset_x, + TEXT()->cursor.ix() + inset_x, TEXT()->cursor.iy() - TEXT()->cursor.irow()->baseline() - 1); TEXT()->cursor.x_fix(TEXT()->cursor.x()); @@ -833,16 +885,16 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) TEXT()->cursorUp(view()); #endif moveCursorUpdate(true, false); - owner->view_state_changed(); } else { - view()->update(TEXT(), BufferView::SELECT|BufferView::FITCUR); + view()->update(TEXT(), BufferView::SELECT); } + owner->clearMessage(); goto exit_with_message; } else if (result == FINISHED_DOWN) { - if (TEXT()->cursor.irow()->next()) { + if (boost::next(TEXT()->cursor.irow()) != TEXT()->rows().end()) { #if 1 TEXT()->setCursorFromCoordinates( - view(), TEXT()->cursor.ix() + inset_x, + TEXT()->cursor.ix() + inset_x, TEXT()->cursor.iy() - TEXT()->cursor.irow()->baseline() + TEXT()->cursor.irow()->height() + 1); @@ -854,7 +906,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) TEXT()->cursorRight(view()); } moveCursorUpdate(true, false); - owner->view_state_changed(); + owner->clearMessage(); goto exit_with_message; } #warning I am not sure this is still right, please have a look! (Jug 20020417) @@ -883,7 +935,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) } goto exit_with_message; case LFUN_DOWN: - if (TEXT()->cursor.row()->next()) + if (boost::next(TEXT()->cursor.row()) != TEXT()->rows().end()) TEXT()->cursorDown(view()); else TEXT()->cursorRight(view()); @@ -920,7 +972,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) } finishUndo(); // Tell the paragraph dialog that we changed paragraph - owner->getDialogs().updateParagraph(); + dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); } } break; @@ -941,15 +993,13 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) if (!searched_string.empty()) { lyxfind::LyXFind(view(), searched_string, fw); } -// view()->showCursor(); } break; case LFUN_PREFIX: { if (view()->available() && !view()->theLockingInset()) { - view()->update(TEXT(), - BufferView::SELECT|BufferView::FITCUR); + view()->update(TEXT(), BufferView::SELECT); } owner->message(keyseq.printOptions()); } @@ -1004,30 +1054,30 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) case LFUN_MENUWRITE: if (!owner->buffer()->isUnnamed()) { - ostringstream s1; -#if USE_BOOST_FORMAT - s1 << boost::format(_("Saving document %1$s...")) - % MakeDisplayPath(owner->buffer()->fileName()); -#else - s1 << _("Saving document ") - << MakeDisplayPath(owner->buffer()->fileName()) - << _("..."); -#endif - owner->message(STRCONV(s1.str())); - MenuWrite(view(), owner->buffer()); - s1 << _(" done."); - owner->message(STRCONV(s1.str())); + string const str = bformat(_("Saving document %1$s..."), + MakeDisplayPath(owner->buffer()->fileName())); + owner->message(str); + MenuWrite(owner->buffer()); + owner->message(str + _(" done.")); } else - WriteAs(view(), owner->buffer()); + WriteAs(owner->buffer()); break; case LFUN_WRITEAS: - WriteAs(view(), owner->buffer(), argument); + WriteAs(owner->buffer(), argument); break; - case LFUN_MENURELOAD: - view()->reload(); + case LFUN_MENURELOAD: { + string const file = MakeDisplayPath(view()->buffer()->fileName(), 20); + string text = bformat(_("Any changes will be lost. Are you sure " + "you want to revert to the saved version of the document %1$s?"), file); + int const ret = Alert::prompt(_("Revert to saved document?"), + text, 0, 1, _("&Revert"), _("&Cancel")); + + if (ret == 0) + view()->reload(); break; + } case LFUN_UPDATE: Exporter::Export(owner->buffer(), argument, true); @@ -1042,7 +1092,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) break; case LFUN_RUNCHKTEX: - MenuRunChktex(owner->buffer()); + owner->buffer()->runChktex(); break; case LFUN_MENUPRINT: @@ -1088,29 +1138,23 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) owner->getDialogs().showSearch(); break; - case LFUN_REMOVEERRORS: - if (view()->removeAutoInsets()) { -#warning repaint() or update() or nothing ? - view()->repaint(); - view()->fitCursor(); - } - break; - case LFUN_DEPTH_MIN: - changeDepth(view(), TEXT(false), -1); + changeDepth(view(), TEXT(false), DEC_DEPTH, false); + owner->view_state_changed(); break; case LFUN_DEPTH_PLUS: - changeDepth(view(), TEXT(false), 1); + changeDepth(view(), TEXT(false), INC_DEPTH, false); + owner->view_state_changed(); break; case LFUN_FREEFONT_APPLY: - apply_freefont(view()); - break; + apply_freefont(view()); + break; - case LFUN_FREEFONT_UPDATE: - update_and_apply_freefont(view(), argument); - break; + case LFUN_FREEFONT_UPDATE: + update_and_apply_freefont(view(), argument); + break; case LFUN_RECONFIGURE: Reconfigure(view()); @@ -1153,15 +1197,8 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) << arg << "'. Bad installation?" << endl; break; } - ostringstream str; -#if USE_BOOST_FORMAT - str << boost::format(_("Opening help file %1$s...")) - % MakeDisplayPath(fname); -#else - str << _("Opening help file ") - << MakeDisplayPath(fname) << _("..."); -#endif - owner->message(STRCONV(str.str())); + owner->message(bformat(_("Opening help file %1$s..."), + MakeDisplayPath(fname))); view()->buffer(bufferlist.loadLyXFile(fname, false)); break; } @@ -1204,7 +1241,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) case LFUN_VC_HISTORY: { - owner->getDialogs().showVCLogFile(); + owner->getDialogs().show("vclog"); break; } @@ -1228,23 +1265,19 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) break; case LFUN_LATEX_LOG: - owner->getDialogs().showLogFile(); + owner->getDialogs().show("log"); break; case LFUN_LAYOUT_DOCUMENT: owner->getDialogs().showDocument(); break; - case LFUN_LAYOUT_PARAGRAPH: - owner->getDialogs().showParagraph(); + case LFUN_LAYOUT_CHARACTER: { + string data = freefont2string(); + if (!data.empty()) + owner->getDialogs().show("character", data); break; - - case LFUN_LAYOUT_CHARACTER: { - string data = freefont2string(); - if (!data.empty()) - owner->getDialogs().show("character", data); - break; - } + } case LFUN_LAYOUT_TABULAR: if (view()->theLockingInset()) { @@ -1324,8 +1357,8 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) int id; istr >> id; - Paragraph * par = owner->buffer()->getParFromID(id); - if (par == 0) { + ParIterator par = owner->buffer()->getParFromID(id); + if (par == owner->buffer()->par_iterator_end()) { lyxerr[Debug::INFO] << "No matching paragraph found! [" << id << ']' << endl; break; @@ -1337,10 +1370,11 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) if (view()->theLockingInset()) view()->unlockInset(view()->theLockingInset()); if (par->inInset()) { - par->inInset()->edit(view()); + FuncRequest cmd(view(), LFUN_INSET_EDIT, "left"); + par->inInset()->localDispatch(cmd); } // Set the cursor - view()->getLyXText()->setCursor(view(), par, 0); + view()->getLyXText()->setCursor(par.pit(), 0); view()->switchKeyMap(); owner->view_state_changed(); @@ -1350,14 +1384,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) } break; - case LFUN_APROPOS: - case LFUN_GETTIP: - { - int const qa = lyxaction.LookupFunc(argument); - setMessage(lyxaction.helpText(static_cast(qa))); - } - break; - // --- insert characters ---------------------------------------- // --- Mathed stuff. If we are here, there is no locked inset yet. @@ -1414,6 +1440,8 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) FuncRequest fr(view(), LFUN_INSET_DIALOG_UPDATE, ev.argument); inset->localDispatch(fr); + } else if (name == "paragraph") { + dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); } } break; @@ -1515,20 +1543,10 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) x11_name != lcolor.getX11Name(LColor::graphicsbg)); if (!lcolor.setColor(lyx_name, x11_name)) { -#if USE_BOOST_FORMAT setErrorMessage( - boost::io::str( - boost::format( - _("Set-color \"%1$s\" failed " + bformat(_("Set-color \"%1$s\" failed " "- color is undefined or " - "may not be redefined")) - % lyx_name)); -#else - setErrorMessage(_("Set-color ") + lyx_name - + _(" failed - color is undefined" - " or may not be redefined")); -#endif - + "may not be redefined"), lyx_name)); break; } @@ -1571,6 +1589,12 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) owner->getDialogs().toggleTooltips(); break; + case LFUN_EXTERNAL_EDIT: { + InsetExternal() + .localDispatch(FuncRequest(view(), action, argument)); + break; + } + default: // Then if it was none of the above // Trying the BufferView::pimpl dispatch: @@ -1582,6 +1606,18 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) } // end of switch exit_with_message: + + view()->owner()->updateLayoutChoice(); + + if (view()->available()) { + view()->fitCursor(); + + // If we executed a mutating lfun, mark the buffer as dirty + if (!lyxaction.funcHasFlag(ev.action, LyXAction::NoBuffer) + && !lyxaction.funcHasFlag(ev.action, LyXAction::ReadOnly)) + view()->buffer()->markDirty(); + } + sendDispatchMessage(getMessage(), ev, verbose); } @@ -1750,44 +1786,23 @@ void LyXFunc::open(string const & fname) // if the file doesn't exist, let the user create one FileInfo const f(filename, true); if (!f.exist()) { - if (!Alert::askQuestion(_("No such file"), disp_fn, - _("Start a new document with this filename ?"))) { - owner->message(_("Canceled.")); - return; - } // the user specifically chose this name. Believe them. Buffer * buffer = bufferlist.newFile(filename, "", true); view()->buffer(buffer); return; } - ostringstream str; -#if USE_BOOST_FORMAT - str << boost::format(_("Opening document %1$s...")) % disp_fn; -#else - str << _("Opening document ") << disp_fn << _("..."); -#endif - - owner->message(STRCONV(str.str())); + owner->message(bformat(_("Opening document %1$s..."), disp_fn)); Buffer * openbuf = bufferlist.loadLyXFile(filename); - ostringstream str2; + string str2; if (openbuf) { view()->buffer(openbuf); -#if USE_BOOST_FORMAT - str2 << boost::format(_("Document %1$s opened.")) % disp_fn; -#else - str2 << _("Document ") << disp_fn << _(" opened."); -#endif + str2 = bformat(_("Document %1$s opened."), disp_fn); } else { -#if USE_BOOST_FORMAT - str2 << boost::format(_("Could not open document %1$s")) - % disp_fn; -#else - str2 << _("Could not open document ") << disp_fn; -#endif + str2 = bformat(_("Could not open document %1$s"), disp_fn); } - owner->message(STRCONV(str2.str())); + owner->message(str2); } @@ -1810,14 +1825,8 @@ void LyXFunc::doImport(string const & argument) initpath = trypath; } -#if USE_BOOST_FORMAT - boost::format fmt(_("Select %1$s file to import")); - fmt % formats.prettyName(format); - string const text = fmt.str(); -#else - string const text = _("Select ") + formats.prettyName(format) - + _(" file to import");; -#endif + string const text = bformat(_("Select %1$s file to import"), + formats.prettyName(format)); FileDialog fileDlg(text, LFUN_IMPORT, @@ -1852,31 +1861,24 @@ void LyXFunc::doImport(string const & argument) string const lyxfile = ChangeExtension(filename, ".lyx"); // Check if the document already is open - if (lyxrc.use_gui && bufferlist.exists(lyxfile)) { - switch (Alert::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)"))) - { - case 1: - // If close is canceled, we cancel here too. - if (!bufferlist.close(bufferlist.getBuffer(lyxfile))) - return; - break; - case 2: - view()->buffer(bufferlist.getBuffer(lyxfile)); - return; - case 3: - owner->message(_("Canceled.")); - return; - } + if (lyx_gui::use_gui && bufferlist.exists(lyxfile)) { + if (!bufferlist.close(bufferlist.getBuffer(lyxfile), true)) { + owner->message(_("Canceled.")); + return; + } } // if the file exists already, and we didn't do // -i lyx thefile.lyx, warn if (FileInfo(lyxfile, true).exist() && filename != lyxfile) { - if (!Alert::askQuestion(_("A document by the name"), - MakeDisplayPath(lyxfile), _("already exists. Overwrite?"))) { + string const file = MakeDisplayPath(lyxfile, 30); + + string text = bformat(_("The document %1$s already exists.\n\n" + "Do you want to over-write that document?"), file); + int const ret = Alert::prompt(_("Over-write document?"), + text, 0, 1, _("&Over-write"), _("&Cancel")); + + if (ret == 1) { owner->message(_("Canceled.")); return; } @@ -1888,7 +1890,7 @@ void LyXFunc::doImport(string const & argument) void LyXFunc::closeBuffer() { - if (bufferlist.close(owner->buffer()) && !quitting) { + if (bufferlist.close(owner->buffer(), true) && !quitting) { if (bufferlist.empty()) { // need this otherwise SEGV may occur while trying to // set variables that don't exist