]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathNest.cpp
Use master buffer's setting for math output type.
[lyx.git] / src / mathed / InsetMathNest.cpp
index 8e04e2a5d99df83eae328ef58cb37afa162f8141..829bbc0a52188b8f4c4bf5caae43bc917eef725f 100644 (file)
@@ -706,6 +706,10 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                        act == LFUN_UP_SELECT;
                cur.selHandle(select);
 
+               // handle autocorrect:
+               cur.autocorrect() = false;
+               cur.message(_("Autocorrect Off ('!' to enter)"));
+
                // go up/down
                bool up = act == LFUN_UP || act == LFUN_UP_SELECT;
                bool successful = cur.upDownInMath(up);
@@ -725,6 +729,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MOUSE_DOUBLE:
        case LFUN_MOUSE_TRIPLE:
        case LFUN_WORD_SELECT:
+       case LFUN_INSET_SELECT_ALL:
                cur.pos() = 0;
                cur.idx() = 0;
                cur.resetAnchor();
@@ -806,7 +811,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                if (cur.pos() == 0)
                        // May affect external cell:
                        cur.recordUndoInset();
-               else
+               else if (!cur.inMacroMode())
                        cur.recordUndoSelection();
                // if the inset can not be removed from within, delete it
                if (!cur.backspace()) {
@@ -872,7 +877,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                // if relevant. Think typing "\frac<space>".
                if (cmd.argument()[0] == ' '
                    && cur.inMacroMode() && cur.macroName() != "\\"
-                   && cur.macroModeClose()) {
+                   && cur.macroModeClose() && cur.pos() > 0) {
                        MathAtom const atom = cur.prevAtom();
                        if (atom->asNestInset() && atom->isActive()) {
                                cur.posBackward();
@@ -1134,10 +1139,34 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_SPACE_INSERT:
+       case LFUN_SPACE_INSERT: {
                cur.recordUndoSelection();
-               cur.insert(MathAtom(new InsetMathSpace));
+               string const name = cmd.getArg(0);
+               if (name == "normal")
+                       cur.insert(MathAtom(new InsetMathSpace(" ", "")));
+               else if (name == "protected")
+                       cur.insert(MathAtom(new InsetMathSpace("~", "")));
+               else if (name == "thin" || name == "med" || name == "thick")
+                       cur.insert(MathAtom(new InsetMathSpace(name + "space", "")));
+               else if (name == "hfill*")
+                       cur.insert(MathAtom(new InsetMathSpace("hspace*{\\fill}", "")));
+               else if (name == "quad" || name == "qquad" ||
+                        name == "enspace" || name == "enskip" ||
+                        name == "negthinspace" || name == "negmedspace" ||
+                        name == "negthickspace" || name == "hfill")
+                       cur.insert(MathAtom(new InsetMathSpace(name, "")));
+               else if (name == "hspace" || name == "hspace*") {
+                       string const len = cmd.getArg(1);
+                       if (len.empty() || !isValidLength(len)) {
+                               lyxerr << "LyX function 'space-insert " << name << "' "
+                                         "needs a valid length argument." << endl;
+                               break;
+                       }
+                       cur.insert(MathAtom(new InsetMathSpace(name, len)));
+               } else
+                       cur.insert(MathAtom(new InsetMathSpace));
                break;
+       }
 
        case LFUN_MATH_SPACE:
                cur.recordUndoSelection();
@@ -1344,7 +1373,6 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd,
        // we just need to be in math mode to enable that
        case LFUN_MATH_SIZE:
        case LFUN_MATH_SPACE:
-       case LFUN_MATH_LIMITS:
        case LFUN_MATH_EXTERN:
                flag.setEnabled(true);
                break;
@@ -1390,6 +1418,14 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
        }
 
+       case LFUN_DIALOG_SHOW_NEW_INSET: {
+               docstring const & name = cmd.argument();
+               if (name == "space")
+                       flag.setEnabled(false);
+               break;
+       }
+
+
        case LFUN_MATH_DELIM:
        case LFUN_MATH_BIGDELIM:
                // Don't do this with multi-cell selections
@@ -1410,6 +1446,17 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd,
                flag.setEnabled(false);
                break;
 
+       case LFUN_CAPTION_INSERT:
+               flag.setEnabled(false);
+               break;
+       
+       case LFUN_SPACE_INSERT: {
+               docstring const & name = cmd.argument();
+               if (name == "visible")
+                       flag.setEnabled(false);
+               break;
+       }
+
        case LFUN_INSET_DISSOLVE:
                flag.setEnabled(!asHullInset());
                break;
@@ -1667,8 +1714,12 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
                //lyxerr << "starting with macro" << endl;
                bool reduced = cap::reduceSelectionToOneCell(cur);
                if (reduced || !cur.selection()) {
+                       cur.recordUndoInset();
                        docstring const safe = cap::grabAndEraseSelection(cur);
-                       cur.insert(MathAtom(new InsetMathUnknown(from_ascii("\\"), safe, false)));
+                       if (!cur.inRegexped())
+                               cur.insert(MathAtom(new InsetMathUnknown(from_ascii("\\"), safe, false)));
+                       else
+                               cur.niceInsert(createInsetMath("backslash", buf));
                }
                return true;
        }
@@ -1721,7 +1772,29 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
        }
 
        // These should be treated differently when not in text mode:
-       if (currentMode() != InsetMath::TEXT_MODE) {
+       if (cur.inRegexped()) {
+               switch (c) {
+               case '\\':
+                       cur.niceInsert(createInsetMath("backslash", buf));
+                       break;
+               case '^':
+                       cur.niceInsert(createInsetMath("mathcircumflex", buf));
+                       break;
+               case '{':
+               case '}':
+               case '#':
+               case '%':
+               case '_':
+                       cur.niceInsert(createInsetMath(docstring(1, c), buf));
+                       break;
+               case '~':
+                       cur.niceInsert(createInsetMath("sim", buf));
+                       break;
+               default:
+                       cur.insert(c);
+               }
+               return true;
+       } else if (currentMode() != InsetMath::TEXT_MODE) {
                if (c == '_') {
                        script(cur, false, save_selection);
                        return true;
@@ -2000,7 +2073,7 @@ MathCompletionList::MathCompletionList(Cursor const & cur)
        }
        sort(locals.begin(), locals.end());
 
-       if (globals.size() > 0)
+       if (!globals.empty())
                return;
 
        // fill in global macros
@@ -2035,6 +2108,7 @@ MathCompletionList::MathCompletionList(Cursor const & cur)
        globals.push_back(from_ascii("\\root"));
        globals.push_back(from_ascii("\\tabular"));
        globals.push_back(from_ascii("\\stackrel"));
+       globals.push_back(from_ascii("\\stackrelthree"));
        globals.push_back(from_ascii("\\binom"));
        globals.push_back(from_ascii("\\choose"));
        globals.push_back(from_ascii("\\brace"));
@@ -2064,6 +2138,14 @@ MathCompletionList::MathCompletionList(Cursor const & cur)
        globals.push_back(from_ascii("\\hphantom"));
        globals.push_back(from_ascii("\\phantom"));
        globals.push_back(from_ascii("\\vphantom"));
+       globals.push_back(from_ascii("\\cancel"));
+       globals.push_back(from_ascii("\\bcancel"));
+       globals.push_back(from_ascii("\\xcancel"));
+       globals.push_back(from_ascii("\\cancelto"));
+       globals.push_back(from_ascii("\\smash"));
+       globals.push_back(from_ascii("\\mathclap"));
+       globals.push_back(from_ascii("\\mathllap"));
+       globals.push_back(from_ascii("\\mathrlap"));
        MathWordList const & words = mathedWordList();
        MathWordList::const_iterator it2;
        //lyxerr << "Globals completion commands: ";