Remove redundant includes.
[wine.git] / dlls / commdlg / finddlg.c
blobe265f7d8571a980aa2d8c83b4e1bb5f9cb72be48
1 /*
2 * COMMDLG - 16 bits Find & Replace Text Dialogs
4 * Copyright 1994 Martin Ayotte
5 * Copyright 1996 Albrecht Kleine
6 */
8 #include <ctype.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include "winbase.h"
12 #include "wine/winbase16.h"
13 #include "wine/winuser16.h"
14 #include "commdlg.h"
15 #include "ldt.h"
16 #include "module.h"
17 #include "debugtools.h"
18 #include "cderr.h"
20 DEFAULT_DEBUG_CHANNEL(commdlg)
22 #include "cdlg.h"
24 struct FRPRIVATE
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 */
31 FINDREPLACE16 *fr16;
34 #define LFRPRIVATE struct FRPRIVATE *
36 LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
37 LPARAM lParam);
38 LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
39 LPARAM lParam);
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);
55 if (!lfr->template)
57 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
58 return FALSE;
61 else if (fr16->Flags & FR_ENABLETEMPLATE)
63 HANDLE16 hResInfo;
64 if (!(hResInfo = FindResource16(fr16->hInstance,
65 fr16->lpTemplateName,
66 RT_DIALOG16)))
68 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
69 return FALSE;
71 if (!(lfr->hDlgTmpl16 = LoadResource16( fr16->hInstance, hResInfo )))
73 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
74 return FALSE;
76 lfr->hResource16 = lfr->hDlgTmpl16;
77 lfr->template = LockResource16(lfr->hResource16);
78 if (!lfr->template)
80 FreeResource16(lfr->hResource16);
81 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
82 return FALSE;
85 else
86 { /* get resource from (32 bits) own Wine resource; convert it to 16 */
87 HANDLE hResInfo, hDlgTmpl32;
88 LPCVOID template32;
89 DWORD size;
90 HGLOBAL16 hGlobal16;
92 if (!(hResInfo = FindResourceA(COMMDLG_hInstance32,
93 lfr->find ?
94 MAKEINTRESOURCEA(FINDDLGORD):MAKEINTRESOURCEA(REPLACEDLGORD),
95 RT_DIALOGA)))
97 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
98 return FALSE;
100 if (!(hDlgTmpl32 = LoadResource(COMMDLG_hInstance32, hResInfo )) ||
101 !(template32 = LockResource( hDlgTmpl32 )))
103 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
104 return FALSE;
106 size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo);
107 hGlobal16 = GlobalAlloc16(0, size);
108 if (!hGlobal16)
110 COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
111 ERR("alloc failure for %ld bytes\n", size);
112 return FALSE;
114 lfr->template = GlobalLock16(hGlobal16);
115 if (!lfr->template)
117 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
118 ERR("global lock failure for %x handle\n", hGlobal16);
119 GlobalFree16(hGlobal16);
120 return FALSE;
122 ConvertDialog32To16((LPVOID)template32, size, (LPVOID)lfr->template);
123 lfr->hDlgTmpl16 = hGlobal16;
124 lfr->hGlobal16 = hGlobal16;
126 return TRUE;
130 /***********************************************************************
131 * FINDDLG_FreeResources [internal]
133 * Free resources allocated
135 void FINDDLG_FreeResources(LFRPRIVATE lfr)
137 /* free resources */
138 if (lfr->fr16->Flags & FR_ENABLETEMPLATEHANDLE)
139 GlobalUnlock16(lfr->fr16->hInstance);
140 if (lfr->hResource16)
142 GlobalUnlock16(lfr->hResource16);
143 FreeResource16(lfr->hResource16);
145 if (lfr->hGlobal16)
147 GlobalUnlock16(lfr->hGlobal16);
148 GlobalFree16(lfr->hGlobal16);
152 /***********************************************************************
153 * FindText16 (COMMDLG.11)
155 HWND16 WINAPI FindText16( SEGPTR find )
157 HANDLE16 hInst;
158 HWND16 ret = 0;
159 FARPROC16 ptr;
160 LFRPRIVATE lfr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FRPRIVATE));
162 if (!lfr) return 0;
163 lfr->fr16 = (LPFINDREPLACE16)PTR_SEG_TO_LIN(find);
164 lfr->find = TRUE;
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);
174 return ret;
178 /***********************************************************************
179 * ReplaceText16 (COMMDLG.12)
181 HWND16 WINAPI ReplaceText16( SEGPTR find )
183 HANDLE16 hInst;
184 HWND16 ret = 0;
185 FARPROC16 ptr;
186 LFRPRIVATE lfr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FRPRIVATE));
188 if (!lfr) return 0;
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);
194 lfr->find = FALSE;
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);
205 return ret;
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
220 * enabled.
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);
249 return TRUE;
253 /***********************************************************************
254 * FINDDLG_WMCommand [internal]
256 static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam,
257 HWND hwndOwner, LPDWORD lpFlags,
258 LPSTR lpstrFindWhat, WORD wFindWhatLen,
259 BOOL fUnicode)
261 int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRING );
262 int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRING );
264 switch (wParam) {
265 case IDOK:
266 if (fUnicode)
267 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
268 else GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
269 if (IsDlgButtonChecked(hWnd, rad2))
270 *lpFlags |= FR_DOWN;
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) );
282 return TRUE;
283 case IDCANCEL:
284 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
285 *lpFlags |= FR_DIALOGTERM;
286 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
287 GetWindowLongA(hWnd, DWL_USER) );
288 DestroyWindow(hWnd);
289 return TRUE;
290 case pshHelp:
291 /* FIXME : should lpfr structure be passed as an argument ??? */
292 SendMessageA(hwndOwner, uHelpMessage, 0, 0);
293 return TRUE;
295 return FALSE;
299 /***********************************************************************
300 * FindTextDlgProc16 (COMMDLG.13)
302 LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
303 LPARAM lParam)
305 LPFINDREPLACE16 lpfr;
306 switch (wMsg) {
307 case WM_INITDIALOG:
308 lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(lParam);
309 return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
310 PTR_SEG_TO_LIN(lpfr->lpstrFindWhat), FALSE);
311 case WM_COMMAND:
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);
317 return 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
333 * enabled.
335 if (fUnicode)
337 SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
338 SetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith);
339 } else
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);
359 return TRUE;
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,
370 BOOL fUnicode)
372 int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRING );
373 int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRING );
375 switch (wParam) {
376 case IDOK:
377 if (fUnicode)
379 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
380 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
381 } else
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) );
396 return TRUE;
397 case IDCANCEL:
398 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
399 *lpFlags |= FR_DIALOGTERM;
400 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
401 GetWindowLongA(hWnd, DWL_USER) );
402 DestroyWindow(hWnd);
403 return TRUE;
404 case psh1:
405 if (fUnicode)
407 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
408 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
409 } else
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) );
424 return TRUE;
425 case psh2:
426 if (fUnicode)
428 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
429 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
430 } else
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) );
445 return TRUE;
446 case pshHelp:
447 /* FIXME : should lpfr structure be passed as an argument ??? */
448 SendMessageA(hwndOwner, uHelpMessage, 0, 0);
449 return TRUE;
451 return FALSE;
455 /***********************************************************************
456 * ReplaceTextDlgProc16 (COMMDLG.14)
458 LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
459 LPARAM lParam)
461 LPFINDREPLACE16 lpfr;
462 switch (wMsg) {
463 case WM_INITDIALOG:
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);
468 case WM_COMMAND:
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);
475 return FALSE;