>>>>> "Jean-Marc" == Jean-Marc Lasgouttes <[EMAIL PROTECTED]> writes:

Jean-Marc> Updated patch attached.

This one adds mainly two things:

- backspacePos0 also handles the case where the paragraph before
  cursor is empty.

- Delete(cur) is also rewritten (1) to be simpler and (2) to work with
  these empty paragraphs.

Please test, in particular with change tracking.

JMarc

Index: src/text.C
===================================================================
--- src/text.C	(revision 15370)
+++ src/text.C	(working copy)
@@ -1589,31 +1589,35 @@ bool LyXText::Delete(LCursor & cur)
 {
 	BOOST_ASSERT(this == cur.text());
 	bool needsUpdate = false;
+	Paragraph & par = cur.paragraph();
 
 	if (cur.pos() != cur.lastpos()) {
-		recordUndo(cur, Undo::DELETE, cur.pit());
-		setCursorIntern(cur, cur.pit(), cur.pos() + 1, false, cur.boundary());
-		needsUpdate = backspace(cur);
-		if (cur.paragraph().lookupChange(cur.pos()) == Change::DELETED)
-			cur.posRight();
+		// this is the code for a normal delete, not pasting
+		// any paragraphs
+		recordUndo(cur, Undo::DELETE);
+		par.erase(cur.pos());
+		if (par.lookupChange(cur.pos()) == Change::DELETED)
+			cur.forwardPos();
+		needsUpdate = true;
 	} else if (cur.pit() != cur.lastpit()) {
-		LCursor scur = cur;
-
-		setCursorIntern(cur, cur.pit() + 1, 0, false, false);
-		if (pars_[cur.pit()].layout() == pars_[scur.pit()].layout()) {
-			recordUndo(scur, Undo::DELETE, scur.pit());
-			needsUpdate = backspace(cur);
-			if (cur.buffer().params().tracking_changes) {
-				// move forward after the paragraph break is DELETED
-				Paragraph & par = cur.paragraph();
-				if (par.lookupChange(par.size()) == Change::DELETED)
-					setCursorIntern(cur, cur.pit() + 1, 0);
-				}
+		if (cur.buffer().params().tracking_changes
+		    && par.lookupChange(cur.pos()) != Change::INSERTED) {
+			// mark "carriage return" as deleted:
+			par.setChange(cur.pos(), Change::DELETED);
+			cur.forwardPos();
+			needsUpdate = true;
 		} else {
-			setCursorIntern(scur, scur.pit(), scur.pos(), false, scur.boundary());
+			setCursorIntern(cur, cur.pit() + 1, 0, false, false);
+			needsUpdate = backspacePos0(cur);
+			if (cur.paragraph().lookupChange(cur.pos()) == Change::DELETED)
+				cur.forwardPos();
 		}
 	} else
 		needsUpdate = dissolveInset(cur);
+
+	// Make sure the cursor is correct. Is this really needed?
+	if (needsUpdate)
+		setCursorIntern(cur, cur.pit(), cur.pos(), false, cur.boundary());
 	
 	return needsUpdate;
 }
@@ -1622,73 +1626,50 @@ bool LyXText::Delete(LCursor & cur)
 bool LyXText::backspacePos0(LCursor & cur)
 {
 	BOOST_ASSERT(this == cur.text());
+	if (cur.pit() == 0)
+		return false;
+
 	bool needsUpdate = false;
 
-	Paragraph & par = cur.paragraph();
+	BufferParams const & bufparams = cur.buffer().params();
+	LyXTextClass const & tclass = bufparams.getLyXTextClass();
+	ParagraphList & plist = cur.text()->paragraphs();
+	Paragraph const & par = cur.paragraph();
+	LCursor prevcur = cur;
+	--prevcur.pit();
+	prevcur.pos() = prevcur.lastpos();
+	Paragraph const & prevpar = prevcur.paragraph();
+
 	// is it an empty paragraph?
-	pos_type lastpos = cur.lastpos();
-	if (lastpos == 0 || (lastpos == 1 && par.isSeparator(0))) {
-		// This is an empty paragraph and we delete it just
-		// by moving the cursor one step
-		// left and let the DeleteEmptyParagraphMechanism
-		// handle the actual deletion of the paragraph.
-
-		if (cur.pit() != 0) {
-			// For KeepEmpty layouts we need to get
-			// rid of the keepEmpty setting first.
-			// And the only way to do this is to
-			// reset the layout to something
-			// else: f.ex. the default layout.
-			if (par.allowEmpty()) {
-				Buffer & buf = cur.buffer();
-				BufferParams const & bparams = buf.params();
-				par.layout(bparams.getLyXTextClass().defaultLayout());
-			}
-                                
-			cursorLeft(cur);
-			return true;
-		}
+	if (cur.lastpos() == 0 
+	    || (cur.lastpos() == 1 && par.isSeparator(0))) {
+		recordUndo(cur, Undo::ATOMIC, prevcur.pit(), cur.pit());
+		plist.erase(boost::next(plist.begin(), cur.pit()));
+		needsUpdate = true;
 	}
-
-	if (cur.pit() != 0)
-		recordUndo(cur, Undo::DELETE, cur.pit() - 1);
-
-	pit_type tmppit = cur.pit();
-	// We used to do cursorLeftIntern() here, but it is
-	// not a good idea since it triggers the auto-delete
-	// mechanism. So we do a cursorLeftIntern()-lite,
-	// without the dreaded mechanism. (JMarc)
-	if (cur.pit() != 0) {
-		// steps into the above paragraph.
-		setCursorIntern(cur, cur.pit() - 1,
-				pars_[cur.pit() - 1].size(),
-				false);
+	// is previous par empty?
+	else if (prevcur.lastpos() == 0 
+		 || (prevcur.lastpos() == 1 && prevpar.isSeparator(0))) {
+		recordUndo(cur, Undo::ATOMIC, prevcur.pit(), cur.pit());
+		plist.erase(boost::next(plist.begin(), prevcur.pit()));
+		needsUpdate = true;
 	}
-
 	// Pasting is not allowed, if the paragraphs have different
 	// layout. I think it is a real bug of all other
 	// word processors to allow it. It confuses the user.
 	// Correction: Pasting is always allowed with standard-layout
-	// Correction (Jug 20050717): Remove check about alignment!
-	Buffer & buf = cur.buffer();
-	BufferParams const & bufparams = buf.params();
-	LyXTextClass const & tclass = bufparams.getLyXTextClass();
-	pit_type const cpit = cur.pit();
-
-	if (cpit != tmppit
-	    && (pars_[cpit].layout() == pars_[tmppit].layout()
-	        || pars_[tmppit].layout() == tclass.defaultLayout()))
-	{
-		mergeParagraph(bufparams, pars_, cpit);
+	else if (par.layout() == prevpar.layout()
+		 || par.layout() == tclass.defaultLayout()) {
+		recordUndo(cur, Undo::ATOMIC, prevcur.pit());
+		mergeParagraph(bufparams, plist, prevcur.pit());
 		needsUpdate = true;
+	}
 
-		if (cur.pos() != 0 && pars_[cpit].isSeparator(cur.pos() - 1))
-				--cur.pos();
-
-		// the counters may have changed
+	if (needsUpdate) {
 		updateCounters(cur.buffer());
-		setCursor(cur, cur.pit(), cur.pos(), false);
+		setCursorIntern(cur, prevcur.pit(), prevcur.pos(), false);
 	}
+
 	return needsUpdate;
 }
 
@@ -1701,11 +1682,7 @@ bool LyXText::backspace(LCursor & cur)
 		if (cur.pit() == 0)
 			return dissolveInset(cur);
 
-		// The cursor is at the beginning of a paragraph, so
-		// the the backspace will collapse two paragraphs into
-		// one.
-
-		if (cur.pit() != 0 && cur.buffer().params().tracking_changes) {
+		if (cur.buffer().params().tracking_changes) {
 			// Previous paragraph, mark "carriage return" as
 			// deleted:
 			Paragraph & par = pars_[cur.pit() - 1];
@@ -1717,6 +1694,8 @@ bool LyXText::backspace(LCursor & cur)
 			}
 		}
 
+		// The cursor is at the beginning of a paragraph, so
+		// the backspace will collapse two paragraphs into one.
 		needsUpdate = backspacePos0(cur);
 
 	} else {

Reply via email to