2 * COMMDLG - 16 bits Find & Replace Text Dialogs
4 * Copyright 1994 Martin Ayotte
5 * Copyright 1996 Albrecht Kleine
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include "wine/winbase16.h"
27 #include "wine/winuser16.h"
29 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
38 HANDLE16 hDlgTmpl16; /* handle for resource 16 */
39 HANDLE16 hResource16; /* handle for allocated resource 16 */
40 HANDLE16 hGlobal16; /* 16 bits mem block (resources) */
41 LPCVOID template; /* template for 32 bits resource */
42 BOOL find; /* TRUE if find dialog, FALSE if replace dialog */
46 #define LFRPRIVATE struct FRPRIVATE *
48 LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
50 LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
53 /***********************************************************************
54 * FINDDLG_Get16BitsTemplate [internal]
56 * Get a template (FALSE if failure) when 16 bits dialogs are used
57 * by a 16 bits application
58 * FIXME : no test was done for the user-provided template cases
60 BOOL FINDDLG_Get16BitsTemplate(LFRPRIVATE lfr)
62 LPFINDREPLACE16 fr16 = lfr->fr16;
64 if (fr16->Flags & FR_ENABLETEMPLATEHANDLE)
66 lfr->template = GlobalLock16(fr16->hInstance);
69 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
73 else if (fr16->Flags & FR_ENABLETEMPLATE)
76 if (!(hResInfo = FindResource16(fr16->hInstance,
77 MapSL(fr16->lpTemplateName),
80 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
83 if (!(lfr->hDlgTmpl16 = LoadResource16( fr16->hInstance, hResInfo )))
85 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
88 lfr->hResource16 = lfr->hDlgTmpl16;
89 lfr->template = LockResource16(lfr->hResource16);
92 FreeResource16(lfr->hResource16);
93 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
98 { /* get resource from (32 bits) own Wine resource; convert it to 16 */
99 HANDLE hResInfo, hDlgTmpl32;
104 if (!(hResInfo = FindResourceA(COMMDLG_hInstance32,
106 MAKEINTRESOURCEA(FINDDLGORD):MAKEINTRESOURCEA(REPLACEDLGORD),
109 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
112 if (!(hDlgTmpl32 = LoadResource(COMMDLG_hInstance32, hResInfo )) ||
113 !(template32 = LockResource( hDlgTmpl32 )))
115 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
118 size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo);
119 hGlobal16 = GlobalAlloc16(0, size);
122 COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
123 ERR("alloc failure for %ld bytes\n", size);
126 lfr->template = GlobalLock16(hGlobal16);
129 COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
130 ERR("global lock failure for %x handle\n", hGlobal16);
131 GlobalFree16(hGlobal16);
134 ConvertDialog32To16((LPVOID)template32, size, (LPVOID)lfr->template);
135 lfr->hDlgTmpl16 = hGlobal16;
136 lfr->hGlobal16 = hGlobal16;
142 /***********************************************************************
143 * FINDDLG_FreeResources [internal]
145 * Free resources allocated
147 void FINDDLG_FreeResources(LFRPRIVATE lfr)
150 if (lfr->fr16->Flags & FR_ENABLETEMPLATEHANDLE)
151 GlobalUnlock16(lfr->fr16->hInstance);
152 if (lfr->hResource16)
154 GlobalUnlock16(lfr->hResource16);
155 FreeResource16(lfr->hResource16);
159 GlobalUnlock16(lfr->hGlobal16);
160 GlobalFree16(lfr->hGlobal16);
164 /***********************************************************************
165 * FindText (COMMDLG.11)
167 HWND16 WINAPI FindText16( SEGPTR find )
172 LFRPRIVATE lfr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FRPRIVATE));
175 lfr->fr16 = MapSL(find);
177 if (FINDDLG_Get16BitsTemplate(lfr))
179 hInst = GetWindowLongA( lfr->fr16->hwndOwner , GWL_HINSTANCE);
180 ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 13);
181 ret = CreateDialogIndirectParam16( hInst, lfr->template,
182 lfr->fr16->hwndOwner, (DLGPROC16) ptr, find);
183 FINDDLG_FreeResources(lfr);
185 HeapFree(GetProcessHeap(), 0, lfr);
190 /***********************************************************************
191 * ReplaceText (COMMDLG.12)
193 HWND16 WINAPI ReplaceText16( SEGPTR find )
198 LFRPRIVATE lfr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FRPRIVATE));
202 * FIXME : We should do error checking on the lpFind structure here
203 * and make CommDlgExtendedError() return the error condition.
205 lfr->fr16 = MapSL(find);
207 if (FINDDLG_Get16BitsTemplate(lfr))
209 hInst = GetWindowLongA( lfr->fr16->hwndOwner , GWL_HINSTANCE);
210 ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 14);
211 ret = CreateDialogIndirectParam16( hInst, lfr->template,
212 lfr->fr16->hwndOwner, (DLGPROC16) ptr, find);
214 FINDDLG_FreeResources(lfr);
216 HeapFree(GetProcessHeap(), 0, lfr);
221 /***********************************************************************
222 * FINDDLG_WMInitDialog [internal]
224 static LRESULT FINDDLG_WMInitDialog(HWND hWnd, LPARAM lParam, LPDWORD lpFlags,
225 LPSTR lpstrFindWhat, BOOL fUnicode)
227 SetWindowLongA(hWnd, DWL_USER, lParam);
228 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
230 * FIXME : If the initial FindWhat string is empty, we should disable the
231 * FindNext (IDOK) button. Only after typing some text, the button should be
234 if (fUnicode) SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
235 else SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
236 CheckRadioButton(hWnd, rad1, rad2, (*lpFlags & FR_DOWN) ? rad2 : rad1);
237 if (*lpFlags & (FR_HIDEUPDOWN | FR_NOUPDOWN)) {
238 EnableWindow(GetDlgItem(hWnd, rad1), FALSE);
239 EnableWindow(GetDlgItem(hWnd, rad2), FALSE);
241 if (*lpFlags & FR_HIDEUPDOWN) {
242 ShowWindow(GetDlgItem(hWnd, rad1), SW_HIDE);
243 ShowWindow(GetDlgItem(hWnd, rad2), SW_HIDE);
244 ShowWindow(GetDlgItem(hWnd, grp1), SW_HIDE);
246 CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
247 if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
248 EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
249 if (*lpFlags & FR_HIDEWHOLEWORD)
250 ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
251 CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
252 if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
253 EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
254 if (*lpFlags & FR_HIDEMATCHCASE)
255 ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
256 if (!(*lpFlags & FR_SHOWHELP)) {
257 EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
258 ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
260 ShowWindow(hWnd, SW_SHOWNORMAL);
265 /***********************************************************************
266 * FINDDLG_WMCommand [internal]
268 static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam,
269 HWND hwndOwner, LPDWORD lpFlags,
270 LPSTR lpstrFindWhat, WORD wFindWhatLen,
273 int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRINGA );
274 int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRINGA );
279 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
280 else GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
281 if (IsDlgButtonChecked(hWnd, rad2))
283 else *lpFlags &= ~FR_DOWN;
284 if (IsDlgButtonChecked(hWnd, chx1))
285 *lpFlags |= FR_WHOLEWORD;
286 else *lpFlags &= ~FR_WHOLEWORD;
287 if (IsDlgButtonChecked(hWnd, chx2))
288 *lpFlags |= FR_MATCHCASE;
289 else *lpFlags &= ~FR_MATCHCASE;
290 *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
291 *lpFlags |= FR_FINDNEXT;
292 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
293 GetWindowLongA(hWnd, DWL_USER) );
296 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
297 *lpFlags |= FR_DIALOGTERM;
298 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
299 GetWindowLongA(hWnd, DWL_USER) );
303 /* FIXME : should lpfr structure be passed as an argument ??? */
304 SendMessageA(hwndOwner, uHelpMessage, 0, 0);
311 /***********************************************************************
312 * FindTextDlgProc (COMMDLG.13)
314 LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
317 LPFINDREPLACE16 lpfr;
321 return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
322 MapSL(lpfr->lpstrFindWhat), FALSE);
324 lpfr=MapSL(GetWindowLongA(hWnd, DWL_USER));
325 return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
326 &lpfr->Flags, MapSL(lpfr->lpstrFindWhat),
327 lpfr->wFindWhatLen, FALSE);
333 /***********************************************************************
334 * REPLACEDLG_WMInitDialog [internal]
336 static LRESULT REPLACEDLG_WMInitDialog(HWND hWnd, LPARAM lParam,
337 LPDWORD lpFlags, LPSTR lpstrFindWhat,
338 LPSTR lpstrReplaceWith, BOOL fUnicode)
340 SetWindowLongA(hWnd, DWL_USER, lParam);
341 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
343 * FIXME : If the initial FindWhat string is empty, we should disable the FinNext /
344 * Replace / ReplaceAll buttons. Only after typing some text, the buttons should be
349 SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
350 SetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith);
353 SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
354 SetDlgItemTextA(hWnd, edt2, lpstrReplaceWith);
356 CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
357 if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
358 EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
359 if (*lpFlags & FR_HIDEWHOLEWORD)
360 ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
361 CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
362 if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
363 EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
364 if (*lpFlags & FR_HIDEMATCHCASE)
365 ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
366 if (!(*lpFlags & FR_SHOWHELP)) {
367 EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
368 ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
370 ShowWindow(hWnd, SW_SHOWNORMAL);
375 /***********************************************************************
376 * REPLACEDLG_WMCommand [internal]
378 static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM16 wParam,
379 HWND hwndOwner, LPDWORD lpFlags,
380 LPSTR lpstrFindWhat, WORD wFindWhatLen,
381 LPSTR lpstrReplaceWith, WORD wReplaceWithLen,
384 int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRINGA );
385 int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRINGA );
391 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
392 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
395 GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
396 GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
398 if (IsDlgButtonChecked(hWnd, chx1))
399 *lpFlags |= FR_WHOLEWORD;
400 else *lpFlags &= ~FR_WHOLEWORD;
401 if (IsDlgButtonChecked(hWnd, chx2))
402 *lpFlags |= FR_MATCHCASE;
403 else *lpFlags &= ~FR_MATCHCASE;
404 *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
405 *lpFlags |= FR_FINDNEXT;
406 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
407 GetWindowLongA(hWnd, DWL_USER) );
410 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
411 *lpFlags |= FR_DIALOGTERM;
412 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
413 GetWindowLongA(hWnd, DWL_USER) );
419 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
420 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
423 GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
424 GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
426 if (IsDlgButtonChecked(hWnd, chx1))
427 *lpFlags |= FR_WHOLEWORD;
428 else *lpFlags &= ~FR_WHOLEWORD;
429 if (IsDlgButtonChecked(hWnd, chx2))
430 *lpFlags |= FR_MATCHCASE;
431 else *lpFlags &= ~FR_MATCHCASE;
432 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACEALL | FR_DIALOGTERM);
433 *lpFlags |= FR_REPLACE;
434 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
435 GetWindowLongA(hWnd, DWL_USER) );
440 GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
441 GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
444 GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
445 GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
447 if (IsDlgButtonChecked(hWnd, chx1))
448 *lpFlags |= FR_WHOLEWORD;
449 else *lpFlags &= ~FR_WHOLEWORD;
450 if (IsDlgButtonChecked(hWnd, chx2))
451 *lpFlags |= FR_MATCHCASE;
452 else *lpFlags &= ~FR_MATCHCASE;
453 *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_DIALOGTERM);
454 *lpFlags |= FR_REPLACEALL;
455 SendMessageA(hwndOwner, uFindReplaceMessage, 0,
456 GetWindowLongA(hWnd, DWL_USER) );
459 /* FIXME : should lpfr structure be passed as an argument ??? */
460 SendMessageA(hwndOwner, uHelpMessage, 0, 0);
467 /***********************************************************************
468 * ReplaceTextDlgProc (COMMDLG.14)
470 LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
473 LPFINDREPLACE16 lpfr;
477 return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
478 MapSL(lpfr->lpstrFindWhat),
479 MapSL(lpfr->lpstrReplaceWith), FALSE);
481 lpfr=MapSL(GetWindowLongA(hWnd, DWL_USER));
482 return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
483 &lpfr->Flags, MapSL(lpfr->lpstrFindWhat),
484 lpfr->wFindWhatLen, MapSL(lpfr->lpstrReplaceWith),
485 lpfr->wReplaceWithLen, FALSE);