X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=e2185fbd897a18711e63f3a4c0335fa66ad007d9;hb=1639abb8edaa492c649e69d093436f8a96f07bec;hp=b1807ed6f27bce50f265ce6d18382dacc493ef0a;hpb=9efa43d2be7dcff0c1152b6f6a45801cfdd6d70e;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index b1807ed6f2..e2185fbd89 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -517,8 +517,12 @@ Buffer::~Buffer() Impl::BufferPositionMap::iterator end = d->children_positions.end(); for (; it != end; ++it) { Buffer * child = const_cast(it->first); - if (theBufferList().isLoaded(child)) - theBufferList().releaseChild(this, child); + if (theBufferList().isLoaded(child)) { + if (theBufferList().isOthersChild(this, child)) + child->setParent(0); + else + theBufferList().release(child); + } } if (!isClean()) { @@ -1029,7 +1033,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(); @@ -1314,7 +1321,7 @@ FileName Buffer::getBackupName() const { fn.onlyPath().absFileName() : lyxrc.backupdir_path; string const fform = convert(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 @@ -1333,7 +1340,7 @@ FileName Buffer::getBackupName() const { v = 1000; break; } - string newbackname = backname + "-" + convert(v); + string const newbackname = backname + "-" + convert(v); backup.set(addName(fpath, addExtension(newbackname, fext))); v++; } @@ -1401,7 +1408,8 @@ bool Buffer::save() const bool made_backup = true; FileName backupName; - if (lyxrc.make_backup || d->need_format_backup) { + bool const needBackup = lyxrc.make_backup || d->need_format_backup; + if (needBackup) { if (d->need_format_backup) backupName = getBackupName(); @@ -1458,8 +1466,8 @@ bool Buffer::save() const } // else we saved the file, but failed to move it to the right location. - if (lyxrc.make_backup && made_backup && !symlink) { - // the original file was moved to filename.lyx~, so it will look + if (needBackup && made_backup && !symlink) { + // the original file was moved to some new location, so it will look // to the user as if it was deleted. (see bug #9234.) we could try // to restore it, but that would basically mean trying to do again // what we just failed to do. better to leave things as they are. @@ -2221,8 +2229,8 @@ void Buffer::getLabelList(vector & list) const list.clear(); shared_ptr toc = d->toc_backend.toc("label"); - TocIterator toc_it = toc->begin(); - TocIterator end = toc->end(); + Toc::const_iterator toc_it = toc->begin(); + Toc::const_iterator end = toc->end(); for (; toc_it != end; ++toc_it) { if (toc_it->depth() == 0) list.push_back(toc_it->str()); @@ -2757,12 +2765,14 @@ 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; 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"); @@ -3024,12 +3034,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; } @@ -5066,13 +5085,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 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 (d->old_position.empty() - || equivalent(FileName(d->old_position), FileName(filePath())) - || !FileName(addExtension(absname, ext)).exists()) + if (!FileName(addExtension(absname, ext)).exists()) return name; if (isabsolute)