X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCursor.cpp;h=56a9dd872245c62f66f345c3679406f52f61f502;hb=1e519d1115f41f71c253cb9e2fbb7803e9a583a9;hp=f3fccfa98e4803afff5f247413a70d92f2ecc3ac;hpb=503c7c1688bee80a2c5dc472aaf97fb2aa0391e0;p=lyx.git diff --git a/src/Cursor.cpp b/src/Cursor.cpp index f3fccfa98e..56a9dd8722 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -496,6 +496,56 @@ void CursorData::clearSelection() } +int CursorData::countInsetsInSelection(InsetCode const & inset_code) +{ + if (!selection_) + return 0; + + DocIterator from, to; + from = selectionBegin(); + to = selectionEnd(); + + int count = 0; + + if (!from.nextInset()) //move to closest inset + from.forwardInset(); + + while (!from.empty() && from < to) { + Inset * inset = from.nextInset(); + if (!inset) + break; + if (inset->lyxCode() == inset_code) + count ++; + from.forwardInset(); + } + return count; +} + + +bool CursorData::insetInSelection(InsetCode const & inset_code) +{ + if (!selection_) + return false; + + DocIterator from, to; + from = selectionBegin(); + to = selectionEnd(); + + if (!from.nextInset()) //move to closest inset + from.forwardInset(); + + while (!from.empty() && from < to) { + Inset * inset = from.nextInset(); + if (!inset) + break; + if (inset->lyxCode() == inset_code) + return true; + from.forwardInset(); + } + return false; +} + + bool CursorData::fixIfBroken() { bool const broken_cursor = DocIterator::fixIfBroken(); @@ -521,38 +571,18 @@ void CursorData::sanitize() } -bool CursorData::isInside(Inset const * p) const -{ - for (size_t i = 0; i != depth(); ++i) - if (&operator[](i).inset() == p) - return true; - return false; -} - - -void CursorData::leaveInset(Inset const & inset) +bool CursorData::undoAction() { - for (size_t i = 0; i != depth(); ++i) { - if (&operator[](i).inset() == &inset) { - resize(i); - return; - } - } -} - - -bool CursorData::textUndo() -{ - if (!buffer()->undo().textUndo(*this)) + if (!buffer()->undo().undoAction(*this)) return false; sanitize(); return true; } -bool CursorData::textRedo() +bool CursorData::redoAction() { - if (!buffer()->undo().textRedo(*this)) + if (!buffer()->undo().redoAction(*this)) return false; sanitize(); return true; @@ -871,6 +901,31 @@ void Cursor::pushBackward(Inset & p) } +void Cursor::editInsertedInset() +{ + LASSERT(!empty(), return); + if (pos() == 0) + return; + + InsetMath &p = prevMath(); + if (!p.isActive()) + return; + + posBackward(); + push(p); + p.idxFirst(*this); + // this could be a while() loop, but only one cell is not empty in + // cases we are interested in. The cell is not empty because we + // have inserted the selection in there. + if (!cell().empty()) { + // if it is not empty, move to the next one. + if (!inset().idxNext(*this)) + // If there is no next one, exit the inset. + popForward(); + } +} + + bool Cursor::popBackward() { LASSERT(!empty(), return false); @@ -1491,14 +1546,11 @@ void Cursor::niceInsert(MathAtom const & t) plainInsert(t); // If possible, enter the new inset and move the contents of the selection if (t->isActive()) { - posBackward(); - // be careful here: don't use 'pushBackward(t)' as this we need to - // push the clone, not the original - pushBackward(*nextInset()); - // We may not use niceInsert here (recursion) + idx_type const idx = prevMath().asNestInset()->firstIdx(); MathData ar(buffer()); asArray(safe, ar); - insert(ar); + prevMath().cell(idx).insert(0, ar); + editInsertedInset(); } else if (t->asMacro() && !safe.empty()) { MathData ar(buffer()); asArray(safe, ar); @@ -1635,20 +1687,14 @@ bool Cursor::down() } -void Cursor::handleNest(MathAtom const & a, int c) +void Cursor::handleNest(MathAtom const & a) { - //lyxerr << "Cursor::handleNest: " << c << endl; + idx_type const idx = a.nucleus()->asNestInset()->firstIdx(); + //lyxerr << "Cursor::handleNest: " << idx << endl; MathAtom t = a; - asArray(cap::grabAndEraseSelection(*this), t.nucleus()->cell(c)); + asArray(cap::grabAndEraseSelection(*this), t.nucleus()->cell(idx)); insert(t); - posBackward(); - pushBackward(*nextInset()); -} - - -void Cursor::handleNest(MathAtom const & a) -{ - handleNest(a, a.nucleus()->asNestInset()->firstIdx()); + editInsertedInset(); } @@ -1690,14 +1736,15 @@ bool Cursor::macroModeClose(bool cancel) --pos(); cell().erase(pos()); - // do nothing if the macro name is empty - if (s == "\\" || cancel) - return false; - // trigger updates of macros, at least, if no full // updates take place anyway screenUpdateFlags(Update::Force); + // do nothing if the macro name is empty + if (s == "\\" || cancel) { + return false; + } + docstring const name = s.substr(1); InsetMathNest * const in = inset().asInsetMath()->asNestInset(); if (in && in->interpretString(*this, s)) @@ -2238,6 +2285,12 @@ void Cursor::screenUpdateFlags(Update::flags f) const } +void Cursor::noScreenUpdate() const +{ + disp_.screenUpdate(Update::None); +} + + void Cursor::forceBufferUpdate() const { disp_.forceBufferUpdate(); @@ -2256,12 +2309,6 @@ bool Cursor::needBufferUpdate() const } -void Cursor::noScreenUpdate() const -{ - disp_.screenUpdate(Update::None); -} - - Font Cursor::getFont() const { // The logic here should more or less match to the