]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Fix typo.
[lyx.git] / src / Buffer.cpp
index 115a542544e8353550c78f4f428d5b58c4058955..5df91ec8532cb20b23ee6bfdd3a417202efd5f2e 100644 (file)
@@ -370,6 +370,10 @@ public:
                + (with_blanks ? blank_count_ : 0);
        }
 
+       // does the buffer contains tracked changes? (if so, we automatically
+       // display the review toolbar)
+       mutable bool tracked_changes_present_;
+
 private:
        /// So we can force access via the accessors.
        mutable Buffer const * parent_buffer;
@@ -442,6 +446,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_;
 }
 
 
@@ -1033,7 +1038,10 @@ bool Buffer::readDocument(Lexer & lex)
        params().indiceslist().addDefault(B_("Index"));
 
        // read main text
-       d->old_position = originFilePath();
+       if (FileName::isAbsolute(params().origin))
+               d->old_position = params().origin;
+       else
+               d->old_position = filePath();
        bool const res = text().read(lex, errorList, d->inset);
        d->old_position.clear();
 
@@ -1318,7 +1326,7 @@ FileName Buffer::getBackupName() const {
                fn.onlyPath().absFileName() :
                lyxrc.backupdir_path;
        string const fform = convert<string>(d->file_format);
-       string const backname = fname + "-" + fform;
+       string const backname = fname + "-lyxformat-" + fform;
        FileName backup(addName(fpath, addExtension(backname, fext)));
 
        // limit recursion, just in case
@@ -1652,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();
@@ -1740,8 +1750,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
@@ -2139,7 +2151,7 @@ void Buffer::writeLyXHTMLSource(odocstream & os,
        if (output_body) {
                bool const output_body_tag = (output != IncludedFile);
                if (output_body_tag)
-                       os << "<body>\n";
+                       os << "<body dir=\"auto\">\n";
                XHTMLStream xs(os);
                if (output != IncludedFile)
                        // if we're an included file, the counters are in the master.
@@ -2762,12 +2774,16 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                break;
 
        case LFUN_CHANGES_TRACK:
-               undo().recordUndoBufferParams(CursorData());
+               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:
-               undo().recordUndoBufferParams(CursorData());
+               if (params().save_transient_properties)
+                       undo().recordUndoBufferParams(CursorData());
                params().output_changes = !params().output_changes;
                if (params().output_changes) {
                        bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
@@ -3029,12 +3045,21 @@ string Buffer::filePath() const
 }
 
 
-string Buffer::originFilePath() const
+DocFileName Buffer::getReferencedFileName(string const & fn) const
 {
-       if (FileName::isAbsolute(params().origin))
-               return params().origin;
+       DocFileName result;
+       if (FileName::isAbsolute(fn) || !FileName::isAbsolute(params().origin))
+               result.set(fn, filePath());
+       else {
+               // filePath() ends with a path separator
+               FileName const test(filePath() + fn);
+               if (test.exists())
+                       result.set(fn, filePath());
+               else
+                       result.set(fn, params().origin);
+       }
 
-       return filePath();
+       return result;
 }
 
 
@@ -4290,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;
 }
 
 
@@ -4570,6 +4591,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
        // update all caches
        clearReferenceCache();
        updateMacros();
+       setChangesPresent(false);
 
        Buffer & cbuf = const_cast<Buffer &>(*this);
 
@@ -4833,6 +4855,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();
@@ -5071,13 +5096,23 @@ void Buffer::checkMasterBuffer()
 
 string Buffer::includedFilePath(string const & name, string const & ext) const
 {
+       if (d->old_position.empty() ||
+           equivalent(FileName(d->old_position), FileName(filePath())))
+               return name;
+
        bool isabsolute = FileName::isAbsolute(name);
-       // old_position already contains a trailing path separator
-       string const absname = isabsolute ? name : d->old_position + name;
+       // both old_position and filePath() end with a path separator
+       string absname = isabsolute ? name : d->old_position + name;
 
-       if (d->old_position.empty()
-           || equivalent(FileName(d->old_position), FileName(filePath()))
-           || !FileName(addExtension(absname, ext)).exists())
+       // if old_position is set to origin, we need to do the equivalent of
+       // getReferencedFileName() (see readDocument())
+       if (!isabsolute && d->old_position == params().origin) {
+               FileName const test(addExtension(filePath() + name, ext));
+               if (test.exists())
+                       absname = filePath() + name;
+       }
+
+       if (!FileName(addExtension(absname, ext)).exists())
                return name;
 
        if (isabsolute)
@@ -5087,4 +5122,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