X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=56a79f8ab69411f947b543d983fbac3ece7bace4;hb=37e82a546392d43f787826b85481a11f2a27af15;hp=f4fac34f66115f3050800e2d55a387f41d6c6c73;hpb=6b89c145fdec2bf224e0bd8c56b3a55dfd5adf22;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index f4fac34f66..56a79f8ab6 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -78,10 +78,10 @@ #include "frontends/Menubar.h" #include "frontends/Toolbars.h" +#include "support/filefilterlist.h" #include "support/FileInfo.h" #include "support/filetools.h" #include "support/forkedcontr.h" -#include "support/globbing.h" #include "support/lstrings.h" #include "support/path.h" #include "support/path_defines.h" @@ -272,11 +272,21 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const { //lyxerr << "LyXFunc::getStatus: cmd: " << cmd << endl; FuncStatus flag; - Buffer * buf = owner->buffer(); LCursor & cur = view()->cursor(); + /* In LyX/Mac, when a dialog is open, the menus of the + application can still be accessed without giving focus to + the main window. In this case, we want to disable the menu + entries that are buffer-related. + */ + Buffer * buf; + if (cmd.origin == FuncRequest::UI && !owner->hasFocus()) + buf = 0; + else + buf = owner->buffer(); + if (cmd.action == LFUN_NOACTION) { - setStatusMessage(N_("Nothing to do")); + flag.message(N_("Nothing to do")); flag.enabled(false); return flag; } @@ -294,19 +304,19 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const } if (flag.unknown()) { - setStatusMessage(N_("Unknown action")); + flag.message(N_("Unknown action")); return flag; } // the default error message if we disable the command - setStatusMessage(N_("Command disabled")); + flag.message(N_("Command disabled")); if (!flag.enabled()) return flag; // Check whether we need a buffer if (!lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer) && !buf) { // no, exit directly - setStatusMessage(N_("Command not allowed with" + flag.message(N_("Command not allowed with" "out any document open")); flag.enabled(false); return flag; @@ -386,27 +396,27 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const if (!inset) break; - InsetOld::Code code = inset->lyxCode(); + InsetBase::Code code = inset->lyxCode(); switch (code) { - case InsetOld::TABULAR_CODE: + case InsetBase::TABULAR_CODE: enable = cmd.argument == "tabular"; break; - case InsetOld::ERT_CODE: + case InsetBase::ERT_CODE: enable = cmd.argument == "ert"; break; - case InsetOld::FLOAT_CODE: + case InsetBase::FLOAT_CODE: enable = cmd.argument == "float"; break; - case InsetOld::WRAP_CODE: + case InsetBase::WRAP_CODE: enable = cmd.argument == "wrap"; break; - case InsetOld::NOTE_CODE: + case InsetBase::NOTE_CODE: enable = cmd.argument == "note"; break; - case InsetOld::BRANCH_CODE: + case InsetBase::BRANCH_CODE: enable = cmd.argument == "branch"; break; - case InsetOld::BOX_CODE: + case InsetBase::BOX_CODE: enable = cmd.argument == "box"; break; default: @@ -427,7 +437,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const enable = Exporter::IsExportable(*buf, "dvi") && lyxrc.print_command != "none"; else if (name == "character") - enable = cur.inset().lyxCode() != InsetOld::ERT_CODE; + enable = cur.inset().lyxCode() != InsetBase::ERT_CODE; else if (name == "vclog") enable = buf->lyxvc().inUse(); else if (name == "latexlog") @@ -447,7 +457,9 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_SEQUENCE: { // argument contains ';'-terminated commands string const firstcmd = token(cmd.argument, ';', 0); - flag = getStatus(lyxaction.lookupFunc(firstcmd)); + FuncRequest func(lyxaction.lookupFunc(firstcmd)); + func.origin = cmd.origin; + flag = getStatus(func); } case LFUN_MENUNEW: @@ -503,13 +515,14 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_SAVE_AS_DEFAULT: case LFUN_BUFFERPARAMS_APPLY: case LFUN_LYXRC_APPLY: + case LFUN_NEXTBUFFER: + case LFUN_PREVIOUSBUFFER: // these are handled in our dispatch() break; default: - cur.getStatus(cmd, flag); - if (!flag.enabled()) + if (!cur.getStatus(cmd, flag)) flag = view()->getStatus(cmd); } @@ -520,7 +533,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const if (buf && buf->isReadonly() && !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly) && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)) { - setStatusMessage(N_("Document is read-only")); + flag.message(N_("Document is read-only")); flag.enabled(false); } @@ -586,8 +599,9 @@ void loadTextclass(string const & name) } //namespace anon -void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) +void LyXFunc::dispatch(FuncRequest const & cmd) { + BOOST_ASSERT(view()); string const argument = cmd.argument; kb_action const action = cmd.action; @@ -601,14 +615,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) bool update = true; - // We cannot use this function here - if (!getStatus(cmd).enabled()) { + FuncStatus const flag = getStatus(cmd); + if (!flag.enabled()) { + // We cannot use this function here lyxerr[Debug::ACTION] << "LyXFunc::dispatch: " << lyxaction.getActionName(action) << " [" << action << "] is disabled at this location" << endl; - setErrorMessage(getStatusMessage()); - + setErrorMessage(flag.message()); } else { if (view()->available()) @@ -958,6 +972,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) view()->setBuffer(bufferlist.getBuffer(argument)); break; + case LFUN_NEXTBUFFER: + view()->setBuffer(bufferlist.next(view()->buffer())); + break; + + case LFUN_PREVIOUSBUFFER: + view()->setBuffer(bufferlist.previous(view()->buffer())); + break; + case LFUN_FILE_NEW: NewFile(view(), argument); break; @@ -1209,7 +1231,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) while (!arg.empty()) { string first; arg = split(arg, first, ';'); - dispatch(lyxaction.lookupFunc(first)); + FuncRequest func(lyxaction.lookupFunc(first)); + func.origin = cmd.origin; + dispatch(func); } break; } @@ -1334,7 +1358,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) << (unknown_tokens == 1 ? "" : "s") << endl; } - + if (defaults.writeFile(defaults.fileName())) setMessage(_("Document defaults saved in ") + MakeDisplayPath(fname)); @@ -1427,14 +1451,16 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) update |= view()->cursor().result().update(); else update |= view()->dispatch(cmd); - break; } } if (view()->available()) { - if (view()->fitCursor() || update) - view()->update(); + // Redraw screen unless explicitly told otherwise. + // This also initializes the position cache for all insets + // in (at least partially) visible top-level paragraphs. + view()->update(true, update); + // if we executed a mutating lfun, mark the buffer as dirty if (getStatus(cmd).enabled() && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer) @@ -1444,18 +1470,20 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) if (view()->cursor().inTexted()) { view()->owner()->updateLayoutChoice(); - sendDispatchMessage(getMessage(), cmd, verbose); } } + sendDispatchMessage(getMessage(), cmd); } -void LyXFunc::sendDispatchMessage(string const & msg, - FuncRequest const & cmd, bool verbose) +void LyXFunc::sendDispatchMessage(string const & msg, FuncRequest const & cmd) { owner->updateMenubar(); owner->updateToolbars(); + const bool verbose = (cmd.origin == FuncRequest::UI + || cmd.origin == FuncRequest::COMMANDBUFFER); + if (cmd.action == LFUN_SELFINSERT || !verbose) { lyxerr[Debug::ACTION] << "dispatch msg is " << msg << endl; if (!msg.empty()) @@ -1744,12 +1772,6 @@ void LyXFunc::setMessage(string const & m) const } -void LyXFunc::setStatusMessage(string const & m) const -{ - status_buffer = m; -} - - string const LyXFunc::viewStatusMessage() { // When meta-fake key is pressed, show the key sequence so far + "M-".