Dylan Smith : richedit: Reversed deletion direction so tables are inserted forwards.
Alexandre Julliard
julliard at winehq.org
Mon Aug 18 10:46:10 CDT 2008
Module: wine
Branch: master
Commit: bc61a637b9629af9efa66b085e04355ff0af9c11
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc61a637b9629af9efa66b085e04355ff0af9c11
Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date: Thu Aug 7 12:31:37 2008 -0400
richedit: Reversed deletion direction so tables are inserted forwards.
---
dlls/riched20/caret.c | 50 ++++++++++++++++++++++++++++++++++++------------
1 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 754c75f..90a5aa8 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -268,6 +268,19 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
ME_Cursor c;
int shift = 0;
int totalChars = nChars;
+ ME_DisplayItem *start_para;
+
+ {
+ /* Prevent deletion past last end of paragraph run. */
+ ME_DisplayItem *pTextEnd = editor->pBuffer->pLast;
+ int nMaxChars = pTextEnd->member.para.prev_para->member.para.nCharOfs;
+ nMaxChars += ME_FindItemBack(pTextEnd, diRun)->member.run.nCharOfs;
+ nMaxChars -= nOfs;
+ nChars = min(nChars, nMaxChars);
+ }
+
+ ME_CursorFromCharOfs(editor, nOfs, &c);
+ start_para = ME_GetParagraph(c.pRun);
if (!bForce)
{
@@ -279,7 +292,19 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
while(nChars > 0)
{
ME_Run *run;
- ME_CursorFromCharOfs(editor, nOfs, &c);
+ ME_CursorFromCharOfs(editor, nOfs+nChars, &c);
+ if (!c.nOffset &&
+ nOfs+nChars == (c.pRun->member.run.nCharOfs
+ + ME_GetParagraph(c.pRun)->member.para.nCharOfs))
+ {
+ /* We aren't deleting anything in this run, so we will go back to the
+ * last run we are deleting text in. */
+ c.pRun = ME_FindItemBack(c.pRun, diRun);
+ if (c.pRun->member.run.nFlags & MERF_ENDPARA)
+ c.nOffset = c.pRun->member.run.nCR + c.pRun->member.run.nLF;
+ else
+ c.nOffset = c.pRun->member.run.strText->nLen;
+ }
run = &c.pRun->member.run;
if (run->nFlags & MERF_ENDPARA) {
int eollen = run->nCR + run->nLF;
@@ -300,22 +325,21 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
else
{
ME_Cursor cursor;
- int nIntendedChars = nChars;
- int nCharsToDelete = nChars;
+ int nCharsToDelete = min(nChars, c.nOffset);
int i;
- int loc = c.nOffset;
-
+
+ c.nOffset -= nCharsToDelete;
+
ME_FindItemBack(c.pRun, diParagraph)->member.para.nFlags |= MEPF_REWRAP;
-
+
cursor = c;
- ME_StrRelPos(run->strText, loc, &nChars);
/* nChars is the number of characters that should be deleted from the
- FOLLOWING runs (these AFTER cursor.pRun)
+ PRECEDING runs (these BEFORE cursor.pRun)
nCharsToDelete is a number of chars to delete from THIS run */
- nCharsToDelete -= nChars;
+ nChars -= nCharsToDelete;
shift -= nCharsToDelete;
- TRACE("Deleting %d (intended %d-remaning %d) chars at %d in '%s' (%d)\n",
- nCharsToDelete, nIntendedChars, nChars, c.nOffset,
+ TRACE("Deleting %d (remaning %d) chars at %d in '%s' (%d)\n",
+ nCharsToDelete, nChars, c.nOffset,
debugstr_w(run->strText->szData), run->strText->nLen);
if (!c.nOffset && ME_StrVLen(run->strText) == nCharsToDelete)
@@ -325,7 +349,7 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
to the current (deleted) run */
ME_UndoItem *pUndo = ME_AddUndoItem(editor, diUndoInsertRun, c.pRun);
if (pUndo)
- pUndo->di.member.run.nCharOfs = nOfs;
+ pUndo->di.member.run.nCharOfs = nOfs+nChars;
}
else
{
@@ -333,7 +357,7 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
ME_UndoItem *pUndo = ME_AddUndoItem(editor, diUndoInsertRun, c.pRun);
if (pUndo) {
ME_DestroyString(pUndo->di.member.run.strText);
- pUndo->di.member.run.nCharOfs = nOfs;
+ pUndo->di.member.run.nCharOfs = nOfs+nChars;
pUndo->di.member.run.strText = ME_MakeStringN(run->strText->szData+c.nOffset, nCharsToDelete);
}
}
More information about the wine-cvs
mailing list