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"
15 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(commdlg);
24 HANDLE16 hDlgTmpl16; /* handle for resource 16 */
25 HANDLE16 hResource16; /* handle for allocated resource 16 */
26 HANDLE16 hGlobal16; /* 16 bits mem block (resources) */
27 LPCVOID template; /* template for 32 bits resource */
28 BOOL find; /* TRUE if find dialog, FALSE if replace dialog */
32 #define LFRPRIVATE struct FRPRIVATE *
34 LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
36 LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
39 /***********************************************************************
40 * FINDDLG_Get16BitsTemplate [internal]
42 * Get a template (FALSE if failure) when 16 bits dialogs are used
43 * by a 16 bits application
44 * FIXME : no test was done for the user-provided template cases
46 BOOL FINDDLG_Get16BitsTemplate(LFRPRIVATE lfr)
48 LPFINDREPLACE16 fr16 = lfr->fr16;
50 if (fr16->Flags & FR_ENABLETEMPLATEHANDLE)
52 lfr->template = GlobalLock16(fr16->hInstance);
55 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
59 else if (fr16->Flags & FR_ENABLETEMPLATE)
62 if (!(hResInfo = FindResource16(fr16->hInstance,
63 MapSL(fr16->lpTemplateName),
66 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
69 if (!(lfr->hDlgTmpl16 = LoadResource16( fr16->hInstance, hResInfo )))
71 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
74 lfr->hResource16 = lfr->hDlgTmpl16;
75 lfr->template = LockResource16(lfr->hResource16);
78 FreeResource16(lfr->hResource16);
79 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
84 { /* get resource from (32 bits) own Wine resource; convert it to 16 */
85 HANDLE hResInfo, hDlgTmpl32;
90 if (!(hResInfo = FindResourceA(COMMDLG_hInstance32,
92 MAKEINTRESOURCEA(FINDDLGORD):MAKEINTRESOURCEA(REPLACEDLGORD),
95 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
98 if (!(hDlgTmpl32 = LoadResource(COMMDLG_hInstance32, hResInfo )) ||
99 !(template32 = LockResource( hDlgTmpl32 )))
101 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
104 size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo);
105 hGlobal16 = GlobalAlloc16(0, size);
108 COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
109 ERR("alloc failure for %ld bytes\n", size);
112 lfr->template = GlobalLock16(hGlobal16);
115 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
116 ERR("global lock failure for %x handle\n", hGlobal16);
117 GlobalFree16(hGlobal16);
120 ConvertDialog32To16((LPVOID)template32, size, (LPVOID)lfr->template);
121 lfr->hDlgTmpl16 = hGlobal16;
122 lfr->hGlobal16 = hGlobal16;
128 /***********************************************************************
129 * FINDDLG_FreeResources [internal]
131 * Free resources allocated
133 void FINDDLG_FreeResources(LFRPRIVATE lfr)
136 if (lfr->fr16->Flags & FR_ENABLETEMPLATEHANDLE)
137 GlobalUnlock16(lfr->fr16->hInstance);
138 if (lfr->hResource16)
140 GlobalUnlock16(lfr->hResource16);
141 FreeResource16(lfr->hResource16);
145 GlobalUnlock16(lfr->hGlobal16);
146 GlobalFree16(lfr->hGlobal16);
150 /***********************************************************************
151 * FindText (COMMDLG.11)
153 HWND16 WINAPI FindText16( SEGPTR find )
158 LFRPRIVATE lfr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FRPRIVATE));
161 lfr->fr16 = MapSL(find);
163 if (FINDDLG_Get16BitsTemplate(lfr))
165 hInst = GetWindowLongA( lfr->fr16->hwndOwner , GWL_HINSTANCE);
166 ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 13);
167 ret = CreateDialogIndirectParam16( hInst, lfr->template,
168 lfr->fr16->hwndOwner, (DLGPROC16) ptr, find);
169 FINDDLG_FreeResources(lfr);
171 HeapFree(GetProcessHeap(), 0, lfr);
176 /***********************************************************************
177 * ReplaceText (COMMDLG.12)
179 HWND16 WINAPI ReplaceText16( SEGPTR find )
184 LFRPRIVATE lfr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FRPRIVATE));
188 * FIXME : We should do error checking on the lpFind structure here
189 * and make CommDlgExtendedError() return the error condition.
191 lfr->fr16 = MapSL(find);
193 if (FINDDLG_Get16BitsTemplate(lfr))
195 hInst = GetWindowLongA( lfr->fr16->hwndOwner , GWL_HINSTANCE);
196 ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 14);
197 ret = CreateDialogIndirectParam16( hInst, lfr->template,
198 lfr->fr16->hwndOwner, (DLGPROC16) ptr, find);
200 FINDDLG_FreeResources(lfr);
202 HeapFree(GetProcessHeap(), 0, lfr);
207 /***********************************************************************
208 * FINDDLG_WMInitDialog [internal]
210 static LRESULT FINDDLG_WMInitDialog(HWND hWnd, LPARAM lParam, LPDWORD lpFlags,
211 LPSTR lpstrFindWhat, BOOL fUnicode)
213 SetWindowLongA(hWnd, DWL_USER, lParam);
214 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
216 * FIXME : If the initial FindWhat string is empty, we should disable the
217 * FindNext (IDOK) button. Only after typing some text, the button should be
220 if (fUnicode) SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
221 else SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
222 CheckRadioButton(hWnd, rad1, rad2, (*lpFlags & FR_DOWN) ? rad2 : rad1);
223 if (*lpFlags & (FR_HIDEUPDOWN | FR_NOUPDOWN)) {
224 EnableWindow(GetDlgItem(hWnd, rad1), FALSE);
225 EnableWindow(GetDlgItem(hWnd, rad2), FALSE);
227 if (*lpFlags & FR_HIDEUPDOWN) {
228 ShowWindow(GetDlgItem(hWnd, rad1), SW_HIDE);
229 ShowWindow(GetDlgItem(hWnd, rad2), SW_HIDE);
230 ShowWindow(GetDlgItem(hWnd, grp1), SW_HIDE);
232 CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
233 if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
234 EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
235 if (*lpFlags & FR_HIDEWHOLEWORD)
236 ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
237 CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
238 if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
239 EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
240 if (*lpFlags & FR_HIDEMATCHCASE)
241 ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
242 if (!(*lpFlags & FR_SHOWHELP)) {
243 EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
244 ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
246 ShowWindow(hWnd, SW_SHOWNORMAL);
251 /***********************************************************************
252 * FINDDLG_WMCommand [internal]
254 static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam,
255 HWND hwndOwner, LPDWORD lpFlags,
256 LPSTR lpstrFindWhat, WORD wFindWhatLen,
259 int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRINGA );
260 int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRINGA );
265 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
266 else GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
267 if (IsDlgButtonChecked(hWnd, rad2))
269 else *lpFlags &= ~FR_DOWN;
270 if (IsDlgButtonChecked(hWnd, chx1))
271 *lpFlags |= FR_WHOLEWORD;
272 else *lpFlags &= ~FR_WHOLEWORD;
273 if (IsDlgButtonChecked(hWnd, chx2))
274 *lpFlags |= FR_MATCHCASE;
275 else *lpFlags &= ~FR_MATCHCASE;
276 *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
277 *lpFlags |= FR_FINDNEXT;
278 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
279 GetWindowLongA(hWnd, DWL_USER) );
282 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
283 *lpFlags |= FR_DIALOGTERM;
284 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
285 GetWindowLongA(hWnd, DWL_USER) );
289 /* FIXME : should lpfr structure be passed as an argument ??? */
290 SendMessageA(hwndOwner, uHelpMessage, 0, 0);
297 /***********************************************************************
298 * FindTextDlgProc (COMMDLG.13)
300 LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
303 LPFINDREPLACE16 lpfr;
307 return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
308 MapSL(lpfr->lpstrFindWhat), FALSE);
310 lpfr=MapSL(GetWindowLongA(hWnd, DWL_USER));
311 return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
312 &lpfr->Flags, MapSL(lpfr->lpstrFindWhat),
313 lpfr->wFindWhatLen, FALSE);
319 /***********************************************************************
320 * REPLACEDLG_WMInitDialog [internal]
322 static LRESULT REPLACEDLG_WMInitDialog(HWND hWnd, LPARAM lParam,
323 LPDWORD lpFlags, LPSTR lpstrFindWhat,
324 LPSTR lpstrReplaceWith, BOOL fUnicode)
326 SetWindowLongA(hWnd, DWL_USER, lParam);
327 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
329 * FIXME : If the initial FindWhat string is empty, we should disable the FinNext /
330 * Replace / ReplaceAll buttons. Only after typing some text, the buttons should be
335 SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
336 SetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith);
339 SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
340 SetDlgItemTextA(hWnd, edt2, lpstrReplaceWith);
342 CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
343 if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
344 EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
345 if (*lpFlags & FR_HIDEWHOLEWORD)
346 ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
347 CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
348 if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
349 EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
350 if (*lpFlags & FR_HIDEMATCHCASE)
351 ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
352 if (!(*lpFlags & FR_SHOWHELP)) {
353 EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
354 ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
356 ShowWindow(hWnd, SW_SHOWNORMAL);
361 /***********************************************************************
362 * REPLACEDLG_WMCommand [internal]
364 static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM16 wParam,
365 HWND hwndOwner, LPDWORD lpFlags,
366 LPSTR lpstrFindWhat, WORD wFindWhatLen,
367 LPSTR lpstrReplaceWith, WORD wReplaceWithLen,
370 int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRINGA );
371 int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRINGA );
377 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
378 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
381 GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
382 GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
384 if (IsDlgButtonChecked(hWnd, chx1))
385 *lpFlags |= FR_WHOLEWORD;
386 else *lpFlags &= ~FR_WHOLEWORD;
387 if (IsDlgButtonChecked(hWnd, chx2))
388 *lpFlags |= FR_MATCHCASE;
389 else *lpFlags &= ~FR_MATCHCASE;
390 *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
391 *lpFlags |= FR_FINDNEXT;
392 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
393 GetWindowLongA(hWnd, DWL_USER) );
396 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
397 *lpFlags |= FR_DIALOGTERM;
398 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
399 GetWindowLongA(hWnd, DWL_USER) );
405 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
406 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
409 GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
410 GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
412 if (IsDlgButtonChecked(hWnd, chx1))
413 *lpFlags |= FR_WHOLEWORD;
414 else *lpFlags &= ~FR_WHOLEWORD;
415 if (IsDlgButtonChecked(hWnd, chx2))
416 *lpFlags |= FR_MATCHCASE;
417 else *lpFlags &= ~FR_MATCHCASE;
418 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACEALL | FR_DIALOGTERM);
419 *lpFlags |= FR_REPLACE;
420 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
421 GetWindowLongA(hWnd, DWL_USER) );
426 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
427 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
430 GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
431 GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
433 if (IsDlgButtonChecked(hWnd, chx1))
434 *lpFlags |= FR_WHOLEWORD;
435 else *lpFlags &= ~FR_WHOLEWORD;
436 if (IsDlgButtonChecked(hWnd, chx2))
437 *lpFlags |= FR_MATCHCASE;
438 else *lpFlags &= ~FR_MATCHCASE;
439 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_DIALOGTERM);
440 *lpFlags |= FR_REPLACEALL;
441 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
442 GetWindowLongA(hWnd, DWL_USER) );
445 /* FIXME : should lpfr structure be passed as an argument ??? */
446 SendMessageA(hwndOwner, uHelpMessage, 0, 0);
453 /***********************************************************************
454 * ReplaceTextDlgProc (COMMDLG.14)
456 LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
459 LPFINDREPLACE16 lpfr;
463 return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
464 MapSL(lpfr->lpstrFindWhat),
465 MapSL(lpfr->lpstrReplaceWith), FALSE);
467 lpfr=MapSL(GetWindowLongA(hWnd, DWL_USER));
468 return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
469 &lpfr->Flags, MapSL(lpfr->lpstrFindWhat),
470 lpfr->wFindWhatLen, MapSL(lpfr->lpstrReplaceWith),
471 lpfr->wReplaceWithLen, FALSE);