Dylan Smith : richedit: Use ME_Cursor instead of offsets for copying text.
Alexandre Julliard
julliard at winehq.org
Thu Aug 13 10:40:53 CDT 2009
Module: wine
Branch: master
Commit: a69ef26599d2242ea92f6f861776144fe8abae7a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a69ef26599d2242ea92f6f861776144fe8abae7a
Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date: Thu Aug 13 08:44:05 2009 -0400
richedit: Use ME_Cursor instead of offsets for copying text.
---
dlls/riched20/clipboard.c | 27 ++++++++++++++-------------
dlls/riched20/editor.c | 31 ++++++++++++++++++++-----------
dlls/riched20/editor.h | 2 +-
dlls/riched20/richole.c | 13 +++++++++----
4 files changed, 44 insertions(+), 29 deletions(-)
diff --git a/dlls/riched20/clipboard.c b/dlls/riched20/clipboard.c
index d573369..3a8e547 100644
--- a/dlls/riched20/clipboard.c
+++ b/dlls/riched20/clipboard.c
@@ -326,26 +326,23 @@ static const IDataObjectVtbl VT_DataObjectImpl =
DataObjectImpl_EnumDAdvise
};
-static HGLOBAL get_unicode_text(ME_TextEditor *editor, const CHARRANGE *lpchrg)
+static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
{
int pars = 0;
- int len;
WCHAR *data;
HANDLE ret;
- ME_Cursor start;
ME_DisplayItem *para;
+ int nEnd = ME_GetCursorOfs(start) + nChars;
- ME_CursorFromCharOfs(editor, lpchrg->cpMin, &start);
/* count paragraphs in range */
- para = start.pPara;
+ para = start->pPara;
while((para = para->member.para.next_para) &&
- para->member.para.nCharOfs <= lpchrg->cpMax)
+ para->member.para.nCharOfs <= nEnd)
pars++;
- len = lpchrg->cpMax-lpchrg->cpMin;
- ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR)*(len+pars+1));
+ ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * (nChars + pars + 1));
data = GlobalLock(ret);
- len = ME_GetTextW(editor, data, len+pars, &start, len, TRUE);
+ ME_GetTextW(editor, data, nChars + pars, start, nChars, TRUE);
GlobalUnlock(ret);
return ret;
}
@@ -392,10 +389,11 @@ static HGLOBAL get_rtf_text(ME_TextEditor *editor, const CHARRANGE *lpchrg)
return gds.hData;
}
-HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAOBJECT *lplpdataobj)
+HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start,
+ int nChars, LPDATAOBJECT *lplpdataobj)
{
DataObjectImpl *obj;
- TRACE("(%p,%d,%d)\n", editor, lpchrg->cpMin, lpchrg->cpMax);
+ TRACE("(%p,%d,%d)\n", editor, ME_GetCursorOfs(start), nChars);
obj = heap_alloc(sizeof(DataObjectImpl));
if(cfRTF == 0)
@@ -403,7 +401,7 @@ HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAO
obj->lpVtbl = &VT_DataObjectImpl;
obj->ref = 1;
- obj->unicode = get_unicode_text(editor, lpchrg);
+ obj->unicode = get_unicode_text(editor, start, nChars);
obj->rtf = NULL;
obj->fmtetc_cnt = 1;
@@ -412,7 +410,10 @@ HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAO
obj->fmtetc = GlobalAlloc(GMEM_ZEROINIT, obj->fmtetc_cnt*sizeof(FORMATETC));
InitFormatEtc(obj->fmtetc[0], CF_UNICODETEXT, TYMED_HGLOBAL);
if(editor->mode & TM_RICHTEXT) {
- obj->rtf = get_rtf_text(editor, lpchrg);
+ CHARRANGE chrg;
+ chrg.cpMin = ME_GetCursorOfs(start);
+ chrg.cpMax = chrg.cpMin + nChars;
+ obj->rtf = get_rtf_text(editor, &chrg);
InitFormatEtc(obj->fmtetc[1], cfRTF, TYMED_HGLOBAL);
}
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 685e0f1..0b7ee7f 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2001,7 +2001,7 @@ static BOOL ME_Paste(ME_TextEditor *editor)
return TRUE;
}
-static BOOL ME_Copy(ME_TextEditor *editor, CHARRANGE *range)
+static BOOL ME_Copy(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
{
LPDATAOBJECT dataObj = NULL;
HRESULT hr = S_OK;
@@ -2010,9 +2010,14 @@ static BOOL ME_Copy(ME_TextEditor *editor, CHARRANGE *range)
return FALSE; /* Copying or Cutting masked text isn't allowed */
if(editor->lpOleCallback)
- hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, range, RECO_COPY, &dataObj);
+ {
+ CHARRANGE range;
+ range.cpMin = ME_GetCursorOfs(start);
+ range.cpMax = range.cpMin + nChars;
+ hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, &range, RECO_COPY, &dataObj);
+ }
if(FAILED(hr) || !dataObj)
- hr = ME_GetDataObject(editor, range, &dataObj);
+ hr = ME_GetDataObject(editor, start, nChars, &dataObj);
if(SUCCEEDED(hr)) {
hr = OleSetClipboard(dataObj);
IDataObject_Release(dataObj);
@@ -2270,14 +2275,16 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
case 'X':
if (ctrl_is_down)
{
- CHARRANGE range;
BOOL result;
+ int nOfs, nChars;
+ int nStartCur = ME_GetSelectionOfs(editor, &nOfs, &nChars);
+ ME_Cursor *selStart = &editor->pCursors[nStartCur];
- ME_GetSelectionOfs(editor, &range.cpMin, &range.cpMax);
- result = ME_Copy(editor, &range);
+ nChars -= nOfs;
+ result = ME_Copy(editor, selStart, nChars);
if (result && nKey == 'X')
{
- ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
+ ME_InternalDeleteText(editor, nOfs, nChars, FALSE);
ME_CommitUndo(editor);
ME_UpdateRepaint(editor);
}
@@ -3537,12 +3544,14 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_CUT:
case WM_COPY:
{
- CHARRANGE range;
- ME_GetSelectionOfs(editor, &range.cpMin, &range.cpMax);
+ int nOfs, nChars;
+ int nStartCur = ME_GetSelectionOfs(editor, &nOfs, &nChars);
+ ME_Cursor *selStart = &editor->pCursors[nStartCur];
- if (ME_Copy(editor, &range) && msg == WM_CUT)
+ nChars -= nOfs;
+ if (ME_Copy(editor, selStart, nChars) && msg == WM_CUT)
{
- ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
+ ME_InternalDeleteText(editor, nOfs, nChars, FALSE);
ME_CommitUndo(editor);
ME_UpdateRepaint(editor);
}
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 14750c8..3dc00b8 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -335,4 +335,4 @@ LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, int nStart, int
LRESULT ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream);
/* clipboard.c */
-HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAOBJECT *lplpdataobj);
+HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, int nChars, LPDATAOBJECT *lplpdataobj);
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index dc5619a..2a9dc01 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -315,16 +315,21 @@ IRichEditOle_fnGetClipboardData(IRichEditOle *me, CHARRANGE *lpchrg,
DWORD reco, LPDATAOBJECT *lplpdataobj)
{
IRichEditOleImpl *This = impl_from_IRichEditOle(me);
- CHARRANGE tmpchrg;
+ ME_Cursor start;
+ int nChars;
TRACE("(%p,%p,%d)\n",This, lpchrg, reco);
if(!lplpdataobj)
return E_INVALIDARG;
if(!lpchrg) {
- ME_GetSelectionOfs(This->editor, &tmpchrg.cpMin, &tmpchrg.cpMax);
- lpchrg = &tmpchrg;
+ int nFrom, nTo, nStartCur = ME_GetSelectionOfs(This->editor, &nFrom, &nTo);
+ start = This->editor->pCursors[nStartCur];
+ nChars = nTo - nFrom;
+ } else {
+ ME_CursorFromCharOfs(This->editor, lpchrg->cpMin, &start);
+ nChars = lpchrg->cpMax - lpchrg->cpMin;
}
- return ME_GetDataObject(This->editor, lpchrg, lplpdataobj);
+ return ME_GetDataObject(This->editor, &start, nChars, lplpdataobj);
}
static LONG WINAPI IRichEditOle_fnGetLinkCount(IRichEditOle *me)
More information about the wine-cvs
mailing list