2 * COMMDLG - 16 bits Find & Replace Text Dialogs
4 * Copyright 1994 Martin Ayotte
5 * Copyright 1996 Albrecht Kleine
12 #include "wine/winbase16.h"
13 #include "wine/winuser16.h"
17 #include "debugtools.h"
20 DEFAULT_DEBUG_CHANNEL(commdlg
)
26 HANDLE16 hDlgTmpl16
; /* handle for resource 16 */
27 HANDLE16 hResource16
; /* handle for allocated resource 16 */
28 HANDLE16 hGlobal16
; /* 16 bits mem block (resources) */
29 LPCVOID
template; /* template for 32 bits resource */
30 BOOL find
; /* TRUE if find dialog, FALSE if replace dialog */
34 #define LFRPRIVATE struct FRPRIVATE *
36 LRESULT WINAPI
FindTextDlgProc16(HWND16 hWnd
, UINT16 wMsg
, WPARAM16 wParam
,
38 LRESULT WINAPI
ReplaceTextDlgProc16(HWND16 hWnd
, UINT16 wMsg
, WPARAM16 wParam
,
41 /***********************************************************************
42 * FINDDLG_Get16BitsTemplate [internal]
44 * Get a template (FALSE if failure) when 16 bits dialogs are used
45 * by a 16 bits application
46 * FIXME : no test was done for the user-provided template cases
48 BOOL
FINDDLG_Get16BitsTemplate(LFRPRIVATE lfr
)
50 LPFINDREPLACE16 fr16
= lfr
->fr16
;
52 if (fr16
->Flags
& FR_ENABLETEMPLATEHANDLE
)
54 lfr
->template = GlobalLock16(fr16
->hInstance
);
57 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE
);
61 else if (fr16
->Flags
& FR_ENABLETEMPLATE
)
64 if (!(hResInfo
= FindResource16(fr16
->hInstance
,
68 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
71 if (!(lfr
->hDlgTmpl16
= LoadResource16( fr16
->hInstance
, hResInfo
)))
73 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
76 lfr
->hResource16
= lfr
->hDlgTmpl16
;
77 lfr
->template = LockResource16(lfr
->hResource16
);
80 FreeResource16(lfr
->hResource16
);
81 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE
);
86 { /* get resource from (32 bits) own Wine resource; convert it to 16 */
87 HANDLE hResInfo
, hDlgTmpl32
;
92 if (!(hResInfo
= FindResourceA(COMMDLG_hInstance32
,
94 MAKEINTRESOURCEA(FINDDLGORD
):MAKEINTRESOURCEA(REPLACEDLGORD
),
97 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
100 if (!(hDlgTmpl32
= LoadResource(COMMDLG_hInstance32
, hResInfo
)) ||
101 !(template32
= LockResource( hDlgTmpl32
)))
103 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
106 size
= SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo
);
107 hGlobal16
= GlobalAlloc16(0, size
);
110 COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE
);
111 ERR("alloc failure for %ld bytes\n", size
);
114 lfr
->template = GlobalLock16(hGlobal16
);
117 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE
);
118 ERR("global lock failure for %x handle\n", hGlobal16
);
119 GlobalFree16(hGlobal16
);
122 ConvertDialog32To16((LPVOID
)template32
, size
, (LPVOID
)lfr
->template);
123 lfr
->hDlgTmpl16
= hGlobal16
;
124 lfr
->hGlobal16
= hGlobal16
;
130 /***********************************************************************
131 * FINDDLG_FreeResources [internal]
133 * Free resources allocated
135 void FINDDLG_FreeResources(LFRPRIVATE lfr
)
138 if (lfr
->fr16
->Flags
& FR_ENABLETEMPLATEHANDLE
)
139 GlobalUnlock16(lfr
->fr16
->hInstance
);
140 if (lfr
->hResource16
)
142 GlobalUnlock16(lfr
->hResource16
);
143 FreeResource16(lfr
->hResource16
);
147 GlobalUnlock16(lfr
->hGlobal16
);
148 GlobalFree16(lfr
->hGlobal16
);
152 /***********************************************************************
153 * FindText16 (COMMDLG.11)
155 HWND16 WINAPI
FindText16( SEGPTR find
)
160 LFRPRIVATE lfr
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(struct FRPRIVATE
));
163 lfr
->fr16
= (LPFINDREPLACE16
)PTR_SEG_TO_LIN(find
);
165 if (FINDDLG_Get16BitsTemplate(lfr
))
167 hInst
= GetWindowLongA( lfr
->fr16
->hwndOwner
, GWL_HINSTANCE
);
168 ptr
= GetProcAddress16(GetModuleHandle16("COMMDLG"), (SEGPTR
) 13);
169 ret
= CreateDialogIndirectParam16( hInst
, lfr
->template,
170 lfr
->fr16
->hwndOwner
, (DLGPROC16
) ptr
, find
);
171 FINDDLG_FreeResources(lfr
);
173 HeapFree(GetProcessHeap(), 0, lfr
);
178 /***********************************************************************
179 * ReplaceText16 (COMMDLG.12)
181 HWND16 WINAPI
ReplaceText16( SEGPTR find
)
186 LFRPRIVATE lfr
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(struct FRPRIVATE
));
190 * FIXME : We should do error checking on the lpFind structure here
191 * and make CommDlgExtendedError() return the error condition.
193 lfr
->fr16
= (LPFINDREPLACE16
)PTR_SEG_TO_LIN(find
);
195 if (FINDDLG_Get16BitsTemplate(lfr
))
197 hInst
= GetWindowLongA( lfr
->fr16
->hwndOwner
, GWL_HINSTANCE
);
198 ptr
= GetProcAddress16(GetModuleHandle16("COMMDLG"), (SEGPTR
) 14);
199 ret
= CreateDialogIndirectParam16( hInst
, lfr
->template,
200 lfr
->fr16
->hwndOwner
, (DLGPROC16
) ptr
, find
);
202 FINDDLG_FreeResources(lfr
);
204 HeapFree(GetProcessHeap(), 0, lfr
);
209 /***********************************************************************
210 * FINDDLG_WMInitDialog [internal]
212 static LRESULT
FINDDLG_WMInitDialog(HWND hWnd
, LPARAM lParam
, LPDWORD lpFlags
,
213 LPSTR lpstrFindWhat
, BOOL fUnicode
)
215 SetWindowLongA(hWnd
, DWL_USER
, lParam
);
216 *lpFlags
&= ~(FR_FINDNEXT
| FR_REPLACE
| FR_REPLACEALL
| FR_DIALOGTERM
);
218 * FIXME : If the initial FindWhat string is empty, we should disable the
219 * FindNext (IDOK) button. Only after typing some text, the button should be
222 if (fUnicode
) SetDlgItemTextW(hWnd
, edt1
, (LPWSTR
)lpstrFindWhat
);
223 else SetDlgItemTextA(hWnd
, edt1
, lpstrFindWhat
);
224 CheckRadioButton(hWnd
, rad1
, rad2
, (*lpFlags
& FR_DOWN
) ? rad2
: rad1
);
225 if (*lpFlags
& (FR_HIDEUPDOWN
| FR_NOUPDOWN
)) {
226 EnableWindow(GetDlgItem(hWnd
, rad1
), FALSE
);
227 EnableWindow(GetDlgItem(hWnd
, rad2
), FALSE
);
229 if (*lpFlags
& FR_HIDEUPDOWN
) {
230 ShowWindow(GetDlgItem(hWnd
, rad1
), SW_HIDE
);
231 ShowWindow(GetDlgItem(hWnd
, rad2
), SW_HIDE
);
232 ShowWindow(GetDlgItem(hWnd
, grp1
), SW_HIDE
);
234 CheckDlgButton(hWnd
, chx1
, (*lpFlags
& FR_WHOLEWORD
) ? 1 : 0);
235 if (*lpFlags
& (FR_HIDEWHOLEWORD
| FR_NOWHOLEWORD
))
236 EnableWindow(GetDlgItem(hWnd
, chx1
), FALSE
);
237 if (*lpFlags
& FR_HIDEWHOLEWORD
)
238 ShowWindow(GetDlgItem(hWnd
, chx1
), SW_HIDE
);
239 CheckDlgButton(hWnd
, chx2
, (*lpFlags
& FR_MATCHCASE
) ? 1 : 0);
240 if (*lpFlags
& (FR_HIDEMATCHCASE
| FR_NOMATCHCASE
))
241 EnableWindow(GetDlgItem(hWnd
, chx2
), FALSE
);
242 if (*lpFlags
& FR_HIDEMATCHCASE
)
243 ShowWindow(GetDlgItem(hWnd
, chx2
), SW_HIDE
);
244 if (!(*lpFlags
& FR_SHOWHELP
)) {
245 EnableWindow(GetDlgItem(hWnd
, pshHelp
), FALSE
);
246 ShowWindow(GetDlgItem(hWnd
, pshHelp
), SW_HIDE
);
248 ShowWindow(hWnd
, SW_SHOWNORMAL
);
253 /***********************************************************************
254 * FINDDLG_WMCommand [internal]
256 static LRESULT
FINDDLG_WMCommand(HWND hWnd
, WPARAM wParam
,
257 HWND hwndOwner
, LPDWORD lpFlags
,
258 LPSTR lpstrFindWhat
, WORD wFindWhatLen
,
261 int uFindReplaceMessage
= RegisterWindowMessageA( FINDMSGSTRING
);
262 int uHelpMessage
= RegisterWindowMessageA( HELPMSGSTRING
);
267 GetDlgItemTextW(hWnd
, edt1
, (LPWSTR
)lpstrFindWhat
, wFindWhatLen
/2);
268 else GetDlgItemTextA(hWnd
, edt1
, lpstrFindWhat
, wFindWhatLen
);
269 if (IsDlgButtonChecked(hWnd
, rad2
))
271 else *lpFlags
&= ~FR_DOWN
;
272 if (IsDlgButtonChecked(hWnd
, chx1
))
273 *lpFlags
|= FR_WHOLEWORD
;
274 else *lpFlags
&= ~FR_WHOLEWORD
;
275 if (IsDlgButtonChecked(hWnd
, chx2
))
276 *lpFlags
|= FR_MATCHCASE
;
277 else *lpFlags
&= ~FR_MATCHCASE
;
278 *lpFlags
&= ~(FR_REPLACE
| FR_REPLACEALL
| FR_DIALOGTERM
);
279 *lpFlags
|= FR_FINDNEXT
;
280 SendMessageA(hwndOwner
, uFindReplaceMessage
, 0,
281 GetWindowLongA(hWnd
, DWL_USER
) );
284 *lpFlags
&= ~(FR_FINDNEXT
| FR_REPLACE
| FR_REPLACEALL
);
285 *lpFlags
|= FR_DIALOGTERM
;
286 SendMessageA(hwndOwner
, uFindReplaceMessage
, 0,
287 GetWindowLongA(hWnd
, DWL_USER
) );
291 /* FIXME : should lpfr structure be passed as an argument ??? */
292 SendMessageA(hwndOwner
, uHelpMessage
, 0, 0);
299 /***********************************************************************
300 * FindTextDlgProc16 (COMMDLG.13)
302 LRESULT WINAPI
FindTextDlgProc16(HWND16 hWnd
, UINT16 wMsg
, WPARAM16 wParam
,
305 LPFINDREPLACE16 lpfr
;
308 lpfr
=(LPFINDREPLACE16
)PTR_SEG_TO_LIN(lParam
);
309 return FINDDLG_WMInitDialog(hWnd
, lParam
, &(lpfr
->Flags
),
310 PTR_SEG_TO_LIN(lpfr
->lpstrFindWhat
), FALSE
);
312 lpfr
=(LPFINDREPLACE16
)PTR_SEG_TO_LIN(GetWindowLongA(hWnd
, DWL_USER
));
313 return FINDDLG_WMCommand(hWnd
, wParam
, lpfr
->hwndOwner
,
314 &lpfr
->Flags
, PTR_SEG_TO_LIN(lpfr
->lpstrFindWhat
),
315 lpfr
->wFindWhatLen
, FALSE
);
321 /***********************************************************************
322 * REPLACEDLG_WMInitDialog [internal]
324 static LRESULT
REPLACEDLG_WMInitDialog(HWND hWnd
, LPARAM lParam
,
325 LPDWORD lpFlags
, LPSTR lpstrFindWhat
,
326 LPSTR lpstrReplaceWith
, BOOL fUnicode
)
328 SetWindowLongA(hWnd
, DWL_USER
, lParam
);
329 *lpFlags
&= ~(FR_FINDNEXT
| FR_REPLACE
| FR_REPLACEALL
| FR_DIALOGTERM
);
331 * FIXME : If the initial FindWhat string is empty, we should disable the FinNext /
332 * Replace / ReplaceAll buttons. Only after typing some text, the buttons should be
337 SetDlgItemTextW(hWnd
, edt1
, (LPWSTR
)lpstrFindWhat
);
338 SetDlgItemTextW(hWnd
, edt2
, (LPWSTR
)lpstrReplaceWith
);
341 SetDlgItemTextA(hWnd
, edt1
, lpstrFindWhat
);
342 SetDlgItemTextA(hWnd
, edt2
, lpstrReplaceWith
);
344 CheckDlgButton(hWnd
, chx1
, (*lpFlags
& FR_WHOLEWORD
) ? 1 : 0);
345 if (*lpFlags
& (FR_HIDEWHOLEWORD
| FR_NOWHOLEWORD
))
346 EnableWindow(GetDlgItem(hWnd
, chx1
), FALSE
);
347 if (*lpFlags
& FR_HIDEWHOLEWORD
)
348 ShowWindow(GetDlgItem(hWnd
, chx1
), SW_HIDE
);
349 CheckDlgButton(hWnd
, chx2
, (*lpFlags
& FR_MATCHCASE
) ? 1 : 0);
350 if (*lpFlags
& (FR_HIDEMATCHCASE
| FR_NOMATCHCASE
))
351 EnableWindow(GetDlgItem(hWnd
, chx2
), FALSE
);
352 if (*lpFlags
& FR_HIDEMATCHCASE
)
353 ShowWindow(GetDlgItem(hWnd
, chx2
), SW_HIDE
);
354 if (!(*lpFlags
& FR_SHOWHELP
)) {
355 EnableWindow(GetDlgItem(hWnd
, pshHelp
), FALSE
);
356 ShowWindow(GetDlgItem(hWnd
, pshHelp
), SW_HIDE
);
358 ShowWindow(hWnd
, SW_SHOWNORMAL
);
363 /***********************************************************************
364 * REPLACEDLG_WMCommand [internal]
366 static LRESULT
REPLACEDLG_WMCommand(HWND hWnd
, WPARAM16 wParam
,
367 HWND hwndOwner
, LPDWORD lpFlags
,
368 LPSTR lpstrFindWhat
, WORD wFindWhatLen
,
369 LPSTR lpstrReplaceWith
, WORD wReplaceWithLen
,
372 int uFindReplaceMessage
= RegisterWindowMessageA( FINDMSGSTRING
);
373 int uHelpMessage
= RegisterWindowMessageA( HELPMSGSTRING
);
379 GetDlgItemTextW(hWnd
, edt1
, (LPWSTR
)lpstrFindWhat
, wFindWhatLen
/2);
380 GetDlgItemTextW(hWnd
, edt2
, (LPWSTR
)lpstrReplaceWith
, wReplaceWithLen
/2);
383 GetDlgItemTextA(hWnd
, edt1
, lpstrFindWhat
, wFindWhatLen
);
384 GetDlgItemTextA(hWnd
, edt2
, lpstrReplaceWith
, wReplaceWithLen
);
386 if (IsDlgButtonChecked(hWnd
, chx1
))
387 *lpFlags
|= FR_WHOLEWORD
;
388 else *lpFlags
&= ~FR_WHOLEWORD
;
389 if (IsDlgButtonChecked(hWnd
, chx2
))
390 *lpFlags
|= FR_MATCHCASE
;
391 else *lpFlags
&= ~FR_MATCHCASE
;
392 *lpFlags
&= ~(FR_REPLACE
| FR_REPLACEALL
| FR_DIALOGTERM
);
393 *lpFlags
|= FR_FINDNEXT
;
394 SendMessageA(hwndOwner
, uFindReplaceMessage
, 0,
395 GetWindowLongA(hWnd
, DWL_USER
) );
398 *lpFlags
&= ~(FR_FINDNEXT
| FR_REPLACE
| FR_REPLACEALL
);
399 *lpFlags
|= FR_DIALOGTERM
;
400 SendMessageA(hwndOwner
, uFindReplaceMessage
, 0,
401 GetWindowLongA(hWnd
, DWL_USER
) );
407 GetDlgItemTextW(hWnd
, edt1
, (LPWSTR
)lpstrFindWhat
, wFindWhatLen
/2);
408 GetDlgItemTextW(hWnd
, edt2
, (LPWSTR
)lpstrReplaceWith
, wReplaceWithLen
/2);
411 GetDlgItemTextA(hWnd
, edt1
, lpstrFindWhat
, wFindWhatLen
);
412 GetDlgItemTextA(hWnd
, edt2
, lpstrReplaceWith
, wReplaceWithLen
);
414 if (IsDlgButtonChecked(hWnd
, chx1
))
415 *lpFlags
|= FR_WHOLEWORD
;
416 else *lpFlags
&= ~FR_WHOLEWORD
;
417 if (IsDlgButtonChecked(hWnd
, chx2
))
418 *lpFlags
|= FR_MATCHCASE
;
419 else *lpFlags
&= ~FR_MATCHCASE
;
420 *lpFlags
&= ~(FR_FINDNEXT
| FR_REPLACEALL
| FR_DIALOGTERM
);
421 *lpFlags
|= FR_REPLACE
;
422 SendMessageA(hwndOwner
, uFindReplaceMessage
, 0,
423 GetWindowLongA(hWnd
, DWL_USER
) );
428 GetDlgItemTextW(hWnd
, edt1
, (LPWSTR
)lpstrFindWhat
, wFindWhatLen
/2);
429 GetDlgItemTextW(hWnd
, edt2
, (LPWSTR
)lpstrReplaceWith
, wReplaceWithLen
/2);
432 GetDlgItemTextA(hWnd
, edt1
, lpstrFindWhat
, wFindWhatLen
);
433 GetDlgItemTextA(hWnd
, edt2
, lpstrReplaceWith
, wReplaceWithLen
);
435 if (IsDlgButtonChecked(hWnd
, chx1
))
436 *lpFlags
|= FR_WHOLEWORD
;
437 else *lpFlags
&= ~FR_WHOLEWORD
;
438 if (IsDlgButtonChecked(hWnd
, chx2
))
439 *lpFlags
|= FR_MATCHCASE
;
440 else *lpFlags
&= ~FR_MATCHCASE
;
441 *lpFlags
&= ~(FR_FINDNEXT
| FR_REPLACE
| FR_DIALOGTERM
);
442 *lpFlags
|= FR_REPLACEALL
;
443 SendMessageA(hwndOwner
, uFindReplaceMessage
, 0,
444 GetWindowLongA(hWnd
, DWL_USER
) );
447 /* FIXME : should lpfr structure be passed as an argument ??? */
448 SendMessageA(hwndOwner
, uHelpMessage
, 0, 0);
455 /***********************************************************************
456 * ReplaceTextDlgProc16 (COMMDLG.14)
458 LRESULT WINAPI
ReplaceTextDlgProc16(HWND16 hWnd
, UINT16 wMsg
, WPARAM16 wParam
,
461 LPFINDREPLACE16 lpfr
;
464 lpfr
=(LPFINDREPLACE16
)PTR_SEG_TO_LIN(lParam
);
465 return REPLACEDLG_WMInitDialog(hWnd
, lParam
, &lpfr
->Flags
,
466 PTR_SEG_TO_LIN(lpfr
->lpstrFindWhat
),
467 PTR_SEG_TO_LIN(lpfr
->lpstrReplaceWith
), FALSE
);
469 lpfr
=(LPFINDREPLACE16
)PTR_SEG_TO_LIN(GetWindowLongA(hWnd
, DWL_USER
));
470 return REPLACEDLG_WMCommand(hWnd
, wParam
, lpfr
->hwndOwner
,
471 &lpfr
->Flags
, PTR_SEG_TO_LIN(lpfr
->lpstrFindWhat
),
472 lpfr
->wFindWhatLen
, PTR_SEG_TO_LIN(lpfr
->lpstrReplaceWith
),
473 lpfr
->wReplaceWithLen
, FALSE
);