]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
fix some C++ parsing bugs
[lyx.git] / src / lyxfunc.C
index a1b316d092db1365152c35f5bc238c33e02f9a6f..34e54fc295dc63b376f16064f76878b8a90aad97 100644 (file)
 
 #include <config.h>
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
 #include "lyxfunc.h"
 #include "version.h"
 #include "kbmap.h"
@@ -38,7 +34,7 @@
 #include "frontends/lyx_gui.h"
 #include "vspace.h"
 #include "FloatList.h"
-#include "converter.h"
+#include "format.h"
 #include "exporter.h"
 #include "importer.h"
 #include "TextCache.h"
@@ -47,6 +43,8 @@
 #include "ParagraphParameters.h"
 
 #include "insets/insetcommand.h"
+#include "insets/inseterror.h"
+#include "insets/insetert.h"
 #include "insets/insettabular.h"
 
 #include "mathed/formulamacro.h"
@@ -123,11 +121,11 @@ inline
 void LyXFunc::moveCursorUpdate(bool flag, bool selecting)
 {
        if (selecting || TEXT(flag)->selection.mark()) {
-               TEXT(flag)->setSelection(view());
-               if (TEXT(flag)->bv_owner)
+               TEXT(flag)->setSelection();
+               if (!TEXT(flag)->isInInset())
                    view()->toggleToggle();
        }
-       view()->update(TEXT(flag), BufferView::SELECT|BufferView::FITCUR);
+       view()->update(TEXT(flag), BufferView::SELECT);
        view()->showCursor();
 
        view()->switchKeyMap();
@@ -148,8 +146,7 @@ void LyXFunc::handleKeyFunc(kb_action action)
        // actions
        keyseq.clear();
        // copied verbatim from do_accent_char
-       view()->update(TEXT(false),
-              BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+       view()->update(TEXT(false), BufferView::SELECT);
        TEXT(false)->selection.cursor = TEXT(false)->cursor;
 }
 
@@ -221,7 +218,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym,
                owner->message(keyseq.print());
        }
 
+
        // Maybe user can only reach the key via holding down shift.
        // Let's see. But only if shift is the only modifier
        if (action == LFUN_UNKNOWN_ACTION && state == key_modifier::shift) {
@@ -229,7 +226,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym,
                action = keyseq.addkey(keysym, key_modifier::none);
                lyxerr[Debug::KEY] << "Action now " << action << endl;
        }
+
        if (action == LFUN_UNKNOWN_ACTION) {
                // Hmm, we didn't match any of the keysequences. See
                // if it's normal insertable text not already covered
@@ -286,7 +283,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        default:
                flag |= lyx_gui::getStatus(ev);
        }
-       
+
        if (flag.unknown()) {
                setStatusMessage(N_("Unknown action"));
                return flag;
@@ -327,8 +324,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                        || lyxrc.print_command == "none";
                break;
        case LFUN_EXPORT:
-               disable = ev.argument == "fax" &&
-                       !Exporter::IsExportable(buf, ev.argument);
+               disable = ev.argument != "custom"
+                       && !Exporter::IsExportable(buf, ev.argument);
                break;
        case LFUN_UNDO:
                disable = buf->undostack.empty();
@@ -338,9 +335,12 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                break;
        case LFUN_CUT:
        case LFUN_COPY:
-               if (tli && tli->lyxCode() == Inset::TABULAR_CODE) {
-                       InsetTabular * t(static_cast<InsetTabular*>(tli));
-                       if (t->hasSelection()) {
+               if (tli) {
+                       UpdatableInset * in = tli;
+                       if (in->lyxCode() != Inset::TABULAR_CODE) {
+                               in = tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE);
+                       }
+                       if (in && static_cast<InsetTabular*>(in)->hasSelection()) {
                                disable = false;
                                break;
                        }
@@ -455,10 +455,20 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        case LFUN_VC_HISTORY:
                disable = !buf->lyxvc.inUse();
                break;
+       case LFUN_MENURELOAD:
+               disable = buf->isUnnamed() || buf->isClean();
+               break;
        case LFUN_BOOKMARK_GOTO:
                disable =  !view()->
                        isSavedPosition(strToUnsignedInt(ev.argument));
                break;
+       case LFUN_MERGE_CHANGES:
+       case LFUN_ACCEPT_CHANGE:
+       case LFUN_REJECT_CHANGE:
+       case LFUN_ACCEPT_ALL_CHANGES:
+       case LFUN_REJECT_ALL_CHANGES:
+               disable = !buf->params.tracking_changes;
+               break;
        case LFUN_INSET_TOGGLE: {
                LyXText * lt = view()->getLyXText();
                disable = !(isEditableInset(lt->getInset())
@@ -496,21 +506,48 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        // the functions which insert insets
        Inset::Code code = Inset::NO_CODE;
        switch (ev.action) {
+       case LFUN_DIALOG_SHOW_NEW_INSET:
+               if (ev.argument == "bibitem")
+                       code = Inset::BIBITEM_CODE;
+               else if (ev.argument == "bibtex")
+                       code = Inset::BIBTEX_CODE;
+               else if (ev.argument == "citation")
+                       code = Inset::CITE_CODE;
+               else if (ev.argument == "ert")
+                       code = Inset::ERT_CODE;
+               else if (ev.argument == "external")
+                       code = Inset::EXTERNAL_CODE;
+               else if (ev.argument == "float")
+                       code = Inset::FLOAT_CODE;
+               else if (ev.argument == "graphics")
+                       code = Inset::GRAPHICS_CODE;
+               else if (ev.argument == "include")
+                       code = Inset::INCLUDE_CODE;
+               else if (ev.argument == "index")
+                       code = Inset::INDEX_CODE;
+               else if (ev.argument == "label")
+                       code = Inset::LABEL_CODE;
+               else if (ev.argument == "minipage")
+                       code = Inset::MINIPAGE_CODE;
+               else if (ev.argument == "ref")
+                       code = Inset::REF_CODE;
+               else if (ev.argument == "toc")
+                       code = Inset::TOC_CODE;
+               else if (ev.argument == "url")
+                       code = Inset::URL_CODE;
+               else if (ev.argument == "wrap")
+                       code = Inset::WRAP_CODE;
+               break;
+
        case LFUN_INSET_ERT:
                code = Inset::ERT_CODE;
                break;
-       case LFUN_INSET_GRAPHICS:
-               code = Inset::GRAPHICS_CODE;
-               break;
        case LFUN_INSET_FOOTNOTE:
                code = Inset::FOOT_CODE;
                break;
        case LFUN_TABULAR_INSERT:
                code = Inset::TABULAR_CODE;
                break;
-       case LFUN_INSET_EXTERNAL:
-               code = Inset::EXTERNAL_CODE;
-               break;
        case LFUN_INSET_MARGINAL:
                code = Inset::MARGIN_CODE;
                break;
@@ -547,15 +584,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        case LFUN_INSET_OPTARG:
                code = Inset::OPTARG_CODE;
                break;
-       case LFUN_REF_INSERT:
-               code = Inset::REF_CODE;
-               break;
-       case LFUN_CITATION_CREATE:
-       case LFUN_CITATION_INSERT:
-               code = Inset::CITE_CODE;
-               break;
-       case LFUN_INSERT_BIBTEX:
-               code = Inset::BIBTEX_CODE;
+       case LFUN_ENVIRONMENT_INSERT:
+               code = Inset::MINIPAGE_CODE;
                break;
        case LFUN_INDEX_INSERT:
                code = Inset::INDEX_CODE;
@@ -563,9 +593,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        case LFUN_INDEX_PRINT:
                code = Inset::INDEX_PRINT_CODE;
                break;
-       case LFUN_CHILD_INSERT:
-               code = Inset::INCLUDE_CODE;
-               break;
        case LFUN_TOC_INSERT:
                code = Inset::TOC_CODE;
                break;
@@ -574,7 +601,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                break;
        case LFUN_HTMLURL:
        case LFUN_URL:
-       case LFUN_INSERT_URL:
                code = Inset::URL_CODE;
                break;
        case LFUN_QUOTE:
@@ -621,6 +647,9 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                if (ev.argument == buf->fileName())
                        flag.setOnOff(true);
                break;
+       case LFUN_TRACK_CHANGES:
+               flag.setOnOff(buf->params.tracking_changes);
+               break;
        default:
                break;
        }
@@ -777,25 +806,25 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                        } else if (((result=inset->
                                     // Hand-over to inset's own dispatch:
                                     localDispatch(FuncRequest(view(), action, argument))) ==
-                                   UpdatableInset::DISPATCHED) ||
-                                  (result == UpdatableInset::DISPATCHED_NOUPDATE))
+                                   DISPATCHED) ||
+                                  (result == DISPATCHED_NOUPDATE))
                                goto exit_with_message;
                                        // If UNDISPATCHED, just soldier on
-                       else if (result == UpdatableInset::FINISHED) {
+                       else if (result == FINISHED) {
                                goto exit_with_message;
                                // We do not need special RTL handling here:
                                // FINISHED means that the cursor should be
                                // one position after the inset.
-                       } else if (result == UpdatableInset::FINISHED_RIGHT) {
+                       } else if (result == FINISHED_RIGHT) {
                                TEXT()->cursorRight(view());
                                moveCursorUpdate(true, false);
                                owner->view_state_changed();
                                goto exit_with_message;
-                       } else if (result == UpdatableInset::FINISHED_UP) {
+                       } else if (result == FINISHED_UP) {
                                if (TEXT()->cursor.irow()->previous()) {
 #if 1
                                        TEXT()->setCursorFromCoordinates(
-                                               view(), TEXT()->cursor.ix() + inset_x,
+                                               TEXT()->cursor.ix() + inset_x,
                                                TEXT()->cursor.iy() -
                                                TEXT()->cursor.irow()->baseline() - 1);
                                        TEXT()->cursor.x_fix(TEXT()->cursor.x());
@@ -805,14 +834,14 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                                        moveCursorUpdate(true, false);
                                        owner->view_state_changed();
                                } else {
-                                       view()->update(TEXT(), BufferView::SELECT|BufferView::FITCUR);
+                                       view()->update(TEXT(), BufferView::SELECT);
                                }
                                goto exit_with_message;
-                       } else if (result == UpdatableInset::FINISHED_DOWN) {
+                       } else if (result == FINISHED_DOWN) {
                                if (TEXT()->cursor.irow()->next()) {
 #if 1
                                        TEXT()->setCursorFromCoordinates(
-                                               view(), TEXT()->cursor.ix() + inset_x,
+                                               TEXT()->cursor.ix() + inset_x,
                                                TEXT()->cursor.iy() -
                                                TEXT()->cursor.irow()->baseline() +
                                                TEXT()->cursor.irow()->height() + 1);
@@ -890,7 +919,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                        }
                        finishUndo();
                        // Tell the paragraph dialog that we changed paragraph
-                       owner->getDialogs().updateParagraph();
+                       dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE));
                }
        }
        break;
@@ -918,8 +947,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
        case LFUN_PREFIX:
        {
                if (view()->available() && !view()->theLockingInset()) {
-                       view()->update(TEXT(),
-                                             BufferView::SELECT|BufferView::FITCUR);
+                       view()->update(TEXT(), BufferView::SELECT);
                }
                owner->message(keyseq.printOptions());
        }
@@ -996,7 +1024,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                break;
 
        case LFUN_MENURELOAD:
-               reloadBuffer();
+               view()->reload();
                break;
 
        case LFUN_UPDATE:
@@ -1035,27 +1063,10 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                break;
 
        case LFUN_TOCVIEW:
-#if 0
-       case LFUN_LOFVIEW:
-       case LFUN_LOTVIEW:
-       case LFUN_LOAVIEW:
-#endif
        {
-               InsetCommandParams p;
-
-#if 0
-               if (action == LFUN_TOCVIEW)
-#endif
-                       p.setCmdName("tableofcontents");
-#if 0
-               else if (action == LFUN_LOAVIEW)
-                       p.setCmdName("listof{algorithm}{List of Algorithms}");
-               else if (action == LFUN_LOFVIEW)
-                       p.setCmdName("listoffigures");
-               else
-                       p.setCmdName("listoftables");
-#endif
-               owner->getDialogs().createTOC(p.getAsString());
+               InsetCommandParams p("tableofcontents");
+               string const data = InsetCommandMailer::params2string("toc", p);
+               owner->getDialogs().show("toc", data, 0);
                break;
        }
 
@@ -1091,8 +1102,12 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                changeDepth(view(), TEXT(false), 1);
                break;
 
-       case LFUN_FREE:
-               owner->getDialogs().setUserFreeFont();
+       case LFUN_FREEFONT_APPLY:
+               apply_freefont(view());
+               break;
+
+       case LFUN_FREEFONT_UPDATE:
+               update_and_apply_freefont(view(), argument);
                break;
 
        case LFUN_RECONFIGURE:
@@ -1116,7 +1131,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
 #endif
 #endif
        case LFUN_HELP_ABOUTLYX:
-               owner->getDialogs().showAboutlyx();
+               owner->getDialogs().show("about");
                break;
 
        case LFUN_HELP_TEXINFO:
@@ -1130,12 +1145,10 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                        setErrorMessage(N_("Missing argument"));
                        break;
                }
-               owner->prohibitInput();
                string const fname = i18nLibFileSearch("doc", arg, "lyx");
                if (fname.empty()) {
                        lyxerr << "LyX: unable to find documentation file `"
                               << arg << "'. Bad installation?" << endl;
-                       owner->allowInput();
                        break;
                }
                ostringstream str;
@@ -1148,7 +1161,6 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
 #endif
                owner->message(STRCONV(str.str()));
                view()->buffer(bufferlist.loadLyXFile(fname, false));
-               owner->allowInput();
                break;
        }
 
@@ -1190,7 +1202,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
 
        case LFUN_VC_HISTORY:
        {
-               owner->getDialogs().showVCLogFile();
+               owner->getDialogs().show("vclog");
                break;
        }
 
@@ -1214,20 +1226,19 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                break;
 
        case LFUN_LATEX_LOG:
-               owner->getDialogs().showLogFile();
+               owner->getDialogs().show("log");
                break;
 
        case LFUN_LAYOUT_DOCUMENT:
                owner->getDialogs().showDocument();
                break;
 
-       case LFUN_LAYOUT_PARAGRAPH:
-               owner->getDialogs().showParagraph();
-               break;
-
-       case LFUN_LAYOUT_CHARACTER:
-               owner->getDialogs().showCharacter();
+       case LFUN_LAYOUT_CHARACTER: {
+               string data = freefont2string();
+               if (!data.empty())
+                       owner->getDialogs().show("character", data);
                break;
+       }
 
        case LFUN_LAYOUT_TABULAR:
            if (view()->theLockingInset()) {
@@ -1323,7 +1334,7 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                        par->inInset()->edit(view());
                }
                // Set the cursor
-               view()->getLyXText()->setCursor(view(), par, 0);
+               view()->getLyXText()->setCursor(par, 0);
                view()->switchKeyMap();
                owner->view_state_changed();
 
@@ -1365,27 +1376,52 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
                owner->getDialogs().showMathPanel();
                break;
 
-       case LFUN_CITATION_CREATE:
-       {
-               InsetCommandParams p("cite");
+       case LFUN_DIALOG_SHOW_NEW_INSET: {
+               string const & name = argument;
+               string data;
+               if (name == "bibitem" ||
+                   name == "bibtex" ||
+                   name == "include" ||
+                   name == "index" ||
+                   name == "ref" ||
+                   name == "toc" ||
+                   name == "url") {
+                       InsetCommandParams p(name);
+                       data = InsetCommandMailer::params2string(name, p);
+               } else if (name == "citation") {
+                       InsetCommandParams p("cite");
+                       data = InsetCommandMailer::params2string(name, p);
+               }
+               owner->getDialogs().show(name, data, 0);
+       }
+       break;
 
-               if (!argument.empty()) {
-                       // This should be set at source, ie when typing
-                       // "citation-insert foo" in the minibuffer.
-                       // Question: would pybibliographer also need to be
-                       // changed. Suspect so. Leave as-is therefore.
-                       if (contains(argument, "|")) {
-                               p.setContents(token(argument, '|', 0));
-                               p.setOptions(token(argument, '|', 1));
-                       } else {
-                               p.setContents(argument);
-                       }
-                       dispatch(FuncRequest(view(), LFUN_CITATION_INSERT, p.getAsString()));
-               } else
-                       owner->getDialogs().createCitation(p.getAsString());
+       case LFUN_DIALOG_SHOW_NEXT_INSET: {
        }
        break;
 
+       case LFUN_DIALOG_UPDATE: {
+               string const & name = argument;
+               // Can only update a dialog connected to an existing inset
+               InsetBase * inset = owner->getDialogs().getOpenInset(name);
+               if (inset) {
+                       FuncRequest fr(view(), LFUN_INSET_DIALOG_UPDATE,
+                                      ev.argument);
+                       inset->localDispatch(fr);
+               } else if (name == "paragraph") {
+                       dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE));
+               }
+       }
+       break;
+
+       case LFUN_DIALOG_HIDE:
+               Dialogs::hide(argument, 0);
+               break;
+
+       case LFUN_DIALOG_DISCONNECT_INSET:
+               owner->getDialogs().disconnect(argument);
+               break;
+
        case LFUN_CHILDOPEN:
        {
                string const filename =
@@ -1542,6 +1578,18 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
        } // end of switch
 
 exit_with_message:
+
+       view()->owner()->updateLayoutChoice();
+
+       if (view()->available()) {
+               view()->fitCursor();
+
+               // If we executed a mutating lfun, mark the buffer as dirty
+               if (!lyxaction.funcHasFlag(ev.action, LyXAction::NoBuffer)
+                   && !lyxaction.funcHasFlag(ev.action, LyXAction::ReadOnly))
+                       view()->buffer()->markDirty();
+       }
+
        sendDispatchMessage(getMessage(), ev, verbose);
 }
 
@@ -1635,7 +1683,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate)
        // The template stuff
        string templname;
        if (fromTemplate) {
-               FileDialog fileDlg(owner, _("Select template file"),
+               FileDialog fileDlg(_("Select template file"),
                        LFUN_SELECT_FILE_SYNC,
                        make_pair(string(_("Documents|#o#O")),
                                  string(lyxrc.document_path)),
@@ -1644,7 +1692,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate)
 
                FileDialog::Result result =
                        fileDlg.open(lyxrc.template_path,
-                                      _("*.lyx|LyX Documents (*.lyx)"));
+                                      _("*.lyx| LyX Documents (*.lyx)"));
 
                if (result.first == FileDialog::Later)
                        return;
@@ -1674,7 +1722,7 @@ void LyXFunc::open(string const & fname)
        string filename;
 
        if (fname.empty()) {
-               FileDialog fileDlg(owner, _("Select document to open"),
+               FileDialog fileDlg(_("Select document to open"),
                        LFUN_FILE_OPEN,
                        make_pair(string(_("Documents|#o#O")),
                                  string(lyxrc.document_path)),
@@ -1683,7 +1731,7 @@ void LyXFunc::open(string const & fname)
 
                FileDialog::Result result =
                        fileDlg.open(initpath,
-                                      "*.lyx|LyX Documents (*.lyx)");
+                                      _("*.lyx| LyX Documents (*.lyx)"));
 
                if (result.first == FileDialog::Later)
                        return;
@@ -1712,7 +1760,7 @@ void LyXFunc::open(string const & fname)
        if (!f.exist()) {
                if (!Alert::askQuestion(_("No such file"), disp_fn,
                        _("Start a new document with this filename ?"))) {
-                       owner->message(_("Canceled"));
+                       owner->message(_("Canceled."));
                        return;
                }
                // the user specifically chose this name. Believe them.
@@ -1779,7 +1827,7 @@ void LyXFunc::doImport(string const & argument)
                        + _(" file to import");;
 #endif
 
-               FileDialog fileDlg(owner, text,
+               FileDialog fileDlg(text,
                        LFUN_IMPORT,
                        make_pair(string(_("Documents|#o#O")),
                                  string(lyxrc.document_path)),
@@ -1837,7 +1885,7 @@ void LyXFunc::doImport(string const & argument)
        if (FileInfo(lyxfile, true).exist() && filename != lyxfile) {
                if (!Alert::askQuestion(_("A document by the name"),
                        MakeDisplayPath(lyxfile), _("already exists. Overwrite?"))) {
-                       owner->message(_("Canceled"));
+                       owner->message(_("Canceled."));
                        return;
                }
        }
@@ -1846,14 +1894,6 @@ void LyXFunc::doImport(string const & argument)
 }
 
 
-void LyXFunc::reloadBuffer()
-{
-       string const fn = owner->buffer()->fileName();
-       if (bufferlist.close(owner->buffer()))
-               view()->buffer(bufferlist.loadLyXFile(fn));
-}
-
-
 void LyXFunc::closeBuffer()
 {
        if (bufferlist.close(owner->buffer()) && !quitting) {