#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;
if (filename.empty()) {
- FileDialog fileDlg(bv->owner(),
- _("Choose a filename to save document as"),
+ FileDialog fileDlg(_("Choose a filename to save document as"),
LFUN_WRITEAS,
make_pair(string(_("Documents|#o#O")),
string(lyxrc.document_path)),
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);
+ 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)) {
+ 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();
string fname = f;
if (fname.empty()) {
- FileDialog fileDlg(bv->owner(), _("Select file to insert"),
+ FileDialog fileDlg(_("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 const getPossibleLabel(BufferView const & bv)
{
- string label(arg);
- bv->owner()->prohibitInput();
- if (label.empty()) {
- Paragraph * par = bv->getLyXText()->cursor.par();
- LyXLayout_ptr layout = par->layout();
- if (layout->latextype == LATEX_PARAGRAPH && par->previous()) {
- Paragraph * par2 = par->previous();
-
- LyXLayout_ptr const & layout2 = par2->layout();
-
- if (layout2->latextype != LATEX_PARAGRAPH) {
- par = par2;
- layout = layout2;
- }
- }
- string text = layout->latexname().substr(0, 3);
- if (layout->latexname() == "theorem")
- text = "thm"; // Create a correct prefix for prettyref
-
- text += ":";
- if (layout->latextype == LATEX_PARAGRAPH ||
- lyxrc.label_init_length < 0)
- text.erase();
- string par_text = par->asString(bv->buffer(), false);
- for (int i = 0; i < lyxrc.label_init_length; ++i) {
- if (par_text.empty())
- break;
- string head;
- par_text = split(par_text, head, ' ');
- if (i > 0)
- text += '-'; // Is it legal to use spaces in
- // labels ?
- text += head;
- }
+ Paragraph * par = bv.getLyXText()->cursor.par();
+ LyXLayout_ptr layout = par->layout();
+ if (layout->latextype == LATEX_PARAGRAPH && par->previous()) {
+ Paragraph * par2 = par->previous();
- pair<bool, string> result =
- Alert::askForText(_("Enter new label to insert:"), text);
- if (result.first) {
- label = trim(result.second);
+ LyXLayout_ptr const & layout2 = par2->layout();
+
+ if (layout2->latextype != LATEX_PARAGRAPH) {
+ par = par2;
+ layout = layout2;
}
}
- if (!label.empty()) {
- InsetCommandParams p("label", label);
- InsetLabel * inset = new InsetLabel(p);
- bv->insertInset(inset);
+
+ string text = layout->latexname().substr(0, 3);
+ if (layout->latexname() == "theorem")
+ text = "thm"; // Create a correct prefix for prettyref
+
+ text += ':';
+ if (layout->latextype == LATEX_PARAGRAPH ||
+ lyxrc.label_init_length < 0)
+ text.erase();
+
+ string par_text = par->asString(bv.buffer(), false);
+ for (int i = 0; i < lyxrc.label_init_length; ++i) {
+ if (par_text.empty())
+ break;
+ string head;
+ par_text = split(par_text, head, ' ');
+ if (i > 0)
+ text += '-'; // Is it legal to use spaces in
+ // labels ?
+ text += head;
}
- bv->owner()->allowInput();
+
+ return text;
}