Commit 08c4de06 authored by Huw Davies's avatar Huw Davies Committed by Alexandre Julliard

riched20: Add support for EN_[HV]SCROLL notifications.

parent db516804
...@@ -3377,7 +3377,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam, ...@@ -3377,7 +3377,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
case EM_SETSCROLLPOS: case EM_SETSCROLLPOS:
{ {
POINT *point = (POINT *)lParam; POINT *point = (POINT *)lParam;
ME_ScrollAbs(editor, point->x, point->y); scroll_abs( editor, point->x, point->y, TRUE );
return 0; return 0;
} }
case EM_AUTOURLDETECT: case EM_AUTOURLDETECT:
...@@ -3986,12 +3986,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam, ...@@ -3986,12 +3986,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
switch(LOWORD(wParam)) switch(LOWORD(wParam))
{ {
case SB_LEFT: case SB_LEFT:
ME_ScrollAbs(editor, 0, 0); scroll_abs( editor, 0, 0, TRUE );
break; break;
case SB_RIGHT: case SB_RIGHT:
ME_ScrollAbs(editor, scroll_abs( editor, editor->horz_si.nMax - (int)editor->horz_si.nPage,
editor->horz_si.nMax - (int)editor->horz_si.nPage, editor->vert_si.nMax - (int)editor->vert_si.nPage, TRUE );
editor->vert_si.nMax - (int)editor->vert_si.nPage);
break; break;
case SB_LINELEFT: case SB_LINELEFT:
ME_ScrollLeft(editor, scrollUnit); ME_ScrollLeft(editor, scrollUnit);
...@@ -4011,7 +4010,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam, ...@@ -4011,7 +4010,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
int pos = HIWORD(wParam); int pos = HIWORD(wParam);
if (editor->horz_si.nMax > 0xffff) if (editor->horz_si.nMax > 0xffff)
pos = MulDiv(pos, editor->horz_si.nMax, 0xffff); pos = MulDiv(pos, editor->horz_si.nMax, 0xffff);
ME_HScrollAbs(editor, pos); scroll_h_abs( editor, pos, FALSE );
break; break;
} }
} }
...@@ -4028,12 +4027,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam, ...@@ -4028,12 +4027,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
switch(LOWORD(wParam)) switch(LOWORD(wParam))
{ {
case SB_TOP: case SB_TOP:
ME_ScrollAbs(editor, 0, 0); scroll_abs( editor, 0, 0, TRUE );
break; break;
case SB_BOTTOM: case SB_BOTTOM:
ME_ScrollAbs(editor, scroll_abs( editor, editor->horz_si.nMax - (int)editor->horz_si.nPage,
editor->horz_si.nMax - (int)editor->horz_si.nPage, editor->vert_si.nMax - (int)editor->vert_si.nPage, TRUE );
editor->vert_si.nMax - (int)editor->vert_si.nPage);
break; break;
case SB_LINEUP: case SB_LINEUP:
ME_ScrollUp(editor,lineHeight); ME_ScrollUp(editor,lineHeight);
...@@ -4053,7 +4051,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam, ...@@ -4053,7 +4051,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
int pos = HIWORD(wParam); int pos = HIWORD(wParam);
if (editor->vert_si.nMax > 0xffff) if (editor->vert_si.nMax > 0xffff)
pos = MulDiv(pos, editor->vert_si.nMax, 0xffff); pos = MulDiv(pos, editor->vert_si.nMax, 0xffff);
ME_VScrollAbs(editor, pos); scroll_v_abs( editor, pos, FALSE );
break; break;
} }
} }
......
...@@ -250,9 +250,9 @@ int ME_twips2pointsY(const ME_Context *c, int y) DECLSPEC_HIDDEN; ...@@ -250,9 +250,9 @@ int ME_twips2pointsY(const ME_Context *c, int y) DECLSPEC_HIDDEN;
/* scroll functions in paint.c */ /* scroll functions in paint.c */
void ME_ScrollAbs(ME_TextEditor *editor, int x, int y) DECLSPEC_HIDDEN; void scroll_abs( ME_TextEditor *editor, int x, int y, BOOL notify ) DECLSPEC_HIDDEN;
void ME_HScrollAbs(ME_TextEditor *editor, int x) DECLSPEC_HIDDEN; void scroll_h_abs( ME_TextEditor *editor, int x, BOOL notify ) DECLSPEC_HIDDEN;
void ME_VScrollAbs(ME_TextEditor *editor, int y) DECLSPEC_HIDDEN; void scroll_v_abs( ME_TextEditor *editor, int y, BOOL notify ) DECLSPEC_HIDDEN;
void ME_ScrollUp(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN; void ME_ScrollUp(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN;
void ME_ScrollDown(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN; void ME_ScrollDown(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN;
void ME_ScrollLeft(ME_TextEditor *editor, int cx) DECLSPEC_HIDDEN; void ME_ScrollLeft(ME_TextEditor *editor, int cx) DECLSPEC_HIDDEN;
......
...@@ -1070,7 +1070,7 @@ static void enable_show_scrollbar( ME_TextEditor *editor, INT bar, BOOL enable ) ...@@ -1070,7 +1070,7 @@ static void enable_show_scrollbar( ME_TextEditor *editor, INT bar, BOOL enable )
ITextHost_TxShowScrollBar( editor->texthost, bar, enable ); ITextHost_TxShowScrollBar( editor->texthost, bar, enable );
} }
static void set_scroll_range_pos( ITextHost2 *host, INT bar, SCROLLINFO *info, BOOL set_range ) static void set_scroll_range_pos( ME_TextEditor *editor, INT bar, SCROLLINFO *info, BOOL set_range, BOOL notify )
{ {
LONG max_pos = info->nMax, pos = info->nPos; LONG max_pos = info->nMax, pos = info->nPos;
...@@ -1080,11 +1080,14 @@ static void set_scroll_range_pos( ITextHost2 *host, INT bar, SCROLLINFO *info, B ...@@ -1080,11 +1080,14 @@ static void set_scroll_range_pos( ITextHost2 *host, INT bar, SCROLLINFO *info, B
pos = MulDiv( pos, 0xffff, max_pos ); pos = MulDiv( pos, 0xffff, max_pos );
max_pos = 0xffff; max_pos = 0xffff;
} }
if (set_range) ITextHost_TxSetScrollRange( host, bar, 0, max_pos, FALSE ); if (set_range) ITextHost_TxSetScrollRange( editor->texthost, bar, 0, max_pos, FALSE );
ITextHost_TxSetScrollPos( host, bar, pos, TRUE ); ITextHost_TxSetScrollPos( editor->texthost, bar, pos, TRUE );
if (notify && editor->nEventMask & ENM_SCROLL)
ITextHost_TxNotify( editor->texthost, bar == SB_VERT ? EN_VSCROLL : EN_HSCROLL, NULL );
} }
void ME_ScrollAbs(ME_TextEditor *editor, int x, int y) void scroll_abs( ME_TextEditor *editor, int x, int y, BOOL notify )
{ {
int scrollX = 0, scrollY = 0; int scrollX = 0, scrollY = 0;
...@@ -1093,7 +1096,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y) ...@@ -1093,7 +1096,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
x = max(x, editor->horz_si.nMin); x = max(x, editor->horz_si.nMin);
scrollX = editor->horz_si.nPos - x; scrollX = editor->horz_si.nPos - x;
editor->horz_si.nPos = x; editor->horz_si.nPos = x;
set_scroll_range_pos( editor->texthost, SB_HORZ, &editor->horz_si, FALSE ); set_scroll_range_pos( editor, SB_HORZ, &editor->horz_si, FALSE, notify );
} }
if (editor->vert_si.nPos != y) { if (editor->vert_si.nPos != y) {
...@@ -1101,7 +1104,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y) ...@@ -1101,7 +1104,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
y = max(y, editor->vert_si.nMin); y = max(y, editor->vert_si.nMin);
scrollY = editor->vert_si.nPos - y; scrollY = editor->vert_si.nPos - y;
editor->vert_si.nPos = y; editor->vert_si.nPos = y;
set_scroll_range_pos( editor->texthost, SB_VERT, &editor->vert_si, FALSE ); set_scroll_range_pos( editor, SB_VERT, &editor->vert_si, FALSE, notify );
} }
if (abs(scrollX) > editor->sizeWindow.cx || abs(scrollY) > editor->sizeWindow.cy) if (abs(scrollX) > editor->sizeWindow.cx || abs(scrollY) > editor->sizeWindow.cy)
...@@ -1114,34 +1117,34 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y) ...@@ -1114,34 +1117,34 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
ME_Repaint(editor); ME_Repaint(editor);
} }
void ME_HScrollAbs(ME_TextEditor *editor, int x) void scroll_h_abs( ME_TextEditor *editor, int x, BOOL notify )
{ {
ME_ScrollAbs(editor, x, editor->vert_si.nPos); scroll_abs( editor, x, editor->vert_si.nPos, notify );
} }
void ME_VScrollAbs(ME_TextEditor *editor, int y) void scroll_v_abs( ME_TextEditor *editor, int y, BOOL notify )
{ {
ME_ScrollAbs(editor, editor->horz_si.nPos, y); scroll_abs( editor, editor->horz_si.nPos, y, notify );
} }
void ME_ScrollUp(ME_TextEditor *editor, int cy) void ME_ScrollUp(ME_TextEditor *editor, int cy)
{ {
ME_VScrollAbs(editor, editor->vert_si.nPos - cy); scroll_v_abs( editor, editor->vert_si.nPos - cy, TRUE );
} }
void ME_ScrollDown(ME_TextEditor *editor, int cy) void ME_ScrollDown(ME_TextEditor *editor, int cy)
{ {
ME_VScrollAbs(editor, editor->vert_si.nPos + cy); scroll_v_abs( editor, editor->vert_si.nPos + cy, TRUE );
} }
void ME_ScrollLeft(ME_TextEditor *editor, int cx) void ME_ScrollLeft(ME_TextEditor *editor, int cx)
{ {
ME_HScrollAbs(editor, editor->horz_si.nPos - cx); scroll_h_abs( editor, editor->horz_si.nPos - cx, TRUE );
} }
void ME_ScrollRight(ME_TextEditor *editor, int cx) void ME_ScrollRight(ME_TextEditor *editor, int cx)
{ {
ME_HScrollAbs(editor, editor->horz_si.nPos + cx); scroll_h_abs( editor, editor->horz_si.nPos + cx, TRUE );
} }
void ME_UpdateScrollBar(ME_TextEditor *editor) void ME_UpdateScrollBar(ME_TextEditor *editor)
...@@ -1157,7 +1160,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor) ...@@ -1157,7 +1160,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
enable = editor->nTotalWidth > editor->sizeWindow.cx; enable = editor->nTotalWidth > editor->sizeWindow.cx;
if (editor->horz_si.nPos && !enable) if (editor->horz_si.nPos && !enable)
{ {
ME_HScrollAbs(editor, 0); scroll_h_abs( editor, 0, TRUE );
/* ME_HScrollAbs will call this function, so nothing else needs to be done here. */ /* ME_HScrollAbs will call this function, so nothing else needs to be done here. */
return; return;
} }
...@@ -1174,7 +1177,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor) ...@@ -1174,7 +1177,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
editor->horz_si.nPage = editor->sizeWindow.cx; editor->horz_si.nPage = editor->sizeWindow.cx;
TRACE( "min = %d max = %d page = %d\n", editor->horz_si.nMin, editor->horz_si.nMax, editor->horz_si.nPage ); TRACE( "min = %d max = %d page = %d\n", editor->horz_si.nMin, editor->horz_si.nMax, editor->horz_si.nPage );
if ((enable || editor->horz_sb_enabled) && editor->scrollbars & WS_HSCROLL) if ((enable || editor->horz_sb_enabled) && editor->scrollbars & WS_HSCROLL)
set_scroll_range_pos( editor->texthost, SB_HORZ, &editor->horz_si, TRUE ); set_scroll_range_pos( editor, SB_HORZ, &editor->horz_si, TRUE, TRUE );
} }
/* Update vertical scrollbar */ /* Update vertical scrollbar */
...@@ -1182,7 +1185,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor) ...@@ -1182,7 +1185,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
if (editor->vert_si.nPos && !enable) if (editor->vert_si.nPos && !enable)
{ {
ME_VScrollAbs(editor, 0); scroll_v_abs( editor, 0, TRUE );
/* ME_VScrollAbs will call this function, so nothing else needs to be done here. */ /* ME_VScrollAbs will call this function, so nothing else needs to be done here. */
return; return;
} }
...@@ -1199,7 +1202,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor) ...@@ -1199,7 +1202,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
editor->vert_si.nPage = editor->sizeWindow.cy; editor->vert_si.nPage = editor->sizeWindow.cy;
TRACE( "min = %d max = %d page = %d\n", editor->vert_si.nMin, editor->vert_si.nMax, editor->vert_si.nPage ); TRACE( "min = %d max = %d page = %d\n", editor->vert_si.nMin, editor->vert_si.nMax, editor->vert_si.nPage );
if ((enable || editor->vert_sb_enabled) && editor->scrollbars & WS_VSCROLL) if ((enable || editor->vert_sb_enabled) && editor->scrollbars & WS_VSCROLL)
set_scroll_range_pos( editor->texthost, SB_VERT, &editor->vert_si, TRUE ); set_scroll_range_pos( editor, SB_VERT, &editor->vert_si, TRUE, TRUE );
} }
} }
...@@ -1221,7 +1224,7 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor ) ...@@ -1221,7 +1224,7 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor )
if (~editor->scrollbars & ES_AUTOVSCROLL) if (~editor->scrollbars & ES_AUTOVSCROLL)
{ {
ME_HScrollAbs(editor, x); scroll_h_abs( editor, x, TRUE );
return; return;
} }
} }
...@@ -1235,11 +1238,11 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor ) ...@@ -1235,11 +1238,11 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor )
yheight = row->nHeight; yheight = row->nHeight;
if (y < editor->vert_si.nPos) if (y < editor->vert_si.nPos)
ME_ScrollAbs(editor, x, y); scroll_abs( editor, x, y, TRUE );
else if (y + yheight > editor->vert_si.nPos + editor->sizeWindow.cy) else if (y + yheight > editor->vert_si.nPos + editor->sizeWindow.cy)
ME_ScrollAbs(editor, x, y + yheight - editor->sizeWindow.cy); scroll_abs( editor, x, y + yheight - editor->sizeWindow.cy, TRUE );
else if (x != editor->horz_si.nPos) else if (x != editor->horz_si.nPos)
ME_ScrollAbs(editor, x, editor->vert_si.nPos); scroll_abs( editor, x, editor->vert_si.nPos, TRUE );
} }
......
...@@ -2743,7 +2743,7 @@ static HRESULT WINAPI ITextRange_fnScrollIntoView(ITextRange *me, LONG value) ...@@ -2743,7 +2743,7 @@ static HRESULT WINAPI ITextRange_fnScrollIntoView(ITextRange *me, LONG value)
FIXME("bStart value %d not handled\n", value); FIXME("bStart value %d not handled\n", value);
return E_NOTIMPL; return E_NOTIMPL;
} }
ME_ScrollAbs(editor, x, y); scroll_abs( editor, x, y, TRUE );
return S_OK; return S_OK;
} }
......
...@@ -398,11 +398,19 @@ static HRESULT __thiscall ITextHostImpl_TxGetPropertyBits(ITextHost *iface, DWOR ...@@ -398,11 +398,19 @@ static HRESULT __thiscall ITextHostImpl_TxGetPropertyBits(ITextHost *iface, DWOR
return S_OK; return S_OK;
} }
static HRESULT __thiscall ITextHostImpl_TxNotify(ITextHost *iface, DWORD iNotify, void *pv) static int en_vscroll_sent;
static HRESULT __thiscall ITextHostImpl_TxNotify( ITextHost *iface, DWORD code, void *data )
{ {
ITextHostTestImpl *This = impl_from_ITextHost(iface); ITextHostTestImpl *This = impl_from_ITextHost(iface);
TRACECALL("Call to TxNotify(%p, iNotify=%d, pv=%p)\n", This, iNotify, pv); TRACECALL( "Call to TxNotify(%p, code = %#x, data = %p)\n", This, code, data );
return E_NOTIMPL; switch (code)
{
case EN_VSCROLL:
en_vscroll_sent++;
ok( !data, "got %p\n", data );
break;
}
return S_OK;
} }
static HIMC __thiscall ITextHostImpl_TxImmGetContext(ITextHost *iface) static HIMC __thiscall ITextHostImpl_TxImmGetContext(ITextHost *iface)
...@@ -1100,6 +1108,55 @@ todo_wine ...@@ -1100,6 +1108,55 @@ todo_wine
ITextHost_Release(host); ITextHost_Release(host);
} }
static void test_notifications( void )
{
ITextServices *txtserv;
ITextHost *host;
LRESULT res;
HRESULT hr;
RECT client = { 0, 0, 100, 100 };
ITextHostTestImpl *host_impl;
init_texthost( &txtserv, &host );
host_impl = impl_from_ITextHost( host );
host_impl->scrollbars = WS_VSCROLL;
host_impl->props = TXTBIT_MULTILINE | TXTBIT_RICHTEXT | TXTBIT_WORDWRAP;
ITextServices_OnTxPropertyBitsChange( txtserv, TXTBIT_SCROLLBARCHANGE | TXTBIT_MULTILINE | TXTBIT_RICHTEXT | TXTBIT_WORDWRAP, host_impl->props );
ITextServices_TxSetText( txtserv, lorem );
host_impl->window = CreateWindowExA( 0, "static", NULL, WS_POPUP | WS_VISIBLE,
0, 0, 400, 400, 0, 0, 0, NULL );
host_impl->client_rect = client;
hr = ITextServices_OnTxInPlaceActivate( txtserv, &client );
ok( hr == S_OK, "got 0x%08x.\n", hr );
hr = ITextServices_TxSendMessage( txtserv, EM_SETEVENTMASK, 0, ENM_SCROLL, &res );
ok( hr == S_OK, "got %08x\n", hr );
/* check EN_VSCROLL notification is sent */
en_vscroll_sent = 0;
hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, SB_LINEDOWN, 0, &res );
ok( hr == S_OK, "got %08x\n", hr );
ok( en_vscroll_sent == 1, "got %d\n", en_vscroll_sent );
hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, SB_BOTTOM, 0, &res );
ok( hr == S_OK, "got %08x\n", hr );
ok( en_vscroll_sent == 2, "got %d\n", en_vscroll_sent );
/* but not when the thumb is moved */
hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, MAKEWPARAM( SB_THUMBTRACK, 0 ), 0, &res );
ok( hr == S_OK, "got %08x\n", hr );
hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, MAKEWPARAM( SB_THUMBPOSITION, 0 ), 0, &res );
ok( hr == S_OK, "got %08x\n", hr );
ok( en_vscroll_sent == 2, "got %d\n", en_vscroll_sent );
DestroyWindow( host_impl->window );
ITextServices_Release( txtserv );
ITextHost_Release( host );
}
START_TEST( txtsrv ) START_TEST( txtsrv )
{ {
ITextServices *txtserv; ITextServices *txtserv;
...@@ -1132,6 +1189,7 @@ START_TEST( txtsrv ) ...@@ -1132,6 +1189,7 @@ START_TEST( txtsrv )
test_QueryInterface(); test_QueryInterface();
test_default_format(); test_default_format();
test_TxGetScroll(); test_TxGetScroll();
test_notifications();
} }
if (wrapperCodeMem) VirtualFree(wrapperCodeMem, 0, MEM_RELEASE); if (wrapperCodeMem) VirtualFree(wrapperCodeMem, 0, MEM_RELEASE);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment