]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathNest.cpp
fix a crash when the inset containing the new word at cursor is deleted
[lyx.git] / src / mathed / InsetMathNest.cpp
index 0b11be1308614340f3c0c5aec9f6305c16832f9b..1c6437d9737f907386b87ed5390775e3ad7aa36a 100644 (file)
@@ -394,12 +394,14 @@ void InsetMathNest::normalize(NormalStream & os) const
 }
 
 
-int InsetMathNest::latex(odocstream & os, OutputParams const & runparams) const
+int InsetMathNest::latex(otexstream & os, OutputParams const & runparams) const
 {
-       WriteStream wi(os, runparams.moving_arg, true,
+       WriteStream wi(os.os(), runparams.moving_arg, true,
                       runparams.dryrun ? WriteStream::wsDryrun : WriteStream::wsDefault,
                       runparams.encoding);
+       wi.canBreakLine(os.canBreakLine());
        write(wi);
+       os.canBreakLine(wi.canBreakLine());
        return wi.line();
 }
 
@@ -1011,10 +1013,13 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_REGEXP_MODE: {
-               InsetMathHull * i = dynamic_cast<InsetMathHull *>(cur.inset().asInsetMath());
-               if (i && i->getType() == hullRegexp) {
-                       cur.message(_("Already in regular expression mode"));
-                       break;
+               InsetMath * im = cur.inset().asInsetMath();
+               if (im) {
+                       InsetMathHull * i = im->asHullInset();          
+                       if (i && i->getType() == hullRegexp) {
+                               cur.message(_("Already in regular expression mode"));
+                               break;
+                       }
                }
                cur.macroModeClose();
                docstring const save_selection = grabAndEraseSelection(cur);
@@ -1106,10 +1111,14 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                        if (have_l)
                                cur.insert(MathAtom(new InsetMathBig(lname,
                                                                ldelim)));
-                       cur.niceInsert(selection);
-                       if (have_r)
+                       // first insert the right delimiter and then go back
+                       // and re-insert the selection (bug 7088)
+                       if (have_r) {
                                cur.insert(MathAtom(new InsetMathBig(rname,
                                                                rdelim)));
+                               cur.posBackward();
+                       }
+                       cur.niceInsert(selection);
                }
                // Don't call cur.undispatched() if we did nothing, this would
                // lead to infinite recursion via Text::dispatch().
@@ -1213,7 +1222,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                string data;
                if (name == "ref") {
                        InsetMathRef tmp(buffer_, name);
-                       data = tmp.createDialogStr(to_utf8(name));
+                       data = tmp.createDialogStr();
                        cur.bv().showDialog(to_utf8(name), data);
                } else if (name == "mathspace") {
                        cur.bv().showDialog(to_utf8(name));
@@ -1348,6 +1357,12 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
        }
 
+       case LFUN_MATH_MODE:
+               // forbid "math-mode on" in math mode to prevent irritating
+               // behaviour of menu entries (bug 6709)
+               flag.setEnabled(currentMode() == TEXT_MODE || arg != "on");
+               break;
+
        case LFUN_MATH_INSERT:
                flag.setEnabled(currentMode() != TEXT_MODE);
                break;
@@ -1381,6 +1396,7 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd,
        }
 
        case LFUN_SPECIALCHAR_INSERT:
+       case LFUN_SCRIPT_INSERT:
                // FIXME: These would probably make sense in math-text mode
                flag.setEnabled(false);
                break;