]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Try to deal with one of the big problems here, namely, that we
[lyx.git] / src / Buffer.cpp
index 84055b33ea56a259bb476858c2bd4032819092e5..11c9231bb651b4be4cc1a87c67feae6cbd6f7920 100644 (file)
@@ -42,6 +42,7 @@
 #include "Lexer.h"
 #include "LyXAction.h"
 #include "LyX.h"
+#include "LyXFunc.h"
 #include "LyXRC.h"
 #include "LyXVC.h"
 #include "output_docbook.h"
@@ -1391,7 +1392,7 @@ void Buffer::makeLyXHTMLFile(FileName const & fname,
                              OutputParams const & runparams,
                              bool const body_only) const
 {
-       LYXERR(Debug::LATEX, "makeLYXHTMLFile...");
+       LYXERR(Debug::LATEX, "makeLyXHTMLFile...");
 
        ofdocstream ofs;
        if (!openFileWrite(ofs, fname))
@@ -1633,27 +1634,73 @@ void Buffer::markDepClean(string const & name)
 
 bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 {
+       if (isInternal()) {
+               // FIXME? if there is an Buffer LFUN that can be dispatched even
+               // if internal, put a switch '(cmd.action)' here.
+               return false;
+       }
+
+       bool enable = true;
+
        switch (cmd.action) {
+
                case LFUN_BUFFER_TOGGLE_READ_ONLY:
                        flag.setOnOff(isReadonly());
                        break;
 
+               // FIXME: There is need for a command-line import.
+               //case LFUN_BUFFER_IMPORT:
+
+               case LFUN_BUFFER_AUTO_SAVE:
+                       break;
+
+               case LFUN_BUFFER_EXPORT_CUSTOM:
+                       // FIXME: Nothing to check here?
+                       break;
+
                case LFUN_BUFFER_EXPORT: {
                        docstring const arg = cmd.argument();
-                       bool enable = arg == "custom" || isExportable(to_utf8(arg));
+                       enable = arg == "custom" || isExportable(to_utf8(arg));
                        if (!enable)
                                flag.message(bformat(
                                        _("Don't know how to export to format: %1$s"), arg));
-                       flag.setEnabled(enable);
                        break;
                }
 
+               case LFUN_MASTER_BUFFER_UPDATE:
+               case LFUN_MASTER_BUFFER_VIEW: 
+                       enable = parent() != 0;
+                       break;
+               case LFUN_BUFFER_UPDATE:
+               case LFUN_BUFFER_VIEW: {
+                       string format = to_utf8(cmd.argument());
+                       if (cmd.argument().empty())
+                               format = getDefaultOutputFormat();
+                       typedef vector<Format const *> Formats;
+                       Formats formats;
+                       formats = exportableFormats(true);
+                       Formats::const_iterator fit = formats.begin();
+                       Formats::const_iterator end = formats.end();
+                       enable = false;
+                       for (; fit != end ; ++fit) {
+                               if ((*fit)->name() == format)
+                                       enable = true;
+                       }
+                       break;
+               }
+               case LFUN_BUFFER_CHKTEX:
+                       enable = isLatex() && !lyxrc.chktex_command.empty();
+                       break;
+
+               case LFUN_BUILD_PROGRAM:
+                       enable = isExportable("program");
+                       break;
+
                case LFUN_BRANCH_ACTIVATE: 
                case LFUN_BRANCH_DEACTIVATE: {
                        BranchList const & branchList = params().branchlist();
                        docstring const branchName = cmd.argument();
-                       flag.setEnabled(!branchName.empty()
-                               && branchList.find(branchName));
+                       enable = !branchName.empty() && branchList.find(branchName);
                        break;
                }
 
@@ -1661,12 +1708,16 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                case LFUN_BRANCHES_RENAME:
                case LFUN_BUFFER_PRINT:
                        // if no Buffer is present, then of course we won't be called!
-                       flag.setEnabled(true);
+                       break;
+
+               case LFUN_BUFFER_LANGUAGE:
+                       enable = !isReadonly();
                        break;
 
                default:
                        return false;
        }
+       flag.setEnabled(enable);
        return true;
 }
 
@@ -1682,8 +1733,16 @@ void Buffer::dispatch(string const & command, DispatchResult & result)
 // whether we have a GUI or not. The boolean use_gui holds this information.
 void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
 {
+       if (isInternal()) {
+               // FIXME? if there is an Buffer LFUN that can be dispatched even
+               // if internal, put a switch '(cmd.action)' here.
+               dr.dispatched(false);
+               return;
+       }
+       string const argument = to_utf8(func.argument());
        // We'll set this back to false if need be.
        bool dispatched = true;
+       undo().beginUndoGroup();
 
        switch (func.action) {
        case LFUN_BUFFER_TOGGLE_READ_ONLY:
@@ -1694,7 +1753,12 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                break;
 
        case LFUN_BUFFER_EXPORT: {
-               bool success = doExport(to_utf8(func.argument()), false);
+               if (argument == "custom") {
+                       lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "sendto"));
+                       break;
+               }
+               doExport(argument, false);
+               bool success = doExport(argument, false);
                dr.setError(success);
                if (!success)
                        dr.setMessage(bformat(_("Error exporting to format: %1$s."), 
@@ -1702,6 +1766,96 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                break;
        }
 
+       case LFUN_BUFFER_UPDATE: {
+               string format = argument;
+               if (argument.empty())
+                       format = getDefaultOutputFormat();
+               doExport(format, true);
+               break;
+       }
+
+       case LFUN_BUFFER_VIEW: {
+               string format = argument;
+               if (argument.empty())
+                       format = getDefaultOutputFormat();
+               preview(format);
+               break;
+       }
+
+       case LFUN_MASTER_BUFFER_UPDATE: {
+               string format = argument;
+               if (argument.empty())
+                       format = masterBuffer()->getDefaultOutputFormat();
+               masterBuffer()->doExport(format, true);
+               break;
+       }
+
+       case LFUN_MASTER_BUFFER_VIEW: {
+               string format = argument;
+               if (argument.empty())
+                       format = masterBuffer()->getDefaultOutputFormat();
+               masterBuffer()->preview(format);
+               break;
+       }
+
+       case LFUN_BUILD_PROGRAM:
+               doExport("program", true);
+               break;
+
+       case LFUN_BUFFER_CHKTEX:
+               runChktex();
+               break;
+
+       case LFUN_BUFFER_EXPORT_CUSTOM: {
+               string format_name;
+               string command = split(argument, format_name, ' ');
+               Format const * format = formats.getFormat(format_name);
+               if (!format) {
+                       lyxerr << "Format \"" << format_name
+                               << "\" not recognized!"
+                               << endl;
+                       break;
+               }
+
+               // The name of the file created by the conversion process
+               string filename;
+
+               // Output to filename
+               if (format->name() == "lyx") {
+                       string const latexname = latexName(false);
+                       filename = changeExtension(latexname,
+                               format->extension());
+                       filename = addName(temppath(), filename);
+
+                       if (!writeFile(FileName(filename)))
+                               break;
+
+               } else {
+                       doExport(format_name, true, filename);
+               }
+
+               // Substitute $$FName for filename
+               if (!contains(command, "$$FName"))
+                       command = "( " + command + " ) < $$FName";
+               command = subst(command, "$$FName", filename);
+
+               // Execute the command in the background
+               Systemcall call;
+               call.startscript(Systemcall::DontWait, command);
+               break;
+       }
+
+       // FIXME: There is need for a command-line import.
+       /*
+       case LFUN_BUFFER_IMPORT:
+               doImport(argument);
+               break;
+       */
+
+       case LFUN_BUFFER_AUTO_SAVE:
+               autoSave();
+               break;
+
        case LFUN_BRANCH_ADD: {
                BranchList & branchList = params().branchlist();
                docstring const branchName = func.argument();
@@ -1897,11 +2051,22 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                break;
        }
 
+       case LFUN_BUFFER_LANGUAGE: {
+               Language const * oldL = params().language;
+               Language const * newL = languages.getLanguage(argument);
+               if (!newL || oldL == newL)
+                       break;
+               if (oldL->rightToLeft() == newL->rightToLeft() && !isMultiLingual())
+                       changeLanguage(oldL, newL);
+               break;
+       }
+
        default:
                dispatched = false;
                break;
        }
        dr.dispatched(dispatched);
+       undo().endUndoGroup();
 }
 
 
@@ -2959,10 +3124,11 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir,
        // Plain text backend
        if (backend_format == "text")
                writePlaintextFile(*this, FileName(filename), runparams);
-       // no backend
-       else if (backend_format == "xhtml")
+       // HTML backend
+       else if (backend_format == "xhtml") {
+               runparams.flavor = OutputParams::HTML;
                makeLyXHTMLFile(FileName(filename), runparams);
-       else if (backend_format == "lyx")
+       }       else if (backend_format == "lyx")
                writeFile(FileName(filename));
        // Docbook backend
        else if (isDocBook()) {
@@ -3137,7 +3303,8 @@ bool Buffer::readFileHelper(FileName const & s)
                                str = _("Document was successfully recovered.");
                        else
                                str = _("Document was NOT successfully recovered.");
-                       str += "\n\n" + _("Remove emergency file now?");
+                       str += "\n\n" + bformat(_("Remove emergency file now?\n(%1$s)"),
+                                               from_utf8(e.absFilename()));
 
                        if (!Alert::prompt(_("Delete emergency file?"), str, 1, 1,
                                        _("&Remove"), _("&Keep it"))) {