Matt Finnicum : riched20: Implement EM_SHOWSCROLLBAR, EM_SETSCROLLPOS,
ES_DISABLENOSCROLL, and WS_VSCROLL.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 9 06:03:25 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 658c0cdd1a5fa19300a09ae4ef6d59c06dcecd0c
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=658c0cdd1a5fa19300a09ae4ef6d59c06dcecd0c
Author: Matt Finnicum <mattfinn at gmail.com>
Date: Tue Aug 8 16:08:43 2006 -0400
riched20: Implement EM_SHOWSCROLLBAR, EM_SETSCROLLPOS, ES_DISABLENOSCROLL, and WS_VSCROLL.
---
dlls/riched20/editor.c | 44 +++++++++++++++++++++++++++++++++++++-------
dlls/riched20/paint.c | 38 +++++++++++++++++++++++---------------
2 files changed, 60 insertions(+), 22 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 7c45edb..77bb7a0 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -87,7 +87,7 @@
+ EM_REDO 2.0
+ EM_REQUESTRESIZE
+ EM_REPLACESEL (proper style?) ANSI&Unicode
- - EM_SCROLL
+ + EM_SCROLL
+ EM_SCROLLCARET
- EM_SELECTIONTYPE
- EM_SETBIDIOPTIONS 3.0
@@ -111,7 +111,7 @@
+ EM_SETRECT
+ EM_SETRECTNP (EM_SETRECT without repainting)
+ EM_SETSEL
- - EM_SETSCROLLPOS 3.0
+ + EM_SETSCROLLPOS 3.0
- EM_SETTABSTOPS 3.0
- EM_SETTARGETDEVICE
+ EM_SETTEXTEX 3.0 (unicode only, no rich text insertion handling, proper style?)
@@ -122,7 +122,7 @@
- EM_SETWORDBREAKPROCEX
- EM_SETWORDWRAPMODE 1.0asian
+ EM_SETZOOM 3.0
- - EM_SHOWSCROLLBAR 2.0
+ + EM_SHOWSCROLLBAR 2.0
- EM_STOPGROUPTYPING 2.0
+ EM_STREAMIN
+ EM_STREAMOUT
@@ -168,7 +168,7 @@
- ES_AUTOHSCROLL
- ES_AUTOVSCROLL
- ES_CENTER
- - ES_DISABLENOSCROLL (scrollbar is always visible)
+ + ES_DISABLENOSCROLL (scrollbar is always visible)
- ES_EX_NOCALLOLEINIT
- ES_LEFT
- ES_MULTILINE (currently single line controls aren't supported)
@@ -182,7 +182,7 @@
- ES_WANTRETURN (don't know how to do WM_GETDLGCODE part)
- WS_SETFONT
- WS_HSCROLL
- - WS_VSCROLL
+ + WS_VSCROLL
*/
/*
@@ -1146,6 +1146,12 @@ ME_TextEditor *ME_MakeEditor(HWND hWnd)
ed->pFontCache[i].nAge = 0;
ed->pFontCache[i].hFont = NULL;
}
+
+ if (GetWindowLongW(hWnd, GWL_STYLE) & WS_HSCROLL)
+ FIXME("WS_HSCROLL requested, but horizontal scrolling isn't implemented yet.\n");
+ ed->bScrollX = 0;
+ ed->bScrollY = GetWindowLongW(hWnd, GWL_STYLE) & WS_VSCROLL;
+
ME_CheckCharOffsets(ed);
if (GetWindowLongW(hWnd, GWL_STYLE) & ES_PASSWORD)
@@ -1438,12 +1444,10 @@ LRESULT WINAPI RichEditANSIWndProc(HWND
UNSUPPORTED_MSG(EM_SETFONTSIZE)
UNSUPPORTED_MSG(EM_SETLANGOPTIONS)
UNSUPPORTED_MSG(EM_SETPALETTE)
- UNSUPPORTED_MSG(EM_SETSCROLLPOS)
UNSUPPORTED_MSG(EM_SETTABSTOPS)
UNSUPPORTED_MSG(EM_SETTARGETDEVICE)
UNSUPPORTED_MSG(EM_SETTYPOGRAPHYOPTIONS)
UNSUPPORTED_MSG(EM_SETWORDBREAKPROCEX)
- UNSUPPORTED_MSG(EM_SHOWSCROLLBAR)
UNSUPPORTED_MSG(WM_STYLECHANGING)
UNSUPPORTED_MSG(WM_STYLECHANGED)
/* UNSUPPORTED_MSG(WM_UNICHAR) FIXME missing in Wine headers */
@@ -1574,6 +1578,14 @@ LRESULT WINAPI RichEditANSIWndProc(HWND
ME_SendSelChange(editor);
return 0;
}
+ case EM_SETSCROLLPOS:
+ {
+ POINT *point = (POINT *)lParam;
+ /* Native behavior when point->y is too large is very odd / dosn't follow MSDN.
+ This seems to be a pretty close approximation of what it does. */
+ ME_Scroll(editor, 0, -(min(point->y, (editor->nTotalLength - 1)) - editor->nScrollPosY));
+ return 0;
+ }
case EM_AUTOURLDETECT:
{
if (wParam==1 || wParam ==0)
@@ -1597,6 +1609,15 @@ LRESULT WINAPI RichEditANSIWndProc(HWND
ME_SendSelChange(editor);
return 0;
}
+ case EM_SHOWSCROLLBAR:
+ {
+ if (wParam == SB_VERT)
+ editor->bScrollY = lParam;
+ else if (wParam == SB_HORZ)
+ editor->bScrollX = lParam;
+ ME_UpdateScrollBar(editor);
+ return 0;
+ }
case EM_SETTEXTEX:
{
LPWSTR wszText = (LPWSTR)lParam;
@@ -2241,6 +2262,15 @@ LRESULT WINAPI RichEditANSIWndProc(HWND
return MAKELONG( pt.x, pt.y );
}
case WM_CREATE:
+ if (GetWindowLongW(hWnd, GWL_STYLE) & WS_HSCROLL)
+ { /* Squelch the default horizontal scrollbar it would make */
+ si.cbSize = sizeof(SCROLLINFO);
+ si.fMask = SIF_POS | SIF_RANGE;
+ si.nMax = 0;
+ si.nMin = 0;
+ si.nPos = 0;
+ SetScrollInfo(hWnd, SB_HORZ, &si, FALSE);
+ }
ME_CommitUndo(editor);
ME_WrapMarkedParagraphs(editor);
ME_MoveCaret(editor);
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 41f2652..2384dd8 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -396,42 +396,50 @@ void ME_UpdateScrollBar(ME_TextEditor *e
{
HWND hWnd = editor->hWnd;
SCROLLINFO si;
- int nOldLen = editor->nTotalLength;
- BOOL bScrollY = (editor->nTotalLength > editor->sizeWindow.cy);
BOOL bUpdateScrollBars;
si.cbSize = sizeof(si);
- si.fMask = SIF_POS | SIF_RANGE;
+ si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
GetScrollInfo(hWnd, SB_VERT, &si);
- bUpdateScrollBars = (bScrollY || editor->bScrollY)&& ((si.nMax != nOldLen) || (si.nPage != editor->sizeWindow.cy));
-
- if (bScrollY != editor->bScrollY)
- {
+ bUpdateScrollBars = (editor->bScrollY)&& ((si.nMax != editor->nTotalLength) || (si.nPage != editor->sizeWindow.cy));
+
+ if (editor->bScrollY != (si.nMax > 0))
+ { /* The scroll bar needs to be shown or hidden */
si.fMask = SIF_RANGE | SIF_PAGE;
+ if (GetWindowLongW(hWnd, GWL_STYLE) & ES_DISABLENOSCROLL)
+ si.fMask |= SIF_DISABLENOSCROLL;
+
si.nMin = 0;
si.nPage = editor->sizeWindow.cy;
- if (bScrollY) {
+
+ if (editor->bScrollY)
si.nMax = editor->nTotalLength;
- } else {
+ else
si.nMax = 0;
- }
+
SetScrollInfo(hWnd, SB_VERT, &si, FALSE);
ME_MarkAllForWrapping(editor);
- editor->bScrollY = bScrollY;
ME_WrapMarkedParagraphs(editor);
+
bUpdateScrollBars = TRUE;
}
- if (bUpdateScrollBars) {
+ if (bUpdateScrollBars)
+ {
int nScroll = 0;
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
- if (editor->nTotalLength > editor->sizeWindow.cy) {
+ if (GetWindowLongW(hWnd, GWL_STYLE) & ES_DISABLENOSCROLL)
+ si.fMask |= SIF_DISABLENOSCROLL;
+ if (editor->bScrollY)
+ {
si.nMax = editor->nTotalLength;
si.nPage = editor->sizeWindow.cy;
- if (si.nPos > si.nMax-si.nPage) {
+ if (si.nPos > si.nMax-si.nPage)
+ {
nScroll = (si.nMax-si.nPage)-si.nPos;
si.nPos = si.nMax-si.nPage;
}
}
- else {
+ else
+ {
si.nMax = 0;
si.nPage = 0;
si.nPos = 0;
More information about the wine-cvs
mailing list