]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathNest.cpp
Generalize control on double blank lines.
[lyx.git] / src / mathed / InsetMathNest.cpp
index 86920e1aafa947263e232dd2d7e0b0bc21feb8c3..12615e6865f926187f4b97f245bede53db1c2cf0 100644 (file)
@@ -139,7 +139,7 @@ void InsetMathNest::cursorPos(BufferView const & bv,
 // to touch all (math)inset's draw() methods. Right now, we'll store
 // absolute value, and make them here relative, only to make them
 // absolute again when actually drawing the cursor. What a mess.
-       LASSERT(&sl.inset() == this, /**/);
+       LASSERT(&sl.inset() == this, return);
        MathData const & ar = sl.cell();
        CoordCache const & coord_cache = bv.coordCache();
        if (!coord_cache.getArrays().has(&ar)) {
@@ -192,7 +192,7 @@ void InsetMathNest::updateBuffer(ParIterator const & it, UpdateType utype)
 
 bool InsetMathNest::idxNext(Cursor & cur) const
 {
-       LASSERT(&cur.inset() == this, /**/);
+       LASSERT(&cur.inset() == this, return false);
        if (cur.idx() == cur.lastidx())
                return false;
        ++cur.idx();
@@ -209,7 +209,7 @@ bool InsetMathNest::idxForward(Cursor & cur) const
 
 bool InsetMathNest::idxPrev(Cursor & cur) const
 {
-       LASSERT(&cur.inset() == this, /**/);
+       LASSERT(&cur.inset() == this, return false);
        if (cur.idx() == 0)
                return false;
        --cur.idx();
@@ -226,7 +226,7 @@ bool InsetMathNest::idxBackward(Cursor & cur) const
 
 bool InsetMathNest::idxFirst(Cursor & cur) const
 {
-       LASSERT(&cur.inset() == this, /**/);
+       LASSERT(&cur.inset() == this, return false);
        if (nargs() == 0)
                return false;
        cur.idx() = 0;
@@ -237,7 +237,7 @@ bool InsetMathNest::idxFirst(Cursor & cur) const
 
 bool InsetMathNest::idxLast(Cursor & cur) const
 {
-       LASSERT(&cur.inset() == this, /**/);
+       LASSERT(&cur.inset() == this, return false);
        if (nargs() == 0)
                return false;
        cur.idx() = cur.lastidx();
@@ -402,6 +402,8 @@ void InsetMathNest::latex(otexstream & os, OutputParams const & runparams) const
                       runparams.encoding);
        wi.canBreakLine(os.canBreakLine());
        write(wi);
+       // Reset parbreak status after a math inset.
+       os.lastChar(0);
        os.canBreakLine(wi.canBreakLine());
 
        int lf = wi.line();
@@ -576,7 +578,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                replaceSelection(cur);
                docstring topaste;
                if (cmd.argument().empty() && !theClipboard().isInternal())
-                       topaste = theClipboard().getAsText();
+                       topaste = theClipboard().getAsText(Clipboard::PlainTextType);
                else {
                        size_t n = 0;
                        idocstringstream is(cmd.argument());
@@ -706,6 +708,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,12 +731,14 @@ 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();
                cur.setSelection(true);
-               cur.pos() = cur.lastpos();
                cur.idx() = cur.lastidx();
+               cur.pos() = cur.lastpos();
+               cur.bv().cursor() = cur;
                break;
 
        case LFUN_PARAGRAPH_UP:
@@ -999,7 +1007,6 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                cur.macroModeClose();
                docstring const save_selection = grabAndEraseSelection(cur);
                selClearOrDel(cur);
-               //cur.plainInsert(MathAtom(new InsetMathMBox(cur.bv())));
                if (currentMode() <= Inset::TEXT_MODE)
                        cur.plainInsert(MathAtom(new InsetMathEnsureMath(buffer_)));
                else
@@ -1075,13 +1082,19 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                cur.recordUndo();
                unsigned int m = 1;
                unsigned int n = 1;
-               docstring name;
+               docstring name = from_ascii("matrix");
                idocstringstream is(cmd.argument());
                is >> m >> n >> name;
                if (m < 1)
                        m = 1;
                if (n < 1)
                        n = 1;
+               // check if we have a valid decoration
+               if (name != "pmatrix" && name != "bmatrix"
+                       && name != "Bmatrix" && name != "vmatrix"
+                       && name != "Vmatrix" && name != "matrix")
+                       name = from_ascii("matrix");
+               
                cur.niceInsert(
                        MathAtom(new InsetMathAMSArray(buffer_, name, m, n)));
                break;
@@ -1456,6 +1469,13 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd,
                flag.setEnabled(!asHullInset());
                break;
 
+       case LFUN_PASTE: {
+               docstring const & name = cmd.argument();
+               if (name == "html" || name == "latex")
+                       flag.setEnabled(false);
+               break;
+       }
+
        default:
                ret = false;
                break;
@@ -1549,16 +1569,29 @@ void InsetMathNest::lfunMousePress(Cursor & cur, FuncRequest & cmd)
 void InsetMathNest::lfunMouseMotion(Cursor & cur, FuncRequest & cmd)
 {
        // only select with button 1
-       if (cmd.button() == mouse_button::button1) {
-               Cursor & bvcur = cur.bv().cursor();
-               if (bvcur.realAnchor().hasPart(cur)) {
-                       //lyxerr << "## lfunMouseMotion: cursor: " << cur << endl;
-                       bvcur.setCursor(cur);
-                       bvcur.setSelection(true);
-                       //lyxerr << "MOTION " << bvcur << endl;
-               } else
-                       cur.undispatched();
+       if (cmd.button() != mouse_button::button1)
+               return;
+
+       Cursor & bvcur = cur.bv().cursor();
+
+       // ignore motions deeper nested than the real anchor
+       if (!bvcur.realAnchor().hasPart(cur)) {
+               cur.undispatched();
+               return;
        }
+
+       CursorSlice old = bvcur.top();
+
+       // We continue with our existing selection or start a new one, so don't
+       // reset the anchor.
+       bvcur.setCursor(cur);
+       // Did we actually move?
+       if (cur.top() == old)
+               // We didn't move one iota, so no need to change selection status
+               // or update the screen.
+               cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
+       else
+               bvcur.setSelection();
 }
 
 
@@ -1632,7 +1665,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
                                cur.backspace();
                                cur.niceInsert(MathAtom(new InsetMathComment(buf)));
                        } else if (c == '#') {
-                               LASSERT(cur.activeMacro(), /**/);
+                               LASSERT(cur.activeMacro(), return false);
                                cur.activeMacro()->setName(name + docstring(1, c));
                        } else {
                                cur.backspace();
@@ -1669,6 +1702,13 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
                                        new InsetMathBig(name.substr(1), delim)));
                                return true;
                        }
+               } else if (name == "\\smash" && c == '[') {
+                       // We can't use cur.macroModeClose() because
+                       // it would create an InsetMathPhantom
+                       InsetMathUnknown * p = cur.activeMacro();
+                       p->finalize();
+                       interpretChar(cur, c);
+                       return true;
                }
 
                // leave macro mode and try again if necessary
@@ -1733,7 +1773,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
                        // but suppress direct insertion of two spaces in a row
                        // the still allows typing  '<space>a<space>' and deleting the 'a', but
                        // it is better than nothing...
-                       if (!cur.pos() != 0 || cur.prevAtom()->getChar() != ' ') {
+                       if (cur.pos() == 0 || cur.prevAtom()->getChar() != ' ') {
                                cur.insert(c);
                                // FIXME: we have to enable full redraw here because of the
                                // visual box corners that define the inset. If we know for