]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
Cleanup private part of Layout Box on destructor (probably not really an
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 3cfc5879c60c079579352bb985932f74053b1185..4de2771414d676488f7b3f92394c8a9a5537f300 100644 (file)
@@ -801,6 +801,7 @@ void GuiView::showEvent(QShowEvent * e)
                // No work area, switch to the background widget.
                d.setBackground();
 
+       updateToolbars();
        QMainWindow::showEvent(e);
 }
 
@@ -897,7 +898,7 @@ void GuiView::dropEvent(QDropEvent * event)
                        = theConverters().importableFormats();
                vector<const Format *>::const_iterator it = import_formats.begin();
                for (; it != import_formats.end(); ++it)
-                       if ((*it)->extension() == ext)
+                       if ((*it)->hasExtension(ext))
                                found_formats.push_back(*it);
 
                FuncRequest cmd;
@@ -1451,7 +1452,7 @@ void GuiView::errors(string const & error_type, bool from_master)
 #if EXPORT_in_THREAD && (QT_VERSION >= 0x040400)
        // We are called with from_master == false by default, so we
        // have to figure out whether that is the case or not.
-       ErrorList & el = const_cast<ErrorList &>(bv->buffer().errorList(error_type));
+       ErrorList & el = bv->buffer().errorList(error_type);
        if (el.empty()) {
            el = bv->buffer().masterBuffer()->errorList(error_type);
            from_master = true;
@@ -1656,6 +1657,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
        }
 
        case LFUN_BUFFER_WRITE_AS:
+       case LFUN_BUFFER_EXPORT_AS:
                enable = doc_buffer;
                break;
 
@@ -2066,10 +2068,10 @@ void GuiView::importDocument(string const & argument)
                        toqstr(addPath(package().system_support().absFileName(), "examples")));
 
                docstring filter = formats.prettyName(format);
-               filter += " (*.";
+               filter += " (*.{";
                // FIXME UNICODE
-               filter += from_utf8(formats.extension(format));
-               filter += ')';
+               filter += from_utf8(formats.extensions(format));
+               filter += "})";
 
                FileDialog::Result result =
                        dlg.open(toqstr(initpath), fileFilters(toqstr(filter)));
@@ -2312,6 +2314,81 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname)
 }
 
 
+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();
+}
+
+
 bool GuiView::saveBuffer(Buffer & b) {
        return saveBuffer(b, FileName());
 }
@@ -3157,6 +3234,11 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        break;
                }
 
+               case LFUN_BUFFER_EXPORT_AS:
+                       LASSERT(doc_buffer, break);
+                       exportBufferAs(*doc_buffer);
+                       break;
+
                case LFUN_BUFFER_UPDATE: {
                        d.asyncBufferProcessing(argument,
                                                doc_buffer,