X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=e78a443a88ab3c44e721f15d7b493c85109bc080;hb=110445e3e2fe9beab1c38d2806cfd126dae967a9;hp=119e26dacdb6939c0f26fa97fb38e1ed20f54fd5;hpb=ee475b62fad9c899e80aba8543cf680fedf1c5ed;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 119e26dacd..e78a443a88 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -354,6 +354,9 @@ public: /// whether the bibinfo cache is valid mutable bool bibinfo_cache_valid_; + /// + mutable bool need_update; + private: int word_count_; int char_count_; @@ -460,7 +463,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, internal_buffer(false), read_only(readonly_), file_fully_loaded(false), need_format_backup(false), ignore_parent(false), macro_lock(false), externally_modified_(false), bibinfo_cache_valid_(false), - word_count_(0), char_count_(0), blank_count_(0) + need_update(false), word_count_(0), char_count_(0), blank_count_(0) { refreshFileMonitor(); if (!cloned_buffer_) { @@ -624,10 +627,9 @@ void Buffer::cloneWithChildren(BufferMap & bufmap, CloneList_ptr clones) const // The clone needs its own DocumentClass, since running updateBuffer() will // modify it, and we would otherwise be sharing it with the original Buffer. buffer_clone->params().makeDocumentClass(true); - ErrorList el; cap::switchBetweenClasses( params().documentClassPtr(), buffer_clone->params().documentClassPtr(), - static_cast(buffer_clone->inset()), el); + static_cast(buffer_clone->inset())); bufmap[this] = buffer_clone; clones->insert(buffer_clone); @@ -669,10 +671,9 @@ Buffer * Buffer::cloneBufferOnly() const { // The clone needs its own DocumentClass, since running updateBuffer() will // modify it, and we would otherwise be sharing it with the original Buffer. buffer_clone->params().makeDocumentClass(true); - ErrorList el; cap::switchBetweenClasses( params().documentClassPtr(), buffer_clone->params().documentClassPtr(), - static_cast(buffer_clone->inset()), el); + static_cast(buffer_clone->inset())); clones->insert(buffer_clone); buffer_clone->d->clone_list_ = clones; @@ -960,6 +961,7 @@ int Buffer::readHeader(Lexer & lex) params().biblatex_citestyle.erase(); params().multibib.erase(); params().lineno_opts.clear(); + params().spellignore().clear(); for (int i = 0; i < 4; ++i) { params().user_defined_bullet(i) = ITEMIZE_DEFAULTS[i]; @@ -988,7 +990,7 @@ int Buffer::readHeader(Lexer & lex) << token << '\''); string const result = - params().readToken(lex, token, d->filename.onlyPath()); + params().readToken(lex, token, d->filename); if (!result.empty()) { if (token == "\\textclass") { d->layout_position = result; @@ -2104,8 +2106,7 @@ Buffer::ExportStatus Buffer::makeDocBookFile(FileName const & fname, updateBuffer(); updateMacroInstances(OutputUpdate); - ExportStatus const retval = - writeDocBookSource(ofs, runparams, output); + ExportStatus const retval = writeDocBookSource(ofs, runparams, output); if (retval == ExportKilled) return ExportKilled; @@ -2142,12 +2143,23 @@ Buffer::ExportStatus Buffer::writeDocBookSource(odocstream & os, << "\n"; + // Prepare the name space declaration for MathML depending on document preferences. + string mathmlNamespace; + if (params().docbook_mathml_prefix != BufferParams::NoPrefix) { + string mathmlPrefix; + if (params().docbook_mathml_prefix == BufferParams::MPrefix) + mathmlPrefix = "m"; + else if (params().docbook_mathml_prefix == BufferParams::MMLPrefix) + mathmlPrefix = "mml"; + mathmlNamespace = + " xmlns:" + mathmlPrefix + "=\"http://www.w3.org/1998/Math/MathML\""; + } + // Directly output the root tag, based on the current type of document. string languageCode = params().language->code(); string params = "xml:lang=\"" + languageCode + '"' + " xmlns=\"http://docbook.org/ns/docbook\"" + " xmlns:xlink=\"http://www.w3.org/1999/xlink\"" - + " xmlns:m=\"http://www.w3.org/1998/Math/MathML\"" + + mathmlNamespace + " xmlns:xi=\"http://www.w3.org/2001/XInclude\"" + " version=\"5.2\""; @@ -2941,16 +2953,9 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) undo().recordUndoBufferParams(CursorData()); branch_list.add(branch_name); branch = branch_list.find(branch_name); - string x11hexname; - string const bcolor = branch->color(); - if (bcolor.size() == 7 && bcolor[0] == '#') - x11hexname = bcolor; - else { - bool const darkmode = theApp() ? theApp()->isInDarkMode() : false; - x11hexname = lcolor.getX11HexName(lcolor.getFromLyXName(bcolor), darkmode); - } - docstring const str = branch_name + ' ' + from_ascii(x11hexname); - lyx::dispatch(FuncRequest(LFUN_SET_COLOR, str)); + if (branch) + // needed to update the color table for dark mode + branch->setColors("background", "background"); dr.setError(false); dr.screenUpdate(Update::Force); } @@ -3542,6 +3547,9 @@ void Buffer::collectChildren(ListOfBuffers & children, bool grand_children) cons // loop over children for (auto const & p : d->children_positions) { Buffer * child = const_cast(p.first); + // This can happen when called during GUI operations + if (!theBufferList().isLoaded(child)) + continue; // No duplicates ListOfBuffers::const_iterator bit = find(children.begin(), children.end(), child); if (bit != children.end()) @@ -3818,7 +3826,7 @@ void Buffer::Impl::updateMacros(DocIterator & it, DocIterator & scope) // FIXME (Abdel), I don't understand why we pass 'it' here // instead of 'macroTemplate' defined above... is this correct? macros[macroTemplate.name()][it] = - Impl::ScopeMacro(scope, MacroData(const_cast(owner_), it)); + Impl::ScopeMacro(scope, MacroData(owner_, it)); } // next paragraph @@ -4362,6 +4370,9 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir void Buffer::setMathFlavor(OutputParams & op) const { + // Passes the way to generate formulae to the XHTML output code. + // In particular, this function has no impact on the DocBook code, as it + // uses another mechanism to handle math flavours. switch (params().html_math_output) { case BufferParams::MathML: op.math_flavor = OutputParams::MathAsMathML; @@ -4405,7 +4416,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir Converters converters = theConverters(); bool need_nice_file = false; if (find(backs.begin(), backs.end(), format) == backs.end()) { - // Get shortest path to format + // Get the shortest path to format converters.buildGraph(); Graph::EdgePath path; for (string const & sit : backs) { @@ -4571,7 +4582,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir result_file = changeExtension(d->exportFileName().absFileName(), ext); else result_file = dest_filename; - // We need to copy referenced files (e. g. included graphics + // We need to copy referenced files (e.g. included graphics // if format == "dvi") to the result dir. vector const extfiles = runparams.exportdata->externalFiles(format); @@ -4696,7 +4707,7 @@ Buffer::ReadStatus Buffer::loadEmergency() "%1$s exists.\n\nRecover emergency save?"), file); int const load_emerg = Alert::prompt(_("Load emergency save?"), text, - 0, 2, _("&Recover"), _("&Load Original"), _("&Cancel")); + 0, 3, _("&Recover"), _("&Load Original"), _("&Only show difference"), _("&Cancel")); switch (load_emerg) { @@ -4771,6 +4782,22 @@ Buffer::ReadStatus Buffer::loadEmergency() return ReadOriginal; } + case 2: { + string const f1 = d->filename.absFileName(); + string const f2 = emergencyFile.absFileName(); + if (loadThisLyXFile(d->filename) != ReadSuccess) + return ReadCancel; + string const par = "compare run-blocking " + quoteName(f1) + " " + quoteName(f2); + LYXERR(Debug::FILES, par << "\n"); + lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, par)); + + //release the emergency buffer loaded by compare + Buffer * emerBuffer = theBufferList().getBuffer(emergencyFile); + if (emerBuffer) + theBufferList().release(emerBuffer); + + return ReadCancel; //Release the buffer of Original immediatelly + } default: break; } @@ -4900,6 +4927,13 @@ void Buffer::bufferRefs(TeXErrors const & terr, ErrorList & errorList) const } +void Buffer::updateBuffer() const +{ + updateBuffer(UpdateMaster, InternalUpdate); + d->need_update = false; +} + + void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const { LBUFERR(!text().paragraphs().empty()); @@ -5013,6 +5047,8 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const cbuf.tocBackend().update(true, utype); if (scope == UpdateMaster) cbuf.structureChanged(); + + d->need_update = false; } @@ -5295,6 +5331,18 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype, bool const dele } +void Buffer::forceUpdate() const +{ + d->need_update = true; +} + + +bool Buffer::needUpdate() const +{ + return d->need_update; +} + + int Buffer::spellCheck(DocIterator & from, DocIterator & to, WordLangTuple & word_lang, docstring_list & suggestions) const {