]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Let getPosNearX take horizontal scrolling into account
[lyx.git] / src / Buffer.cpp
index b1807ed6f27bce50f265ce6d18382dacc493ef0a..e2185fbd897a18711e63f3a4c0335fa66ad007d9 100644 (file)
@@ -517,8 +517,12 @@ Buffer::~Buffer()
                Impl::BufferPositionMap::iterator end = d->children_positions.end();
                for (; it != end; ++it) {
                        Buffer * child = const_cast<Buffer *>(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<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
@@ -1333,7 +1340,7 @@ FileName Buffer::getBackupName() const {
                        v = 1000;
                        break;
                }
-               string newbackname = backname + "-" + convert<string>(v);
+               string const newbackname = backname + "-" + convert<string>(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<docstring> & list) const
 
        list.clear();
        shared_ptr<Toc> 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)