X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyXFunc.cpp;h=5fb648e05142531e7dd13e86c372a02e6e3c7f01;hb=6a8219c190315a63426e6798290cc3a04dbc0f09;hp=d94fe1b360a6ab57f2ac3f638b89be593da91225;hpb=2c382f2f471023d8a8fd16052e2bbf441a9cb980;p=lyx.git diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index d94fe1b360..5fb648e051 100644 --- a/src/LyXFunc.cpp +++ b/src/LyXFunc.cpp @@ -21,7 +21,7 @@ #include "LyXFunc.h" -#include "BaseClassList.h" +#include "LayoutFile.h" #include "BranchList.h" #include "buffer_funcs.h" #include "Buffer.h" @@ -62,10 +62,11 @@ #include "insets/InsetERT.h" #include "insets/InsetExternal.h" #include "insets/InsetFloat.h" -#include "insets/InsetListings.h" #include "insets/InsetGraphics.h" #include "insets/InsetInclude.h" +#include "insets/InsetListings.h" #include "insets/InsetNote.h" +#include "insets/InsetSpace.h" #include "insets/InsetTabular.h" #include "insets/InsetVSpace.h" #include "insets/InsetWrap.h" @@ -105,10 +106,11 @@ namespace { // This function runs "configure" and then rereads lyx.defaults to // reconfigure the automatic settings. -void reconfigure(LyXView & lv, string const & option) +void reconfigure(LyXView * lv, string const & option) { // emit message signal. - lv.message(_("Running configure...")); + if (lv) + lv->message(_("Running configure...")); // Run configure in user lyx directory PathChanger p(package().user_support()); @@ -118,7 +120,8 @@ void reconfigure(LyXView & lv, string const & option) int ret = one.startscript(Systemcall::Wait, configure_command); p.pop(); // emit message signal. - lv.message(_("Reloading configuration...")); + if (lv) + lv->message(_("Reloading configuration...")); lyxrc.read(libFileSearch(string(), "lyxrc.defaults")); // Re-read packages.lst LaTeXFeatures::getAvailable(); @@ -150,9 +153,9 @@ bool getLocalStatus(Cursor cursor, FuncRequest const & cmd, FuncStatus & status) bool res = false; for ( ; cursor.depth(); cursor.pop()) { //lyxerr << "\nCursor::getStatus: cmd: " << cmd << endl << *this << endl; - BOOST_ASSERT(cursor.idx() <= cursor.lastidx()); - BOOST_ASSERT(cursor.pit() <= cursor.lastpit()); - BOOST_ASSERT(cursor.pos() <= cursor.lastpos()); + LASSERT(cursor.idx() <= cursor.lastidx(), /**/); + LASSERT(cursor.pit() <= cursor.lastpit(), /**/); + LASSERT(cursor.pos() <= cursor.lastpos(), /**/); // The inset's getStatus() will return 'true' if it made // a definitive decision on whether it want to handle the @@ -214,14 +217,14 @@ void LyXFunc::setLyXView(LyXView * lv) } -void LyXFunc::handleKeyFunc(kb_action action) +void LyXFunc::handleKeyFunc(FuncCode action) { char_type c = encoded_last_key; if (keyseq.length()) c = 0; - BOOST_ASSERT(lyx_view_ && lyx_view_->view()); + LASSERT(lyx_view_ && lyx_view_->view(), /**/); lyx_view_->view()->getIntl().getTransManager().deadkey( c, get_accent(action).accent, view()->cursor().innerText(), view()->cursor()); // Need to clear, in case the minibuffer calls these @@ -236,25 +239,25 @@ void LyXFunc::handleKeyFunc(kb_action action) // to GuiView and be GuiView and be window dependent. void LyXFunc::gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer) { - BOOST_ASSERT(lyx_view_); - if (!LyX::ref().session().bookmarks().isValid(idx)) + LASSERT(lyx_view_, /**/); + if (!theSession().bookmarks().isValid(idx)) return; - BookmarksSection::Bookmark const & bm = LyX::ref().session().bookmarks().bookmark(idx); - BOOST_ASSERT(!bm.filename.empty()); + BookmarksSection::Bookmark const & bm = theSession().bookmarks().bookmark(idx); + LASSERT(!bm.filename.empty(), /**/); string const file = bm.filename.absFilename(); // if the file is not opened, open it. - if (!theBufferList().exists(file)) { + if (!theBufferList().exists(bm.filename)) { if (openFile) dispatch(FuncRequest(LFUN_FILE_OPEN, file)); else return; } // open may fail, so we need to test it again - if (!theBufferList().exists(file)) + if (!theBufferList().exists(bm.filename)) return; // if the current buffer is not that one, switch to it. - if (lyx_view_->buffer()->absFileName() != file) { + if (lyx_view_->buffer()->fileName() != bm.filename) { if (!switchToBuffer) return; dispatch(FuncRequest(LFUN_BUFFER_SWITCH, file)); @@ -293,7 +296,8 @@ void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state) if (keysym.isModifier()) { LYXERR(Debug::KEY, "isModifier true"); - lyx_view_->restartCursor(); + if (lyx_view_) + lyx_view_->restartCursor(); return; } @@ -367,23 +371,12 @@ void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state) dispatch(FuncRequest(LFUN_SELF_INSERT, arg, FuncRequest::KEYBOARD)); LYXERR(Debug::KEY, "SelfInsert arg[`" << to_utf8(arg) << "']"); - lyx_view_->updateCompletion(true, true); } } else { dispatch(func); if (!lyx_view_) return; - if (func.action == LFUN_CHAR_DELETE_BACKWARD) - // backspace is not a self-insertion. But it - // still should not hide the completion popup. - // FIXME: more clever way to detect those movements - lyx_view_->updateCompletion(false, true); - else - lyx_view_->updateCompletion(false, false); } - - if (lyx_view_) - lyx_view_->restartCursor(); } @@ -392,11 +385,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const //lyxerr << "LyXFunc::getStatus: cmd: " << cmd << endl; FuncStatus flag; - Buffer * buf = lyx_view_? lyx_view_->buffer() : 0; + Buffer * buf = lyx_view_ ? lyx_view_->buffer() : 0; if (cmd.action == LFUN_NOACTION) { flag.message(from_utf8(N_("Nothing to do"))); - flag.enabled(false); + flag.setEnabled(false); return flag; } @@ -406,7 +399,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_THESAURUS_ENTRY: #endif flag.unknown(true); - flag.enabled(false); + flag.setEnabled(false); break; default: @@ -429,7 +422,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const // no, exit directly flag.message(from_utf8(N_("Command not allowed with" "out any document open"))); - flag.enabled(false); + flag.setEnabled(false); return flag; } @@ -440,40 +433,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const bool enable = true; switch (cmd.action) { - // FIXME: these cases should be hidden in GuiApplication::getStatus(). - case LFUN_WINDOW_CLOSE: - if (theApp()) - return theApp()->getStatus(cmd); - enable = false; - break; - - // FIXME: these cases should be hidden in GuiView::getStatus(). - case LFUN_DIALOG_TOGGLE: - case LFUN_DIALOG_SHOW: - case LFUN_DIALOG_UPDATE: - if (cmd.argument() == "prefs" - || cmd.argument() == "aboutlyx") - enable = true; - else if (lyx_view_) - return lyx_view_->getStatus(cmd); - else - enable = false; - break; - - case LFUN_TOOLBAR_TOGGLE: - case LFUN_INSET_APPLY: - case LFUN_BUFFER_WRITE: - case LFUN_BUFFER_WRITE_AS: - case LFUN_SPLIT_VIEW: - case LFUN_CLOSE_TAB_GROUP: - case LFUN_COMPLETION_POPUP: - case LFUN_COMPLETION_INLINE: - case LFUN_COMPLETION_COMPLETE: - if (lyx_view_) - return lyx_view_->getStatus(cmd); - enable = false; - break; - case LFUN_BUFFER_TOGGLE_READ_ONLY: flag.setOnOff(buf->isReadonly()); break; @@ -499,18 +458,20 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const break; case LFUN_VC_REGISTER: - enable = !buf->lyxvc().inUse(); + enable = !buf->lyxvc().inUse() && !buf->isUnnamed(); break; case LFUN_VC_CHECK_IN: - enable = buf->lyxvc().inUse() && !buf->isReadonly(); + enable = buf->lyxvc().checkInEnabled(); break; case LFUN_VC_CHECK_OUT: - enable = buf->lyxvc().inUse() && buf->isReadonly(); + enable = buf->lyxvc().checkOutEnabled(); break; case LFUN_VC_REVERT: - case LFUN_VC_UNDO_LAST: enable = buf->lyxvc().inUse(); break; + case LFUN_VC_UNDO_LAST: + enable = buf->lyxvc().undoLastEnabled(); + break; case LFUN_BUFFER_RELOAD: enable = !buf->isUnnamed() && buf->fileName().exists() && (!buf->isClean() || buf->isExternallyModified(Buffer::timestamp_method)); @@ -527,7 +488,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const /* case LFUN_BUFFER_WRITE: case LFUN_BUFFER_WRITE_AS: { - Buffer * b = theBufferList().getBuffer(cmd.getArg(0)); + Buffer * b = theBufferList().getBuffer(FileName(cmd.getArg(0))); enable = b && (b->isUnnamed() || !b->isClean()); break; } @@ -553,12 +514,12 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_BOOKMARK_GOTO: { const unsigned int num = convert(to_utf8(cmd.argument())); - enable = LyX::ref().session().bookmarks().isValid(num); + enable = theSession().bookmarks().isValid(num); break; } case LFUN_BOOKMARK_CLEAR: - enable = LyX::ref().session().bookmarks().size() > 0; + enable = theSession().bookmarks().size() > 0; break; // this one is difficult to get right. As a half-baked @@ -572,13 +533,30 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const break; } + // we want to check if at least one of these is enabled + case LFUN_COMMAND_ALTERNATIVES: { + // argument contains ';'-terminated commands + string arg = to_utf8(cmd.argument()); + while (!arg.empty()) { + string first; + arg = split(arg, first, ';'); + FuncRequest func(lyxaction.lookupFunc(first)); + func.origin = cmd.origin; + flag = getStatus(func); + // if this one is enabled, the whole thing is + if (flag.enabled()) + break; + } + break; + } + case LFUN_CALL: { FuncRequest func; string name = to_utf8(cmd.argument()); - if (LyX::ref().topLevelCmdDef().lock(name, func)) { + if (theTopLevelCmdDef().lock(name, func)) { func.origin = cmd.origin; flag = getStatus(func); - LyX::ref().topLevelCmdDef().release(name); + theTopLevelCmdDef().release(name); } else { // catch recursion or unknown command definiton // all operations until the recursion or unknown command @@ -588,8 +566,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const break; } - case LFUN_BUFFER_NEW: - case LFUN_BUFFER_NEW_TEMPLATE: case LFUN_WORD_FIND_FORWARD: case LFUN_WORD_FIND_BACKWARD: case LFUN_COMMAND_PREFIX: @@ -605,17 +581,15 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_BUFFER_AUTO_SAVE: case LFUN_RECONFIGURE: case LFUN_HELP_OPEN: - case LFUN_FILE_OPEN: case LFUN_DROP_LAYOUTS_CHOICE: case LFUN_MENU_OPEN: - case LFUN_SERVER_GET_NAME: + case LFUN_SERVER_GET_FILENAME: case LFUN_SERVER_NOTIFY: case LFUN_SERVER_GOTO_FILE_ROW: case LFUN_DIALOG_HIDE: case LFUN_DIALOG_DISCONNECT_INSET: case LFUN_BUFFER_CHILD_OPEN: - case LFUN_UI_TOGGLE: - case LFUN_TOGGLE_CURSOR_FOLLOWS_SCROLLBAR: + case LFUN_CURSOR_FOLLOWS_SCROLLBAR_TOGGLE: case LFUN_KEYMAP_OFF: case LFUN_KEYMAP_PRIMARY: case LFUN_KEYMAP_SECONDARY: @@ -624,12 +598,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_BUFFER_EXPORT_CUSTOM: case LFUN_BUFFER_PRINT: case LFUN_PREFERENCES_SAVE: - case LFUN_SCREEN_FONT_UPDATE: - case LFUN_SET_COLOR: case LFUN_MESSAGE: - case LFUN_EXTERNAL_EDIT: - case LFUN_GRAPHICS_EDIT: - case LFUN_ALL_INSETS_TOGGLE: + case LFUN_INSET_EDIT: case LFUN_BUFFER_LANGUAGE: case LFUN_TEXTCLASS_APPLY: case LFUN_TEXTCLASS_LOAD: @@ -641,12 +611,27 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_LYXRC_APPLY: case LFUN_BUFFER_NEXT: case LFUN_BUFFER_PREVIOUS: - case LFUN_WINDOW_NEW: - case LFUN_LYX_QUIT: // these are handled in our dispatch() break; default: + if (!theApp()) { + enable = false; + break; + } + if (theApp()->getStatus(cmd, flag)) + break; + + // Does the view know something? + if (!lyx_view_) { + enable = false; + break; + } + if (lyx_view_->getStatus(cmd, flag)) + break; + + // If we have a BufferView, try cursor position and + // then the BufferView. if (!view()) { enable = false; break; @@ -656,14 +641,14 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const } if (!enable) - flag.enabled(false); + flag.setEnabled(false); // Can we use a readonly buffer? if (buf && buf->isReadonly() && !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly) && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)) { flag.message(from_utf8(N_("Document is read-only"))); - flag.enabled(false); + flag.setEnabled(false); } // Are we in a DELETED change-tracking region? @@ -672,7 +657,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const && !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly) && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)) { flag.message(from_utf8(N_("This portion of the document is deleted."))); - flag.enabled(false); + flag.setEnabled(false); } // the default error message if we disable the command @@ -715,18 +700,18 @@ void showPrintError(string const & name) } -bool loadTextClass(string const & name, string const & buf_path) +bool loadLayoutFile(string const & name, string const & buf_path) { - if (!BaseClassList::get().haveClass(name)) { + if (!LayoutFileList::get().haveClass(name)) { lyxerr << "Document class \"" << name << "\" does not exist." << endl; return false; } - TextClass const & tc = BaseClassList::get()[name]; + LayoutFile & tc = LayoutFileList::get()[name]; if (!tc.load(buf_path)) { - docstring s = bformat(_("The document class %1$s." + docstring s = bformat(_("The document class %1$s " "could not be loaded."), from_utf8(name)); Alert::error(_("Could not load class"), s); return false; @@ -743,7 +728,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new); void LyXFunc::dispatch(FuncRequest const & cmd) { string const argument = to_utf8(cmd.argument()); - kb_action const action = cmd.action; + FuncCode const action = cmd.action; LYXERR(Debug::ACTION, "\nLyXFunc::dispatch: cmd: " << cmd); //lyxerr << "LyXFunc::dispatch: cmd: " << cmd << endl; @@ -763,12 +748,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd) << lyxaction.getActionName(action) << " [" << action << "] is disabled at this location"); setErrorMessage(flag.message()); + if (lyx_view_) + lyx_view_->restartCursor(); } else { switch (action) { case LFUN_WORD_FIND_FORWARD: case LFUN_WORD_FIND_BACKWARD: { - BOOST_ASSERT(lyx_view_ && lyx_view_->view()); + LASSERT(lyx_view_ && lyx_view_->view(), /**/); static docstring last_search; docstring searched_string; @@ -790,12 +777,12 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_COMMAND_PREFIX: - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); lyx_view_->message(keyseq.printOptions(true)); break; case LFUN_CANCEL: - BOOST_ASSERT(lyx_view_ && lyx_view_->view()); + LASSERT(lyx_view_ && lyx_view_->view(), /**/); keyseq.reset(); meta_fake_bit = NoModifier; if (lyx_view_->buffer()) @@ -810,7 +797,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; case LFUN_BUFFER_TOGGLE_READ_ONLY: { - BOOST_ASSERT(lyx_view_ && lyx_view_->view() && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->view() && lyx_view_->buffer(), /**/); Buffer * buf = lyx_view_->buffer(); if (buf->lyxvc().inUse()) buf->lyxvc().toggleReadOnly(); @@ -820,23 +807,13 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } // --- Menus ----------------------------------------------- - case LFUN_BUFFER_NEW: - lyx_view_->newDocument(argument, false); - updateFlags = Update::None; - break; - - case LFUN_BUFFER_NEW_TEMPLATE: - lyx_view_->newDocument(argument, true); - updateFlags = Update::None; - break; - case LFUN_BUFFER_CLOSE: lyx_view_->closeBuffer(); updateFlags = Update::None; break; case LFUN_BUFFER_RELOAD: { - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); docstring const file = makeDisplayPath(lyx_view_->buffer()->absFileName(), 20); docstring text = bformat(_("Any changes will be lost. Are you sure " "you want to revert to the saved version of the document %1$s?"), file); @@ -849,37 +826,37 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_BUFFER_UPDATE: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); lyx_view_->buffer()->doExport(argument, true); break; case LFUN_BUFFER_VIEW: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); lyx_view_->buffer()->preview(argument); break; case LFUN_MASTER_BUFFER_UPDATE: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer()); + LASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer(), /**/); lyx_view_->buffer()->masterBuffer()->doExport(argument, true); break; case LFUN_MASTER_BUFFER_VIEW: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer()); + LASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer(), /**/); lyx_view_->buffer()->masterBuffer()->preview(argument); break; case LFUN_BUILD_PROGRAM: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); lyx_view_->buffer()->doExport("program", true); break; case LFUN_BUFFER_CHKTEX: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); lyx_view_->buffer()->runChktex(); break; case LFUN_BUFFER_EXPORT: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); if (argument == "custom") dispatch(FuncRequest(LFUN_DIALOG_SHOW, "sendto")); else @@ -887,7 +864,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; case LFUN_BUFFER_EXPORT_CUSTOM: { - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); string format_name; string command = split(argument, format_name, ' '); Format const * format = formats.getFormat(format_name); @@ -929,7 +906,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_BUFFER_PRINT: { - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); // FIXME: cmd.getArg() might fail if one of the arguments // contains double quotes string target = cmd.getArg(0); @@ -1047,13 +1024,12 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; case LFUN_RECONFIGURE: - BOOST_ASSERT(lyx_view_); // argument is any additional parameter to the configure.py command - reconfigure(*lyx_view_, argument); + reconfigure(lyx_view_, argument); break; case LFUN_HELP_OPEN: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); string const arg = argument; if (arg.empty()) { setErrorMessage(from_ascii(N_("Missing argument"))); @@ -1079,8 +1055,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd) // --- version control ------------------------------- case LFUN_VC_REGISTER: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); - if (!ensureBufferClean(view())) + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); + if (!ensureBufferClean(view()) || lyx_view_->buffer()->isUnnamed()) break; if (!lyx_view_->buffer()->lyxvc().inUse()) { lyx_view_->buffer()->lyxvc().registrer(); @@ -1090,42 +1066,41 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; case LFUN_VC_CHECK_IN: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); if (!ensureBufferClean(view())) break; if (lyx_view_->buffer()->lyxvc().inUse() && !lyx_view_->buffer()->isReadonly()) { - lyx_view_->buffer()->lyxvc().checkIn(); + setMessage(from_utf8(lyx_view_->buffer()->lyxvc().checkIn())); reloadBuffer(); } break; case LFUN_VC_CHECK_OUT: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); if (!ensureBufferClean(view())) break; - if (lyx_view_->buffer()->lyxvc().inUse() - && lyx_view_->buffer()->isReadonly()) { - lyx_view_->buffer()->lyxvc().checkOut(); + if (lyx_view_->buffer()->lyxvc().inUse()) { + setMessage(from_utf8(lyx_view_->buffer()->lyxvc().checkOut())); reloadBuffer(); } break; case LFUN_VC_REVERT: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); lyx_view_->buffer()->lyxvc().revert(); reloadBuffer(); break; case LFUN_VC_UNDO_LAST: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); lyx_view_->buffer()->lyxvc().undoLast(); reloadBuffer(); break; // --- lyxserver commands ---------------------------- - case LFUN_SERVER_GET_NAME: - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + case LFUN_SERVER_GET_FILENAME: + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); setMessage(from_utf8(lyx_view_->buffer()->absFileName())); LYXERR(Debug::INFO, "FNAME[" << lyx_view_->buffer()->absFileName() << ']'); @@ -1137,7 +1112,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; case LFUN_SERVER_GOTO_FILE_ROW: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); string file_name; int row; istringstream is(argument); @@ -1153,8 +1128,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd) // and get full path FileName const s = fileSearch(string(), changeExtension(file_name, ".lyx"), "lyx"); // Either change buffer or load the file - if (theBufferList().exists(s.absFilename())) - buf = theBufferList().getBuffer(s.absFilename()); + if (theBufferList().exists(s)) + buf = theBufferList().getBuffer(s); else { buf = lyx_view_->loadDocument(s); loaded = true; @@ -1177,7 +1152,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case LFUN_DIALOG_SHOW_NEW_INSET: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); string const name = cmd.getArg(0); InsetCode code = insetCode(name); string data = trim(to_utf8(cmd.argument()).substr(name.size())); @@ -1192,7 +1167,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case TOC_CODE: case HYPERLINK_CODE: { InsetCommandParams p(code); - data = InsetCommandMailer::params2string(name, p); + data = InsetCommand::params2string(name, p); break; } case INCLUDE_CODE: { @@ -1202,64 +1177,69 @@ void LyXFunc::dispatch(FuncRequest const & cmd) // default type is requested data = "include"; InsetCommandParams p(INCLUDE_CODE, data); - data = InsetCommandMailer::params2string("include", p); + data = InsetCommand::params2string("include", p); break; } case BOX_CODE: { // \c data == "Boxed" || "Frameless" etc InsetBoxParams p(data); - data = InsetBoxMailer::params2string(p); + data = InsetBox::params2string(p); break; } case BRANCH_CODE: { InsetBranchParams p; - data = InsetBranchMailer::params2string(p); + data = InsetBranch::params2string(p); break; } case CITE_CODE: { InsetCommandParams p(CITE_CODE); - data = InsetCommandMailer::params2string(name, p); + data = InsetCommand::params2string(name, p); break; } case ERT_CODE: { - data = InsetERTMailer::params2string(InsetCollapsable::Open); + data = InsetERT::params2string(InsetCollapsable::Open); break; } case EXTERNAL_CODE: { InsetExternalParams p; Buffer const & buffer = *lyx_view_->buffer(); - data = InsetExternalMailer::params2string(p, buffer); + data = InsetExternal::params2string(p, buffer); break; } case FLOAT_CODE: { InsetFloatParams p; - data = InsetFloatMailer::params2string(p); + data = InsetFloat::params2string(p); break; } case LISTINGS_CODE: { InsetListingsParams p; - data = InsetListingsMailer::params2string(p); + data = InsetListings::params2string(p); break; } case GRAPHICS_CODE: { InsetGraphicsParams p; Buffer const & buffer = *lyx_view_->buffer(); - data = InsetGraphicsMailer::params2string(p, buffer); + data = InsetGraphics::params2string(p, buffer); break; } case NOTE_CODE: { InsetNoteParams p; - data = InsetNoteMailer::params2string(p); + data = InsetNote::params2string(p); + break; + } + case SPACE_CODE: { + InsetSpaceParams p; + data = InsetSpace::params2string(p); break; } case VSPACE_CODE: { VSpace space; - data = InsetVSpaceMailer::params2string(space); + data = InsetVSpace::params2string(space); break; } case WRAP_CODE: { InsetWrapParams p; - data = InsetWrapMailer::params2string(p); + data = InsetWrap::params2string(p); break; } default: @@ -1274,7 +1254,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_CITATION_INSERT: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); if (!argument.empty()) { // we can have one optional argument, delimited by '|' // citation-insert | @@ -1290,7 +1270,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) icp["key"] = from_utf8(arg); if (!opt1.empty()) icp["before"] = from_utf8(opt1); - string icstr = InsetCommandMailer::params2string("citation", icp); + string icstr = InsetCommand::params2string("citation", icp); FuncRequest fr(LFUN_INSET_INSERT, icstr); dispatch(fr); } else @@ -1299,14 +1279,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_BUFFER_CHILD_OPEN: { - BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); + LASSERT(lyx_view_ && lyx_view_->buffer(), /**/); Buffer * parent = lyx_view_->buffer(); FileName filename = makeAbsPath(argument, parent->filePath()); view()->saveBookmark(false); Buffer * child = 0; bool parsed = false; - if (theBufferList().exists(filename.absFilename())) { - child = theBufferList().getBuffer(filename.absFilename()); + if (theBufferList().exists(filename)) { + child = theBufferList().getBuffer(filename); } else { setMessage(bformat(_("Opening child document %1$s..."), makeDisplayPath(filename.absFilename()))); @@ -1332,28 +1312,28 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; } - case LFUN_TOGGLE_CURSOR_FOLLOWS_SCROLLBAR: - BOOST_ASSERT(lyx_view_); + case LFUN_CURSOR_FOLLOWS_SCROLLBAR_TOGGLE: + LASSERT(lyx_view_, /**/); lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar; break; case LFUN_KEYMAP_OFF: - BOOST_ASSERT(lyx_view_ && lyx_view_->view()); + LASSERT(lyx_view_ && lyx_view_->view(), /**/); lyx_view_->view()->getIntl().keyMapOn(false); break; case LFUN_KEYMAP_PRIMARY: - BOOST_ASSERT(lyx_view_ && lyx_view_->view()); + LASSERT(lyx_view_ && lyx_view_->view(), /**/); lyx_view_->view()->getIntl().keyMapPrim(); break; case LFUN_KEYMAP_SECONDARY: - BOOST_ASSERT(lyx_view_ && lyx_view_->view()); + LASSERT(lyx_view_ && lyx_view_->view(), /**/); lyx_view_->view()->getIntl().keyMapSec(); break; case LFUN_KEYMAP_TOGGLE: - BOOST_ASSERT(lyx_view_ && lyx_view_->view()); + LASSERT(lyx_view_ && lyx_view_->view(), /**/); lyx_view_->view()->getIntl().toggleKeyMap(); break; @@ -1383,12 +1363,29 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; } + case LFUN_COMMAND_ALTERNATIVES: { + // argument contains ';'-terminated commands + string arg = argument; + while (!arg.empty()) { + string first; + arg = split(arg, first, ';'); + FuncRequest func(lyxaction.lookupFunc(first)); + func.origin = cmd.origin; + FuncStatus stat = getStatus(func); + if (stat.enabled()) { + dispatch(func); + break; + } + } + break; + } + case LFUN_CALL: { FuncRequest func; - if (LyX::ref().topLevelCmdDef().lock(argument, func)) { + if (theTopLevelCmdDef().lock(argument, func)) { func.origin = cmd.origin; dispatch(func); - LyX::ref().topLevelCmdDef().release(argument); + theTopLevelCmdDef().release(argument); } else { if (func.action == LFUN_UNKNOWN_ACTION) { // unknown command definition @@ -1412,85 +1409,13 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; } - case LFUN_SET_COLOR: { - string lyx_name; - string const x11_name = split(argument, lyx_name, ' '); - if (lyx_name.empty() || x11_name.empty()) { - setErrorMessage(from_ascii(N_( - "Syntax: set-color " - " "))); - break; - } - - bool const graphicsbg_changed = - (lyx_name == lcolor.getLyXName(Color_graphicsbg) && - x11_name != lcolor.getX11Name(Color_graphicsbg)); - - if (!lcolor.setColor(lyx_name, x11_name)) { - setErrorMessage( - bformat(_("Set-color \"%1$s\" failed " - "- color is undefined or " - "may not be redefined"), - from_utf8(lyx_name))); - break; - } - - theApp()->updateColor(lcolor.getFromLyXName(lyx_name)); - - if (graphicsbg_changed) { - // FIXME: The graphics cache no longer has a changeDisplay method. -#if 0 - graphics::GCache::get().changeDisplay(true); -#endif - } - break; - } - case LFUN_MESSAGE: - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); lyx_view_->message(from_utf8(argument)); break; - case LFUN_EXTERNAL_EDIT: { - BOOST_ASSERT(lyx_view_); - FuncRequest fr(action, argument); - InsetExternal().dispatch(view()->cursor(), fr); - break; - } - - case LFUN_GRAPHICS_EDIT: { - FuncRequest fr(action, argument); - InsetGraphics().dispatch(view()->cursor(), fr); - break; - } - - case LFUN_ALL_INSETS_TOGGLE: { - BOOST_ASSERT(lyx_view_); - string action; - string const name = split(argument, action, ' '); - InsetCode const inset_code = insetCode(name); - - Cursor & cur = view()->cursor(); - FuncRequest fr(LFUN_INSET_TOGGLE, action); - - Inset & inset = lyx_view_->buffer()->inset(); - InsetIterator it = inset_iterator_begin(inset); - InsetIterator const end = inset_iterator_end(inset); - for (; it != end; ++it) { - if (!it->asInsetMath() - && (inset_code == NO_CODE - || inset_code == it->lyxCode())) { - Cursor tmpcur = cur; - tmpcur.pushBackward(*it); - it->dispatch(tmpcur, fr); - } - } - updateFlags = Update::Force | Update::FitCursor; - break; - } - case LFUN_BUFFER_LANGUAGE: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); Buffer & buffer = *lyx_view_->buffer(); Language const * oldL = buffer.params().language; Language const * newL = languages.getLanguage(argument); @@ -1510,7 +1435,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) Buffer defaults(fname); istringstream ss(argument); - Lexer lex(0,0); + Lexer lex; lex.setStream(ss); int const unknown_tokens = defaults.readHeader(lex); @@ -1530,19 +1455,15 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_BUFFER_PARAMS_APPLY: { - BOOST_ASSERT(lyx_view_); - biblio::CiteEngine const oldEngine = - lyx_view_->buffer()->params().getEngine(); + LASSERT(lyx_view_, /**/); Buffer * buffer = lyx_view_->buffer(); - - DocumentClass * oldClass = buffer->params().documentClassPtr(); - + DocumentClass const * const oldClass = buffer->params().documentClassPtr(); Cursor & cur = view()->cursor(); cur.recordUndoFullDocument(); istringstream ss(argument); - Lexer lex(0,0); + Lexer lex; lex.setStream(ss); int const unknown_tokens = buffer->readHeader(lex); @@ -1555,32 +1476,18 @@ void LyXFunc::dispatch(FuncRequest const & cmd) updateLayout(oldClass, buffer); - biblio::CiteEngine const newEngine = - lyx_view_->buffer()->params().getEngine(); - - if (oldEngine != newEngine) { - FuncRequest fr(LFUN_INSET_REFRESH); - - Inset & inset = lyx_view_->buffer()->inset(); - InsetIterator it = inset_iterator_begin(inset); - InsetIterator const end = inset_iterator_end(inset); - for (; it != end; ++it) - if (it->lyxCode() == CITE_CODE) - it->dispatch(cur, fr); - } - updateFlags = Update::Force | Update::FitCursor; - // We are here most certainaly because of a change in the document - // It is then better to make sure that all dialogs are in sync - // with current document settings. LyXView::restartCursor() achieve this. + // We are most certainly here because of a change in the document + // It is then better to make sure that all dialogs are in sync with + // current document settings. LyXView::restartCursor() achieve this. lyx_view_->restartCursor(); break; } case LFUN_LAYOUT_MODULES_CLEAR: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); Buffer * buffer = lyx_view_->buffer(); - DocumentClass * oldClass = buffer->params().documentClassPtr(); + DocumentClass const * const oldClass = buffer->params().documentClassPtr(); view()->cursor().recordUndoFullDocument(); buffer->params().clearLayoutModules(); buffer->params().makeDocumentClass(); @@ -1590,9 +1497,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_LAYOUT_MODULE_ADD: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); Buffer * buffer = lyx_view_->buffer(); - DocumentClass * oldClass = buffer->params().documentClassPtr(); + DocumentClass const * const oldClass = buffer->params().documentClassPtr(); view()->cursor().recordUndoFullDocument(); buffer->params().addLayoutModule(argument); buffer->params().makeDocumentClass(); @@ -1602,21 +1509,22 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_TEXTCLASS_APPLY: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); Buffer * buffer = lyx_view_->buffer(); - if (!loadTextClass(argument, buffer->filePath())) + if (!loadLayoutFile(argument, buffer->temppath()) && + !loadLayoutFile(argument, buffer->filePath())) break; - TextClass const * old_class = buffer->params().baseClass(); - TextClass const * new_class = &(BaseClassList::get()[argument]); + LayoutFile const * old_layout = buffer->params().baseClass(); + LayoutFile const * new_layout = &(LayoutFileList::get()[argument]); - if (old_class == new_class) + if (old_layout == new_layout) // nothing to do break; //Save the old, possibly modular, layout for use in conversion. - DocumentClass * oldDocClass = buffer->params().documentClassPtr(); + DocumentClass const * const oldDocClass = buffer->params().documentClassPtr(); view()->cursor().recordUndoFullDocument(); buffer->params().setBaseClass(argument); buffer->params().makeDocumentClass(); @@ -1626,11 +1534,12 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_LAYOUT_RELOAD: { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); Buffer * buffer = lyx_view_->buffer(); - DocumentClass * oldClass = buffer->params().documentClassPtr(); - BaseClassIndex bc = buffer->params().baseClassID(); - BaseClassList::get().reset(bc); + DocumentClass const * const oldClass = buffer->params().documentClassPtr(); + LayoutFileIndex bc = buffer->params().baseClassID(); + LayoutFileList::get().reset(bc); + buffer->params().setBaseClass(bc); buffer->params().makeDocumentClass(); updateLayout(oldClass, buffer); updateFlags = Update::Force | Update::FitCursor; @@ -1638,7 +1547,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } case LFUN_TEXTCLASS_LOAD: - loadTextClass(argument, lyx_view_->buffer()->filePath()); + loadLayoutFile(argument, lyx_view_->buffer()->temppath()) || + loadLayoutFile(argument, lyx_view_->buffer()->filePath()); break; case LFUN_LYXRC_APPLY: { @@ -1673,29 +1583,41 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; case LFUN_BOOKMARK_CLEAR: - LyX::ref().session().bookmarks().clear(); + theSession().bookmarks().clear(); break; default: - BOOST_ASSERT(theApp()); + LASSERT(theApp(), /**/); // Let the frontend dispatch its own actions. if (theApp()->dispatch(cmd)) // Nothing more to do. return; + // Everything below is only for active lyx_view_ + if (lyx_view_ == 0) + break; + + // Start an undo group. This may be needed for + // some stuff like inset-apply on labels. + if (lyx_view_->view()) + view()->cursor().beginUndoGroup(); + // Let the current LyXView dispatch its own actions. - BOOST_ASSERT(lyx_view_); if (lyx_view_->dispatch(cmd)) { - if (lyx_view_->view()) + if (lyx_view_->view()) { updateFlags = lyx_view_->view()->cursor().result().update(); + view()->cursor().endUndoGroup(); + } break; } - BOOST_ASSERT(lyx_view_->view()); + LASSERT(lyx_view_->view(), /**/); + // Let the current BufferView dispatch its own actions. if (view()->dispatch(cmd)) { // The BufferView took care of its own updates if needed. updateFlags = Update::None; + view()->cursor().endUndoGroup(); break; } @@ -1713,6 +1635,22 @@ void LyXFunc::dispatch(FuncRequest const & cmd) view()->cursor().fixIfBroken(); } + // we assume here that the buffer view has not + // changed since the beginUndoGroup. + view()->cursor().endUndoGroup(); + + // update completion. We do it here and not in + // processKeySym to avoid another redraw just for a + // changed inline completion + if (cmd.origin == FuncRequest::KEYBOARD) { + if (cmd.action == LFUN_SELF_INSERT) + lyx_view_->updateCompletion(view()->cursor(), true, true); + else if (cmd.action == LFUN_CHAR_DELETE_BACKWARD) + lyx_view_->updateCompletion(view()->cursor(), false, true); + else + lyx_view_->updateCompletion(view()->cursor(), false, false); + } + updateFlags = view()->cursor().result().update(); } @@ -1729,8 +1667,11 @@ void LyXFunc::dispatch(FuncRequest const & cmd) && !lyxaction.funcHasFlag(action, LyXAction::ReadOnly)) lyx_view_->buffer()->markDirty(); - //Do we have a selection? + // Do we have a selection? theSelection().haveSelection(view()->cursor().selection()); + + // update gui + lyx_view_->restartCursor(); } } if (lyx_view_) { @@ -1825,7 +1766,7 @@ void LyXFunc::setMessage(docstring const & m) const } -docstring const LyXFunc::viewStatusMessage() +docstring LyXFunc::viewStatusMessage() { // When meta-fake key is pressed, show the key sequence so far + "M-". if (wasMetaKey()) @@ -1836,7 +1777,7 @@ docstring const LyXFunc::viewStatusMessage() if (keyseq.length() > 0 && !keyseq.deleted()) return keyseq.printOptions(true); - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); if (!lyx_view_->buffer()) return _("Welcome to LyX!"); @@ -1846,7 +1787,7 @@ docstring const LyXFunc::viewStatusMessage() BufferView * LyXFunc::view() const { - BOOST_ASSERT(lyx_view_); + LASSERT(lyx_view_, /**/); return lyx_view_->view(); } @@ -1857,7 +1798,7 @@ bool LyXFunc::wasMetaKey() const } -void LyXFunc::updateLayout(DocumentClass * oldlayout,Buffer * buffer) +void LyXFunc::updateLayout(DocumentClass const * const oldlayout, Buffer * buffer) { lyx_view_->message(_("Converting document to new document class...")); @@ -1897,6 +1838,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_BIBTEX_COMMAND: case LyXRC::RC_BINDFILE: case LyXRC::RC_CHECKLASTFILES: + case LyXRC::RC_COMPLETION_CURSOR_TEXT: case LyXRC::RC_COMPLETION_INLINE_DELAY: case LyXRC::RC_COMPLETION_INLINE_DOTS: case LyXRC::RC_COMPLETION_INLINE_MATH: @@ -1916,6 +1858,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_CUSTOM_EXPORT_FORMAT: case LyXRC::RC_DATE_INSERT_FORMAT: case LyXRC::RC_DEFAULT_LANGUAGE: + case LyXRC::RC_GUI_LANGUAGE: case LyXRC::RC_DEFAULT_PAPERSIZE: case LyXRC::RC_DEFFILE: case LyXRC::RC_DIALOGS_ICONIFY_WITH_MAIN: @@ -1930,7 +1873,9 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_EXAMPLEPATH: case LyXRC::RC_FONT_ENCODING: case LyXRC::RC_FORMAT: + case LyXRC::RC_GROUP_LAYOUTS: case LyXRC::RC_INDEX_COMMAND: + case LyXRC::RC_NOMENCL_COMMAND: case LyXRC::RC_INPUT: case LyXRC::RC_KBMAP: case LyXRC::RC_KBMAP_PRIMARY: @@ -1944,6 +1889,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_LANGUAGE_GLOBAL_OPTIONS: case LyXRC::RC_LANGUAGE_PACKAGE: case LyXRC::RC_LANGUAGE_USE_BABEL: + case LyXRC::RC_MAC_LIKE_WORD_MOVEMENT: case LyXRC::RC_MACRO_EDIT_STYLE: case LyXRC::RC_MAKE_BACKUP: case LyXRC::RC_MARK_FOREIGN_LANGUAGE: @@ -1990,6 +1936,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_SERVERPIPE: case LyXRC::RC_SET_COLOR: case LyXRC::RC_SHOW_BANNER: + case LyXRC::RC_OPEN_BUFFERS_IN_TABS: case LyXRC::RC_SPELL_COMMAND: case LyXRC::RC_TEMPDIRPATH: case LyXRC::RC_TEMPLATEPATH: