X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=bf551cd8b55ba52548abb52d28b459770eb39c6b;hb=a9713c5563c924f4ab98bde3d9f24a5c1e4dd50e;hp=85eaa63d5c6eaa9288889b2631005040622202e2;hpb=774dabb32347b6dc2c1abbc202960f4f6f366db3;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 85eaa63d5c..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" @@ -31,13 +28,14 @@ #include "gettext.h" #include "Lsstream.h" #include "trans_mgr.h" +#include "encoding.h" #include "layout.h" #include "bufferview_funcs.h" #include "frontends/LyXView.h" #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" @@ -46,6 +44,7 @@ #include "ParagraphParameters.h" #include "insets/insetcommand.h" +#include "insets/insetexternal.h" #include "insets/insettabular.h" #include "mathed/formulamacro.h" @@ -66,6 +65,7 @@ #include "support/FileInfo.h" #include "support/forkedcontr.h" #include "support/lstrings.h" +#include "support/tostr.h" #include "support/path.h" #include "support/lyxfunctional.h" @@ -84,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; @@ -99,6 +100,7 @@ extern void ShowLatexLog(); LyXFunc::LyXFunc(LyXView * o) : owner(o), + encoded_last_key(0), keyseq(toplevel_keymap.get(), toplevel_keymap.get()), cancel_meta_seq(toplevel_keymap.get(), toplevel_keymap.get()), meta_fake_bit(key_modifier::none) @@ -119,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(); } @@ -132,9 +133,9 @@ void LyXFunc::moveCursorUpdate(bool flag, bool selecting) void LyXFunc::handleKeyFunc(kb_action action) { - char c = keyseq.getLastKeyEncoded(); + char c = encoded_last_key; - if (keyseq.length() > 1) { + if (keyseq.length()) { c = 0; } @@ -144,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; } @@ -160,7 +160,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, << keysym->getSymbolName() << endl; } - + // Do nothing if we have nothing (JMarc) if (!keysym->isOK()) { lyxerr[Debug::KEY] << "Empty kbd action (probably composing)" @@ -169,15 +169,20 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, } if (keysym->isModifier()) { + lyxerr[Debug::KEY] << "isModifier true" << endl; return; } + Encoding const * encoding = view()->getEncoding(); + + encoded_last_key = keysym->getISOEncoded(encoding ? encoding->Name() : ""); + // 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, state); - lyxerr[Debug::KEY] << "action first set to [" << action << "]" << endl; + lyxerr[Debug::KEY] << "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. @@ -186,7 +191,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, // remove Caps Lock and Mod2 as a modifiers action = keyseq.addkey(keysym, (state | meta_fake_bit)); lyxerr[Debug::KEY] << "action now set to [" - << action << "]" << endl; + << action << ']' << endl; } // Dont remove this unless you know what you are doing. @@ -200,7 +205,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, if (lyxerr.debugging(Debug::KEY)) { lyxerr << "Key [action=" << action << "][" - << keyseq.print() << "]" + << keyseq.print() << ']' << endl; } @@ -212,31 +217,39 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, owner->message(keyseq.print()); } - if (action == LFUN_UNKNOWN_ACTION) { - // It is unknown, but what if we remove all - // the modifiers? (Lgb) - action = keyseq.addkey(keysym, key_modifier::none); - lyxerr[Debug::KEY] << "Removing modifiers...\n" - << "Action now set to [" - << action << "]" << endl; + // 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) { + lyxerr[Debug::KEY] << "Trying without shift" << endl; + action = keyseq.addkey(keysym, key_modifier::none); + lyxerr[Debug::KEY] << "Action now " << action << endl; + } - if (action == LFUN_UNKNOWN_ACTION) { + if (action == LFUN_UNKNOWN_ACTION) { + // Hmm, we didn't match any of the keysequences. See + // if it's normal insertable text not already covered + // by a binding + if (keysym->isText() && keyseq.length() == 1) { + lyxerr[Debug::KEY] << "isText() is true, inserting." << endl; + action = LFUN_SELFINSERT; + } else { + lyxerr[Debug::KEY] << "Unknown, !isText() - giving up" << endl; owner->message(_("Unknown function.")); return; } } if (action == LFUN_SELFINSERT) { - char c = keysym->getISOEncoded(); - string argument; + if (encoded_last_key != 0) { + string arg; + arg += encoded_last_key; - if (c != 0) - argument = c; + dispatch(FuncRequest(view(), LFUN_SELFINSERT, arg)); - dispatch(FuncRequest(view(), LFUN_SELFINSERT, argument)); - lyxerr[Debug::KEY] << "SelfInsert arg[`" + lyxerr[Debug::KEY] << "SelfInsert arg[`" << argument << "']" << endl; + } } else { dispatch(action); } @@ -259,9 +272,20 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const return flag.disabled(true); } - if (ev.action == LFUN_UNKNOWN_ACTION) { + switch (ev.action) { + case LFUN_UNKNOWN_ACTION: +#ifndef HAVE_LIBAIKSAURUS + case LFUN_THESAURUS_ENTRY: +#endif + flag.unknown(true); + break; + default: + flag |= lyx_gui::getStatus(ev); + } + + if (flag.unknown()) { setStatusMessage(N_("Unknown action")); - return flag.unknown(true); + return flag; } // the default error message if we disable the command @@ -299,8 +323,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const || lyxrc.print_command == "none"; break; case LFUN_EXPORT: - disable = ev.argument == "fax" && - !Exporter::IsExportable(buf, ev.argument); + disable = ev.argument != "custom" + && !Exporter::IsExportable(buf, ev.argument); break; case LFUN_UNDO: disable = buf->undostack.empty(); @@ -310,22 +334,20 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const break; case LFUN_CUT: case LFUN_COPY: - if (tli && tli->lyxCode() == Inset::TABULAR_CODE) { - InsetTabular * t(static_cast(tli)); - if (t->hasSelection()) { + if (tli) { + UpdatableInset * in = tli; + if (in->lyxCode() != Inset::TABULAR_CODE) { + in = tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE); + } + if (in && static_cast(in)->hasSelection()) { disable = false; break; } } disable = !mathcursor && !view()->getLyXText()->selection.set(); break; -#ifndef HAVE_LIBAIKSAURUS - case LFUN_THESAURUS_ENTRY: - disable = true; - break; -#endif case LFUN_RUNCHKTEX: - disable = lyxrc.chktex_command == "none"; + disable = !buf->isLatex() || lyxrc.chktex_command == "none"; break; case LFUN_BUILDPROG: disable = !Exporter::IsExportable(buf, "program"); @@ -341,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(); @@ -400,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; @@ -432,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()) @@ -444,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; @@ -473,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; @@ -524,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; @@ -540,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: @@ -566,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; @@ -598,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; } @@ -672,9 +771,7 @@ void LyXFunc::dispatch(string const & s, bool verbose) int const action = lyxaction.LookupFunc(s); if (action == LFUN_UNKNOWN_ACTION) { - string const msg = string(_("Unknown function (")) - + s + ")"; - owner->message(msg); + owner->message(bformat(_("Unknown function (%1$s)"), s)); return; } @@ -692,7 +789,7 @@ void LyXFunc::dispatch(int ac, bool verbose) void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) { lyxerr[Debug::ACTION] << "LyXFunc::dispatch: action[" << ev.action - <<"] arg[" << ev.argument << "]" << endl; + <<"] arg[" << ev.argument << ']' << endl; // we have not done anything wrong yet. errorstat = false; @@ -707,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; @@ -723,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) && @@ -736,8 +833,21 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) #endif if ((action == LFUN_UNKNOWN_ACTION) && argument.empty()) { - argument = keyseq.getLastKeyEncoded(); + 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(); @@ -748,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()); @@ -774,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); @@ -795,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) @@ -824,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()); @@ -861,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; @@ -878,19 +989,17 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) } else { searched_string = last_search; } - bool fw = (action == LFUN_WORDFINDBACKWARD); + bool fw = (action == LFUN_WORDFINDFORWARD); 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()); } @@ -945,24 +1054,30 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) case LFUN_MENUWRITE: if (!owner->buffer()->isUnnamed()) { - ostringstream s1; - s1 << _("Saving document") << ' ' - << MakeDisplayPath(owner->buffer()->fileName() + "..."); - owner->message(s1.str().c_str()); - MenuWrite(view(), owner->buffer()); - s1 << _(" done."); - owner->message(s1.str().c_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); @@ -977,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: @@ -1000,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; } @@ -1040,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_FREE: - owner->getDialogs().setUserFreeFont(); + case LFUN_FREEFONT_APPLY: + apply_freefont(view()); + break; + + case LFUN_FREEFONT_UPDATE: + update_and_apply_freefont(view(), argument); break; case LFUN_RECONFIGURE: @@ -1081,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: @@ -1095,20 +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; - str << _("Opening help file") << ' ' - << MakeDisplayPath(fname) << "..."; - owner->message(str.str().c_str()); + owner->message(bformat(_("Opening help file %1$s..."), + MakeDisplayPath(fname))); view()->buffer(bufferlist.loadLyXFile(fname, false)); - owner->allowInput(); break; } @@ -1150,7 +1241,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) case LFUN_VC_HISTORY: { - owner->getDialogs().showVCLogFile(); + owner->getDialogs().show("vclog"); break; } @@ -1174,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()) { @@ -1267,10 +1357,10 @@ 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; + << id << ']' << endl; break; } else { lyxerr[Debug::INFO] << "Paragraph " << par->id() @@ -1280,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(); @@ -1293,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. @@ -1325,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 = @@ -1435,11 +1543,10 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose) x11_name != lcolor.getX11Name(LColor::graphicsbg)); if (!lcolor.setColor(lyx_name, x11_name)) { - 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)); + setErrorMessage( + bformat(_("Set-color \"%1$s\" failed " + "- color is undefined or " + "may not be redefined"), lyx_name)); break; } @@ -1482,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: @@ -1493,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); } @@ -1511,7 +1636,7 @@ void LyXFunc::sendDispatchMessage(string const & msg, FuncRequest const & ev, bo string dispatch_msg = msg; if (!dispatch_msg.empty()) - dispatch_msg += " "; + dispatch_msg += ' '; string comname = lyxaction.getActionName(ev.action); @@ -1525,7 +1650,7 @@ void LyXFunc::sendDispatchMessage(string const & msg, FuncRequest const & ev, bo if (pseudoaction == LFUN_UNKNOWN_ACTION) { pseudoaction = ev.action; } else { - comname += " " + ev.argument; + comname += ' ' + ev.argument; argsadded = true; } } @@ -1535,12 +1660,12 @@ void LyXFunc::sendDispatchMessage(string const & msg, FuncRequest const & ev, bo if (!shortcuts.empty()) { comname += ": " + shortcuts; } else if (!argsadded && !ev.argument.empty()) { - comname += " " + ev.argument; + comname += ' ' + ev.argument; } if (!comname.empty()) { comname = rtrim(comname); - dispatch_msg += "(" + comname + ')'; + dispatch_msg += '(' + comname + ')'; } lyxerr[Debug::ACTION] << "verbose dispatch msg " << dispatch_msg << endl; @@ -1586,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)), @@ -1594,8 +1719,8 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate) string(lyxrc.template_path))); FileDialog::Result result = - fileDlg.Select(lyxrc.template_path, - _("*.lyx|LyX Documents (*.lyx)")); + fileDlg.open(lyxrc.template_path, + _("*.lyx| LyX Documents (*.lyx)")); if (result.first == FileDialog::Later) return; @@ -1625,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)), @@ -1633,8 +1758,8 @@ void LyXFunc::open(string const & fname) string(AddPath(system_lyxdir, "examples")))); FileDialog::Result result = - fileDlg.Select(initpath, - "*.lyx|LyX Documents (*.lyx)"); + fileDlg.open(initpath, + _("*.lyx| LyX Documents (*.lyx)")); if (result.first == FileDialog::Later) return; @@ -1661,33 +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; - str << _("Opening document") << ' ' << disp_fn << "..."; - - owner->message(str.str().c_str()); + owner->message(bformat(_("Opening document %1$s..."), disp_fn)); Buffer * openbuf = bufferlist.loadLyXFile(filename); + string str2; if (openbuf) { view()->buffer(openbuf); - ostringstream str; - str << _("Document") << ' ' << disp_fn << ' ' << _("opened."); - owner->message(str.str().c_str()); + str2 = bformat(_("Document %1$s opened."), disp_fn); } else { - ostringstream str; - str << _("Could not open document") << ' ' << disp_fn; - owner->message(str.str().c_str()); + str2 = bformat(_("Could not open document %1$s"), disp_fn); } + owner->message(str2); } @@ -1710,10 +1825,10 @@ void LyXFunc::doImport(string const & argument) initpath = trypath; } - string const text = _("Select ") + formats.prettyName(format) - + _(" file to import"); + 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)), @@ -1722,9 +1837,9 @@ void LyXFunc::doImport(string const & argument) string const extension = "*." + formats.extension(format) + "| " + formats.prettyName(format) - + " (*." + formats.extension(format) + ")"; + + " (*." + formats.extension(format) + ')'; - FileDialog::Result result = fileDlg.Select(initpath, + FileDialog::Result result = fileDlg.open(initpath, extension); if (result.first == FileDialog::Later) @@ -1746,32 +1861,25 @@ 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?"))) { - owner->message(_("Canceled")); + 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; } } @@ -1780,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