X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyXFunc.cpp;h=8cd2d66906122667452902f9d5ad33cc3d584ddd;hb=821e2764074c58791988e220ffa774fea926959a;hp=717d686f1c33fb010c78757c442c3ca5a427fdd6;hpb=8c8ff137dad6e998f60ac60e328a232a6c71c6c1;p=lyx.git diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index 717d686f1c..8cd2d66906 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" @@ -66,6 +66,7 @@ #include "insets/InsetGraphics.h" #include "insets/InsetInclude.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(); @@ -214,7 +217,7 @@ void LyXFunc::setLyXView(LyXView * lv) } -void LyXFunc::handleKeyFunc(kb_action action) +void LyXFunc::handleKeyFunc(FuncCode action) { char_type c = encoded_last_key; @@ -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,19 +371,11 @@ 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_) @@ -392,7 +388,7 @@ 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"))); @@ -450,11 +446,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const // FIXME: these cases should be hidden in GuiView::getStatus(). case LFUN_DIALOG_TOGGLE: case LFUN_DIALOG_SHOW: + case LFUN_UI_TOGGLE: case LFUN_DIALOG_UPDATE: - if (cmd.argument() == "prefs" - || cmd.argument() == "aboutlyx") - enable = true; - else if (lyx_view_) + // FIXME: add special handling for about and prefs dialogs here + // which do not depend on GuiView. + if (lyx_view_) return lyx_view_->getStatus(cmd); else enable = false; @@ -614,8 +610,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const 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: @@ -715,26 +710,23 @@ void showPrintError(string const & name) } -void loadTextClass(string const & name, string const & buf_path) +bool loadLayoutFile(string const & name, string const & buf_path) { - pair const tc_pair = - baseclasslist.numberOfClass(name); - - if (!tc_pair.first) { + if (!LayoutFileList::get().haveClass(name)) { lyxerr << "Document class \"" << name << "\" does not exist." << endl; - return; + return false; } - BaseClassIndex const tc = tc_pair.second; - - if (!baseclasslist[tc].load(buf_path)) { - docstring s = bformat(_("The document class %1$s." - "could not be loaded."), - from_utf8(baseclasslist[tc].name())); + LayoutFile & tc = LayoutFileList::get()[name]; + if (!tc.load(buf_path)) { + docstring s = bformat(_("The document class %1$s " + "could not be loaded."), from_utf8(name)); Alert::error(_("Could not load class"), s); + return false; } + return true; } @@ -746,7 +738,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; @@ -823,16 +815,6 @@ 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; @@ -1050,9 +1032,8 @@ 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: { @@ -1255,6 +1236,11 @@ void LyXFunc::dispatch(FuncRequest const & cmd) data = InsetNoteMailer::params2string(p); break; } + case SPACE_CODE: { + InsetSpaceParams p; + data = InsetSpaceMailer::params2string(p); + break; + } case VSPACE_CODE: { VSpace space; data = InsetVSpaceMailer::params2string(space); @@ -1335,7 +1321,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; } - case LFUN_TOGGLE_CURSOR_FOLLOWS_SCROLLBAR: + case LFUN_CURSOR_FOLLOWS_SCROLLBAR_TOGGLE: BOOST_ASSERT(lyx_view_); lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar; break; @@ -1534,13 +1520,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case LFUN_BUFFER_PARAMS_APPLY: { BOOST_ASSERT(lyx_view_); - biblio::CiteEngine const oldEngine = - lyx_view_->buffer()->params().getEngine(); Buffer * buffer = lyx_view_->buffer(); - - TextClassPtr oldClass = buffer->params().textClassPtr(); - + DocumentClass * oldClass = buffer->params().documentClassPtr(); Cursor & cur = view()->cursor(); cur.recordUndoFullDocument(); @@ -1558,24 +1540,10 @@ 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; } @@ -1583,10 +1551,10 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case LFUN_LAYOUT_MODULES_CLEAR: { BOOST_ASSERT(lyx_view_); Buffer * buffer = lyx_view_->buffer(); - TextClassPtr oldClass = buffer->params().textClassPtr(); + DocumentClass * oldClass = buffer->params().documentClassPtr(); view()->cursor().recordUndoFullDocument(); buffer->params().clearLayoutModules(); - buffer->params().makeTextClass(); + buffer->params().makeDocumentClass(); updateLayout(oldClass, buffer); updateFlags = Update::Force | Update::FitCursor; break; @@ -1595,10 +1563,10 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case LFUN_LAYOUT_MODULE_ADD: { BOOST_ASSERT(lyx_view_); Buffer * buffer = lyx_view_->buffer(); - TextClassPtr oldClass = buffer->params().textClassPtr(); + DocumentClass * oldClass = buffer->params().documentClassPtr(); view()->cursor().recordUndoFullDocument(); buffer->params().addLayoutModule(argument); - buffer->params().makeTextClass(); + buffer->params().makeDocumentClass(); updateLayout(oldClass, buffer); updateFlags = Update::Force | Update::FitCursor; break; @@ -1608,27 +1576,23 @@ void LyXFunc::dispatch(FuncRequest const & cmd) BOOST_ASSERT(lyx_view_); Buffer * buffer = lyx_view_->buffer(); - loadTextClass(argument, buffer->filePath()); - - pair const tc_pair = - baseclasslist.numberOfClass(argument); - - if (!tc_pair.first) + if (!loadLayoutFile(argument, buffer->temppath()) && + !loadLayoutFile(argument, buffer->filePath())) break; - BaseClassIndex const old_class = buffer->params().baseClass(); - BaseClassIndex const new_class = tc_pair.second; + 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. - TextClassPtr oldClass = buffer->params().textClassPtr(); + DocumentClass * oldDocClass = buffer->params().documentClassPtr(); view()->cursor().recordUndoFullDocument(); - buffer->params().setBaseClass(new_class); - buffer->params().makeTextClass(); - updateLayout(oldClass, buffer); + buffer->params().setBaseClass(argument); + buffer->params().makeDocumentClass(); + updateLayout(oldDocClass, buffer); updateFlags = Update::Force | Update::FitCursor; break; } @@ -1636,18 +1600,19 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case LFUN_LAYOUT_RELOAD: { BOOST_ASSERT(lyx_view_); Buffer * buffer = lyx_view_->buffer(); - TextClassPtr oldClass = buffer->params().textClassPtr(); - BaseClassIndex const tc = buffer->params().baseClass(); - baseclasslist.reset(tc); - buffer->params().setBaseClass(tc); - buffer->params().makeTextClass(); + DocumentClass * 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; break; } 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: { @@ -1692,8 +1657,11 @@ void LyXFunc::dispatch(FuncRequest const & cmd) // Nothing more to do. return; + // Everything below is only for active lyx_view_ + if (lyx_view_ == 0) + break; + // Let the current LyXView dispatch its own actions. - BOOST_ASSERT(lyx_view_); if (lyx_view_->dispatch(cmd)) { if (lyx_view_->view()) updateFlags = lyx_view_->view()->cursor().result().update(); @@ -1722,6 +1690,18 @@ void LyXFunc::dispatch(FuncRequest const & cmd) view()->cursor().fixIfBroken(); } + // 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(); } @@ -1738,8 +1718,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_) { @@ -1834,7 +1817,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()) @@ -1866,14 +1849,14 @@ bool LyXFunc::wasMetaKey() const } -void LyXFunc::updateLayout(TextClassPtr oldlayout,Buffer * buffer) +void LyXFunc::updateLayout(DocumentClass * oldlayout,Buffer * buffer) { lyx_view_->message(_("Converting document to new document class...")); StableDocIterator backcur(view()->cursor()); ErrorList & el = buffer->errorList("Class Switch"); cap::switchBetweenClasses( - oldlayout, buffer->params().textClassPtr(), + oldlayout, buffer->params().documentClassPtr(), static_cast(buffer->inset()), el); view()->setCursor(backcur.asDocIterator(&(buffer->inset()))); @@ -1906,6 +1889,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: @@ -1939,6 +1923,7 @@ 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_INPUT: case LyXRC::RC_KBMAP: @@ -1999,6 +1984,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: