riched20: Implement EM_SHOWSCROLLBAR, EM_SETSCROLLPOS, ES_DISABLENOSCROLL, and WS_VSCROLL.

This commit is contained in:
Matt Finnicum 2006-08-08 16:08:43 -04:00 committed by Alexandre Julliard
parent bf4e00fd9b
commit 658c0cdd1a
2 changed files with 60 additions and 22 deletions

View File

@ -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 hWnd, UINT msg, WPARAM wParam, LPARAM lP
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 hWnd, UINT msg, WPARAM wParam, LPARAM lP
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 hWnd, UINT msg, WPARAM wParam, LPARAM lP
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 hWnd, UINT msg, WPARAM wParam, LPARAM lP
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);

View File

@ -396,42 +396,50 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
{
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;