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;
 

Reply via email to