]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
added a parseError signal to Buffer and use it
[lyx.git] / src / lyxfunc.C
index 76dc5425cec9398c15a1eef22ecb7e3a4a5d0bc2..576d918963acbdcd4b81dca3f74ed21ff9712c61 100644 (file)
@@ -15,6 +15,8 @@
 #include "kbmap.h"
 #include "lyxrow.h"
 #include "bufferlist.h"
+#include "buffer.h"
+#include "buffer_funcs.h"
 #include "BufferView.h"
 #include "lyxserver.h"
 #include "intl.h"
@@ -43,6 +45,7 @@
 #include "ParagraphParameters.h"
 
 #include "insets/insetcommand.h"
+#include "insets/insetexternal.h"
 #include "insets/insettabular.h"
 
 #include "mathed/formulamacro.h"
@@ -316,10 +319,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        // encode this in the function itself.
        bool disable = false;
        switch (ev.action) {
-       case LFUN_MENUPRINT:
-               disable = !Exporter::IsExportable(buf, "dvi")
-                       || lyxrc.print_command == "none";
-               break;
        case LFUN_EXPORT:
                disable = ev.argument != "custom"
                        && !Exporter::IsExportable(buf, ev.argument);
@@ -351,10 +350,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                disable = !Exporter::IsExportable(buf, "program");
                break;
 
-       case LFUN_LAYOUT_CHARACTER:
-               disable = tli && tli->lyxCode() == Inset::ERT_CODE;
-               break;
-
        case LFUN_LAYOUT_TABULAR:
                disable = !tli
                        || (tli->lyxCode() != Inset::TABULAR_CODE
@@ -461,7 +456,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                break;
        case LFUN_VC_REVERT:
        case LFUN_VC_UNDO:
-       case LFUN_VC_HISTORY:
                disable = !buf->lyxvc.inUse();
                break;
        case LFUN_MENURELOAD:
@@ -490,7 +484,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        case LFUN_INSET_SETTINGS: {
                disable = true;
                UpdatableInset * inset = view()->theLockingInset();
-               
+
                if (!inset)
                        break;
 
@@ -500,7 +494,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                // jump back to owner if an InsetText, so
                // we get back to the InsetTabular or whatever
                if (inset->lyxCode() == Inset::TEXT_CODE)
-                       inset = static_cast<UpdatableInset*>(inset->owner());
+                       inset = inset->owner();
 
                Inset::Code code = inset->lyxCode();
                switch (code) {
@@ -525,10 +519,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                break;
        }
 
-       case LFUN_LATEX_LOG:
-               disable = !IsFileReadable(buf->getLogName().second);
-               break;
-
        case LFUN_MATH_MUTATE:
                if (mathcursor)
                        //flag.setOnOff(mathcursor->formula()->hullType() == ev.argument);
@@ -547,6 +537,31 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                disable = !mathcursor;
                break;
 
+       case LFUN_DIALOG_SHOW: {
+               string const name = ev.getArg(0);
+               if (!buf) {
+                       disable = !(name == "aboutlyx" ||
+                                   name == "file" ||
+                                   name == "forks" ||
+                                   name == "preferences" ||
+                                   name == "texinfo");
+                       break;
+               }
+
+               if (name == "print") {
+                       disable = !Exporter::IsExportable(buf, "dvi") ||
+                               lyxrc.print_command == "none";
+               } else if (name == "character") {
+                       UpdatableInset * tli = view()->theLockingInset();
+                       disable = tli && tli->lyxCode() == Inset::ERT_CODE;
+               } else if (name == "vclog") {
+                       disable = !buf->lyxvc.inUse();
+               } else if (name == "latexlog") {
+                       disable = !IsFileReadable(buf->getLogName().second);
+               }
+               break;
+       }
+
        default:
                break;
        }
@@ -644,9 +659,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        case LFUN_TOC_INSERT:
                code = Inset::TOC_CODE;
                break;
-       case LFUN_PARENTINSERT:
-               code = Inset::PARENT_CODE;
-               break;
        case LFUN_HTMLURL:
        case LFUN_URL:
                code = Inset::URL_CODE;
@@ -836,6 +848,19 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                            && argument.empty()) {
                                argument = encoded_last_key;
                        }
+
+                       // the insets can't try to handle this,
+                       // a table cell in the dummy position will
+                       // lock its insettext, the insettext will
+                       // pass it the bufferview, and succeed,
+                       // so it will stay not locked. Not good
+                       // if we've just done LFUN_ESCAPE (which
+                       // injects an LFUN_PARAGRAPH_UPDATE)
+                       if (action == LFUN_PARAGRAPH_UPDATE) {
+                               view()->dispatch(ev);
+                               goto exit_with_message;
+                       }
+
                        // Undo/Redo is a bit tricky for insets.
                        if (action == LFUN_UNDO) {
                                view()->undo();
@@ -1045,14 +1070,14 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                        string const str = bformat(_("Saving document %1$s..."),
                           MakeDisplayPath(owner->buffer()->fileName()));
                        owner->message(str);
-                       MenuWrite(view(), owner->buffer());
+                       MenuWrite(owner->buffer());
                        owner->message(str + _(" done."));
                } else
-                       WriteAs(view(), owner->buffer());
+                       WriteAs(owner->buffer());
                break;
 
        case LFUN_WRITEAS:
-               WriteAs(view(), owner->buffer(), argument);
+               WriteAs(owner->buffer(), argument);
                break;
 
        case LFUN_MENURELOAD: {
@@ -1083,10 +1108,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                owner->buffer()->runChktex();
                break;
 
-       case LFUN_MENUPRINT:
-               owner->getDialogs().showPrint();
-               break;
-
        case LFUN_EXPORT:
                if (argument == "custom")
                        owner->getDialogs().showSendto();
@@ -1122,18 +1143,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                view()->redo();
                break;
 
-       case LFUN_MENUSEARCH:
-               owner->getDialogs().showSearch();
-               break;
-
-       case LFUN_REMOVEERRORS:
-               if (view()->removeAutoInsets()) {
-#warning repaint() or update() or nothing ?
-                       view()->repaint();
-                       view()->fitCursor();
-               }
-               break;
-
        case LFUN_DEPTH_MIN:
                changeDepth(view(), TEXT(false), DEC_DEPTH, false);
                owner->view_state_changed();
@@ -1172,14 +1181,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
 //#warning Find another implementation here (or another lyxfunc)!
 #endif
 #endif
-       case LFUN_HELP_ABOUTLYX:
-               owner->getDialogs().show("about");
-               break;
-
-       case LFUN_HELP_TEXINFO:
-               owner->getDialogs().showTexinfo();
-               break;
-
        case LFUN_HELP_OPEN:
        {
                string const arg = argument;
@@ -1195,7 +1196,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                }
                owner->message(bformat(_("Opening help file %1$s..."),
                        MakeDisplayPath(fname)));
-               view()->buffer(bufferlist.loadLyXFile(fname, false));
+               view()->loadLyXFile(fname, false);
                break;
        }
 
@@ -1235,12 +1236,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
        }
        break;
 
-       case LFUN_VC_HISTORY:
-       {
-               owner->getDialogs().show("vclog");
-               break;
-       }
-
        // --- buffers ----------------------------------------
 
        case LFUN_SWITCHBUFFER:
@@ -1260,21 +1255,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                open(argument);
                break;
 
-       case LFUN_LATEX_LOG:
-               owner->getDialogs().show("log");
-               break;
-
-       case LFUN_LAYOUT_DOCUMENT:
-               owner->getDialogs().showDocument();
-               break;
-
-       case LFUN_LAYOUT_CHARACTER: {
-               string data = freefont2string();
-               if (!data.empty())
-                       owner->getDialogs().show("character", data);
-               break;
-       }
-
        case LFUN_LAYOUT_TABULAR:
            if (view()->theLockingInset()) {
                if (view()->theLockingInset()->lyxCode()==Inset::TABULAR_CODE) {
@@ -1290,10 +1270,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
            }
            break;
 
-       case LFUN_LAYOUT_PREAMBLE:
-               owner->getDialogs().showPreamble();
-               break;
-
        case LFUN_DROP_LAYOUTS_CHOICE:
                owner->getToolbar().openLayoutList();
                break;
@@ -1302,10 +1278,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                owner->getMenubar().openByName(argument);
                break; // RVDK_PATCH_5
 
-       case LFUN_SPELLCHECK:
-               owner->getDialogs().showSpellchecker();
-               break;
-
        // --- lyxserver commands ----------------------------
 
 
@@ -1336,7 +1308,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                if (bufferlist.exists(s)) {
                        view()->buffer(bufferlist.getBuffer(s));
                } else {
-                       view()->buffer(bufferlist.loadLyXFile(s));
+                       view()->loadLyXFile(s);
                }
 
                view()->setCursorFromRow(row);
@@ -1359,18 +1331,18 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                                            << id << ']' << endl;
                        break;
                } else {
-                       lyxerr[Debug::INFO] << "Paragraph " << (*par)->id()
+                       lyxerr[Debug::INFO] << "Paragraph " << par->id()
                                            << " found." << endl;
                }
 
                if (view()->theLockingInset())
                        view()->unlockInset(view()->theLockingInset());
-               if ((*par)->inInset()) {
+               if (par->inInset()) {
                        FuncRequest cmd(view(), LFUN_INSET_EDIT, "left");
-                       (*par)->inInset()->localDispatch(cmd);
+                       par->inInset()->localDispatch(cmd);
                }
                // Set the cursor
-               view()->getLyXText()->setCursor(*par, 0);
+               view()->getLyXText()->setCursor(par.pit(), 0);
                view()->switchKeyMap();
                owner->view_state_changed();
 
@@ -1400,9 +1372,32 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                dispatch(FuncRequest(view(), LFUN_SELFINSERT, "^"));
                break;
 
-       case LFUN_MATH_PANEL:
-               owner->getDialogs().showMathPanel();
+       case LFUN_DIALOG_SHOW: {
+               string const name = ev.getArg(0);
+               string data = trim(ev.argument.substr(name.size()));
+
+               if (name == "character") {
+                       data = freefont2string();
+                       if (!data.empty())
+                               owner->getDialogs().show("character", data);
+               } else if (name == "document")
+                       owner->getDialogs().showDocument();
+               else if (name == "findreplace")
+                       owner->getDialogs().showSearch();
+               else if (name == "forks")
+                       owner->getDialogs().showForks();
+               else if (name == "preamble")
+                       owner->getDialogs().showPreamble();
+               else if (name == "preferences")
+                       owner->getDialogs().showPreferences();
+               else if (name == "print")
+                       owner->getDialogs().showPrint();
+               else if (name == "spellchecker")
+                       owner->getDialogs().showSpellchecker();
+               else
+                       owner->getDialogs().show(name, data);
                break;
+       }
 
        case LFUN_DIALOG_SHOW_NEW_INSET: {
                string const & name = argument;
@@ -1461,7 +1456,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                if (bufferlist.exists(filename))
                        view()->buffer(bufferlist.getBuffer(filename));
                else
-                       view()->buffer(bufferlist.loadLyXFile(filename));
+                       view()->loadLyXFile(filename);
        }
        break;
 
@@ -1496,10 +1491,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
        }
        break;
 
-       case LFUN_DIALOG_PREFERENCES:
-               owner->getDialogs().showPreferences();
-               break;
-
        case LFUN_SAVEPREFERENCES:
        {
                Path p(user_lyxdir);
@@ -1566,10 +1557,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                owner->message(argument);
                break;
 
-       case LFUN_FORKS_SHOW:
-               owner->getDialogs().showForks();
-               break;
-
        case LFUN_FORKS_KILL:
        {
                if (!isStrInt(argument))
@@ -1585,6 +1572,12 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                owner->getDialogs().toggleTooltips();
                break;
 
+       case LFUN_EXTERNAL_EDIT: {
+               InsetExternal()
+                       .localDispatch(FuncRequest(view(), action, argument));
+               break;
+       }
+
        default:
                // Then if it was none of the above
                // Trying the BufferView::pimpl dispatch:
@@ -1722,7 +1715,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate)
                templname = fname;
        }
 
-       view()->buffer(bufferlist.newFile(filename, templname, !name.empty()));
+       view()->buffer(newFile(filename, templname, !name.empty()));
 }
 
 
@@ -1777,17 +1770,15 @@ void LyXFunc::open(string const & fname)
        FileInfo const f(filename, true);
        if (!f.exist()) {
                // the user specifically chose this name. Believe them.
-               Buffer * buffer =  bufferlist.newFile(filename, "", true);
+               Buffer * buffer =  newFile(filename, "", true);
                view()->buffer(buffer);
                return;
        }
 
        owner->message(bformat(_("Opening document %1$s..."), disp_fn));
 
-       Buffer * openbuf = bufferlist.loadLyXFile(filename);
        string str2;
-       if (openbuf) {
-               view()->buffer(openbuf);
+       if (view()->loadLyXFile(filename)) {
                str2 = bformat(_("Document %1$s opened."), disp_fn);
        } else {
                str2 = bformat(_("Could not open document %1$s"), disp_fn);