X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCursor.cpp;h=92b9110ba7629b9b7215acae81e3296df281be48;hb=2f271f61bcd514da3ab5b44d2b7bf61e12ac0c44;hp=b662faa82f89b68f2e5c0be9384735782062dcff;hpb=eb28cb8755439d05714dd3a933bb7c94785c9452;p=lyx.git diff --git a/src/Cursor.cpp b/src/Cursor.cpp index b662faa82f..92b9110ba7 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -468,7 +468,7 @@ bool Cursor::posVisRight(bool skip_inset) new_cur.pos() = right_pos; new_cur.boundary(false); if (!skip_inset && - text()->checkAndActivateInsetVisual(new_cur, right_pos>=pos(), false)) { + text()->checkAndActivateInsetVisual(new_cur, right_pos >= pos(), false)) { // we actually move the cursor at the end of this function, for now // we just keep track of the new position in new_cur... LYXERR(Debug::RTL, "entering inset at: " << new_cur.pos()); @@ -944,7 +944,14 @@ DocIterator Cursor::selectionBegin() const { if (!selection()) return *this; - DocIterator di = (anchor() < top() ? anchor_ : *this); + + DocIterator di; + // FIXME: This is a work-around for the problem that + // CursorSlice doesn't keep track of the boundary. + if (anchor() == top()) + di = anchor_.boundary() > boundary() ? anchor_ : *this; + else + di = anchor() < top() ? anchor_ : *this; di.resize(depth()); return di; } @@ -954,7 +961,15 @@ DocIterator Cursor::selectionEnd() const { if (!selection()) return *this; - DocIterator di = (anchor() > top() ? anchor_ : *this); + + DocIterator di; + // FIXME: This is a work-around for the problem that + // CursorSlice doesn't keep track of the boundary. + if (anchor() == top()) + di = anchor_.boundary() < boundary() ? anchor_ : *this; + else + di = anchor() > top() ? anchor_ : *this; + if (di.depth() > depth()) { di.resize(depth()); ++di.pos(); @@ -968,7 +983,9 @@ void Cursor::setSelection() selection() = true; // A selection with no contents is not a selection // FIXME: doesnt look ok - if (pit() == anchor().pit() && pos() == anchor().pos()) + if (idx() == anchor().idx() && + pit() == anchor().pit() && + pos() == anchor().pos()) selection() = false; } @@ -1559,7 +1576,7 @@ void Cursor::normalize() << pos() << ' ' << lastpos() << " in idx: " << idx() << " in atom: '"; odocstringstream os; - WriteStream wi(os, false, true); + WriteStream wi(os, false, true, false); inset().asInsetMath()->write(wi); lyxerr << to_utf8(os.str()) << endl; pos() = lastpos(); @@ -1812,6 +1829,8 @@ void Cursor::handleFont(string const & font) safe = cap::grabAndEraseSelection(*this); } + recordUndoInset(); + if (lastpos() != 0) { // something left in the cell if (pos() == 0) { @@ -1831,8 +1850,9 @@ void Cursor::handleFont(string const & font) } } else { // nothing left in the cell - pullArg(); + popBackward(); plainErase(); + resetAnchor(); } insert(safe); } @@ -1859,11 +1879,19 @@ docstring Cursor::selectionAsString(bool with_label) const ? AS_STR_LABEL | AS_STR_INSETS : AS_STR_INSETS; if (inTexted()) { + idx_type const startidx = selBegin().idx(); + idx_type const endidx = selEnd().idx(); + if (startidx != endidx) { + // multicell selection + InsetTabular * table = inset().asInsetTabular(); + LASSERT(table, return docstring()); + return table->asString(startidx, endidx); + } + ParagraphList const & pars = text()->paragraphs(); - // should be const ... - pit_type startpit = selBegin().pit(); - pit_type endpit = selEnd().pit(); + pit_type const startpit = selBegin().pit(); + pit_type const endpit = selEnd().pit(); size_t const startpos = selBegin().pos(); size_t const endpos = selEnd().pos(); @@ -1895,7 +1923,7 @@ docstring Cursor::selectionAsString(bool with_label) const } -docstring Cursor::currentState() +docstring Cursor::currentState() const { if (inMathed()) { odocstringstream os; @@ -1910,7 +1938,7 @@ docstring Cursor::currentState() } -docstring Cursor::getPossibleLabel() +docstring Cursor::getPossibleLabel() const { return inMathed() ? from_ascii("eq:") : text()->getPossibleLabel(*this); } @@ -1990,7 +2018,6 @@ bool Cursor::fixIfBroken() { if (DocIterator::fixIfBroken()) { clearSelection(); - resetAnchor(); return true; } return false; @@ -2082,8 +2109,7 @@ bool Cursor::textUndo() return false; // Set cursor setCursor(dit); - selection() = false; - resetAnchor(); + clearSelection(); fixIfBroken(); return true; } @@ -2097,50 +2123,61 @@ bool Cursor::textRedo() return false; // Set cursor setCursor(dit); - selection() = false; - resetAnchor(); + clearSelection(); fixIfBroken(); return true; } -void Cursor::finishUndo() +void Cursor::finishUndo() const { bv_->buffer().undo().finishUndo(); } -void Cursor::recordUndo(UndoKind kind, pit_type from, pit_type to) +void Cursor::beginUndoGroup() const +{ + bv_->buffer().undo().beginUndoGroup(); +} + + +void Cursor::endUndoGroup() const +{ + bv_->buffer().undo().endUndoGroup(); +} + + +void Cursor::recordUndo(UndoKind kind, pit_type from, pit_type to) const { bv_->buffer().undo().recordUndo(*this, kind, from, to); } -void Cursor::recordUndo(UndoKind kind, pit_type from) +void Cursor::recordUndo(UndoKind kind, pit_type from) const { bv_->buffer().undo().recordUndo(*this, kind, from); } -void Cursor::recordUndo(UndoKind kind) +void Cursor::recordUndo(UndoKind kind) const { bv_->buffer().undo().recordUndo(*this, kind); } -void Cursor::recordUndoInset(UndoKind kind) +void Cursor::recordUndoInset(UndoKind kind) const { bv_->buffer().undo().recordUndoInset(*this, kind); } -void Cursor::recordUndoFullDocument() +void Cursor::recordUndoFullDocument() const { bv_->buffer().undo().recordUndoFullDocument(*this); } -void Cursor::recordUndoSelection() +void Cursor::recordUndoSelection() const { if (inMathed()) { if (cap::multipleCellsSelected(*this))