#include "support/FileInfo.h"
#include "support/filetools.h"
+#include "support/forkedcall.h"
#include "support/path.h"
#include "support/systemcall.h"
#include "support/lstrings.h"
+#include "BoostFormat.h"
+
#include <fstream>
#include <algorithm>
#include <utility>
-#include <iostream>
using std::vector;
using std::ifstream;
fname += ".lyx";
FileDialog::Result result =
- fileDlg.Select(OnlyPath(fname),
- _("*.lyx|LyX Documents (*.lyx)"),
+ fileDlg.save(OnlyPath(fname),
+ _("*.lyx| LyX Documents (*.lyx)"),
OnlyFilename(fname));
if (result.first == FileDialog::Later)
}
+namespace {
-void AutoSave(BufferView * bv)
- // should probably be moved into BufferList (Lgb)
- // Perfect target for a thread...
-{
- if (!bv->available())
- return;
-
- if (bv->buffer()->isBakClean() || bv->buffer()->isReadonly()) {
- // We don't save now, but we'll try again later
- bv->owner()->resetAutosaveTimer();
- return;
+class AutoSaveBuffer : public ForkedProcess {
+public:
+ ///
+ AutoSaveBuffer(BufferView & bv, string const & fname)
+ : bv_(bv), fname_(fname) {}
+ ///
+ virtual ForkedProcess * clone() const {
+ return new AutoSaveBuffer(*this);
}
+ ///
+ int start();
+private:
+ ///
+ virtual int generateChild();
+ ///
+ BufferView & bv_;
+ string fname_;
+};
+
+
+int AutoSaveBuffer::start()
+{
+#if USE_BOOST_FORMAT
+ command_ = boost::io::str(boost::format(_("Auto-saving %1$s")) % fname_);
+#else
+ command_ = _("Auto-saving ") + fname_;
+#endif
+ return runNonBlocking();
+}
- bv->owner()->message(_("Autosaving current document..."));
-
- // create autosave filename
- string fname = bv->buffer()->filePath();
- fname += "#";
- fname += OnlyFilename(bv->buffer()->fileName());
- fname += "#";
+int AutoSaveBuffer::generateChild()
+{
// tmp_ret will be located (usually) in /tmp
// will that be a problem?
pid_t const pid = fork(); // If you want to debug the autosave
string const tmp_ret = lyx::tempName(string(), "lyxauto");
if (!tmp_ret.empty()) {
- bv->buffer()->writeFile(tmp_ret, 1);
+ bv_.buffer()->writeFile(tmp_ret);
// assume successful write of tmp_ret
- if (!lyx::rename(tmp_ret, fname)) {
+ if (!lyx::rename(tmp_ret, fname_)) {
failed = true;
// most likely couldn't move between filesystems
// unless write of tmp_ret failed
if (failed) {
// failed to write/rename tmp_ret so try writing direct
- if (!bv->buffer()->writeFile(fname, 1)) {
+ if (!bv_.buffer()->writeFile(fname_)) {
// It is dangerous to do this in the child,
// but safe in the parent, so...
if (pid == -1)
- bv->owner()->message(_("Autosave failed!"));
+ bv_.owner()->message(_("Autosave failed!"));
}
}
if (pid == 0) { // we are the child so...
_exit(0);
}
}
+ return pid;
+}
+
+} // namespace anon
+
+
+void AutoSave(BufferView * bv)
+ // should probably be moved into BufferList (Lgb)
+ // Perfect target for a thread...
+{
+ if (!bv->available())
+ return;
+
+ if (bv->buffer()->isBakClean() || bv->buffer()->isReadonly()) {
+ // We don't save now, but we'll try again later
+ bv->owner()->resetAutosaveTimer();
+ return;
+ }
+
+ bv->owner()->message(_("Autosaving current document..."));
+
+ // create autosave filename
+ string fname = bv->buffer()->filePath();
+ fname += '#';
+ fname += OnlyFilename(bv->buffer()->fileName());
+ fname += '#';
+
+ AutoSaveBuffer autosave(*bv, fname);
+ autosave.start();
bv->buffer()->markBakClean();
bv->owner()->resetAutosaveTimer();
// create new file with template
// SERVERCMD !
//
-Buffer * NewLyxFile(string const & filename)
+Buffer * NewFile(string const & filename)
{
// Split argument by :
string name;
FileDialog fileDlg(bv->owner(), _("Select file to insert"),
(asParagraph) ? LFUN_FILE_INSERT_ASCII_PARA : LFUN_FILE_INSERT_ASCII);
- FileDialog::Result result = fileDlg.Select(bv->owner()->buffer()->filePath());
+ FileDialog::Result result = fileDlg.open(bv->owner()->buffer()->filePath());
if (result.first == FileDialog::Later)
return string();
ifstream ifs(fname.c_str());
if (!ifs) {
- Alert::err_alert(_("Error! Cannot open specified file: "),
+ Alert::err_alert(_("Error! Cannot open specified file:"),
MakeDisplayPath(fname, 50));
return string();
}
void MenuInsertLabel(BufferView * bv, string const & arg)
{
- string label(arg);
+ string label = arg;
bv->owner()->prohibitInput();
if (label.empty()) {
Paragraph * par = bv->getLyXText()->cursor.par();
if (layout->latexname() == "theorem")
text = "thm"; // Create a correct prefix for prettyref
- text += ":";
+ text += ':';
if (layout->latextype == LATEX_PARAGRAPH ||
lyxrc.label_init_length < 0)
text.erase();