X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=e78a443a88ab3c44e721f15d7b493c85109bc080;hb=110445e3e2fe9beab1c38d2806cfd126dae967a9;hp=40c91b8ce9b75c4addbe0f29c23f5d515d6c5eba;hpb=12bb380941437fe8a48774e7ceb5f17034dc3317;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 40c91b8ce9..e78a443a88 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -21,6 +21,7 @@ #include "BufferParams.h" #include "Bullet.h" #include "Chktex.h" +#include "ColorSet.h" #include "Converter.h" #include "Counters.h" #include "Cursor.h" @@ -353,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_; @@ -459,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_) { @@ -623,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); @@ -668,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; @@ -945,7 +947,9 @@ int Buffer::readHeader(Lexer & lex) params().fontcolor = RGBColor(0, 0, 0); params().isfontcolor = false; params().notefontcolor = RGBColor(0xCC, 0xCC, 0xCC); + params().isnotefontcolor = false; params().boxbgcolor = RGBColor(0xFF, 0, 0); + params().isboxbgcolor = false; params().html_latex_start.clear(); params().html_latex_end.clear(); params().html_math_img_scale = 1.0; @@ -957,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]; @@ -985,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; @@ -1006,7 +1011,7 @@ int Buffer::readHeader(Lexer & lex) params().shell_escape = theSession().shellescapeFiles().find(absFileName()); - params().makeDocumentClass(); + params().makeDocumentClass(isClone(), isInternal()); return unknown_tokens; } @@ -1471,7 +1476,7 @@ bool Buffer::save() const // proper location once that has been done successfully. that // way we preserve the original file if something goes wrong. string const justname = fileName().onlyFileNameWithoutExt(); - auto tempfile = make_unique(fileName().onlyPath(), + auto tempfile = lyx::make_unique(fileName().onlyPath(), justname + "-XXXXXX.lyx"); bool const symlink = fileName().isSymLink(); if (!symlink) @@ -2101,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; @@ -2139,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\""; @@ -2938,9 +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 const x11hexname = X11hexname(branch->color()); - 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); } @@ -3532,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()) @@ -3808,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 @@ -4352,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; @@ -4395,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) { @@ -4561,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); @@ -4686,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) { @@ -4761,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; } @@ -4890,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()); @@ -5003,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; } @@ -5285,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 {