]> git.lyx.org Git - features.git/blobdiff - src/Buffer.cpp
* docstream: factorize out some code and introduce odocfstream::reset()
[features.git] / src / Buffer.cpp
index 40f439de28d72d291132bc888937387bb82e5882..7ab95e8f0ea53360609a82439d2add74e86ac26e 100644 (file)
 #include "frontends/alert.h"
 #include "frontends/Delegates.h"
 #include "frontends/WorkAreaManager.h"
-#include "frontends/FileDialog.h"
 
 #include "graphics/Previews.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/FileFilterList.h"
+#include "support/FileNameList.h"
 #include "support/filetools.h"
 #include "support/ForkedCalls.h"
 #include "support/gettext.h"
@@ -130,6 +130,7 @@ using support::changeExtension;
 using support::cmd_ret;
 using support::createBufferTmpDir;
 using support::FileName;
+using support::FileNameList;
 using support::libFileSearch;
 using support::latex_path;
 using support::ltrim;
@@ -230,6 +231,10 @@ public:
 
        ///
        Undo undo_;
+
+       /// A cache for the bibfiles (including bibfiles of loaded child
+       /// documents), needed for appropriate update of natbib labels.
+       mutable FileNameList bibfilesCache_;
 };
 
 
@@ -874,8 +879,6 @@ bool Buffer::save() const
 
        if (writeFile(d->filename)) {
                markClean();
-               removeAutosaveFile(absFileName());
-               saveCheckSum(d->filename);
                return true;
        } else {
                // Saving failed, so backup is not backup
@@ -899,27 +902,40 @@ bool Buffer::writeFile(FileName const & fname) const
                content = FileName(addName(temppath(), "content.lyx"));
        else
                content = fname;
-       
+
+       docstring const str = bformat(_("Saving document %1$s..."),
+               makeDisplayPath(content.absFilename()));
+       message(str);
+
        if (params().compressed) {
                gz::ogzstream ofs(content.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
-               if (!ofs)
-                       return false;
-
-               retval = write(ofs);
+               retval = ofs && write(ofs);
        } else {
                ofstream ofs(content.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
-               if (!ofs)
-                       return false;
+               retval = ofs && write(ofs);
+       }
 
-               retval = write(ofs);
+       if (!retval) {
+               message(str + _(" could not write file!."));
+               return false;
        }
 
-       if (retval && params().embedded) {
-               // write file.lyx and all the embedded files to the zip file fname
-               // if embedding is enabled
-               return d->embedded_files.writeFile(fname);
+       removeAutosaveFile(d->filename.absFilename());
+       saveCheckSum(d->filename);
+       message(str + _(" done."));
+
+       if (!params().embedded)
+               return true;
+
+       message(str + _(" writing embedded files!."));
+       // if embedding is enabled, write file.lyx and all the embedded files
+       // to the zip file fname.
+       if (!d->embedded_files.writeFile(fname)) {
+               message(str + _(" could not write embedded files!."));
+               return false;
        }
-       return retval;
+       message(str + _(" error while writing embedded files."));
+       return true;
 }
 
 
@@ -993,7 +1009,15 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
        string const encoding = runparams.encoding->iconvName();
        LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << "...");
 
-       odocfstream ofs(encoding);
+       odocfstream ofs;
+       try { ofs.reset(encoding); }
+       catch (iconv_codecvt_facet_exception & e) {
+               lyxerr << "Caught iconv exception: " << e.what() << endl;
+               Alert::error(_("Iconv software exception Detected"), bformat(_("Please "
+                       "verify that the support software for your encoding (%1$s) is "
+                       "properly installed"), from_ascii(encoding)));
+               return false;
+       }
        if (!openFileWrite(ofs, fname))
                return false;
 
@@ -1440,22 +1464,22 @@ void Buffer::updateBibfilesCache() const
                return;
        }
 
-       bibfilesCache_.clear();
+       d->bibfilesCache_.clear();
        for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
                if (it->lyxCode() == BIBTEX_CODE) {
                        InsetBibtex const & inset =
                                static_cast<InsetBibtex const &>(*it);
-                       vector<FileName> const bibfiles = inset.getFiles(*this);
-                       bibfilesCache_.insert(bibfilesCache_.end(),
+                       FileNameList const bibfiles = inset.getFiles(*this);
+                       d->bibfilesCache_.insert(d->bibfilesCache_.end(),
                                bibfiles.begin(),
                                bibfiles.end());
                } else if (it->lyxCode() == INCLUDE_CODE) {
                        InsetInclude & inset =
                                static_cast<InsetInclude &>(*it);
                        inset.updateBibfilesCache(*this);
-                       vector<FileName> const & bibfiles =
+                       FileNameList const & bibfiles =
                                        inset.getBibfilesCache(*this);
-                       bibfilesCache_.insert(bibfilesCache_.end(),
+                       d->bibfilesCache_.insert(d->bibfilesCache_.end(),
                                bibfiles.begin(),
                                bibfiles.end());
                }
@@ -1463,7 +1487,7 @@ void Buffer::updateBibfilesCache() const
 }
 
 
-vector<FileName> const & Buffer::getBibfilesCache() const
+FileNameList const & Buffer::getBibfilesCache() const
 {
        // if this is a child document and the parent is already loaded
        // use the parent's cache instead
@@ -1473,10 +1497,10 @@ vector<FileName> const & Buffer::getBibfilesCache() const
                return tmp->getBibfilesCache();
 
        // We update the cache when first used instead of at loading time.
-       if (bibfilesCache_.empty())
+       if (d->bibfilesCache_.empty())
                const_cast<Buffer *>(this)->updateBibfilesCache();
 
-       return bibfilesCache_;
+       return d->bibfilesCache_;
 }
 
 
@@ -2082,7 +2106,7 @@ void Buffer::autoSave() const
        // create autosave filename
        string fname = filePath();
        fname += '#';
-       fname += onlyFilename(absFileName());
+       fname += d->filename.onlyFileName();
        fname += '#';
 
        AutoSaveBuffer autosave(*this, FileName(fname));
@@ -2093,115 +2117,6 @@ void Buffer::autoSave() const
 }
 
 
-/** Write a buffer to a new file name and rename the buffer
-    according to the new file name.
-
-    This function is e.g. used by menu callbacks and
-    LFUN_BUFFER_WRITE_AS.
-
-    If 'newname' is empty (the default), the user is asked via a
-    dialog for the buffer's new name and location.
-
-    If 'newname' is non-empty and has an absolute path, that is used.
-    Otherwise the base directory of the buffer is used as the base
-    for any relative path in 'newname'.
-*/
-
-bool Buffer::writeAs(string const & newname)
-{
-       string fname = absFileName();
-       string const oldname = fname;
-
-       if (newname.empty()) {  /// No argument? Ask user through dialog
-
-               // FIXME UNICODE
-               FileDialog dlg(_("Choose a filename to save document as"),
-                                  LFUN_BUFFER_WRITE_AS);
-               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-               dlg.setButton2(_("Templates|#T#t"), from_utf8(lyxrc.template_path));
-
-               if (!support::isLyXFilename(fname))
-                       fname += ".lyx";
-
-               support::FileFilterList const filter(_("LyX Documents (*.lyx)"));
-
-               FileDialog::Result result =
-                       dlg.save(from_utf8(onlyPath(fname)),
-                                    filter,
-                                    from_utf8(onlyFilename(fname)));
-
-               if (result.first == FileDialog::Later)
-                       return false;
-
-               fname = to_utf8(result.second);
-
-               if (fname.empty())
-                       return false;
-
-               // Make sure the absolute filename ends with appropriate suffix
-               fname = makeAbsPath(fname).absFilename();
-               if (!support::isLyXFilename(fname))
-                       fname += ".lyx";
-
-       } else 
-               fname = makeAbsPath(newname, onlyPath(oldname)).absFilename();
-
-       if (FileName(fname).exists()) {
-               docstring const file = makeDisplayPath(fname, 30);
-               docstring text = bformat(_("The document %1$s already "
-                                          "exists.\n\nDo you want to "
-                                          "overwrite that document?"), 
-                                        file);
-               int const ret = Alert::prompt(_("Overwrite document?"),
-                       text, 0, 1, _("&Overwrite"), _("&Cancel"));
-
-               if (ret == 1)
-                       return false;
-       }
-
-       // Ok, change the name of the buffer
-       setFileName(fname);
-       markDirty();
-       bool unnamed = isUnnamed();
-       setUnnamed(false);
-       saveCheckSum(FileName(fname));
-
-       if (!menuWrite()) {
-               setFileName(oldname);
-               setUnnamed(unnamed);
-               saveCheckSum(FileName(oldname));
-               return false;
-       }
-
-       removeAutosaveFile(oldname);
-       return true;
-}
-
-
-bool Buffer::menuWrite()
-{
-       if (save()) {
-               LyX::ref().session().lastFiles().add(FileName(absFileName()));
-               return true;
-       }
-
-       // FIXME: we don't tell the user *WHY* the save failed !!
-
-       docstring const file = makeDisplayPath(absFileName(), 30);
-
-       docstring text = bformat(_("The document %1$s could not be saved.\n\n"
-                                  "Do you want to rename the document and "
-                                  "try again?"), file);
-       int const ret = Alert::prompt(_("Rename and save?"),
-               text, 0, 1, _("&Rename"), _("&Cancel"));
-
-       if (ret != 0)
-               return false;
-
-       return writeAs();
-}
-
-
 void Buffer::resetChildDocuments(bool close_them) const
 {
        for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {