Jean-Marc Lasgouttes wrote:
>>>>>> "Georg" == Georg Baum
>>>>>> <[EMAIL PROTECTED]>
>>>>>> writes:
>
> Georg> The attached patch fixes bug 2059 and cut and paste in mathed
> Georg> in general. It requires my previous undo patch.
>
> You posted the undo patch again, didn't you?
Indeed. Here is the right one.
Georg
diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/ChangeLog lyx-1.4-cvs/src/ChangeLog
--- lyx-1.4-clean/src/ChangeLog 2005-10-08 10:43:27.000000000 +0200
+++ lyx-1.4-cvs/src/ChangeLog 2005-10-09 16:11:03.498138752 +0200
@@ -1,3 +1,19 @@
+2005-10-09 Georg Baum <[EMAIL PROTECTED]>
+
+ * 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-07 Jürgen Spitzmüller <[EMAIL PROTECTED]>
* LyXAction.C:
diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/cursor.C lyx-1.4-cvs/src/cursor.C
--- lyx-1.4-clean/src/cursor.C 2005-10-03 14:26:39.000000000 +0200
+++ lyx-1.4-cvs/src/cursor.C 2005-10-09 13:19:44.000000000 +0200
@@ -1126,9 +1136,9 @@ string LCursor::selectionAsString(bool l
return result;
}
-#ifdef WITH_WARNINGS
-#warning and mathed?
-#endif
+ if (inMathed())
+ return lyx::cap::grabSelection(*this);
+
return string();
}
diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/CutAndPaste.C lyx-1.4-cvs/src/CutAndPaste.C
--- lyx-1.4-clean/src/CutAndPaste.C 2005-09-07 20:50:17.000000000 +0200
+++ lyx-1.4-cvs/src/CutAndPaste.C 2005-10-09 16:10:42.822281960 +0200
@@ -370,7 +370,6 @@ string grabAndEraseSelection(LCursor & c
return string();
string res = grabSelection(cur);
eraseSelection(cur);
- cur.selection() = false;
return res;
}
@@ -473,14 +472,15 @@ std::vector<string> const availableSelec
}
-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 do
// 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 do
}
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_
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 -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/CutAndPaste.h lyx-1.4-cvs/src/CutAndPaste.h
--- lyx-1.4-clean/src/CutAndPaste.h 2005-09-07 20:50:17.000000000 +0200
+++ lyx-1.4-cvs/src/CutAndPaste.h 2005-10-08 17:42:03.000000000 +0200
@@ -67,7 +67,7 @@ void SwitchBetweenClasses(lyx::textclass
void replaceWord(LCursor & cur, std::string const & replacestring);
///
-std::string grabSelection(LCursor & cur);
+std::string grabSelection(LCursor const & cur);
///
void eraseSelection(LCursor & cur);
///
diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/undo.h lyx-1.4-cvs/src/undo.h
--- lyx-1.4-clean/src/undo.h 2005-07-16 10:58:54.000000000 +0200
+++ lyx-1.4-cvs/src/undo.h 2005-10-09 16:06:14.881015224 +0200
@@ -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.
diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/mathed/ChangeLog lyx-1.4-cvs/src/mathed/ChangeLog
--- lyx-1.4-clean/src/mathed/ChangeLog 2005-10-05 22:12:57.000000000 +0200
+++ lyx-1.4-cvs/src/mathed/ChangeLog 2005-10-09 13:31:25.000000000 +0200
@@ -1,3 +1,9 @@
+2005-10-09 Georg Baum <[EMAIL PROTECTED]>
+
+ * 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-04 Georg Baum <[EMAIL PROTECTED]>
* math_macro.C (editXY): new, fix crash (bug 2060)
diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/mathed/math_gridinset.C lyx-1.4-cvs/src/mathed/math_gridinset.C
--- lyx-1.4-clean/src/mathed/math_gridinset.C 2005-07-18 21:19:33.000000000 +0200
+++ lyx-1.4-cvs/src/mathed/math_gridinset.C 2005-10-09 15:59:43.000000000 +0200
@@ -1197,6 +1197,8 @@ void MathGridInset::doDispatch(LCursor &
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 +1232,9 @@ void MathGridInset::doDispatch(LCursor &
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 -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/mathed/math_nestinset.C lyx-1.4-cvs/src/mathed/math_nestinset.C
--- lyx-1.4-clean/src/mathed/math_nestinset.C 2005-10-05 21:11:45.000000000 +0200
+++ lyx-1.4-cvs/src/mathed/math_nestinset.C 2005-10-09 16:12:58.390672432 +0200
@@ -415,7 +415,8 @@ void MathNestInset::doDispatch(LCursor &
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 &
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;