]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Fix broken layout file syntax
[lyx.git] / src / Text3.cpp
index beebcc5b904291cea7fd8446cc6e5d5da96c0c7c..9cace0df53822176dcb873b498035eb62c2c6712 100644 (file)
@@ -51,6 +51,7 @@
 #include "frontends/Clipboard.h"
 #include "frontends/Selection.h"
 
+#include "insets/InsetArgument.h"
 #include "insets/InsetCollapsable.h"
 #include "insets/InsetCommand.h"
 #include "insets/InsetExternal.h"
@@ -294,7 +295,12 @@ static bool doInsertInset(Cursor & cur, Text * text,
                        // Merge multiple paragraphs -- hack
                        while (cur.lastpit() > 0)
                                mergeParagraph(bparams, cur.text()->paragraphs(), 0);
+                       Cursor old = cur;
                        cur.leaveInset(*inset);
+                       if (cmd.action() == LFUN_PREVIEW_INSERT
+                           || cmd.action() == LFUN_IPA_INSERT)
+                               // trigger preview
+                               notifyCursorLeavesOrEnters(old, cur);
                }
        } else {
                cur.leaveInset(*inset);
@@ -1063,7 +1069,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
                break;
 
-       case LFUN_BREAK_PARAGRAPH:
+       case LFUN_PARAGRAPH_BREAK:
                cap::replaceSelection(cur);
                breakParagraph(cur, cmd.argument() == "inverse");
                cur.resetAnchor();
@@ -1957,12 +1963,19 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_LANGUAGE: {
-               Language const * lang = languages.getLanguage(to_utf8(cmd.argument()));
-               if (!lang)
+               string const lang_arg = cmd.getArg(0);
+               bool const reset = (lang_arg.empty() || lang_arg == "reset");
+               Language const * lang =
+                       reset ? reset_language
+                             : languages.getLanguage(lang_arg);
+               // we allow reset_language, which is 0, but only if it
+               // was requested via empty or "reset" arg.
+               if (!lang && !reset)
                        break;
+               bool const toggle = (cmd.getArg(1) != "set");
                selectWordWhenUnderCursor(cur, WHOLE_WORD_STRICT);
                Font font(ignore_font, lang);
-               toggleAndShow(cur, this, font, false);
+               toggleAndShow(cur, this, font, toggle);
                break;
        }
 
@@ -2308,6 +2321,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        FontInfo const & fontinfo = cur.real_current_font.fontInfo();
        bool enable = true;
+       bool allow_in_passthru = false;
        InsetCode code = NO_CODE;
 
        switch (cmd.action()) {
@@ -2504,9 +2518,33 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
        case LFUN_ARGUMENT_INSERT: {
                code = ARG_CODE;
+               allow_in_passthru = true;
+               string const arg = cmd.getArg(0);
+               if (arg.empty()) {
+                       enable = false;
+                       break;
+               }
                Layout const & lay = cur.paragraph().layout();
-               int const numargs = lay.reqargs + lay.optargs;
-               enable = cur.paragraph().insetList().count(ARG_CODE) < numargs;
+               Layout::LaTeXArgMap args = lay.latexargs();
+               Layout::LaTeXArgMap::const_iterator const lait =
+                               args.find(convert<unsigned int>(arg));
+               if (lait != args.end()) {
+                       enable = true;
+                       InsetList::const_iterator it = cur.paragraph().insetList().begin();
+                       InsetList::const_iterator const end = cur.paragraph().insetList().end();
+                       for (; it != end; ++it) {
+                               if (it->inset->lyxCode() == ARG_CODE) {
+                                       InsetArgument const * ins =
+                                               static_cast<InsetArgument const *>(it->inset);
+                                       if (ins->name() == arg) {
+                                               // we have this already
+                                               enable = false;
+                                               break;
+                                       }
+                               }
+                       }
+               } else
+                       enable = false;
                break;
        }
        case LFUN_INDEX_INSERT:
@@ -2744,10 +2782,10 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_LANGUAGE:
                enable = !cur.paragraph().isPassThru();
-               flag.setOnOff(to_utf8(cmd.argument()) == cur.real_current_font.language()->lang());
+               flag.setOnOff(cmd.getArg(0) == cur.real_current_font.language()->lang());
                break;
 
-       case LFUN_BREAK_PARAGRAPH:
+       case LFUN_PARAGRAPH_BREAK:
                enable = cur.inset().getLayout().isMultiPar();
                break;
        
@@ -2877,7 +2915,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        if (code != NO_CODE
            && (cur.empty() 
                || !cur.inset().insetAllowed(code)
-               || cur.paragraph().layout().pass_thru))
+               || (cur.paragraph().layout().pass_thru && !allow_in_passthru)))
                enable = false;
 
        flag.setEnabled(enable);