Module: wine Branch: refs/heads/master Commit: 00a7faa3777ccb18b81b47c14df427f4f616b4a2 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=00a7faa3777ccb18b81b47c1...
Author: Mike McCormack mike@codeweavers.com Date: Tue Jan 3 12:15:04 2006 +0100
msi: Subclass the Richedit control. Send a "DoAction" control event when the user scrolls the text.
---
dlls/msi/dialog.c | 93 +++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 72 insertions(+), 21 deletions(-)
diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c index ac10dc9..d7b3fdd 100644 --- a/dlls/msi/dialog.c +++ b/dlls/msi/dialog.c @@ -59,7 +59,6 @@ struct msi_control_tag HBITMAP hBitmap; HICON hIcon; LPWSTR tabnext; - HMODULE hDll; WCHAR name[1]; };
@@ -329,7 +328,6 @@ static msi_control *msi_dialog_create_wi control->value = NULL; control->hBitmap = NULL; control->hIcon = NULL; - control->hDll = NULL; control->tabnext = strdupW( MSI_RecordGetString( rec, 11) );
x = MSI_RecordGetInteger( rec, 4 ); @@ -695,6 +693,42 @@ static UINT msi_dialog_line_control( msi 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 { LPSTR string; @@ -718,40 +752,59 @@ msi_richedit_stream_in( DWORD_PTR arg, L 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 const WCHAR szRichEdit20W[] = { '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; - LPCWSTR text; - EDITSTREAM es; 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 | ES_READONLY | ES_AUTOVSCROLL | WS_TABSTOP; control = msi_dialog_add_control( dialog, rec, szRichEdit20W, style ); if (!control) + { + FreeLibrary( info->hRichedit ); + msi_free( info ); return ERROR_FUNCTION_FAILED; + }
- control->hDll = hRichedit; - - 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; + info->dialog = dialog; + info->control = control;
- 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; } @@ -2144,8 +2197,6 @@ void msi_dialog_destroy( msi_dialog *dia DestroyIcon( t->hIcon ); msi_free( t->tabnext ); msi_free( t ); - if (t->hDll) - FreeLibrary( t->hDll ); }
/* destroy the list of fonts */