]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
ui glitch
[lyx.git] / src / Buffer.cpp
index 5bd73da715315da24f5f00effdb0757f195ba092..e2aa7266647b7e175ff0f2e3f39bb490541db421 100644 (file)
@@ -128,7 +128,7 @@ namespace {
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-int const LYX_FORMAT = 404; // rgh: refstyle
+int const LYX_FORMAT = 407; // uwestoehr: support for multirow offset
 
 typedef map<string, bool> DepClean;
 typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
@@ -875,6 +875,10 @@ Buffer::ReadStatus Buffer::readFile(FileName const & fn)
                return readFile(tmpFile);
        }
 
+       // FIXME: InsetInfo needs to know whether the file is under VCS 
+       // during the parse process, so this has to be done before.
+       lyxvc().file_found_hook(d->filename);
+
        if (readDocument(lex)) {
                Alert::error(_("Document format failure"),
                        bformat(_("%1$s ended unexpectedly, which means"
@@ -884,8 +888,6 @@ Buffer::ReadStatus Buffer::readFile(FileName const & fn)
        }
 
        d->file_fully_loaded = true;
-       // InsetInfo needs to know if file is under VCS
-       lyxvc().file_found_hook(fn);
        d->read_only = !fname.isWritable();
        params().compressed = fname.isZippedFile();
        saveCheckSum();
@@ -3228,13 +3230,7 @@ int AutoSaveBuffer::generateChild()
 
 FileName Buffer::getEmergencyFileName() const
 {
-       return getEmergencyFileNameFor(d->filename);
-}
-
-
-FileName Buffer::getEmergencyFileNameFor(FileName const & fn) const
-{
-       return FileName(fn.absFileName() + ".emergency");
+       return FileName(d->filename.absFileName() + ".emergency");
 }
 
 
@@ -3250,15 +3246,9 @@ FileName Buffer::getAutosaveFileName() const
        if (!isUnnamed() || fpath.empty() || !FileName(fpath).exists())
                fpath = filePath();
 
-       string const fname = d->filename.onlyFileName();
-       return getAutosaveFileNameFor(makeAbsPath(fname, fpath));
-}
-
+       string const fname = "#" + d->filename.onlyFileName() + "#";
 
-FileName Buffer::getAutosaveFileNameFor(FileName const & fn) const
-{
-       string const fname = "#" + onlyFileName(fn.absFileName()) + "#";
-       return FileName(onlyPath(fn.absFileName()) + fname);
+       return makeAbsPath(fname, fpath);
 }
 
 
@@ -3617,25 +3607,25 @@ vector<string> Buffer::backends() const
 }
 
 
-Buffer::ReadStatus Buffer::extractFromVC(FileName const & fn)
+Buffer::ReadStatus Buffer::extractFromVC()
 {
-       bool const found = LyXVC::file_not_found_hook(fn);
+       bool const found = LyXVC::file_not_found_hook(d->filename);
        if (!found)
                return ReadFileNotFound;
-       if (!fn.isReadableFile())
+       if (!d->filename.isReadableFile())
                return ReadVCError;
        return ReadSuccess;
 }
 
 
-Buffer::ReadStatus Buffer::loadEmergency(FileName const & fn)
+Buffer::ReadStatus Buffer::loadEmergency()
 {
-       FileName const emergencyFile = getEmergencyFileNameFor(fn);
+       FileName const emergencyFile = getEmergencyFileName();
        if (!emergencyFile.exists() 
-                 || emergencyFile.lastModified() <= fn.lastModified())
+                 || emergencyFile.lastModified() <= d->filename.lastModified())
                return ReadFileNotFound;
 
-       docstring const file = makeDisplayPath(fn.absFileName(), 20);
+       docstring const file = makeDisplayPath(d->filename.absFileName(), 20);
        docstring const text = bformat(_("An emergency save of the document "
                "%1$s exists.\n\nRecover emergency save?"), file);
        
@@ -3654,7 +3644,7 @@ Buffer::ReadStatus Buffer::loadEmergency(FileName const & fn)
                } else
                        str = _("Document was NOT successfully recovered.");
                str += "\n\n" + bformat(_("Remove emergency file now?\n(%1$s)"),
-                                       makeDisplayPath(emergencyFile.absFileName()));
+                       makeDisplayPath(emergencyFile.absFileName()));
 
                int const del_emerg = 
                        Alert::prompt(_("Delete emergency file?"), str, 1, 1,
@@ -3684,15 +3674,15 @@ Buffer::ReadStatus Buffer::loadEmergency(FileName const & fn)
 }
 
 
-Buffer::ReadStatus Buffer::loadAutosave(FileName const & fn)
+Buffer::ReadStatus Buffer::loadAutosave()
 {
        // Now check if autosave file is newer.
-       FileName const autosaveFile = getAutosaveFileNameFor(fn);
+       FileName const autosaveFile = getAutosaveFileName();
        if (!autosaveFile.exists() 
-                 || autosaveFile.lastModified() <= fn.lastModified()) 
+                 || autosaveFile.lastModified() <= d->filename.lastModified()) 
                return ReadFileNotFound;
 
-       docstring const file = makeDisplayPath(fn.absFileName(), 20);
+       docstring const file = makeDisplayPath(d->filename.absFileName(), 20);
        docstring const text = bformat(_("The backup of the document %1$s " 
                "is newer.\n\nLoad the backup instead?"), file);
        int const ret = Alert::prompt(_("Load backup?"), text, 0, 2,
@@ -3720,23 +3710,23 @@ Buffer::ReadStatus Buffer::loadAutosave(FileName const & fn)
 }
 
 
-Buffer::ReadStatus Buffer::loadLyXFile(FileName const & fn)
+Buffer::ReadStatus Buffer::loadLyXFile()
 {
-       if (!fn.isReadableFile()) {
-               ReadStatus const ret_rvc = extractFromVC(fn);
+       if (!d->filename.isReadableFile()) {
+               ReadStatus const ret_rvc = extractFromVC();
                if (ret_rvc != ReadSuccess)
                        return ret_rvc;
        }
 
-       ReadStatus const ret_re = loadEmergency(fn);
+       ReadStatus const ret_re = loadEmergency();
        if (ret_re == ReadSuccess || ret_re == ReadCancel)
                return ret_re;
        
-       ReadStatus const ret_ra = loadAutosave(fn);
+       ReadStatus const ret_ra = loadAutosave();
        if (ret_ra == ReadSuccess || ret_ra == ReadCancel)
                return ret_ra;
 
-       return loadThisLyXFile(fn);
+       return loadThisLyXFile(d->filename);
 }
 
 
@@ -4117,7 +4107,7 @@ Buffer::ReadStatus Buffer::reload()
        d->filename.refresh();
        docstring const disp_fn = makeDisplayPath(d->filename.absFileName());
 
-       ReadStatus const status = loadLyXFile(d->filename);
+       ReadStatus const status = loadLyXFile();
        if (status == ReadSuccess) {
                updateBuffer();
                changed(true);
@@ -4135,6 +4125,39 @@ Buffer::ReadStatus Buffer::reload()
 }
 
 
+bool Buffer::saveAs(FileName const & fn)
+{
+       FileName const old_name = fileName();
+       FileName const old_auto = getAutosaveFileName();
+       bool const old_unnamed = isUnnamed();
+
+       setFileName(fn.absFileName());
+       markDirty();
+       setUnnamed(false);
+
+       if (save()) {
+               // bring the autosave file with us, just in case.
+               moveAutosaveFile(old_auto);
+               // validate version control data and
+               // correct buffer title
+               lyxvc().file_found_hook(fileName());
+               updateTitles();
+               // the file has now been saved to the new location.
+               // we need to check that the locations of child buffers
+               // are still valid.
+               checkChildBuffers();
+               return true;
+       } else {
+               // save failed
+               // reset the old filename and unnamed state
+               setFileName(old_name.absFileName());
+               setUnnamed(old_unnamed);
+               saveCheckSum();
+               return false;
+       }
+}
+
+
 // FIXME We could do better here, but it is complicated. What would be
 // nice is to offer either (a) to save the child buffer to an appropriate
 // location, so that it would "move with the master", or else (b) to update