Sync to Wine-0_9_1: Phil Krylov phil@newstar.rinet.ru - Added support for EM_REQUESTRESIZE message, EN_REQUESTRESIZE notification, and ENM_REQUESTRESIZE event mask. - Cache background color brush instead of recreating it at each screen update. Mike McCormack mike@codeweavers.com - Convert all RTFPanic and RTFMsg calls to ERR calls. Modified: trunk/reactos/lib/riched20/caret.c Modified: trunk/reactos/lib/riched20/editor.c Modified: trunk/reactos/lib/riched20/editor.h Modified: trunk/reactos/lib/riched20/editstr.h Modified: trunk/reactos/lib/riched20/paint.c Modified: trunk/reactos/lib/riched20/reader.c Modified: trunk/reactos/lib/riched20/rtf.h Modified: trunk/reactos/lib/riched20/wrap.c _____
Modified: trunk/reactos/lib/riched20/caret.c --- trunk/reactos/lib/riched20/caret.c 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/caret.c 2005-11-17 21:58:13 UTC (rev 19315) @@ -1097,6 +1097,7 @@
editor->bCaretAtEnd = FALSE; /* FIXME or maybe not */ ME_DeleteSelection(editor); ME_UpdateRepaint(editor); + ME_SendRequestResize(editor, FALSE); return TRUE; } if (ME_ArrowLeft(editor, p)) { @@ -1105,6 +1106,7 @@ ME_MoveCaret(editor); ME_DeleteTextAtCursor(editor, nCursor, 1); ME_UpdateRepaint(editor); + ME_SendRequestResize(editor, FALSE); } return TRUE; } @@ -1117,11 +1119,13 @@ ME_DeleteSelection(editor); ME_ClearTempStyle(editor); ME_UpdateRepaint(editor); + ME_SendRequestResize(editor, FALSE); return TRUE; } ME_DeleteTextAtCursor(editor, nCursor, 1); ME_ClearTempStyle(editor); ME_UpdateRepaint(editor); + ME_SendRequestResize(editor, FALSE); return TRUE; } case VK_HOME: { _____
Modified: trunk/reactos/lib/riched20/editor.c --- trunk/reactos/lib/riched20/editor.c 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/editor.c 2005-11-17 21:58:13 UTC (rev 19315) @@ -83,7 +83,7 @@
- EM_PASTESPECIAL + EM_POSFROMCHAR + EM_REDO 2.0 - - EM_REQUESTRESIZE + + EM_REQUESTRESIZE + EM_REPLACESEL (proper style?) ANSI&Unicode - EM_SCROLL - EM_SCROLLCARET @@ -153,7 +153,7 @@ - EN_MSGFILTER - EN_OLEOPFAILED - EN_PROTECTED - - EN_REQUESTRESIZE + + EN_REQUESTRESIZE - EN_SAVECLIPBOARD + EN_SELCHANGE + EN_SETFOCUS @@ -633,6 +633,7 @@ } ME_MoveCaret(editor); ME_SendSelChange(editor); + ME_SendRequestResize(editor, FALSE);
return 0; } @@ -820,6 +821,7 @@ ed->nUDArrowX = -1; ed->nSequence = 0; ed->rgbBackColor = -1; + ed->hbrBackground = GetSysColorBrush(COLOR_WINDOW); ed->bCaretAtEnd = FALSE; ed->nEventMask = 0; ed->nModifyStep = 0; @@ -925,7 +927,8 @@ if (editor->pFontCache[i].hFont) DeleteObject(editor->pFontCache[i].hFont); } - + DeleteObject(editor->hbrBackground); + FREE_OBJ(editor); }
@@ -1134,7 +1137,6 @@ UNSUPPORTED_MSG(EM_HIDESELECTION) UNSUPPORTED_MSG(EM_LIMITTEXT) /* also known as EM_SETLIMITTEXT */ UNSUPPORTED_MSG(EM_PASTESPECIAL) - UNSUPPORTED_MSG(EM_REQUESTRESIZE) UNSUPPORTED_MSG(EM_SCROLL) UNSUPPORTED_MSG(EM_SCROLLCARET) UNSUPPORTED_MSG(EM_SELECTIONTYPE) @@ -1265,10 +1267,18 @@ case EM_SETBKGNDCOLOR: { LRESULT lColor = ME_GetBackColor(editor); + if (editor->rgbBackColor != -1) + DeleteObject(editor->hbrBackground); if (wParam) + { editor->rgbBackColor = -1; + editor->hbrBackground = GetSysColorBrush(COLOR_WINDOW); + } else + { editor->rgbBackColor = lParam; + editor->hbrBackground = CreateSolidBrush(editor->rgbBackColor); + } if (editor->bRedraw) { InvalidateRect(hWnd, NULL, TRUE); @@ -1792,12 +1802,9 @@ { HDC hDC = (HDC)wParam; RECT rc; - COLORREF rgbBG = ME_GetBackColor(editor); if (GetUpdateRect(hWnd,&rc,TRUE)) { - HBRUSH hbr = CreateSolidBrush(rgbBG); - FillRect(hDC, &rc, hbr); - DeleteObject(hbr); + FillRect(hDC, &rc, editor->hbrBackground); } } return 1; @@ -1974,6 +1981,9 @@ ME_RewrapRepaint(editor); return 0; } + case EM_REQUESTRESIZE: + ME_SendRequestResize(editor, TRUE); + return 0; case WM_SETREDRAW: editor->bRedraw = wParam; return 0; _____
Modified: trunk/reactos/lib/riched20/editor.h --- trunk/reactos/lib/riched20/editor.h 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/editor.h 2005-11-17 21:58:13 UTC (rev 19315) @@ -173,6 +173,7 @@
void ME_InsertRowStart(ME_WrapContext *wc, ME_DisplayItem *pEnd); void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp); BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor); +void ME_SendRequestResize(ME_TextEditor *editor, BOOL force);
/* para.c */ ME_DisplayItem *ME_GetParagraph(ME_DisplayItem *run); _____
Modified: trunk/reactos/lib/riched20/editstr.h --- trunk/reactos/lib/riched20/editstr.h 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/editstr.h 2005-11-17 21:58:13 UTC (rev 19315) @@ -270,6 +270,7 @@
int nSequence; int nOldSelFrom, nOldSelTo; COLORREF rgbBackColor; + HBRUSH hbrBackground; BOOL bCaretAtEnd; int nEventMask; int nModifyStep; _____
Modified: trunk/reactos/lib/riched20/paint.c --- trunk/reactos/lib/riched20/paint.c 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/paint.c 2005-11-17 21:58:13 UTC (rev 19315) @@ -78,18 +78,17 @@
}
if (ye>ys) { - HBRUSH hbr; - hbr = CreateSolidBrush(ME_GetBackColor(c.editor)); rc.left = xs; rc.top = ys; rc.right = xe; rc.bottom = ye; - FillRect(hDC, &rc, hbr); - DeleteObject(hbr); + FillRect(hDC, &rc, c.editor->hbrBackground); } if (ys == c.pt.y) /* don't overwrite the top bar */ ys++; } + if (editor->nTotalLength != editor->nLastTotalLength) + ME_SendRequestResize(editor, FALSE); editor->nLastTotalLength = editor->nTotalLength; ME_DestroyContext(&c); } _____
Modified: trunk/reactos/lib/riched20/reader.c --- trunk/reactos/lib/riched20/reader.c 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/reader.c 2005-11-17 21:58:13 UTC (rev 19315) @@ -219,7 +219,7 @@
info->rtfTextBuf = RTFAlloc (rtfBufSiz); info->pushedTextBuf = RTFAlloc (rtfBufSiz); if (info->rtfTextBuf == NULL || info->pushedTextBuf == NULL) - RTFPanic (info,"Cannot allocate text buffers."); + ERR ("Cannot allocate text buffers."); info->rtfTextBuf[0] = info->pushedTextBuf[0] = '\0'; }
@@ -283,7 +283,7 @@
info->inputName = RTFStrSave (name); if (info->inputName == NULL) - RTFPanic (info,"RTFSetInputName: out of memory"); + ERR ("RTFSetInputName: out of memory"); }
@@ -299,7 +299,7 @@
info->outputName = RTFStrSave (name); if (info->outputName == NULL) - RTFPanic (info, "RTFSetOutputName: out of memory"); + ERR ("RTFSetOutputName: out of memory"); }
@@ -388,7 +388,7 @@
if (info->rtfClass < 0 || info->rtfClass >= rtfMaxClass) /* watchdog */ { - RTFPanic (info,"Unknown class %d: %s (reader malfunction)", + ERR( "Unknown class %d: %s (reader malfunction)", info->rtfClass, info->rtfTextBuf); } if (RTFCheckCM (info, rtfControl, rtfDestination)) @@ -490,9 +490,9 @@ TRACE("\n");
if (info->pushedClass >= 0) /* there's already an ungotten token */ - RTFPanic (info,"cannot unget two tokens"); + ERR ("cannot unget two tokens"); if (info->rtfClass < 0) - RTFPanic (info,"no token to unget"); + ERR ("no token to unget"); info->pushedClass = info->rtfClass; info->pushedMajor = info->rtfMajor; info->pushedMinor = info->rtfMinor; @@ -600,7 +600,7 @@ /* FIXME: TranslateCharsetInfo does not work as good as it * should, so let's use it only when all else fails */ if (!TranslateCharsetInfo(&n, &csi, TCI_SRCCHARSET)) - RTFMsg(info, "%s: unknown charset %u\n", __FUNCTION__, charset); + ERR("%s: unknown charset %u\n", __FUNCTION__, charset); else return csi.ciACP; } @@ -893,19 +893,19 @@ else if (RTFCheckCM (info, rtfGroup, rtfBeginGroup)) old = 0; /* brace */ else /* can't tell! */ - RTFPanic (info, "%s: Cannot determine format", fn); + ERR ( "%s: Cannot determine format", fn); } if (old == 0) /* need to find "{" here */ { if (!RTFCheckCM (info, rtfGroup, rtfBeginGroup)) - RTFPanic (info, "%s: missing "{"", fn); + ERR ( "%s: missing "{"", fn); RTFGetToken (info); /* yes, skip to next token */ if (info->rtfClass == rtfEOF) break; } fp = New (RTFFont); if (fp == NULL) - RTFPanic (info, "%s: cannot allocate font entry", fn); + ERR ( "%s: cannot allocate font entry", fn);
fp->rtfNextFont = info->fontList; info->fontList = fp; @@ -929,8 +929,8 @@ { default: /* ignore token but announce it */ - RTFMsg (info,"%s: unknown token "%s"\n", - fn, info->rtfTextBuf); + ERR ("%s: unknown token "%s"\n", + fn, info->rtfTextBuf); break; case rtfFontFamily: fp->rtfFFamily = info->rtfMinor; @@ -991,7 +991,7 @@ *bp = '\0'; fp->rtfFName = RTFStrSave (buf); if (fp->rtfFName == NULL) - RTFPanic (info, "%s: cannot allocate font name", fn); + ERR ( "%s: cannot allocate font name", fn); /* already have next token; don't read one */ /* at bottom of loop */ continue; @@ -999,7 +999,7 @@ else { /* ignore token but announce it */ - RTFMsg (info, "%s: unknown token "%s"\n", + ERR ( "%s: unknown token "%s"\n",
fn,info->rtfTextBuf); } RTFGetToken (info); @@ -1012,7 +1012,7 @@ { RTFGetToken (info); if (!RTFCheckCM (info, rtfGroup, rtfEndGroup)) - RTFPanic (info, "%s: missing "}"", fn); + ERR ( "%s: missing "}"", fn); if (info->rtfClass == rtfEOF) break; } @@ -1026,7 +1026,7 @@ } } if (fp->rtfFNum == -1) - RTFPanic (info,"%s: missing font number", fn); + ERR( "%s: missing font number", fn); /* * Could check other pieces of structure here, too, I suppose. */ @@ -1068,7 +1068,7 @@ break; cp = New (RTFColor); if (cp == NULL) - RTFPanic (info,"%s: cannot allocate color entry", fn); + ERR ( "%s: cannot allocate color entry", fn); cp->rtfCNum = cnum++; cp->rtfCRed = cp->rtfCGreen = cp->rtfCBlue = -1; cp->rtfNextColor = info->colorList; @@ -1086,7 +1086,7 @@ if (info->rtfClass == rtfEOF) break; if (!RTFCheckCM (info, rtfText, ';')) - RTFPanic (info,"%s: malformed entry", fn); + ERR ("%s: malformed entry", fn); } RTFRouteToken (info); /* feed "}" back to router */ } @@ -1116,7 +1116,7 @@ break; sp = New (RTFStyle); if (sp == NULL) - RTFPanic (info,"%s: cannot allocate stylesheet entry", fn); + ERR ( "%s: cannot allocate stylesheet entry", fn); sp->rtfSName = NULL; sp->rtfSNum = -1; sp->rtfSType = rtfParStyle; @@ -1128,7 +1128,7 @@ sp->rtfExpanding = 0; info->styleList = sp; if (!RTFCheckCM (info, rtfGroup, rtfBeginGroup)) - RTFPanic (info,"%s: missing "{"", fn); + ERR ( "%s: missing "{"", fn); real_style = TRUE; for (;;) { @@ -1140,7 +1140,7 @@ { if (RTFCheckMM (info, rtfSpecialChar, rtfOptDest)) { RTFGetToken(info); - RTFPanic(info, "%s: skipping optional destination", fn); + ERR( "%s: skipping optional destination", fn); RTFSkipGroup(info); info->rtfClass = rtfGroup; info->rtfMajor = rtfEndGroup; @@ -1182,14 +1182,14 @@ } sep = New (RTFStyleElt); if (sep == NULL) - RTFPanic (info,"%s: cannot allocate style element", fn); + ERR ( "%s: cannot allocate style element", fn); sep->rtfSEClass = info->rtfClass; sep->rtfSEMajor = info->rtfMajor; sep->rtfSEMinor = info->rtfMinor; sep->rtfSEParam = info->rtfParam; sep->rtfSEText = RTFStrSave (info->rtfTextBuf); if (sep->rtfSEText == NULL) - RTFPanic (info,"%s: cannot allocate style element text", fn); + ERR ( "%s: cannot allocate style element text", fn); if (sepLast == NULL) sp->rtfSSEList = sep; /* first element */ else /* add to end */ @@ -1203,7 +1203,7 @@ * This passes over "{*\keycode ... }, among * other things. A temporary (perhaps) hack. */ - RTFPanic(info, "%s: skipping begin", fn); + ERR( "%s: skipping begin", fn); RTFSkipGroup (info); continue; } @@ -1224,19 +1224,19 @@ *bp = '\0'; sp->rtfSName = RTFStrSave (buf); if (sp->rtfSName == NULL) - RTFPanic (info, "%s: cannot allocate style name", fn); + ERR ( "%s: cannot allocate style name", fn); } else /* unrecognized */ { /* ignore token but announce it */ - RTFMsg (info, "%s: unknown token "%s"\n", + ERR ( "%s: unknown token "%s"\n", fn, info->rtfTextBuf); } } if (real_style) { RTFGetToken (info); if (!RTFCheckCM (info, rtfGroup, rtfEndGroup)) - RTFPanic (info, "%s: missing "}"", fn); + ERR ( "%s: missing "}"", fn); /* * Check over the style structure. A name is a must. * If no style number was specified, check whether it's the @@ -1248,12 +1248,12 @@ * Some German RTF writers use "Standard" instead of "Normal". */ if (sp->rtfSName == NULL) - RTFPanic (info,"%s: missing style name", fn); + ERR ( "%s: missing style name", fn); if (sp->rtfSNum < 0) { if (strncmp (buf, "Normal", 6) != 0 && strncmp (buf, "Standard", 8) != 0) - RTFPanic (info,"%s: missing style number", fn); + ERR ( "%s: missing style number", fn); sp->rtfSNum = rtfNormalStyleNum; } if (sp->rtfSNextPar == -1) /* if \snext not given, */ @@ -1359,7 +1359,7 @@ if (s == NULL) return; if (s->rtfExpanding != 0) - RTFPanic (info,"Style expansion loop, style %d", n); + ERR ("Style expansion loop, style %d", n); s->rtfExpanding = 1; /* set expansion flag for loop detection */ /* * Expand "based-on" style (unless it's the same as the current @@ -2446,63 +2446,6 @@ /* ---------------------------------------------------------------------- */
/* - * Print message. - * - * Message should include linefeeds as necessary. - */ - - -void RTFMsg (RTF_Info *info, const char *fmt, ...) -{ - char buf[rtfBufSiz]; - - va_list args; - va_start (args,fmt); - vsprintf (buf, fmt, args); - va_end (args); - MESSAGE( "%s", buf); -} - - -/* ---------------------------------------------------------------------- */ - - -/* - * Process termination. Print error message and exit. Also prints - * current token, and current input line number and position within - * line if any input has been read from the current file. (No input - * has been read if prevChar is EOF). - */ - -static void DefaultPanicProc(RTF_Info *info, char *s) -{ - MESSAGE( "%s", s); - /*exit (1);*/ -} - - - -void RTFPanic(RTF_Info *info, const char *fmt, ...) -{ - char buf[rtfBufSiz]; - - va_list args; - va_start (args,fmt); - vsprintf (buf, fmt, args); - va_end (args); - lstrcatA (buf, "\n"); - if (info->prevChar != EOF && info->rtfTextBuf != NULL) - { - sprintf (buf + lstrlenA (buf), - "Last token read was "%s" near line %ld, position %d.\n", - info->rtfTextBuf, info->rtfLineNum, info->rtfLinePos); - } - DefaultPanicProc(info, buf); -} - -/* ---------------------------------------------------------------------- */ - -/* * originally from RTF tools' text-writer.c * * text-writer -- RTF-to-text translation writer code. @@ -2594,7 +2537,7 @@ TRACE("font %d codepage %d\n", info->rtfParam, info->codePage); } else - RTFMsg(info, "unknown font %d\n", info->rtfParam); + ERR( "unknown font %d\n", info->rtfParam); break; case rtfUnicodeLength: info->unicodeLength = info->rtfParam; _____
Modified: trunk/reactos/lib/riched20/rtf.h --- trunk/reactos/lib/riched20/rtf.h 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/rtf.h 2005-11-17 21:58:13 UTC (rev 19315) @@ -1093,8 +1093,6 @@
RTFFuncPtr readHook;
- RTFFuncPtr panicProc; - DWORD dwOutputCount; WCHAR OutputBuffer[0x1000];
@@ -1140,19 +1138,7 @@ RTFStyle *RTFGetStyle (RTF_Info *, int); int RTFCharToHex ( char); int RTFHexToChar ( int ); -void RTFSetMsgProc ( RTFFuncPtr ); -void RTFSetPanicProc ( RTF_Info *, RTFFuncPtr);
-/* - * The following messing around is used to allow RTFMsg() and RTFPanic() - * to be variable-argument functions that are declared publicly but - * without generating prototype-mismatch errors on systems that have - * stdarg.h. - */ - -void RTFMsg (RTF_Info *, const char *fmt, ...); -void RTFPanic (RTF_Info *, const char *fmt, ...); - void RTFFlushOutputBuffer( RTF_Info *info ); void RTFSetEditStream(RTF_Info *info, ME_InStream *stream);
_____
Modified: trunk/reactos/lib/riched20/wrap.c --- trunk/reactos/lib/riched20/wrap.c 2005-11-17 21:56:58 UTC (rev 19314) +++ trunk/reactos/lib/riched20/wrap.c 2005-11-17 21:58:13 UTC (rev 19315) @@ -448,9 +448,36 @@
} editor->sizeWindow.cx = c.rcView.right-c.rcView.left; editor->sizeWindow.cy = c.rcView.bottom-c.rcView.top; + editor->nTotalLength = c.pt.y;
ME_DestroyContext(&c); ReleaseDC(hWnd, hDC); return bModified; } + + +void +ME_SendRequestResize(ME_TextEditor *editor, BOOL force) +{ + if (editor->nEventMask & ENM_REQUESTRESIZE) + { + RECT rc; + + GetClientRect(editor->hWnd, &rc); + + if (force || rc.bottom != editor->nTotalLength) + { + REQRESIZE info; + + info.nmhdr.hwndFrom = editor->hWnd; + info.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID); + info.nmhdr.code = EN_REQUESTRESIZE; + info.rc = rc; + info.rc.bottom = editor->nTotalLength; + + SendMessageW(GetParent(editor->hWnd), WM_NOTIFY, + info.nmhdr.idFrom, (LPARAM)&info); + } + } +}