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.c... ============================================================================== --- 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?r... ============================================================================== --- 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.c... ============================================================================== --- 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.c... ============================================================================== --- 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.c... ============================================================================== --- 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?r... ============================================================================== --- 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?r... ============================================================================== --- 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.c... ============================================================================== --- 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))