From: Georg Baum Date: Wed, 12 Oct 2005 18:44:53 +0000 (+0000) Subject: implement missing bits of math cut and paste and fix bug 2059 X-Git-Tag: 1.6.10~13841 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=d7055d0a8e64f66afc9f43f7d22fc9c71a2d1cac;p=features.git implement missing bits of math cut and paste and fix bug 2059 git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10548 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/ChangeLog b/src/ChangeLog index faf4cd5b5f..4dd054fb80 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,19 @@ +2005-10-09 Georg Baum + + * CutAndPaste.C (nrOfParagraphs): remove (unused) + * CutAndPaste.C (cutSelection): Remove debug message + * CutAndPaste.C (cutSelection): Use the real cursor in mathed, record + undo information and only copy if this is a real cut + * CutAndPaste.C (pasteSelection): remove superflous cur.resetAnchor() + call + * CutAndPaste.C (pasteSelection): remove now superflous mathed warning + (bug 2059) + * CutAndPaste.C (eraseSelection): prevent cursor corruption + * CutAndPaste.C (grabAndEraseSelection, selDel): remove now + superflous cur.selection() setting + * CutAndPaste.[Ch] (grabSelection): take a const cursor + * cursor.C (selectionAsString): implement mathed case ((bug 2059) + 2005-10-09 Georg Baum * text3.C (mathDispatch, dispatch): Dont' record undo steps that don't diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index 25193a4a07..436113033a 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -370,7 +370,6 @@ string grabAndEraseSelection(LCursor & cur) return string(); string res = grabSelection(cur); eraseSelection(cur); - cur.selection() = false; return res; } @@ -473,14 +472,15 @@ std::vector const availableSelections(Buffer const & buffer) } -int nrOfParagraphs() +void cutSelection(LCursor & cur, bool doclear, bool realcut) { - return theCuts.empty() ? 0 : theCuts[0].first.size(); -} + // This doesn't make sense, if there is no selection + if (!cur.selection()) + return; + // OK, we have a selection. This is always between cur.selBegin() + // and cur.selEnd() -void cutSelection(LCursor & cur, bool doclear, bool realcut) -{ if (cur.inTexted()) { LyXText * text = cur.text(); BOOST_ASSERT(text); @@ -494,13 +494,6 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut) // calls to stuffClipboard. (Lgb) // cur.bv().stuffClipboard(cur.selectionAsString(true)); - // This doesn't make sense, if there is no selection - if (!cur.selection()) - return; - - // OK, we have a selection. This is always between cur.selBegin() - // and cur.selEnd() - // make sure that the depth behind the selection are restored, too recordUndoSelection(cur); pit_type begpit = cur.selBegin().pit(); @@ -542,11 +535,18 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut) } if (cur.inMathed()) { - lyxerr << "cutSelection in mathed" << endl; - LCursor tmp = cur; - copySelection(cur); - cur.selection() = false; - eraseSelection(tmp); + if (cur.selBegin().idx() != cur.selEnd().idx()) { + // The current selection spans more than one cell. + // Record all cells + recordUndoInset(cur); + } else { + // Record only the current cell to avoid a jumping + // cursor after undo + recordUndo(cur); + } + if (realcut) + copySelection(cur); + eraseSelection(cur); } } @@ -630,15 +630,13 @@ void pasteSelection(LCursor & cur, size_t sel_index) cur.bv().showErrorList(_("Paste")); cur.clearSelection(); - cur.resetAnchor(); text->setCursor(cur, ppp.first, ppp.second); cur.setSelection(); updateCounters(cur.buffer()); } - if (cur.inMathed()) { - lyxerr << "### should be handled in MathNest/GridInset" << endl; - } + // mathed is handled in MathNestInset/MathGridInset + BOOST_ASSERT(!cur.inMathed()); } @@ -710,6 +708,10 @@ void eraseSelection(LCursor & cur) cur.top() = i1; if (i1.idx() == i2.idx()) { i1.cell().erase(i1.pos(), i2.pos()); + // We may have deleted i1.cell(cur.pos()). + // Make sure that pos is valid. + if (cur.pos() > cur.lastpos()) + cur.pos() = cur.lastpos(); } else { MathInset * p = i1.asMathInset(); InsetBase::row_type r1, r2; @@ -721,7 +723,8 @@ void eraseSelection(LCursor & cur) // We've deleted the whole cell. Only pos 0 is valid. cur.pos() = 0; } - cur.resetAnchor(); + // need a valid cursor. (Lgb) + cur.clearSelection(); } else { lyxerr << "can't erase this selection 1" << endl; } @@ -732,10 +735,8 @@ void eraseSelection(LCursor & cur) void selDel(LCursor & cur) { //lyxerr << "LCursor::selDel" << endl; - if (cur.selection()) { + if (cur.selection()) eraseSelection(cur); - cur.selection() = false; - } } @@ -749,11 +750,20 @@ void selClearOrDel(LCursor & cur) } -string grabSelection(LCursor & cur) +string grabSelection(LCursor const & cur) { if (!cur.selection()) return string(); + // FIXME: What is wrong with the following? +#if 0 + std::ostringstream os; + for (DocIterator dit = cur.selectionBegin(); + dit != cur.selectionEnd(); dit.forwardPos()) + os << asString(dit.cell()); + return os.str(); +#endif + CursorSlice i1 = cur.selBegin(); CursorSlice i2 = cur.selEnd(); diff --git a/src/CutAndPaste.h b/src/CutAndPaste.h index 4acfbd8341..bb94d83234 100644 --- a/src/CutAndPaste.h +++ b/src/CutAndPaste.h @@ -67,7 +67,7 @@ void SwitchBetweenClasses(lyx::textclass_type c1, void replaceWord(LCursor & cur, std::string const & replacestring); /// -std::string grabSelection(LCursor & cur); +std::string grabSelection(LCursor const & cur); /// void eraseSelection(LCursor & cur); /// diff --git a/src/cursor.C b/src/cursor.C index 5c28e86895..ff206f5320 100644 --- a/src/cursor.C +++ b/src/cursor.C @@ -1126,9 +1126,9 @@ string LCursor::selectionAsString(bool label) const return result; } -#ifdef WITH_WARNINGS -#warning and mathed? -#endif + if (inMathed()) + return lyx::cap::grabSelection(*this); + return string(); } diff --git a/src/mathed/ChangeLog b/src/mathed/ChangeLog index d0bb6cea54..b138600eec 100644 --- a/src/mathed/ChangeLog +++ b/src/mathed/ChangeLog @@ -1,3 +1,9 @@ +2005-10-09 Georg Baum + + * math_gridinset.C (doDispatch): adjust paste to match paste in text + and math nest inset + * math_nestinset.C (doDispatch): implement paste (bug 2059) + 2005-10-09 Georg Baum * math_nestinset.C (doDispatch): Don't record undo steps when diff --git a/src/mathed/math_gridinset.C b/src/mathed/math_gridinset.C index c9fcfcc514..29c1d1200a 100644 --- a/src/mathed/math_gridinset.C +++ b/src/mathed/math_gridinset.C @@ -1196,7 +1196,8 @@ void MathGridInset::doDispatch(LCursor & cur, FuncRequest & cmd) } case LFUN_PASTE: { - lyxerr << "MathGridInset: PASTE: " << cmd << std::endl; + cur.message(_("Paste")); + lyx::cap::replaceSelection(cur); istringstream is(cmd.argument); int n = 0; is >> n; @@ -1230,6 +1231,9 @@ void MathGridInset::doDispatch(LCursor & cur, FuncRequest & cmd) for (col_type c = 0; c < grid.ncols(); ++c) cell(i).append(grid.cell(grid.index(r, c))); } + cur.clearSelection(); // bug 393 + cur.bv().switchKeyMap(); + finishUndo(); break; } diff --git a/src/mathed/math_nestinset.C b/src/mathed/math_nestinset.C index b12a44ad16..5f401c1758 100644 --- a/src/mathed/math_nestinset.C +++ b/src/mathed/math_nestinset.C @@ -415,7 +415,8 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd) size_t n = 0; istringstream is(cmd.argument); is >> n; - pasteSelection(cur, n); + string const selection = lyx::cap::getSelection(cur.buffer(), n); + cur.niceInsert(selection); cur.clearSelection(); // bug 393 cur.bv().switchKeyMap(); finishUndo(); @@ -427,6 +428,7 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd) cutSelection(cur, true, true); cur.message(_("Cut")); // Prevent stale position >= size crash + // Probably not necessary anymore, see eraseSelection (gb 2005-10-09) cur.normalize(); break; diff --git a/src/undo.h b/src/undo.h index 781621c5bb..fe677a8a4b 100644 --- a/src/undo.h +++ b/src/undo.h @@ -105,6 +105,13 @@ void finishUndo(); * end' of the range of changed paragraphs. So we give an inclusive range. * This is called before you make the changes to the paragraph, and it * will record the original information of the paragraphs in the undo stack. + * + * FIXME: We need something to record undo in partial grids for mathed. + * Right now we use recordUndoInset if more than one cell is changed, + * but that puts the cursor in front of the inset after undo. We would need + * something like + * recordUndoGrid(LCursor & cur, Undo::undo_kind kind, idx_type from, idx_type to); + * and store the cell information in class Undo. */ /// The general case: prepare undo for an arbitrary range.