X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=bf551cd8b55ba52548abb52d28b459770eb39c6b;hb=c1e009f2d3baa65a05345224ae14f1fe521b8199;hp=2f9023a3cd6427a143ce63353a4f8802cda84fdc;hpb=dcdbeb3b3475d803c0c66e463dca64db0103c10d;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 2f9023a3cd..bf551cd8b5 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -10,15 +10,12 @@ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "lyxfunc.h" #include "version.h" #include "kbmap.h" #include "lyxrow.h" #include "bufferlist.h" +#include "buffer.h" #include "BufferView.h" #include "lyxserver.h" #include "intl.h" @@ -38,7 +35,7 @@ #include "frontends/lyx_gui.h" #include "vspace.h" #include "FloatList.h" -#include "converter.h" +#include "format.h" #include "exporter.h" #include "importer.h" #include "TextCache.h" @@ -47,6 +44,7 @@ #include "ParagraphParameters.h" #include "insets/insetcommand.h" +#include "insets/insetexternal.h" #include "insets/insettabular.h" #include "mathed/formulamacro.h" @@ -67,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 @@ -87,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; @@ -123,12 +121,11 @@ inline void LyXFunc::moveCursorUpdate(bool flag, bool selecting) { if (selecting || TEXT(flag)->selection.mark()) { - TEXT(flag)->setSelection(view()); - if (TEXT(flag)->bv_owner) + 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(); } @@ -148,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; } @@ -221,7 +217,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, owner->message(keyseq.print()); } - + // Maybe user can only reach the key via holding down shift. // Let's see. But only if shift is the only modifier if (action == LFUN_UNKNOWN_ACTION && state == key_modifier::shift) { @@ -229,7 +225,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, action = keyseq.addkey(keysym, key_modifier::none); lyxerr[Debug::KEY] << "Action now " << action << endl; } - + if (action == LFUN_UNKNOWN_ACTION) { // Hmm, we didn't match any of the keysequences. See // if it's normal insertable text not already covered @@ -286,7 +282,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const default: flag |= lyx_gui::getStatus(ev); } - + if (flag.unknown()) { setStatusMessage(N_("Unknown action")); return flag; @@ -327,7 +323,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const || lyxrc.print_command == "none"; break; case LFUN_EXPORT: - disable = !Exporter::IsExportable(buf, ev.argument); + disable = ev.argument != "custom" + && !Exporter::IsExportable(buf, ev.argument); break; case LFUN_UNDO: disable = buf->undostack.empty(); @@ -350,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"); @@ -366,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(); @@ -425,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; @@ -457,10 +466,20 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const case LFUN_VC_HISTORY: disable = !buf->lyxvc.inUse(); break; + case LFUN_MENURELOAD: + disable = buf->isUnnamed() || buf->isClean(); + break; case LFUN_BOOKMARK_GOTO: disable = !view()-> isSavedPosition(strToUnsignedInt(ev.argument)); break; + case LFUN_MERGE_CHANGES: + case LFUN_ACCEPT_CHANGE: + case LFUN_REJECT_CHANGE: + case LFUN_ACCEPT_ALL_CHANGES: + case LFUN_REJECT_ALL_CHANGES: + disable = !buf->params.tracking_changes; + break; case LFUN_INSET_TOGGLE: { LyXText * lt = view()->getLyXText(); disable = !(isEditableInset(lt->getInset()) @@ -469,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; @@ -498,21 +556,48 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const // the functions which insert insets Inset::Code code = Inset::NO_CODE; switch (ev.action) { + case LFUN_DIALOG_SHOW_NEW_INSET: + if (ev.argument == "bibitem") + code = Inset::BIBITEM_CODE; + else if (ev.argument == "bibtex") + code = Inset::BIBTEX_CODE; + else if (ev.argument == "citation") + code = Inset::CITE_CODE; + else if (ev.argument == "ert") + code = Inset::ERT_CODE; + else if (ev.argument == "external") + code = Inset::EXTERNAL_CODE; + else if (ev.argument == "float") + code = Inset::FLOAT_CODE; + else if (ev.argument == "graphics") + code = Inset::GRAPHICS_CODE; + else if (ev.argument == "include") + code = Inset::INCLUDE_CODE; + else if (ev.argument == "index") + code = Inset::INDEX_CODE; + else if (ev.argument == "label") + code = Inset::LABEL_CODE; + else if (ev.argument == "minipage") + code = Inset::MINIPAGE_CODE; + else if (ev.argument == "ref") + code = Inset::REF_CODE; + else if (ev.argument == "toc") + code = Inset::TOC_CODE; + else if (ev.argument == "url") + code = Inset::URL_CODE; + else if (ev.argument == "wrap") + code = Inset::WRAP_CODE; + break; + case LFUN_INSET_ERT: code = Inset::ERT_CODE; break; - case LFUN_INSET_GRAPHICS: - code = Inset::GRAPHICS_CODE; - break; case LFUN_INSET_FOOTNOTE: code = Inset::FOOT_CODE; break; case LFUN_TABULAR_INSERT: code = Inset::TABULAR_CODE; break; - case LFUN_INSET_EXTERNAL: - code = Inset::EXTERNAL_CODE; - break; case LFUN_INSET_MARGINAL: code = Inset::MARGIN_CODE; break; @@ -549,15 +634,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const case LFUN_INSET_OPTARG: code = Inset::OPTARG_CODE; break; - case LFUN_REF_INSERT: - code = Inset::REF_CODE; - break; - case LFUN_CITATION_CREATE: - case LFUN_CITATION_INSERT: - code = Inset::CITE_CODE; - break; - case LFUN_INSERT_BIBTEX: - code = Inset::BIBTEX_CODE; + case LFUN_ENVIRONMENT_INSERT: + code = Inset::MINIPAGE_CODE; break; case LFUN_INDEX_INSERT: code = Inset::INDEX_CODE; @@ -565,18 +643,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const case LFUN_INDEX_PRINT: code = Inset::INDEX_PRINT_CODE; break; - case LFUN_CHILD_INSERT: - code = Inset::INCLUDE_CODE; - break; case LFUN_TOC_INSERT: code = Inset::TOC_CODE; break; - case LFUN_PARENTINSERT: - code = Inset::PARENT_CODE; - break; case LFUN_HTMLURL: case LFUN_URL: - case LFUN_INSERT_URL: code = Inset::URL_CODE; break; case LFUN_QUOTE: @@ -591,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; @@ -623,6 +694,9 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const if (ev.argument == buf->fileName()) flag.setOnOff(true); break; + case LFUN_TRACK_CHANGES: + flag.setOnOff(buf->params.tracking_changes); + break; default: break; } @@ -697,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; } @@ -738,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; @@ -754,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) && @@ -769,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(); @@ -779,25 +858,26 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) } else if (((result=inset-> // Hand-over to inset's own dispatch: localDispatch(FuncRequest(view(), action, argument))) == - UpdatableInset::DISPATCHED) || - (result == UpdatableInset::DISPATCHED_NOUPDATE)) + DISPATCHED) || + (result == DISPATCHED_NOUPDATE)) goto exit_with_message; // If UNDISPATCHED, just soldier on - else if (result == UpdatableInset::FINISHED) { + 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 // one position after the inset. - } else if (result == UpdatableInset::FINISHED_RIGHT) { + } else if (result == FINISHED_RIGHT) { TEXT()->cursorRight(view()); moveCursorUpdate(true, false); - owner->view_state_changed(); + owner->clearMessage(); goto exit_with_message; - } else if (result == UpdatableInset::FINISHED_UP) { - if (TEXT()->cursor.irow()->previous()) { + } else if (result == FINISHED_UP) { + 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()); @@ -805,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 == UpdatableInset::FINISHED_DOWN) { - if (TEXT()->cursor.irow()->next()) { + } else if (result == FINISHED_DOWN) { + 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); @@ -826,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) @@ -855,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()); @@ -892,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; @@ -913,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()); } @@ -976,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: - reloadBuffer(); + 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); @@ -1014,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: @@ -1037,27 +1115,10 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) break; case LFUN_TOCVIEW: -#if 0 - case LFUN_LOFVIEW: - case LFUN_LOTVIEW: - case LFUN_LOAVIEW: -#endif { - InsetCommandParams p; - -#if 0 - if (action == LFUN_TOCVIEW) -#endif - p.setCmdName("tableofcontents"); -#if 0 - else if (action == LFUN_LOAVIEW) - p.setCmdName("listof{algorithm}{List of Algorithms}"); - else if (action == LFUN_LOFVIEW) - p.setCmdName("listoffigures"); - else - p.setCmdName("listoftables"); -#endif - owner->getDialogs().createTOC(p.getAsString()); + InsetCommandParams p("tableofcontents"); + string const data = InsetCommandMailer::params2string("toc", p); + owner->getDialogs().show("toc", data, 0); break; } @@ -1077,24 +1138,22 @@ 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; - case LFUN_FREE: - owner->getDialogs().setUserFreeFont(); + case LFUN_FREEFONT_UPDATE: + update_and_apply_freefont(view(), argument); break; case LFUN_RECONFIGURE: @@ -1118,7 +1177,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) #endif #endif case LFUN_HELP_ABOUTLYX: - owner->getDialogs().showAboutlyx(); + owner->getDialogs().show("about"); break; case LFUN_HELP_TEXINFO: @@ -1132,25 +1191,15 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) setErrorMessage(N_("Missing argument")); break; } - owner->prohibitInput(); string const fname = i18nLibFileSearch("doc", arg, "lyx"); if (fname.empty()) { lyxerr << "LyX: unable to find documentation file `" << arg << "'. Bad installation?" << endl; - owner->allowInput(); 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)); - owner->allowInput(); break; } @@ -1192,7 +1241,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) case LFUN_VC_HISTORY: { - owner->getDialogs().showVCLogFile(); + owner->getDialogs().show("vclog"); break; } @@ -1216,20 +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(); - break; - - case LFUN_LAYOUT_CHARACTER: - owner->getDialogs().showCharacter(); + case LFUN_LAYOUT_CHARACTER: { + string data = freefont2string(); + if (!data.empty()) + owner->getDialogs().show("character", data); break; + } case LFUN_LAYOUT_TABULAR: if (view()->theLockingInset()) { @@ -1309,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; @@ -1322,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(); @@ -1335,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. @@ -1367,27 +1408,52 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) owner->getDialogs().showMathPanel(); break; - case LFUN_CITATION_CREATE: - { - InsetCommandParams p("cite"); + case LFUN_DIALOG_SHOW_NEW_INSET: { + string const & name = argument; + string data; + if (name == "bibitem" || + name == "bibtex" || + name == "include" || + name == "index" || + name == "ref" || + name == "toc" || + name == "url") { + InsetCommandParams p(name); + data = InsetCommandMailer::params2string(name, p); + } else if (name == "citation") { + InsetCommandParams p("cite"); + data = InsetCommandMailer::params2string(name, p); + } + owner->getDialogs().show(name, data, 0); + } + break; - 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(FuncRequest(view(), LFUN_CITATION_INSERT, p.getAsString())); - } else - owner->getDialogs().createCitation(p.getAsString()); + case LFUN_DIALOG_SHOW_NEXT_INSET: { + } + break; + + case LFUN_DIALOG_UPDATE: { + string const & name = argument; + // Can only update a dialog connected to an existing inset + InsetBase * inset = owner->getDialogs().getOpenInset(name); + if (inset) { + FuncRequest fr(view(), LFUN_INSET_DIALOG_UPDATE, + ev.argument); + inset->localDispatch(fr); + } else if (name == "paragraph") { + dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); + } } break; + case LFUN_DIALOG_HIDE: + Dialogs::hide(argument, 0); + break; + + case LFUN_DIALOG_DISCONNECT_INSET: + owner->getDialogs().disconnect(argument); + break; + case LFUN_CHILDOPEN: { string const filename = @@ -1477,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; } @@ -1533,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: @@ -1544,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); } @@ -1637,7 +1711,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate) // The template stuff string templname; if (fromTemplate) { - FileDialog fileDlg(owner, _("Select template file"), + FileDialog fileDlg(_("Select template file"), LFUN_SELECT_FILE_SYNC, make_pair(string(_("Documents|#o#O")), string(lyxrc.document_path)), @@ -1646,7 +1720,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate) FileDialog::Result result = fileDlg.open(lyxrc.template_path, - _("*.lyx|LyX Documents (*.lyx)")); + _("*.lyx| LyX Documents (*.lyx)")); if (result.first == FileDialog::Later) return; @@ -1676,7 +1750,7 @@ void LyXFunc::open(string const & fname) string filename; if (fname.empty()) { - FileDialog fileDlg(owner, _("Select document to open"), + FileDialog fileDlg(_("Select document to open"), LFUN_FILE_OPEN, make_pair(string(_("Documents|#o#O")), string(lyxrc.document_path)), @@ -1685,7 +1759,7 @@ void LyXFunc::open(string const & fname) FileDialog::Result result = fileDlg.open(initpath, - "*.lyx|LyX Documents (*.lyx)"); + _("*.lyx| LyX Documents (*.lyx)")); if (result.first == FileDialog::Later) return; @@ -1712,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); } @@ -1772,16 +1825,10 @@ 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(owner, text, + FileDialog fileDlg(text, LFUN_IMPORT, make_pair(string(_("Documents|#o#O")), string(lyxrc.document_path)), @@ -1814,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; } @@ -1848,17 +1888,9 @@ void LyXFunc::doImport(string const & argument) } -void LyXFunc::reloadBuffer() -{ - string const fn = owner->buffer()->fileName(); - if (bufferlist.close(owner->buffer())) - view()->buffer(bufferlist.loadLyXFile(fn)); -} - - 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