#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"
using support::cmd_ret;
using support::createBufferTmpDir;
using support::FileName;
+using support::FileNameList;
using support::libFileSearch;
using support::latex_path;
using support::ltrim;
///
Undo undo_;
+
+ /// A cache for the bibfiles (including bibfiles of loaded child
+ /// documents), needed for appropriate update of natbib labels.
+ mutable FileNameList bibfilesCache_;
};
if (writeFile(d->filename)) {
markClean();
- removeAutosaveFile(absFileName());
- saveCheckSum(d->filename);
return true;
} else {
// Saving failed, so backup is not backup
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;
}
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;
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());
}
}
-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
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_;
}
// create autosave filename
string fname = filePath();
fname += '#';
- fname += onlyFilename(absFileName());
+ fname += d->filename.onlyFileName();
fname += '#';
AutoSaveBuffer autosave(*this, FileName(fname));
}
-/** 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) {