+ bool const saved = saveBuffer(b, fname);
+ if (saved)
+ b.reload(false);
+ return saved;
+}
+
+
+struct PrettyNameComparator
+{
+ bool operator()(Format const *first, Format const *second) const {
+ return compare_ascii_no_case(first->prettyname(), second->prettyname()) <= 0;
+ }
+};
+
+
+bool GuiView::exportBufferAs(Buffer & b)
+{
+ FileName fname = b.fileName();
+
+ FileDialog dlg(qt_("Choose a filename to export the document as"));
+ dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+
+ QStringList types;
+ types << "Any supported format (*.*)";
+ Formats::const_iterator it = formats.begin();
+ vector<Format const *> export_formats;
+ for (; it != formats.end(); ++it)
+ if (it->documentFormat() && it->inExportMenu())
+ export_formats.push_back(&(*it));
+ PrettyNameComparator cmp;
+ sort(export_formats.begin(), export_formats.end(), cmp);
+ vector<Format const *>::const_iterator fit = export_formats.begin();
+ for (; fit != export_formats.end(); ++fit)
+ types << toqstr((*fit)->prettyname() + " (*." + (*fit)->extension() + ")");
+ QString filter;
+ FileDialog::Result result =
+ dlg.save(toqstr(fname.onlyPath().absFileName()),
+ types,
+ toqstr(fname.onlyFileName()),
+ &filter);
+ if (result.first != FileDialog::Chosen)
+ return false;
+
+ string s = fromqstr(filter);
+ size_t pos = s.find(" (*.");
+ LASSERT(pos != string::npos, /**/);
+ string fmt_prettyname = s.substr(0, pos);
+ string fmt_name;
+ fname.set(fromqstr(result.second));
+ if (fmt_prettyname == "Any supported format")
+ fmt_name = formats.getFormatFromExtension(fname.extension());
+ else
+ fmt_name = formats.getFormatFromPrettyName(fmt_prettyname);
+ LYXERR(Debug::FILES, "fmt_prettyname=" << fmt_prettyname
+ << ", fmt_name=" << fmt_name << ", fname=" << fname.absFileName());
+
+ if (fmt_name.empty() || fname.empty())
+ return false;
+
+ // fname is now the new Buffer location.
+ if (FileName(fname).exists()) {
+ docstring const file = makeDisplayPath(fname.absFileName(), 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, 2, _("&Overwrite"), _("&Rename"), _("&Cancel"));
+ switch (ret) {
+ case 0: break;
+ case 1: return exportBufferAs(b);
+ case 2: return false;
+ }
+ }
+
+ FuncRequest cmd(LFUN_BUFFER_EXPORT, fmt_name + " " + fname.absFileName());
+ DispatchResult dr;
+ dispatch(cmd, dr);
+ return dr.dispatched();