]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Revert "Automatically show the review toolbar if the document has tracked changes"
[lyx.git] / src / Buffer.cpp
index 6f53a567db73837d6b58d27ead0b956ea4a7acb2..ea04b34a619e7bb2dd559cac380a1c13e2ac1f52 100644 (file)
@@ -83,6 +83,7 @@
 #include "graphics/GraphicsCache.h"
 #include "graphics/PreviewLoader.h"
 
+#include "frontends/Application.h"
 #include "frontends/alert.h"
 #include "frontends/Delegates.h"
 #include "frontends/WorkAreaManager.h"
@@ -320,7 +321,7 @@ public:
        /// If there was an error when previewing, on the next preview we do
        /// a fresh compile (e.g. in case the user installed a package that
        /// was missing).
-       bool preview_error_;
+       bool require_fresh_start_;
 
        /// Cache the references associated to a label and their positions
        /// in the buffer.
@@ -390,10 +391,6 @@ 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_;
-
        // Make sure the file monitor monitors the good file.
        void refreshFileMonitor();
 
@@ -403,6 +400,12 @@ public:
        /// has been externally modified? Can be reset by the user.
        mutable bool externally_modified_;
 
+       ///Binding LaTeX lines with buffer positions.
+       //Common routine for LaTeX and Reference errors listing.
+        void traverseErrors(TeXErrors::Errors::const_iterator err,
+               TeXErrors::Errors::const_iterator end,
+               ErrorList & errorList) const;
+
 private:
        /// So we can force access via the accessors.
        mutable Buffer const * parent_buffer;
@@ -449,16 +452,21 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_,
          file_fully_loaded(false), file_format(LYX_FORMAT), need_format_backup(false),
          ignore_parent(false),  toc_backend(owner), macro_lock(false),
          checksum_(0), wa_(0),  gui_(0), undo_(*owner), bibinfo_cache_valid_(false),
-         cite_labels_valid_(false), have_bibitems_(false), preview_error_(false),
+         cite_labels_valid_(false), have_bibitems_(false), require_fresh_start_(false),
          inset(0), preview_loader_(0), cloned_buffer_(cloned_buffer),
          clone_list_(0), doing_export(false),
-         tracked_changes_present_(0), externally_modified_(false), parent_buffer(0),
+         externally_modified_(false), parent_buffer(0),
          word_count_(0), char_count_(0), blank_count_(0)
 {
        refreshFileMonitor();
        if (!cloned_buffer_) {
                temppath = createBufferTmpDir();
                lyxvc.setBuffer(owner_);
+               Language const * inplang = theApp() ?
+                                       languages.getFromCode(theApp()->inputLanguageCode())
+                                     : nullptr;
+               if (inplang)
+                       params.language = inplang;
                if (use_gui)
                        wa_ = new frontend::WorkAreaManager;
                return;
@@ -477,8 +485,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_,
        layout_position = cloned_buffer_->d->layout_position;
        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_;
+       require_fresh_start_ = cloned_buffer_->d->require_fresh_start_;
 }
 
 
@@ -920,6 +927,9 @@ int Buffer::readHeader(Lexer & lex)
        params().headsep.erase();
        params().footskip.erase();
        params().columnsep.erase();
+       params().font_roman_opts.erase();
+       params().font_sans_opts.erase();
+       params().font_typewriter_opts.erase();
        params().fonts_cjk.erase();
        params().listings_params.clear();
        params().clearLayoutModules();
@@ -943,6 +953,7 @@ int Buffer::readHeader(Lexer & lex)
        params().biblatex_bibstyle.erase();
        params().biblatex_citestyle.erase();
        params().multibib.erase();
+       params().lineno_opts.clear();
 
        for (int i = 0; i < 4; ++i) {
                params().user_defined_bullet(i) = ITEMIZE_DEFAULTS[i];
@@ -1230,9 +1241,14 @@ void Buffer::setFullyLoaded(bool value)
 }
 
 
-bool Buffer::lastPreviewError() const
+bool Buffer::freshStartRequired() const
+{
+       return d->require_fresh_start_;
+}
+
+void Buffer::requireFreshStart(bool const b) const
 {
-       return d->preview_error_;
+       d->require_fresh_start_ = b;
 }
 
 
@@ -1726,9 +1742,11 @@ Buffer::ExportStatus Buffer::makeLaTeXFile(FileName const & fname,
        try { ofs.reset(encoding); }
        catch (iconv_codecvt_facet_exception const & e) {
                lyxerr << "Caught iconv exception: " << e.what() << endl;
-               Alert::error(_("Iconv software exception Detected"), bformat(_("Please "
-                       "verify that the support software for your encoding (%1$s) is "
-                       "properly installed"), from_ascii(encoding)));
+               Alert::error(_("Iconv software exception Detected"),
+                       bformat(_("Please verify that the `iconv' support software is"
+                                         " properly installed and supports the selected encoding"
+                                         " (%1$s), or change the encoding in"
+                                         " Document>Settings>Language."), from_ascii(encoding)));
                return ExportError;
        }
        if (!openFileWrite(ofs, fname))
@@ -1922,8 +1940,15 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os,
                                        os << "\\catcode`\\%=11"
                                              "\\def\\%{%}\\catcode`\\%=14\n";
                                }
-                               bool const detokenize = !isAscii(from_utf8(docdir));
+                               if (contains(docdir, '~'))
+                                       docdir = subst(docdir, "~", "\\string~");
+                               bool const nonascii = !isAscii(from_utf8(docdir));
+                               // LaTeX 2019/10/01 handles non-ascii path without detokenize
+                               bool const utfpathlatex = features.isAvailable("LaTeX-2019/10/01");
+                               bool const detokenize = !utfpathlatex && nonascii;
                                bool const quote = contains(docdir, ' ');
+                               if (utfpathlatex && nonascii)
+                                       os << "\\UseRawInputEncoding\n";
                                os << "\\makeatletter\n"
                                   << "\\def\\input@path{{";
                                if (detokenize)
@@ -1949,6 +1974,9 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os,
                runparams.use_babel = params().writeLaTeX(os, features,
                                                          d->filename.onlyPath());
 
+               // Active characters
+               runparams.active_chars = features.getActiveChars();
+
                // Biblatex bibliographies are loaded here
                if (params().useBiblatex()) {
                        vector<pair<docstring, string>> const bibfiles =
@@ -2465,17 +2493,25 @@ FileName Buffer::getBibfilePath(docstring const & bibid) const
        map<docstring, FileName>::const_iterator it =
                bibfileCache.find(bibid);
        if (it != bibfileCache.end()) {
-               // i.e., bibfileCache[bibid]
+               // i.e., return bibfileCache[bibid];
                return it->second;
        }
 
        LYXERR(Debug::FILES, "Reading file location for " << bibid);
-       string texfile = changeExtension(to_utf8(bibid), "bib");
-       // note that, if the filename can be found directly from the path,
-       // findtexfile will just return a FileName object for that path.
-       FileName file(findtexfile(texfile, "bib"));
-       if (file.empty())
-               file = FileName(makeAbsPath(texfile, filePath()));
+       string const texfile = changeExtension(to_utf8(bibid), "bib");
+       // we need to check first if this file exists where it's said to be.
+       // there's a weird bug that occurs otherwise: if the file is in the
+       // Buffer's directory but has the same name as some file that would be
+       // found by kpsewhich, then we find the latter, not the former.
+       FileName const local_file = makeAbsPath(texfile, filePath());
+       FileName file = local_file;
+       if (!file.exists()) {
+               // there's no need now to check whether the file can be found
+               // locally
+               file = findtexfile(texfile, "bib", true);
+               if (file.empty())
+                       file = local_file;
+       }
        LYXERR(Debug::FILES, "Found at: " << file);
 
        bibfileCache[bibid] = file;
@@ -2992,8 +3028,6 @@ 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:
@@ -3089,7 +3123,7 @@ void Buffer::getLanguages(std::set<Language const *> & langs) const
        for (ParConstIterator it = par_iterator_begin(); it != end; ++it)
                it->getLanguages(langs);
        // also children
-       ListOfBuffers clist = getDescendents();
+       ListOfBuffers clist = getDescendants();
        for (auto const & cit : clist)
                cit->getLanguages(langs);
 }
@@ -3458,7 +3492,7 @@ Buffer const * Buffer::parent() const
 
 ListOfBuffers Buffer::allRelatives() const
 {
-       ListOfBuffers lb = masterBuffer()->getDescendents();
+       ListOfBuffers lb = masterBuffer()->getDescendants();
        lb.push_front(const_cast<Buffer *>(masterBuffer()));
        return lb;
 }
@@ -3529,7 +3563,7 @@ ListOfBuffers Buffer::getChildren() const
 }
 
 
-ListOfBuffers Buffer::getDescendents() const
+ListOfBuffers Buffer::getDescendants() const
 {
        ListOfBuffers v;
        collectChildren(v, true);
@@ -3553,7 +3587,7 @@ typename M::const_iterator greatest_below(M & m, typename M::key_type const & x)
        if (it == m.begin())
                return m.end();
 
-       it--;
+       --it;
        return it;
 }
 
@@ -4359,7 +4393,7 @@ bool Buffer::autoSave() const
 void Buffer::setExportStatus(bool e) const
 {
        d->doing_export = e;
-       ListOfBuffers clist = getDescendents();
+       ListOfBuffers clist = getDescendants();
        for (auto const & bit : clist)
                bit->d->doing_export = e;
 }
@@ -4461,9 +4495,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                                if (format == "pdf4")
                                        s += "\n"
                                          + bformat(_("Hint: use non-TeX fonts or set input encoding "
-                                                     " to '%1$s' or '%2$s'"),
-                                                   from_utf8(encodings.fromLyXName("utf8")->guiName()),
-                                                   from_utf8(encodings.fromLyXName("ascii")->guiName()));
+                                                 " to '%1$s'"), from_utf8(encodings.fromLyXName("ascii")->guiName()));
                                Alert::error(_("Couldn't export file"), s);
                        }
                        return ExportNoPathToFormat;
@@ -4572,7 +4604,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                else
                        errors(error_type);
                // also to the children, in case of master-buffer-view
-               ListOfBuffers clist = getDescendents();
+               ListOfBuffers clist = getDescendants();
                for (auto const & bit : clist) {
                        if (runparams.silent)
                                bit->d->errorLists[error_type].clear();
@@ -4610,7 +4642,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                result_file = dest_filename;
        // We need to copy referenced files (e. g. included graphics
        // if format == "dvi") to the result dir.
-       vector<ExportedFile> const files =
+       vector<ExportedFile> const extfiles =
                runparams.exportdata->externalFiles(format);
        string const dest = runparams.export_folder.empty() ?
                onlyPath(result_file) : runparams.export_folder;
@@ -4618,7 +4650,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                                 : force_overwrite == ALL_FILES;
        CopyStatus status = use_force ? FORCE : SUCCESS;
 
-       for (ExportedFile const & exp : files) {
+       for (ExportedFile const & exp : extfiles) {
                if (status == CANCEL) {
                        message(_("Document export cancelled."));
                        return ExportCancel;
@@ -4694,7 +4726,7 @@ Buffer::ExportStatus Buffer::preview(string const & format, bool includeall) con
        Impl * theimpl = isClone() ? d->cloned_buffer_->d : d;
        theimpl->preview_file_ = previewFile;
        theimpl->preview_format_ = format;
-       theimpl->preview_error_ = (status != ExportSuccess);
+       theimpl->require_fresh_start_ = (status != ExportSuccess);
 
        if (status != ExportSuccess)
                return status;
@@ -4799,6 +4831,10 @@ Buffer::ReadStatus Buffer::loadEmergency()
                                          "You should do so manually. Otherwise, you will be "
                                          "asked about it again the next time you try to load "
                                          "this file, and may over-write your own work."));
+                       } else {
+                               Alert::warning(_("Emergency File Renames"),
+                                       bformat(_("Emergency file renamed as:\n %1$s"),
+                                       from_utf8(newname.onlyFileName())));
                        }
                }
                return ReadOriginal;
@@ -4882,26 +4918,26 @@ Buffer::ReadStatus Buffer::loadThisLyXFile(FileName const & fn)
 }
 
 
-void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const
+void Buffer::Impl::traverseErrors(TeXErrors::Errors::const_iterator err, TeXErrors::Errors::const_iterator end, ErrorList & errorList) const
 {
-       for (auto const & err : terr) {
+       for (; err != end; ++err) {
                TexRow::TextEntry start = TexRow::text_none, end = TexRow::text_none;
-               int errorRow = err.error_in_line;
+               int errorRow = err->error_in_line;
                Buffer const * buf = 0;
-               Impl const * p = d;
-               if (err.child_name.empty())
+               Impl const * p = this;
+               if (err->child_name.empty())
                        tie(start, end) = p->texrow.getEntriesFromRow(errorRow);
                else {
                        // The error occurred in a child
-                       for (Buffer const * child : getDescendents()) {
+                       for (Buffer const * child : owner_->getDescendants()) {
                                string const child_name =
                                        DocFileName(changeExtension(child->absFileName(), "tex")).
                                        mangledFileName();
-                               if (err.child_name != child_name)
+                               if (err->child_name != child_name)
                                        continue;
                                tie(start, end) = child->d->texrow.getEntriesFromRow(errorRow);
                                if (!TexRow::isNone(start)) {
-                                       buf = d->cloned_buffer_
+                                       buf = this->cloned_buffer_
                                                ? child->d->cloned_buffer_->d->owner_
                                                : child->d->owner_;
                                        p = child->d;
@@ -4909,12 +4945,30 @@ void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const
                                }
                        }
                }
-               errorList.push_back(ErrorItem(err.error_desc, err.error_text,
+               errorList.push_back(ErrorItem(err->error_desc, err->error_text,
                                              start, end, buf));
        }
 }
 
 
+void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const
+{
+       TeXErrors::Errors::const_iterator err = terr.begin();
+       TeXErrors::Errors::const_iterator end = terr.end();
+
+       d->traverseErrors(err, end, errorList);
+}
+
+
+void Buffer::bufferRefs(TeXErrors const & terr, ErrorList & errorList) const
+{
+       TeXErrors::Errors::const_iterator err = terr.begin_ref();
+       TeXErrors::Errors::const_iterator end = terr.end_ref();
+
+       d->traverseErrors(err, end, errorList);
+}
+
+
 void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
 {
        LBUFERR(!text().paragraphs().empty());
@@ -4971,9 +5025,12 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
        // update all caches
        clearReferenceCache();
        updateMacros();
-       setChangesPresent(false);
 
        Buffer & cbuf = const_cast<Buffer &>(*this);
+       // if we are reloading, then we could have a dangling TOC,
+       // in effect. so we need to go ahead and reset, even though
+       // we will do so again when we rebuild the TOC later.
+       cbuf.tocBackend().reset();
 
        // do the real work
        ParIterator parit = cbuf.par_iterator_begin();
@@ -5008,7 +5065,6 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
                clearReferenceCache();
                // we should not need to do this again?
                // updateMacros();
-               setChangesPresent(false);
                updateBuffer(parit, utype);
                // this will already have been done by reloadBibInfoCache();
                // d->bibinfo_cache_valid_ = true;
@@ -5290,9 +5346,6 @@ 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
                for (auto const & insit : parit->insetList()) {
                        parit.pos() = insit.pos;
@@ -5554,29 +5607,6 @@ string Buffer::includedFilePath(string const & name, string const & ext) const
 }
 
 
-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);
-}
-
-
 void Buffer::Impl::refreshFileMonitor()
 {
        if (file_monitor_ && file_monitor_->filename() == filename.absFileName()) {