]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Replace the hardcoded TEXT_TO_INSET_OFFSET by tunable values
[lyx.git] / src / Buffer.cpp
index 0c0c9dfac72a9939bc8955df357de802148603b8..0dcd81ab5ebed7c6cc4b0c8a27caaa08a4bc5a68 100644 (file)
@@ -321,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.
@@ -391,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();
 
@@ -456,10 +452,10 @@ 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();
@@ -489,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_;
 }
 
 
@@ -1033,20 +1028,13 @@ bool Buffer::readDocument(Lexer & lex)
        readHeader(lex);
 
        if (params().output_changes) {
-               bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
                bool xcolorulem = LaTeXFeatures::isAvailable("ulem") &&
                                  LaTeXFeatures::isAvailable("xcolor");
 
-               if (!dvipost && !xcolorulem) {
+               if (!xcolorulem) {
                        Alert::warning(_("Changes not shown in LaTeX output"),
                                       _("Changes will not be highlighted in LaTeX output, "
-                                        "because neither dvipost nor xcolor/ulem are installed.\n"
-                                        "Please install these packages or redefine "
-                                        "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
-               } else if (!xcolorulem) {
-                       Alert::warning(_("Changes not shown in LaTeX output"),
-                                      _("Changes will not be highlighted in LaTeX output "
-                                        "when using pdflatex, because xcolor and ulem are not installed.\n"
+                                        "because xcolor and ulem are not installed.\n"
                                         "Please install both packages or redefine "
                                         "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
                }
@@ -1246,9 +1234,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;
 }
 
 
@@ -3028,8 +3021,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:
@@ -3037,20 +3028,13 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                        undo().recordUndoBufferParams(CursorData());
                params().output_changes = !params().output_changes;
                if (params().output_changes) {
-                       bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
                        bool xcolorulem = LaTeXFeatures::isAvailable("ulem") &&
                                          LaTeXFeatures::isAvailable("xcolor");
 
-                       if (!dvipost && !xcolorulem) {
+                       if (!xcolorulem) {
                                Alert::warning(_("Changes not shown in LaTeX output"),
                                               _("Changes will not be highlighted in LaTeX output, "
-                                                "because neither dvipost nor xcolor/ulem are installed.\n"
-                                                "Please install these packages or redefine "
-                                                "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
-                       } else if (!xcolorulem) {
-                               Alert::warning(_("Changes not shown in LaTeX output"),
-                                              _("Changes will not be highlighted in LaTeX output "
-                                                "when using pdflatex, because xcolor and ulem are not installed.\n"
+                                                "because xcolor and ulem are not installed.\n"
                                                 "Please install both packages or redefine "
                                                 "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
                        }
@@ -3125,7 +3109,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);
 }
@@ -3494,7 +3478,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;
 }
@@ -3565,7 +3549,7 @@ ListOfBuffers Buffer::getChildren() const
 }
 
 
-ListOfBuffers Buffer::getDescendents() const
+ListOfBuffers Buffer::getDescendants() const
 {
        ListOfBuffers v;
        collectChildren(v, true);
@@ -4041,14 +4025,17 @@ void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to)
                return;
 
        string const paramName = "key";
+       UndoGroupHelper ugh(this);
        InsetIterator it = inset_iterator_begin(inset());
        for (; it; ++it) {
                if (it->lyxCode() != CITE_CODE)
                        continue;
                InsetCommand * inset = it->asInsetCommand();
                docstring const oldValue = inset->getParam(paramName);
-               if (oldValue == from)
+               if (oldValue == from) {
+                       undo().recordUndo(CursorData(it));
                        inset->setParam(paramName, to);
+               }
        }
 }
 
@@ -4395,7 +4382,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;
 }
@@ -4606,7 +4593,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();
@@ -4728,7 +4715,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;
@@ -4931,7 +4918,7 @@ void Buffer::Impl::traverseErrors(TeXErrors::Errors::const_iterator err, TeXErro
                        tie(start, end) = p->texrow.getEntriesFromRow(errorRow);
                else {
                        // The error occurred in a child
-                       for (Buffer const * child : owner_->getDescendents()) {
+                       for (Buffer const * child : owner_->getDescendants()) {
                                string const child_name =
                                        DocFileName(changeExtension(child->absFileName(), "tex")).
                                        mangledFileName();
@@ -5027,7 +5014,6 @@ 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,
@@ -5068,7 +5054,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;
@@ -5324,6 +5309,7 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
 
        depth_type maxdepth = 0;
        pit_type const lastpit = parit.lastpit();
+       bool changed = false;
        for ( ; parit.pit() <= lastpit ; ++parit.pit()) {
                // reduce depth if necessary
                if (parit->params().depth() > maxdepth) {
@@ -5350,15 +5336,20 @@ 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;
                        insit.inset->updateBuffer(parit, utype);
+                       changed |= insit.inset->isChanged();
                }
+
+               // are there changes in this paragraph?
+               changed |= parit->isChanged();
        }
+
+       // set change indicator for the inset (or the cell that the iterator
+       // points to, if applicable).
+       parit.text()->inset().isChanged(changed);
 }
 
 
@@ -5471,6 +5462,12 @@ int Buffer::charCount(bool with_blanks) const
 }
 
 
+bool Buffer::areChangesPresent() const
+{
+       return inset().isChanged();
+}
+
+
 Buffer::ReadStatus Buffer::reload()
 {
        setBusy(true);
@@ -5614,29 +5611,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()) {