]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Check path of Qt tools if qtchooser is detected
[lyx.git] / src / Buffer.cpp
index e2185fbd897a18711e63f3a4c0335fa66ad007d9..888fb93d9b16a7dbc19f0186b02ed28e3c730f01 100644 (file)
@@ -57,6 +57,7 @@
 #include "PDFOptions.h"
 #include "SpellChecker.h"
 #include "sgml.h"
+#include "texstream.h"
 #include "TexRow.h"
 #include "Text.h"
 #include "TextClass.h"
 #include "support/types.h"
 
 #include "support/bind.h"
-#include "support/shared_ptr.h"
 
 #include <algorithm>
 #include <fstream>
 #include <iomanip>
 #include <map>
+#include <memory>
 #include <set>
 #include <sstream>
 #include <vector>
@@ -236,8 +237,8 @@ public:
        /// positions of child buffers in the buffer
        typedef map<Buffer const * const, DocIterator> BufferPositionMap;
        struct ScopeBuffer {
-               ScopeBuffer() {}
-               ScopeBuffer(DocIterator const & s,Buffer const * b)
+               ScopeBuffer() : buffer(0) {}
+               ScopeBuffer(DocIterator const & s, Buffer const * b)
                        : scope(s), buffer(b) {}
                DocIterator scope;
                Buffer const * buffer;
@@ -370,6 +371,10 @@ public:
                + (with_blanks ? blank_count_ : 0);
        }
 
+       // does the buffer contain tracked changes? (if so, we automatically
+       // display the review toolbar, for instance)
+       mutable bool tracked_changes_present_;
+
 private:
        /// So we can force access via the accessors.
        mutable Buffer const * parent_buffer;
@@ -442,6 +447,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_,
        preview_file_ = cloned_buffer_->d->preview_file_;
        preview_format_ = cloned_buffer_->d->preview_format_;
        preview_error_ = cloned_buffer_->d->preview_error_;
+       tracked_changes_present_ = cloned_buffer_->d->tracked_changes_present_;
 }
 
 
@@ -1392,9 +1398,8 @@ 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();
-       boost::scoped_ptr<TempFile>
-               tempfile(new TempFile(fileName().onlyPath(),
-                  justname + "-XXXXXX.lyx"));
+       auto tempfile = make_unique<TempFile>(fileName().onlyPath(),
+                                             justname + "-XXXXXX.lyx");
        bool const symlink = fileName().isSymLink();
        if (!symlink)
                tempfile->setAutoRemove(false);
@@ -1655,9 +1660,11 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
 {
        OutputParams runparams = runparams_in;
 
-       // XeTeX with TeX fonts is only safe with ASCII encoding,
-       // but the "flavor" is not known in BufferParams::encoding().
-       if (!params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX))
+       // XeTeX with TeX fonts is only safe with ASCII encoding (see also #9740),
+       // Check here, because the "flavor" is not known in BufferParams::encoding()
+       // (power users can override this safety measure selecting "utf8-plain").
+       if (!params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX)
+           && (runparams.encoding->name() != "utf8-plain"))
                runparams.encoding = encodings.fromLyXName("ascii");
 
        string const encoding = runparams.encoding->iconvName();
@@ -1678,7 +1685,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
        ErrorList & errorList = d->errorLists["Export"];
        errorList.clear();
        bool failed_export = false;
-       otexstream os(ofs, d->texrow);
+       otexstream os(ofs);
 
        // make sure we are ready to export
        // this needs to be done before we validate
@@ -1688,7 +1695,6 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
        updateMacroInstances(OutputUpdate);
 
        try {
-               os.texrow().reset();
                writeLaTeXSource(os, original_path, runparams, output);
        }
        catch (EncodingException const & e) {
@@ -1719,6 +1725,8 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
                lyx_exit(1);
        }
 
+       d->texrow = move(os.texrow());
+
        ofs.close();
        if (ofs.fail()) {
                failed_export = true;
@@ -1743,8 +1751,10 @@ void Buffer::writeLaTeXSource(otexstream & os,
        OutputParams runparams = runparams_in;
 
        // XeTeX with TeX fonts is only safe with ASCII encoding,
-       // but the "flavor" is not known in BufferParams::encoding().
-       if (!params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX))
+       // Check here, because the "flavor" is not known in BufferParams::encoding()
+       // (power users can override this safety measure selecting "utf8-plain").
+       if (!params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX)
+           && (runparams.encoding->name() != "utf8-plain"))
                runparams.encoding = encodings.fromLyXName("ascii");
        // FIXME: when only the current paragraph is shown, this is ignored
        //        (or not reached) and characters encodable in the current
@@ -2210,8 +2220,8 @@ void Buffer::validate(LaTeXFeatures & features) const
        if (!features.runparams().is_child)
                params().validate(features);
 
-       for_each(paragraphs().begin(), paragraphs().end(),
-                bind(&Paragraph::validate, _1, ref(features)));
+       for (Paragraph const & p : paragraphs())
+               p.validate(features);
 
        if (lyxerr.debugging(Debug::LATEX)) {
                features.showStruct();
@@ -2768,6 +2778,8 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                if (params().save_transient_properties)
                        undo().recordUndoBufferParams(CursorData());
                params().track_changes = !params().track_changes;
+               if (!params().track_changes)
+                       dr.forceChangesUpdate();
                break;
 
        case LFUN_CHANGES_OUTPUT:
@@ -3647,11 +3659,11 @@ void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to)
 }
 
 // returns NULL if id-to-row conversion is unsupported
-auto_ptr<TexRow> Buffer::getSourceCode(odocstream & os, string const & format,
-                          pit_type par_begin, pit_type par_end,
-                          OutputWhat output, bool master) const
+unique_ptr<TexRow> Buffer::getSourceCode(odocstream & os, string const & format,
+                                         pit_type par_begin, pit_type par_end,
+                                         OutputWhat output, bool master) const
 {
-       auto_ptr<TexRow> texrow(NULL);
+       unique_ptr<TexRow> texrow;
        OutputParams runparams(&params().encoding());
        runparams.nice = true;
        runparams.flavor = params().getOutputFlavor(format);
@@ -3705,14 +3717,13 @@ auto_ptr<TexRow> Buffer::getSourceCode(odocstream & os, string const & format,
                        LaTeXFeatures features(*this, params(), runparams);
                        params().validate(features);
                        runparams.use_polyglossia = features.usePolyglossia();
-                       texrow.reset(new TexRow());
-                       texrow->newline();
-                       texrow->newline();
                        // latex or literate
-                       otexstream ots(os, *texrow);
-
+                       otexstream ots(os);
+                       // output above
+                       ots.texrow().newlines(2);
                        // the real stuff
                        latexParagraphs(*this, text(), ots, runparams);
+                       texrow = ots.releaseTexRow();
                        texrow->finalize();
 
                        // Restore the parenthood
@@ -3748,13 +3759,13 @@ auto_ptr<TexRow> Buffer::getSourceCode(odocstream & os, string const & format,
                                writeDocBookSource(os, absFileName(), runparams, output);
                } else {
                        // latex or literate
-                       texrow.reset(new TexRow());
-                       texrow->newline();
-                       texrow->newline();
-                       otexstream ots(os, *texrow);
+                       otexstream ots(os);
+                       // output above
+                       ots.texrow().newlines(2);
                        if (master)
                                runparams.is_child = true;
                        writeLaTeXSource(ots, string(), runparams, output);
+                       texrow = ots.releaseTexRow();
                        texrow->finalize();
                }
        }
@@ -3841,7 +3852,7 @@ public:
        ///
        virtual shared_ptr<ForkedProcess> clone() const
        {
-               return shared_ptr<ForkedProcess>(new AutoSaveBuffer(*this));
+               return make_shared<AutoSaveBuffer>(*this);
        }
        ///
        int start()
@@ -4304,26 +4315,22 @@ Buffer::ExportStatus Buffer::preview(string const & format, bool includeall) con
        ExportStatus const status = doExport(format, true, false, result_file);
        FileName const previewFile(result_file);
 
-       LATTEST (isClone());
-       d->cloned_buffer_->d->preview_file_ = previewFile;
-       d->cloned_buffer_->d->preview_format_ = format;
-       d->cloned_buffer_->d->preview_error_ = (status != ExportSuccess);
+       Impl * theimpl = isClone() ? d->cloned_buffer_->d : d;
+       theimpl->preview_file_ = previewFile;
+       theimpl->preview_format_ = format;
+       theimpl->preview_error_ = (status != ExportSuccess);
 
        if (status != ExportSuccess)
                return status;
-       if (previewFile.exists()) {
-               if (!formats.view(*this, previewFile, format))
-                       return PreviewError;
-               else
-                       return PreviewSuccess;
-       }
-       else {
-               // Successful export but no output file?
-               // Probably a bug in error detection.
-               LATTEST (status != ExportSuccess);
 
-               return status;
-       }
+       if (previewFile.exists())
+               return formats.view(*this, previewFile, format) ?
+                       PreviewSuccess : PreviewError;
+
+       // Successful export but no output file?
+       // Probably a bug in error detection.
+       LATTEST(status != ExportSuccess);
+       return status;
 }
 
 
@@ -4584,6 +4591,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
        // update all caches
        clearReferenceCache();
        updateMacros();
+       setChangesPresent(false);
 
        Buffer & cbuf = const_cast<Buffer &>(*this);
 
@@ -4611,6 +4619,11 @@ static depth_type getDepth(DocIterator const & it)
                if (!it[i].inset().inMathed())
                        depth += it[i].paragraph().getDepth() + 1;
        // remove 1 since the outer inset does not count
+       // we should have at least one non-math inset, so
+       // depth should nevery be 0. but maybe it is worth
+       // marking this, just in case.
+       LATTEST(depth > 0);
+       // coverity[INTEGER_OVERFLOW]
        return depth - 1;
 }
 
@@ -4847,6 +4860,9 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
                // set the counter for this paragraph
                d->setLabel(parit, utype);
 
+               // update change-tracking flag 
+               parit->addChangesToBuffer(*this);
+
                // now the insets
                InsetList::const_iterator iit = parit->insetList().begin();
                InsetList::const_iterator end = parit->insetList().end();
@@ -5111,4 +5127,29 @@ string Buffer::includedFilePath(string const & name, string const & ext) const
                                   from_utf8(filePath())));
 }
 
+
+void Buffer::setChangesPresent(bool b) const
+{
+       d->tracked_changes_present_ = b;
+}
+
+
+bool Buffer::areChangesPresent() const
+{
+       return d->tracked_changes_present_;
+}
+
+
+void Buffer::updateChangesPresent() const
+{
+       LYXERR(Debug::CHANGES, "Buffer::updateChangesPresent");
+       setChangesPresent(false);
+       ParConstIterator it = par_iterator_begin();
+       ParConstIterator const end = par_iterator_end();
+       for (; !areChangesPresent() && it != end; ++it)
+               it->addChangesToBuffer(*this);
+}
+
+
+
 } // namespace lyx