Commit 00a7faa3 authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

msi: Subclass the Richedit control.

Send a "DoAction" control event when the user scrolls the text.
parent a0f88f7a
...@@ -59,7 +59,6 @@ struct msi_control_tag ...@@ -59,7 +59,6 @@ struct msi_control_tag
HBITMAP hBitmap; HBITMAP hBitmap;
HICON hIcon; HICON hIcon;
LPWSTR tabnext; LPWSTR tabnext;
HMODULE hDll;
WCHAR name[1]; WCHAR name[1];
}; };
...@@ -329,7 +328,6 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog, ...@@ -329,7 +328,6 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog,
control->value = NULL; control->value = NULL;
control->hBitmap = NULL; control->hBitmap = NULL;
control->hIcon = NULL; control->hIcon = NULL;
control->hDll = NULL;
control->tabnext = strdupW( MSI_RecordGetString( rec, 11) ); control->tabnext = strdupW( MSI_RecordGetString( rec, 11) );
x = MSI_RecordGetInteger( rec, 4 ); x = MSI_RecordGetInteger( rec, 4 );
...@@ -695,6 +693,42 @@ static UINT msi_dialog_line_control( msi_dialog *dialog, MSIRECORD *rec ) ...@@ -695,6 +693,42 @@ static UINT msi_dialog_line_control( msi_dialog *dialog, MSIRECORD *rec )
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
/******************** Scroll Text ********************************************/
struct msi_scrolltext_info
{
msi_dialog *dialog;
msi_control *control;
WNDPROC oldproc;
HMODULE hRichedit;
};
static LRESULT WINAPI
MSIScrollText_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
struct msi_scrolltext_info *info;
HRESULT r;
TRACE("%p %04x %08x %08lx\n", hWnd, msg, wParam, lParam);
info = GetPropW( hWnd, szButtonData );
r = CallWindowProcW( info->oldproc, hWnd, msg, wParam, lParam );
switch( msg )
{
case WM_NCDESTROY:
FreeLibrary( info->hRichedit );
msi_free( info );
RemovePropW( hWnd, szButtonData );
break;
case WM_VSCROLL:
msi_dialog_button_handler( info->dialog, info->control, BN_CLICKED );
break;
}
return r;
}
struct msi_streamin_info struct msi_streamin_info
{ {
LPSTR string; LPSTR string;
...@@ -718,40 +752,59 @@ msi_richedit_stream_in( DWORD_PTR arg, LPBYTE buffer, LONG count, LONG *pcb ) ...@@ -718,40 +752,59 @@ msi_richedit_stream_in( DWORD_PTR arg, LPBYTE buffer, LONG count, LONG *pcb )
return 0; return 0;
} }
static void msi_scrolltext_add_text( msi_control *control, LPCWSTR text )
{
struct msi_streamin_info info;
EDITSTREAM es;
info.string = strdupWtoA( text );
info.offset = 0;
info.length = lstrlenA( info.string ) + 1;
es.dwCookie = (DWORD_PTR) &info;
es.dwError = 0;
es.pfnCallback = msi_richedit_stream_in;
SendMessageW( control->hwnd, EM_STREAMIN, SF_RTF, (LPARAM) &es );
msi_free( info.string );
}
static UINT msi_dialog_scrolltext_control( msi_dialog *dialog, MSIRECORD *rec ) static UINT msi_dialog_scrolltext_control( msi_dialog *dialog, MSIRECORD *rec )
{ {
static const WCHAR szRichEdit20W[] = { static const WCHAR szRichEdit20W[] = {
'R','i','c','h','E','d','i','t','2','0','W',0 'R','i','c','h','E','d','i','t','2','0','W',0
}; };
struct msi_streamin_info info; struct msi_scrolltext_info *info;
msi_control *control; msi_control *control;
LPCWSTR text;
EDITSTREAM es;
DWORD style; DWORD style;
HMODULE hRichedit;
hRichedit = LoadLibraryA("riched20"); info = msi_alloc( sizeof *info );
if (!info)
return ERROR_FUNCTION_FAILED;
info->hRichedit = LoadLibraryA("riched20");
style = WS_BORDER | ES_MULTILINE | WS_VSCROLL | style = WS_BORDER | ES_MULTILINE | WS_VSCROLL |
ES_READONLY | ES_AUTOVSCROLL | WS_TABSTOP; ES_READONLY | ES_AUTOVSCROLL | WS_TABSTOP;
control = msi_dialog_add_control( dialog, rec, szRichEdit20W, style ); control = msi_dialog_add_control( dialog, rec, szRichEdit20W, style );
if (!control) if (!control)
{
FreeLibrary( info->hRichedit );
msi_free( info );
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
}
control->hDll = hRichedit; info->dialog = dialog;
info->control = control;
text = MSI_RecordGetString( rec, 10 );
info.string = strdupWtoA( text );
info.offset = 0;
info.length = lstrlenA( info.string ) + 1;
es.dwCookie = (DWORD_PTR) &info;
es.dwError = 0;
es.pfnCallback = msi_richedit_stream_in;
SendMessageW( control->hwnd, EM_STREAMIN, SF_RTF, (LPARAM) &es ); /* subclass the static control */
info->oldproc = (WNDPROC) SetWindowLongPtrW( control->hwnd, GWLP_WNDPROC,
(LONG_PTR)MSIScrollText_WndProc );
SetPropW( control->hwnd, szButtonData, info );
msi_free( info.string ); /* add the text into the richedit */
msi_scrolltext_add_text( control, MSI_RecordGetString( rec, 10 ) );
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
...@@ -2144,8 +2197,6 @@ void msi_dialog_destroy( msi_dialog *dialog ) ...@@ -2144,8 +2197,6 @@ void msi_dialog_destroy( msi_dialog *dialog )
DestroyIcon( t->hIcon ); DestroyIcon( t->hIcon );
msi_free( t->tabnext ); msi_free( t->tabnext );
msi_free( t ); msi_free( t );
if (t->hDll)
FreeLibrary( t->hDll );
} }
/* destroy the list of fonts */ /* destroy the list of fonts */
......
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