Author: cwittich
Date: Mon Oct 27 03:10:25 2008
New Revision: 37014
URL:
http://svn.reactos.org/svn/reactos?rev=37014&view=rev
Log:
sync riched20 with wine 1.1.7
Modified:
trunk/reactos/dll/win32/riched20/editor.c
trunk/reactos/dll/win32/riched20/editstr.h
trunk/reactos/dll/win32/riched20/paint.c
trunk/reactos/dll/win32/riched20/para.c
trunk/reactos/dll/win32/riched20/reader.c
trunk/reactos/dll/win32/riched20/string.c
trunk/reactos/dll/win32/riched20/table.c
trunk/reactos/dll/win32/riched20/txtsrv.c
trunk/reactos/dll/win32/riched20/undo.c
trunk/reactos/dll/win32/riched20/wrap.c
trunk/reactos/dll/win32/riched20/writer.c
Modified: trunk/reactos/dll/win32/riched20/editor.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/editor.…
==============================================================================
--- trunk/reactos/dll/win32/riched20/editor.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/editor.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -101,6 +101,7 @@
- EM_SETIMEOPTIONS 1.0asian
- EM_SETLANGOPTIONS 2.0
- EM_SETLIMITTEXT
+ - EM_SETMARGINS
+ EM_SETMODIFY (not sure if implementation is correct)
- EM_SETOLECALLBACK
+ EM_SETOPTIONS (partially implemented)
@@ -1937,6 +1938,93 @@
return -1;
}
+typedef struct tagME_GlobalDestStruct
+{
+ HGLOBAL hData;
+ int nLength;
+} ME_GlobalDestStruct;
+
+static DWORD CALLBACK ME_ReadFromHGLOBALUnicode(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG
cb, LONG *pcb)
+{
+ ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
+ int i;
+ WORD *pSrc, *pDest;
+
+ cb = cb >> 1;
+ pDest = (WORD *)lpBuff;
+ pSrc = (WORD *)GlobalLock(pData->hData);
+ for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
+ pDest[i] = pSrc[pData->nLength+i];
+ }
+ pData->nLength += i;
+ *pcb = 2*i;
+ GlobalUnlock(pData->hData);
+ return 0;
+}
+
+static DWORD CALLBACK ME_ReadFromHGLOBALRTF(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb,
LONG *pcb)
+{
+ ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
+ int i;
+ BYTE *pSrc, *pDest;
+
+ pDest = lpBuff;
+ pSrc = (BYTE *)GlobalLock(pData->hData);
+ for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
+ pDest[i] = pSrc[pData->nLength+i];
+ }
+ pData->nLength += i;
+ *pcb = i;
+ GlobalUnlock(pData->hData);
+ return 0;
+}
+
+static BOOL ME_Paste(ME_TextEditor *editor)
+{
+ DWORD dwFormat = 0;
+ EDITSTREAM es;
+ ME_GlobalDestStruct gds;
+ UINT nRTFFormat = RegisterClipboardFormatA("Rich Text Format");
+ UINT cf = 0;
+
+ if (IsClipboardFormatAvailable(nRTFFormat))
+ cf = nRTFFormat, dwFormat = SF_RTF;
+ else if (IsClipboardFormatAvailable(CF_UNICODETEXT))
+ cf = CF_UNICODETEXT, dwFormat = SF_TEXT|SF_UNICODE;
+ else
+ return FALSE;
+
+ if (!OpenClipboard(editor->hWnd))
+ return FALSE;
+ gds.hData = GetClipboardData(cf);
+ gds.nLength = 0;
+ es.dwCookie = (DWORD)&gds;
+ es.pfnCallback = dwFormat == SF_RTF ? ME_ReadFromHGLOBALRTF :
ME_ReadFromHGLOBALUnicode;
+ ME_StreamIn(editor, dwFormat|SFF_SELECTION, &es, FALSE);
+
+ CloseClipboard();
+ return TRUE;
+}
+
+static BOOL ME_Copy(ME_TextEditor *editor, CHARRANGE *range)
+{
+ LPDATAOBJECT dataObj = NULL;
+ HRESULT hr = S_OK;
+
+ if (editor->cPasswordMask)
+ return FALSE; /* Copying or Cutting masked text isn't allowed */
+
+ if(editor->lpOleCallback)
+ hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, range,
RECO_COPY, &dataObj);
+ if(FAILED(hr) || !dataObj)
+ hr = ME_GetDataObject(editor, range, &dataObj);
+ if(SUCCEEDED(hr)) {
+ hr = OleSetClipboard(dataObj);
+ IDataObject_Release(dataObj);
+ }
+ return SUCCEEDED(hr) != 0;
+}
+
/* helper to send a msg filter notification */
static BOOL
ME_FilterEvent(ME_TextEditor *editor, UINT msg, WPARAM* wParam, LPARAM* lParam)
@@ -2022,6 +2110,49 @@
ME_UpdateRepaint(editor);
ME_SendRequestResize(editor, FALSE);
return TRUE;
+ case 'A':
+ if (ctrl_is_down)
+ {
+ ME_SetSelection(editor, 0, -1);
+ return TRUE;
+ }
+ break;
+ case 'V':
+ if (ctrl_is_down)
+ return ME_Paste(editor);
+ break;
+ case 'C':
+ case 'X':
+ if (ctrl_is_down)
+ {
+ CHARRANGE range;
+ BOOL result;
+
+ ME_GetSelection(editor, &range.cpMin, &range.cpMax);
+ result = ME_Copy(editor, &range);
+ if (result && nKey == 'X')
+ {
+ ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
+ ME_CommitUndo(editor);
+ ME_UpdateRepaint(editor);
+ }
+ return result;
+ }
+ break;
+ case 'Z':
+ if (ctrl_is_down)
+ {
+ ME_Undo(editor);
+ return TRUE;
+ }
+ break;
+ case 'Y':
+ if (ctrl_is_down)
+ {
+ ME_Redo(editor);
+ return TRUE;
+ }
+ break;
default:
if (nKey != VK_SHIFT && nKey != VK_CONTROL && nKey && nKey
!= VK_MENU)
@@ -2103,10 +2234,29 @@
POINT pt;
BOOL isExact;
int offset;
+ SCROLLBARINFO sbi;
DWORD messagePos = GetMessagePos();
pt.x = (short)LOWORD(messagePos);
pt.y = (short)HIWORD(messagePos);
+
+ sbi.cbSize = sizeof(sbi);
+ GetScrollBarInfo(editor->hWnd, OBJID_HSCROLL, &sbi);
+ if (!(sbi.rgstate[0] & (STATE_SYSTEM_INVISIBLE|STATE_SYSTEM_OFFSCREEN)) &&
+ PtInRect(&sbi.rcScrollBar, pt))
+ {
+ SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW));
+ return TRUE;
+ }
+ sbi.cbSize = sizeof(sbi);
+ GetScrollBarInfo(editor->hWnd, OBJID_VSCROLL, &sbi);
+ if (!(sbi.rgstate[0] & (STATE_SYSTEM_INVISIBLE|STATE_SYSTEM_OFFSCREEN)) &&
+ PtInRect(&sbi.rcScrollBar, pt))
+ {
+ SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW));
+ return TRUE;
+ }
ScreenToClient(editor->hWnd, &pt);
+
if ((GetWindowLongW(editor->hWnd, GWL_STYLE) & ES_SELECTIONBAR) &&
(pt.x < editor->selofs ||
(editor->nSelectionType == stLine && GetCapture() ==
editor->hWnd)))
@@ -2209,8 +2359,7 @@
ed->nParagraphs = 1;
ed->nLastSelStart = ed->nLastSelEnd = 0;
ed->pLastSelStartPara = ed->pLastSelEndPara =
ME_FindItemFwd(ed->pBuffer->pFirst, diParagraph);
- ed->bRedraw = TRUE;
- ed->bWordWrap = (GetWindowLongW(hWnd, GWL_STYLE) & WS_HSCROLL) ? FALSE : TRUE;
+ ed->bWordWrap = (GetWindowLongW(hWnd, GWL_STYLE) & (WS_HSCROLL|ES_AUTOHSCROLL))
? FALSE : TRUE;
ed->bHideSelection = FALSE;
ed->nInvalidOfs = -1;
ed->pfnWordBreak = NULL;
@@ -2250,48 +2399,6 @@
return ed;
}
-
-typedef struct tagME_GlobalDestStruct
-{
- HGLOBAL hData;
- int nLength;
-} ME_GlobalDestStruct;
-
-static DWORD CALLBACK ME_ReadFromHGLOBALUnicode(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG
cb, LONG *pcb)
-{
- ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
- int i;
- WORD *pSrc, *pDest;
-
- cb = cb >> 1;
- pDest = (WORD *)lpBuff;
- pSrc = (WORD *)GlobalLock(pData->hData);
- for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
- pDest[i] = pSrc[pData->nLength+i];
- }
- pData->nLength += i;
- *pcb = 2*i;
- GlobalUnlock(pData->hData);
- return 0;
-}
-
-static DWORD CALLBACK ME_ReadFromHGLOBALRTF(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb,
LONG *pcb)
-{
- ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
- int i;
- BYTE *pSrc, *pDest;
-
- pDest = lpBuff;
- pSrc = (BYTE *)GlobalLock(pData->hData);
- for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
- pDest[i] = pSrc[pData->nLength+i];
- }
- pData->nLength += i;
- *pcb = i;
- GlobalUnlock(pData->hData);
- return 0;
-}
-
void ME_DestroyEditor(ME_TextEditor *editor)
{
@@ -2530,6 +2637,7 @@
UNSUPPORTED_MSG(EM_SETEDITSTYLE)
UNSUPPORTED_MSG(EM_SETFONTSIZE)
UNSUPPORTED_MSG(EM_SETLANGOPTIONS)
+ UNSUPPORTED_MSG(EM_SETMARGINS)
UNSUPPORTED_MSG(EM_SETPALETTE)
UNSUPPORTED_MSG(EM_SETTABSTOPS)
UNSUPPORTED_MSG(EM_SETTYPOGRAPHYOPTIONS)
@@ -2741,8 +2849,9 @@
ME_GetSelection(editor, &from, &to);
style = ME_GetSelectionInsertStyle(editor);
ME_InternalDeleteText(editor, from, to - from, FALSE);
- if (pStruct->codepage != 1200 && lParam && !strncmp((char
*)lParam, "{\\rtf", 5))
- ME_StreamInRTFString(editor, 1, (char *)lParam);
+ if (pStruct->codepage != 1200 && lParam &&
+ (!strncmp((char *)lParam, "{\\rtf", 5) || !strncmp((char *)lParam,
"{\\urtf}", 6)))
+ ME_StreamInRTFString(editor, 1, (char *)lParam);
else ME_InsertTextFromCursor(editor, 0, wszText, len, style);
ME_ReleaseStyle(style);
@@ -2750,8 +2859,9 @@
}
else {
ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE);
- if (pStruct->codepage != 1200 && lParam && !strncmp((char
*)lParam, "{\\rtf", 5))
- ME_StreamInRTFString(editor, 0, (char *)lParam);
+ if (pStruct->codepage != 1200 && lParam &&
+ (!strncmp((char *)lParam, "{\\rtf", 5) || !strncmp((char *)lParam,
"{\\urtf}", 6)))
+ ME_StreamInRTFString(editor, 0, (char *)lParam);
else ME_InsertTextFromCursor(editor, 0, wszText, len,
editor->pBuffer->pDefaultStyle);
len = 1;
@@ -2785,11 +2895,8 @@
editor->rgbBackColor = lParam;
editor->hbrBackground = CreateSolidBrush(editor->rgbBackColor);
}
- if (editor->bRedraw)
- {
- InvalidateRect(hWnd, NULL, TRUE);
- UpdateWindow(hWnd);
- }
+ InvalidateRect(hWnd, NULL, TRUE);
+ UpdateWindow(hWnd);
return lColor;
}
case EM_GETMODIFY:
@@ -3047,51 +3154,15 @@
return FALSE;
}
case WM_PASTE:
- {
- DWORD dwFormat = 0;
- EDITSTREAM es;
- ME_GlobalDestStruct gds;
- UINT nRTFFormat = RegisterClipboardFormatA("Rich Text Format");
- UINT cf = 0;
-
- if (IsClipboardFormatAvailable(nRTFFormat))
- cf = nRTFFormat, dwFormat = SF_RTF;
- else if (IsClipboardFormatAvailable(CF_UNICODETEXT))
- cf = CF_UNICODETEXT, dwFormat = SF_TEXT|SF_UNICODE;
- else
- return 0;
-
- if (!OpenClipboard(hWnd))
- return 0;
- gds.hData = GetClipboardData(cf);
- gds.nLength = 0;
- es.dwCookie = (DWORD)&gds;
- es.pfnCallback = dwFormat == SF_RTF ? ME_ReadFromHGLOBALRTF :
ME_ReadFromHGLOBALUnicode;
- ME_StreamIn(editor, dwFormat|SFF_SELECTION, &es, FALSE);
-
- CloseClipboard();
+ ME_Paste(editor);
return 0;
- }
case WM_CUT:
case WM_COPY:
{
- LPDATAOBJECT dataObj = NULL;
CHARRANGE range;
- HRESULT hr = S_OK;
-
- if (editor->cPasswordMask)
- return 0; /* Copying or Cutting masked text isn't allowed */
-
ME_GetSelection(editor, &range.cpMin, &range.cpMax);
- if(editor->lpOleCallback)
- hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, &range,
RECO_COPY, &dataObj);
- if(FAILED(hr) || !dataObj)
- hr = ME_GetDataObject(editor, &range, &dataObj);
- if(SUCCEEDED(hr)) {
- hr = OleSetClipboard(dataObj);
- IDataObject_Release(dataObj);
- }
- if (SUCCEEDED(hr) && msg == WM_CUT)
+
+ if (ME_Copy(editor, &range) && msg == WM_CUT)
{
ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
ME_CommitUndo(editor);
@@ -3472,18 +3543,15 @@
if (wParam >= 0x40000)
nCharOfs = lParam;
nLength = ME_GetTextLength(editor);
-
- if (nCharOfs < nLength) {
- ME_RunOfsFromCharOfs(editor, nCharOfs, &pRun, &nOffset);
- assert(pRun->type == diRun);
- pt.y = pRun->member.run.pt.y;
- pt.x = pRun->member.run.pt.x + ME_PointFromChar(editor,
&pRun->member.run, nOffset);
- pt.y += ME_GetParagraph(pRun)->member.para.pt.y;
- } else {
- pt.x = 0;
- pt.y = editor->pBuffer->pLast->member.para.pt.y;
- }
+ nCharOfs = min(nCharOfs, nLength);
+
+ ME_RunOfsFromCharOfs(editor, nCharOfs, &pRun, &nOffset);
+ assert(pRun->type == diRun);
+ pt.y = pRun->member.run.pt.y;
+ pt.x = pRun->member.run.pt.x + ME_PointFromChar(editor, &pRun->member.run,
nOffset);
+ pt.y += ME_GetParagraph(pRun)->member.para.pt.y;
pt.x += editor->selofs;
+ pt.x++; /* for some reason native offsets x by one */
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
@@ -3581,7 +3649,6 @@
goto do_default;
break;
case WM_PAINT:
- if (editor->bRedraw)
{
HDC hDC;
PAINTSTRUCT ps;
@@ -3604,14 +3671,11 @@
return 0;
case WM_ERASEBKGND:
{
- if (editor->bRedraw)
- {
- HDC hDC = (HDC)wParam;
- RECT rc;
- if (GetUpdateRect(hWnd,&rc,TRUE))
- {
- FillRect(hDC, &rc, editor->hbrBackground);
- }
+ HDC hDC = (HDC)wParam;
+ RECT rc;
+ if (GetUpdateRect(hWnd,&rc,TRUE))
+ {
+ FillRect(hDC, &rc, editor->hbrBackground);
}
return 1;
}
@@ -3642,36 +3706,11 @@
MultiByteToWideChar(CP_ACP, 0, &charA, 1, &wstr, 1);
}
- switch (wstr)
- {
- case 1: /* Ctrl-A */
- ME_SetSelection(editor, 0, -1);
- return 0;
- case 3: /* Ctrl-C */
- SendMessageW(editor->hWnd, WM_COPY, 0, 0);
- return 0;
- }
-
if (GetWindowLongW(editor->hWnd, GWL_STYLE) & ES_READONLY) {
MessageBeep(MB_ICONERROR);
return 0; /* FIXME really 0 ? */
}
- switch (wstr)
- {
- case 22: /* Ctrl-V */
- SendMessageW(editor->hWnd, WM_PASTE, 0, 0);
- return 0;
- case 24: /* Ctrl-X */
- SendMessageW(editor->hWnd, WM_CUT, 0, 0);
- return 0;
- case 25: /* Ctrl-Y */
- SendMessageW(editor->hWnd, EM_REDO, 0, 0);
- return 0;
- case 26: /* Ctrl-Z */
- SendMessageW(editor->hWnd, EM_UNDO, 0, 0);
- return 0;
- }
if (((unsigned)wstr)>=' '
|| (wstr=='\r' && (GetWindowLongW(hWnd, GWL_STYLE) &
ES_MULTILINE))
|| wstr=='\t') {
@@ -3930,9 +3969,7 @@
ME_SendRequestResize(editor, TRUE);
return 0;
case WM_SETREDRAW:
- if ((editor->bRedraw = wParam))
- ME_RewrapRepaint(editor);
- return 0;
+ return DefWindowProcW(hWnd, msg, wParam, lParam);
case WM_SIZE:
{
GetClientRect(hWnd, &editor->rcFormat);
Modified: trunk/reactos/dll/win32/riched20/editstr.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/editstr…
==============================================================================
--- trunk/reactos/dll/win32/riched20/editstr.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/editstr.h [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -351,7 +351,6 @@
ME_FontCacheItem pFontCache[HFONT_CACHE_SIZE];
int nZoomNumerator, nZoomDenominator;
RECT rcFormat;
- BOOL bRedraw;
BOOL bWordWrap;
int nInvalidOfs;
int nTextLimit;
@@ -401,7 +400,7 @@
int nAvailWidth;
int nRow;
POINT pt;
- BOOL bOverflown;
+ BOOL bOverflown, bWordWrap;
ME_DisplayItem *pRowStart;
ME_DisplayItem *pLastSplittableRun;
Modified: trunk/reactos/dll/win32/riched20/paint.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/paint.c…
==============================================================================
--- trunk/reactos/dll/win32/riched20/paint.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/paint.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -147,6 +147,8 @@
ME_UpdateScrollBar(editor);
FIXME("ME_Repaint had to call ME_WrapMarkedParagraphs\n");
}
+ if (!IsWindowVisible(editor->hWnd))
+ return;
if (!editor->bEmulateVersion10 || (editor->nEventMask & ENM_UPDATE))
ME_SendOldNotify(editor, EN_UPDATE);
UpdateWindow(editor->hWnd);
@@ -159,7 +161,6 @@
BOOL wrappedParagraphs;
wrappedParagraphs = ME_WrapMarkedParagraphs(editor);
- if (!editor->bRedraw) return;
if (wrappedParagraphs)
ME_UpdateScrollBar(editor);
@@ -185,12 +186,9 @@
* looks, but not content. Like resizing. */
ME_MarkAllForWrapping(editor);
- if (editor->bRedraw)
- {
- ME_WrapMarkedParagraphs(editor);
- ME_UpdateScrollBar(editor);
- ME_Repaint(editor);
- }
+ ME_WrapMarkedParagraphs(editor);
+ ME_UpdateScrollBar(editor);
+ ME_Repaint(editor);
}
int ME_twips2pointsX(ME_Context *c, int x)
@@ -1074,17 +1072,14 @@
si.nPos = 0;
}
- nNewPos = SetScrollInfo(editor->hWnd, SB_VERT, &si, editor->bRedraw);
+ nNewPos = SetScrollInfo(editor->hWnd, SB_VERT, &si, TRUE);
editor->vert_si.nPos = nNewPos;
nActualScroll = nOrigPos - nNewPos;
- if (editor->bRedraw)
- {
- if (abs(nActualScroll) > editor->sizeWindow.cy)
- InvalidateRect(editor->hWnd, NULL, TRUE);
- else
- ScrollWindowEx(editor->hWnd, 0, nActualScroll, NULL, NULL, NULL, NULL,
SW_INVALIDATE);
- ME_Repaint(editor);
- }
+ if (abs(nActualScroll) > editor->sizeWindow.cy)
+ InvalidateRect(editor->hWnd, NULL, TRUE);
+ else
+ ScrollWindowEx(editor->hWnd, 0, nActualScroll, NULL, NULL, NULL, NULL,
SW_INVALIDATE);
+ ME_Repaint(editor);
hWnd = editor->hWnd;
winStyle = GetWindowLongW(hWnd, GWL_STYLE);
@@ -1099,7 +1094,7 @@
}
- void ME_UpdateScrollBar(ME_TextEditor *editor)
+void ME_UpdateScrollBar(ME_TextEditor *editor)
{
/* Note that this is the only function that should ever call SetScrolLInfo
* with SIF_PAGE or SIF_RANGE. SetScrollPos and SetScrollRange should never
Modified: trunk/reactos/dll/win32/riched20/para.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/para.c?…
==============================================================================
--- trunk/reactos/dll/win32/riched20/para.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/para.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -287,6 +287,7 @@
{
ME_AddUndoItem(editor, diUndoSetParagraphFormat, tp);
*tp->member.para.pFmt = *pNext->member.para.pFmt;
+ tp->member.para.border = pNext->member.para.border;
}
if (!editor->bEmulateVersion10) { /* v4.1 */
Modified: trunk/reactos/dll/win32/riched20/reader.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/reader.…
==============================================================================
--- trunk/reactos/dll/win32/riched20/reader.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/reader.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -109,7 +109,7 @@
if (stream->dwSize == 0)
return EOF;
}
- ch = stream->buffer[stream->dwUsed++];
+ ch = (unsigned char)stream->buffer[stream->dwUsed++];
if (!ch)
return EOF;
return ch;
Modified: trunk/reactos/dll/win32/riched20/string.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/string.…
==============================================================================
--- trunk/reactos/dll/win32/riched20/string.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/string.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -304,6 +304,8 @@
/* FIXME: Native also knows about punctuation */
TRACE("s==%s, start==%d, len==%d, code==%d\n",
debugstr_wn(s, len), start, len, code);
+ /* convert number of bytes to number of characters. */
+ len /= sizeof(WCHAR);
switch (code)
{
case WB_ISDELIMITER:
@@ -330,11 +332,23 @@
int
ME_CallWordBreakProc(ME_TextEditor *editor, ME_String *str, INT start, INT code)
{
- /* FIXME: ANSIfy the string when bEmulateVersion10 is TRUE */
- if (!editor->pfnWordBreak)
- return ME_WordBreakProc(str->szData, start, str->nLen, code);
- else
- return editor->pfnWordBreak(str->szData, start, str->nLen, code);
+ if (!editor->pfnWordBreak) {
+ return ME_WordBreakProc(str->szData, start, str->nLen*sizeof(WCHAR), code);
+ } else if (!editor->bEmulateVersion10) {
+ /* MSDN lied about the third parameter for EditWordBreakProc being the number
+ * of characters, it is actually the number of bytes of the string. */
+ return editor->pfnWordBreak(str->szData, start, str->nLen*sizeof(WCHAR),
code);
+ } else {
+ int result;
+ int buffer_size = WideCharToMultiByte(CP_ACP, 0, str->szData, str->nLen,
+ NULL, 0, NULL, NULL);
+ char *buffer = (char*)heap_alloc(buffer_size);
+ WideCharToMultiByte(CP_ACP, 0, str->szData, str->nLen,
+ buffer, buffer_size, NULL, NULL);
+ result = editor->pfnWordBreak(str->szData, start, str->nLen, code);
+ heap_free(buffer);
+ return result;
+ }
}
LPWSTR ME_ToUnicode(BOOL unicode, LPVOID psz)
Modified: trunk/reactos/dll/win32/riched20/table.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/table.c…
==============================================================================
--- trunk/reactos/dll/win32/riched20/table.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/table.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -392,9 +392,10 @@
assert(table_row);
assert(table_row->type == diParagraph);
if (!editor->bEmulateVersion10) { /* v4.1 */
- ME_DisplayItem *insertedCell, *para, *cell;
+ ME_DisplayItem *insertedCell, *para, *cell, *prevTableEnd;
cell = ME_FindItemFwd(ME_GetTableRowStart(table_row), diCell);
- run = ME_GetTableRowEnd(table_row)->member.para.next_para;
+ prevTableEnd = ME_GetTableRowEnd(table_row);
+ run = prevTableEnd->member.para.next_para;
run = ME_FindItemFwd(run, diRun);
editor->pCursors[0].pRun = run;
editor->pCursors[0].nOffset = 0;
@@ -412,7 +413,8 @@
insertedCell->member.cell.nRightBoundary = cell->member.cell.nRightBoundary;
insertedCell->member.cell.border = cell->member.cell.border;
};
- ME_InsertTableRowEndFromCursor(editor);
+ para = ME_InsertTableRowEndFromCursor(editor);
+ *para->member.para.pFmt = *prevTableEnd->member.para.pFmt;
/* return the table row start for the inserted paragraph */
return ME_FindItemFwd(cell, diParagraph)->member.para.next_para;
} else { /* v1.0 - 3.0 */
Modified: trunk/reactos/dll/win32/riched20/txtsrv.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/txtsrv.…
==============================================================================
--- trunk/reactos/dll/win32/riched20/txtsrv.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/txtsrv.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -57,6 +57,7 @@
ITextHost *pMyHost;
LONG ref;
CRITICAL_SECTION csTxtSrv;
+ char spare[256];
} ITextServicesImpl;
static const ITextServicesVtbl textservices_Vtbl;
Modified: trunk/reactos/dll/win32/riched20/undo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/undo.c?…
==============================================================================
--- trunk/reactos/dll/win32/riched20/undo.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/undo.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -96,6 +96,7 @@
pItem->member.para.pFmt->cbSize = sizeof(PARAFORMAT2);
pItem->member.para.pFmt->dwMask = 0;
*pItem->member.para.pFmt = *pdi->member.para.pFmt;
+ pItem->member.para.border = pdi->member.para.border;
pItem->member.para.nFlags = prev_para->member.para.nFlags & ~MEPF_CELL;
pItem->member.para.pCell = NULL;
break;
@@ -293,6 +294,7 @@
para = ME_FindItemBack(tmp.pRun, diParagraph);
ME_AddUndoItem(editor, diUndoSetParagraphFormat, para);
*para->member.para.pFmt = *pItem->member.para.pFmt;
+ para->member.para.border = pItem->member.para.border;
break;
}
case diUndoSetCharFormat:
@@ -343,12 +345,14 @@
new_para->member.para.nFlags |= MEPF_ROWSTART;
assert(pItem->member.para.pFmt->cbSize == sizeof(PARAFORMAT2));
*new_para->member.para.pFmt = *pItem->member.para.pFmt;
+ new_para->member.para.border = pItem->member.para.border;
if (pItem->member.para.pCell)
{
ME_DisplayItem *pItemCell, *pCell;
pItemCell = pItem->member.para.pCell;
pCell = new_para->member.para.pCell;
pCell->member.cell.nRightBoundary = pItemCell->member.cell.nRightBoundary;
+ pCell->member.cell.border = pItemCell->member.cell.border;
}
break;
}
Modified: trunk/reactos/dll/win32/riched20/wrap.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/wrap.c?…
==============================================================================
--- trunk/reactos/dll/win32/riched20/wrap.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/wrap.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -50,8 +50,10 @@
wc->pRowStart = NULL;
wc->bOverflown = FALSE;
wc->pLastSplittableRun = NULL;
+ wc->bWordWrap = wc->context->editor->bWordWrap;
if (para->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND)) {
wc->nAvailWidth = 0;
+ wc->bWordWrap = FALSE;
if (para->member.para.nFlags & MEPF_ROWEND)
{
ME_Cell *cell = &ME_FindItemBack(para, diCell)->member.cell;
@@ -73,11 +75,11 @@
wc->nAvailWidth = cell->nWidth
- (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) -
wc->nRightMargin;
- } else if (wc->context->editor->bWordWrap) {
+ wc->bWordWrap = TRUE;
+ } else {
wc->nAvailWidth = wc->context->rcView.right -
wc->context->rcView.left
- - (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) -
wc->nRightMargin;
- } else {
- wc->nAvailWidth = ~0u >> 1;
+ - (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin
+ - wc->context->editor->selofs;
}
wc->pt.x = wc->context->pt.x;
if (wc->context->editor->bEmulateVersion10 && /* v1.0 - 3.0 */
@@ -148,9 +150,9 @@
assert(para->member.para.pFmt->dwMask & PFM_ALIGNMENT);
align = para->member.para.pFmt->wAlignment;
if (align == PFA_CENTER)
- shift = (wc->nAvailWidth-width)/2;
+ shift = max((wc->nAvailWidth-width)/2, 0);
if (align == PFA_RIGHT)
- shift = wc->nAvailWidth-width;
+ shift = max(wc->nAvailWidth-width, 0);
for (p = wc->pRowStart; p!=pEnd; p = p->next)
{
if (p->type==diRun) { /* FIXME add more run types */
@@ -377,7 +379,8 @@
}
/* will current run fit? */
- if (wc->pt.x + run->nWidth - wc->context->pt.x > wc->nAvailWidth)
+ if (wc->bWordWrap &&
+ wc->pt.x + run->nWidth - wc->context->pt.x > wc->nAvailWidth)
{
int loc = wc->context->pt.x + wc->nAvailWidth - wc->pt.x;
/* total white run ? */
@@ -416,9 +419,11 @@
{
if (run->nFlags & MERF_STARTWHITE)
{
- /* we had only spaces so far, so we must be on the first line of the
- * paragraph, since no other lines of the paragraph start with spaces. */
- assert(!wc->nRow);
+ /* We had only spaces so far, so we must be on the first line of the
+ * paragraph (or the first line after MERF_ENDROW forced the line
+ * break within the paragraph), since no other lines of the paragraph
+ * start with spaces. */
+
/* The lines will only contain spaces, and the rest of the run will
* overflow onto the next line. */
wc->bOverflown = TRUE;
@@ -730,30 +735,31 @@
return bModified;
}
-void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor) {
+void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor)
+{
ME_Context c;
+ RECT rc;
+ int ofs;
+ ME_DisplayItem *item;
ME_InitContext(&c, editor, GetDC(editor->hWnd));
- if (editor->bRedraw)
- {
- RECT rc = c.rcView;
- int ofs = ME_GetYScrollPos(editor);
-
- ME_DisplayItem *item = editor->pBuffer->pFirst;
- while(item != editor->pBuffer->pLast) {
- if (item->member.para.nFlags & MEPF_REPAINT) {
- rc.top = item->member.para.pt.y - ofs;
- rc.bottom = item->member.para.pt.y + item->member.para.nHeight - ofs;
- InvalidateRect(editor->hWnd, &rc, TRUE);
- }
- item = item->member.para.next_para;
- }
- if (editor->nTotalLength < editor->nLastTotalLength)
- {
- rc.top = editor->nTotalLength - ofs;
- rc.bottom = editor->nLastTotalLength - ofs;
+ rc = c.rcView;
+ ofs = ME_GetYScrollPos(editor);
+
+ item = editor->pBuffer->pFirst;
+ while(item != editor->pBuffer->pLast) {
+ if (item->member.para.nFlags & MEPF_REPAINT) {
+ rc.top = item->member.para.pt.y - ofs;
+ rc.bottom = item->member.para.pt.y + item->member.para.nHeight - ofs;
InvalidateRect(editor->hWnd, &rc, TRUE);
}
+ item = item->member.para.next_para;
+ }
+ if (editor->nTotalLength < editor->nLastTotalLength)
+ {
+ rc.top = editor->nTotalLength - ofs;
+ rc.bottom = editor->nLastTotalLength - ofs;
+ InvalidateRect(editor->hWnd, &rc, TRUE);
}
ME_DestroyContext(&c, editor->hWnd);
}
Modified: trunk/reactos/dll/win32/riched20/writer.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/riched20/writer.…
==============================================================================
--- trunk/reactos/dll/win32/riched20/writer.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/riched20/writer.c [iso-8859-1] Mon Oct 27 03:10:25 2008
@@ -196,11 +196,14 @@
static BOOL
-ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun, const
ME_DisplayItem *pLastRun)
+ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun,
+ ME_DisplayItem *pLastRun)
{
ME_DisplayItem *item = pFirstRun;
ME_FontTableItem *table = pStream->fonttbl;
int i;
+ ME_DisplayItem *pLastPara = ME_GetParagraph(pLastRun);
+ ME_DisplayItem *pCell = NULL;
do {
CHARFORMAT2W *fmt = &item->member.run.style->fmt;
@@ -214,7 +217,7 @@
if (table[i].bCharSet == bCharSet
&& (table[i].szFaceName == face || !lstrcmpW(table[i].szFaceName,
face)))
break;
- if (i == pStream->nFontTblLen) {
+ if (i == pStream->nFontTblLen && i < STREAMOUT_FONTTBL_SIZE) {
table[i].bCharSet = bCharSet;
table[i].szFaceName = face;
pStream->nFontTblLen++;
@@ -226,7 +229,7 @@
for (i = 1; i < pStream->nColorTblLen; i++)
if (pStream->colortbl[i] == crColor)
break;
- if (i == pStream->nColorTblLen) {
+ if (i == pStream->nColorTblLen && i < STREAMOUT_COLORTBL_SIZE) {
pStream->colortbl[i] = crColor;
pStream->nColorTblLen++;
}
@@ -236,7 +239,7 @@
for (i = 1; i < pStream->nColorTblLen; i++)
if (pStream->colortbl[i] == crColor)
break;
- if (i == pStream->nColorTblLen) {
+ if (i == pStream->nColorTblLen && i < STREAMOUT_COLORTBL_SIZE) {
pStream->colortbl[i] = crColor;
pStream->nColorTblLen++;
}
@@ -245,6 +248,38 @@
if (item == pLastRun)
break;
item = ME_FindItemFwd(item, diRun);
+ } while (item);
+ item = ME_GetParagraph(pFirstRun);
+ do {
+ if (item->member.para.pCell && item->member.para.pCell)
+ {
+ pCell = item->member.para.pCell;
+ if (pCell)
+ {
+ ME_Border* borders[4] = { &pCell->member.cell.border.top,
+ &pCell->member.cell.border.left,
+ &pCell->member.cell.border.bottom,
+ &pCell->member.cell.border.right };
+ for (i = 0; i < 4; i++)
+ {
+ if (borders[i]->width > 0)
+ {
+ int j;
+ COLORREF crColor = borders[i]->colorRef;
+ for (j = 1; j < pStream->nColorTblLen; j++)
+ if (pStream->colortbl[j] == crColor)
+ break;
+ if (j == pStream->nColorTblLen && j < STREAMOUT_COLORTBL_SIZE)
{
+ pStream->colortbl[j] = crColor;
+ pStream->nColorTblLen++;
+ }
+ }
+ }
+ }
+ }
+ if (item == pLastPara)
+ break;
+ item = item->member.para.next_para;
} while (item);
if (!ME_StreamOutPrint(pStream, "{\\fonttbl"))
@@ -286,30 +321,78 @@
static BOOL
ME_StreamOutRTFTableProps(ME_TextEditor *editor, ME_OutStream *pStream,
- const ME_DisplayItem *para)
+ ME_DisplayItem *para)
{
ME_DisplayItem *cell;
char props[STREAMOUT_BUFFER_SIZE] = "";
+ int i;
+ const char sideChar[4] = {'t','l','b','r'};
if (!ME_StreamOutPrint(pStream, "\\trowd"))
return FALSE;
if (!editor->bEmulateVersion10) { /* v4.1 */
- assert(para->member.para.nFlags & MEPF_ROWSTART);
+ PARAFORMAT2 *pFmt = ME_GetTableRowEnd(para)->member.para.pFmt;
+ para = ME_GetTableRowStart(para);
cell = para->member.para.next_para->member.para.pCell;
assert(cell);
+ if (pFmt->dxOffset)
+ sprintf(props + strlen(props), "\\trgaph%d", pFmt->dxOffset);
+ if (pFmt->dxStartIndent)
+ sprintf(props + strlen(props), "\\trleft%d", pFmt->dxStartIndent);
do {
+ ME_Border* borders[4] = { &cell->member.cell.border.top,
+ &cell->member.cell.border.left,
+ &cell->member.cell.border.bottom,
+ &cell->member.cell.border.right };
+ for (i = 0; i < 4; i++)
+ {
+ if (borders[i]->width)
+ {
+ int j;
+ COLORREF crColor = borders[i]->colorRef;
+ sprintf(props + strlen(props), "\\clbrdr%c", sideChar[i]);
+ sprintf(props + strlen(props), "\\brdrs");
+ sprintf(props + strlen(props), "\\brdrw%d", borders[i]->width);
+ for (j = 1; j < pStream->nColorTblLen; j++) {
+ if (pStream->colortbl[j] == crColor) {
+ sprintf(props + strlen(props), "\\brdrcf%u", j);
+ break;
+ }
+ }
+ }
+ }
sprintf(props + strlen(props), "\\cellx%d",
cell->member.cell.nRightBoundary);
cell = cell->member.cell.next_cell;
} while (cell->member.cell.next_cell);
} else { /* v1.0 - 3.0 */
+ const ME_Border* borders[4] = { ¶->member.para.border.top,
+ ¶->member.para.border.left,
+ ¶->member.para.border.bottom,
+ ¶->member.para.border.right };
PARAFORMAT2 *pFmt = para->member.para.pFmt;
- int i;
assert(!(para->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL)));
if (pFmt->dxOffset)
sprintf(props + strlen(props), "\\trgaph%d", pFmt->dxOffset);
if (pFmt->dxStartIndent)
sprintf(props + strlen(props), "\\trleft%d", pFmt->dxStartIndent);
+ for (i = 0; i < 4; i++)
+ {
+ if (borders[i]->width)
+ {
+ int j;
+ COLORREF crColor = borders[i]->colorRef;
+ sprintf(props + strlen(props), "\\trbrdr%c", sideChar[i]);
+ sprintf(props + strlen(props), "\\brdrs");
+ sprintf(props + strlen(props), "\\brdrw%d", borders[i]->width);
+ for (j = 1; j < pStream->nColorTblLen; j++) {
+ if (pStream->colortbl[j] == crColor) {
+ sprintf(props + strlen(props), "\\brdrcf%u", j);
+ break;
+ }
+ }
+ }
+ }
for (i = 0; i < pFmt->cTabCount; i++)
{
sprintf(props + strlen(props), "\\cellx%d", pFmt->rgxTabs[i] &
0x00FFFFFF);
@@ -727,7 +810,7 @@
}
} else if (p->member.para.nFlags & MEPF_ROWEND) {
pStream->nNestingLevel--;
- if (pStream->nNestingLevel > 1) {
+ if (pStream->nNestingLevel >= 1) {
if (!ME_StreamOutPrint(pStream, "{\\*\\nesttableprops"))
return FALSE;
if (!ME_StreamOutRTFTableProps(editor, pStream, p))