]> 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 e68d3b517e2d97e39a8b4a538179dfdc2b35fd2a..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();
 }
 
@@ -574,8 +576,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                }
                cur.niceInsert(topaste, parseflg, false);
                cur.clearSelection(); // bug 393
-               // FIXME audit setBuffer/updateBuffer calls
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                cur.finishUndo();
                break;
        }
@@ -587,8 +588,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                // Prevent stale position >= size crash
                // Probably not necessary anymore, see eraseSelection (gb 2005-10-09)
                cur.normalize();
-               // FIXME audit setBuffer/updateBuffer calls
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                break;
 
        case LFUN_COPY:
@@ -623,7 +623,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_CHAR_LEFT:
        case LFUN_CHAR_BACKWARD:
        case LFUN_CHAR_FORWARD:
-               cur.updateFlags(Update::Decoration | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor);
        case LFUN_CHAR_RIGHT_SELECT:
        case LFUN_CHAR_LEFT_SELECT:
        case LFUN_CHAR_BACKWARD_SELECT:
@@ -683,7 +683,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_DOWN:
        case LFUN_UP:
-               cur.updateFlags(Update::Decoration | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor);
        case LFUN_DOWN_SELECT:
        case LFUN_UP_SELECT: {
                // close active macro
@@ -726,7 +726,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_PARAGRAPH_UP:
        case LFUN_PARAGRAPH_DOWN:
-               cur.updateFlags(Update::Decoration | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor);
        case LFUN_PARAGRAPH_UP_SELECT:
        case LFUN_PARAGRAPH_DOWN_SELECT:
                break;
@@ -734,7 +734,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_LINE_BEGIN:
        case LFUN_WORD_BACKWARD:
        case LFUN_WORD_LEFT:
-               cur.updateFlags(Update::Decoration | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor);
        case LFUN_LINE_BEGIN_SELECT:
        case LFUN_WORD_BACKWARD_SELECT:
        case LFUN_WORD_LEFT_SELECT:
@@ -759,7 +759,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_WORD_FORWARD:
        case LFUN_WORD_RIGHT:
        case LFUN_LINE_END:
-               cur.updateFlags(Update::Decoration | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor);
        case LFUN_WORD_FORWARD_SELECT:
        case LFUN_WORD_RIGHT_SELECT:
        case LFUN_LINE_END_SELECT:
@@ -783,12 +783,12 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                break;
 
        case LFUN_CELL_FORWARD:
-               cur.updateFlags(Update::Decoration | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor);
                cur.inset().idxNext(cur);
                break;
 
        case LFUN_CELL_BACKWARD:
-               cur.updateFlags(Update::Decoration | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor);
                cur.inset().idxPrev(cur);
                break;
 
@@ -998,8 +998,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                cur.posBackward();
                cur.pushBackward(*cur.nextInset());
                cur.niceInsert(save_selection);
-               // FIXME audit setBuffer/updateBuffer calls
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
 #else
                if (currentMode() == Inset::TEXT_MODE) {
                        cur.recordUndoSelection();
@@ -1014,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);
@@ -1109,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().
@@ -1216,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));
@@ -1229,8 +1235,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                if (createInsetMath_fromDialogStr(cmd.argument(), ar)) {
                        cur.recordUndoSelection();
                        cur.insert(ar);
-                       // FIXME audit setBuffer/updateBuffer calls
-                       cur.buffer()->updateBuffer();
+                       cur.forceBufferUpdate();                        
                } else
                        cur.undispatched();
                break;
@@ -1352,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;
@@ -1385,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;
@@ -1457,8 +1469,8 @@ void InsetMathNest::lfunMousePress(Cursor & cur, FuncRequest & cmd)
                // Update::FitCursor: adjust the screen to the cursor
                //                    position if needed
                // cur.result().update(): don't overwrite previously set flags.
-               cur.updateFlags(Update::Decoration | Update::FitCursor
-                               | cur.result().update());
+               cur.screenUpdateFlags(Update::Decoration | Update::FitCursor
+                               | cur.result().screenUpdate());
        } else if (cmd.button() == mouse_button::button2) {
                if (cap::selection()) {
                        // See comment in Text::dispatch why we do this
@@ -1496,7 +1508,7 @@ void InsetMathNest::lfunMouseRelease(Cursor & cur, FuncRequest & cmd)
 
        if (cmd.button() == mouse_button::button1) {
                if (!cur.selection())
-                       cur.noUpdate();
+                       cur.noScreenUpdate();
                else {
                        Cursor & bvcur = cur.bv().cursor();
                        bvcur.setSelection(true);
@@ -1663,7 +1675,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
                                // visual box corners that define the inset. If we know for
                                // sure that we stay within the same cell we can optimize for
                                // that using:
-                               //cur.updateFlags(Update::SinglePar | Update::FitCursor);
+                               //cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
                        }
                        return true;
                }
@@ -1673,7 +1685,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
                        // visual box corners that define the inset. If we know for
                        // sure that we stay within the same cell we can optimize for
                        // that using:
-                       //cur.updateFlags(Update::SinglePar | Update::FitCursor);
+                       //cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
                        return true;
                }
 
@@ -1682,7 +1694,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
                        // visual box corners that define the inset. If we know for
                        // sure that we stay within the same cell we can optimize for
                        // that using:
-                       //cur.updateFlags(Update::FitCursor);
+                       //cur.screenUpdateFlags(Update::FitCursor);
                        return true;
                }
 
@@ -1998,6 +2010,7 @@ MathCompletionList::MathCompletionList(Cursor const & cur)
        globals.push_back(from_ascii("\\cases"));
        globals.push_back(from_ascii("\\substack"));
        globals.push_back(from_ascii("\\xymatrix"));
+       globals.push_back(from_ascii("\\Diagram"));
        globals.push_back(from_ascii("\\subarray"));
        globals.push_back(from_ascii("\\array"));
        globals.push_back(from_ascii("\\sqrt"));