X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyXFunc.cpp;h=ee4702067d5cc75a9b817a00af64c086c2f48b0b;hb=027563eec2d2a1b81391b221f9ca40d823713235;hp=294d502ce2f69551014df3bca5b077144635fdca;hpb=0655e4d78f6b9ecae721af12793696602b475caa;p=lyx.git diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index 294d502ce2..ee4702067d 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(); @@ -206,7 +209,7 @@ void LyXFunc::initKeySequences(KeyMap * kb) void LyXFunc::setLyXView(LyXView * lv) { - if (!quitting && lyx_view_ && lyx_view_->view() && lyx_view_ != lv) + if (lyx_view_ && lyx_view_->view() && lyx_view_ != lv) // save current selection to the selection buffer to allow // middle-button paste in another window cap::saveSelection(lyx_view_->view()->cursor()); @@ -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; @@ -232,7 +235,8 @@ void LyXFunc::handleKeyFunc(kb_action action) view()->processUpdateFlags(Update::FitCursor); } - +//FIXME: bookmark handling is a frontend issue. This code should be transferred +// to GuiView and be GuiView and be window dependent. void LyXFunc::gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer) { BOOST_ASSERT(lyx_view_); @@ -292,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; } @@ -366,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_) @@ -391,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"))); @@ -449,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; @@ -613,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: @@ -714,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; } @@ -745,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; @@ -822,18 +815,8 @@ 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: - closeBuffer(); + lyx_view_->closeBuffer(); updateFlags = Update::None; break; @@ -1049,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: { @@ -1254,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); @@ -1334,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; @@ -1533,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(); @@ -1557,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; } @@ -1582,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; @@ -1594,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; @@ -1607,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; } @@ -1635,18 +1600,18 @@ 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().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: { @@ -1691,8 +1656,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(); @@ -1721,6 +1689,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(); } @@ -1737,11 +1717,14 @@ 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 (!quitting && lyx_view_) { + if (lyx_view_) { // Some messages may already be translated, so we cannot use _() sendDispatchMessage(translateIfPossible(getMessage()), cmd); } @@ -1794,16 +1777,6 @@ void LyXFunc::sendDispatchMessage(docstring const & msg, FuncRequest const & cmd } -void LyXFunc::closeBuffer() -{ - // goto bookmark to update bookmark pit. - for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i) - gotoBookmark(i+1, false, false); - - lyx_view_->closeBuffer(); -} - - void LyXFunc::reloadBuffer() { FileName filename = lyx_view_->buffer()->fileName(); @@ -1843,7 +1816,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()) @@ -1875,15 +1848,14 @@ bool LyXFunc::wasMetaKey() const } -void LyXFunc::updateLayout(TextClassPtr const & 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()))); @@ -1916,6 +1888,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: @@ -1949,6 +1922,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: @@ -2009,6 +1983,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: