source: trunk/dll/walkem.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 40.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: walkem.c 907 2008-01-06 07:26:17Z stevenhl $
5
6 Copyright (c) 1993-98 M. Kimes
7 Copyright (c) 2005, 2007 Steven H. Levine
8
9 01 Aug 04 SHL Rework lstrip/rstrip usage
10 05 Jun 05 SHL Use QWL_USER
11 13 Aug 05 SHL Run through indent
12 13 Aug 05 SHL remove_udir - avoid corrupting last dirs list
13 17 Jul 06 SHL Use Runtime_Error
14 29 Jul 06 SHL Use xfgets
15 20 Oct 06 SHL Correct . .. check
16 06 Nov 06 SHL Oops - need to allow .. here
17 14 Nov 06 SHL Correct FillPathListBox regression
18 22 Mar 07 GKY Use QWL_USER
19 20 Apr 07 SHL Avoid spurious add_udir error reports
20 16 Aug 07 SHL Update add_setups for ticket# 109
21 19 Aug 07 SHL Correct load_setups error reporting
22 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
23 25 Aug 07 SHL Correct #pragma alloc_text typos
24 11 Nov 07 GKY Cancel now directly closes dialog even if directory path text has changed
25
26***********************************************************************/
27
28#include <stdlib.h>
29#include <string.h>
30#include <ctype.h>
31#include <share.h>
32
33#define INCL_WIN
34#define INCL_DOS
35#define INCL_DOSERRORS
36#define INCL_SHLERRORS // PMERR_NOT_IN_IDX
37#define INCL_LONGLONG
38
39#include "fm3dlg.h"
40#include "fm3str.h"
41#include "errutil.h" // Dos_Error...
42#include "strutil.h" // GetPString
43#include "fm3dll.h"
44
45#pragma data_seg(DATA1)
46
47static PSZ pszSrcFile = __FILE__;
48
49
50typedef struct
51{
52 USHORT size;
53 USHORT changed;
54 BOOL nounwriteable;
55 CHAR szCurrentPath[CCHMAXPATH];
56 CHAR *szReturnPath;
57}
58WALKER;
59
60static CHAR WalkFont[CCHMAXPATH] = "";
61static ULONG WalkFontSize = sizeof(WalkFont);
62
63/**
64 * States names management
65 */
66
67static BOOL fSetupsLoaded;
68static LINKDIRS *pFirstSetup;
69static const PSZ pszLastSetups = "LastSetups";
70// 18 Aug 07 SHL fixme to stop supporting old style 1 year from now?
71static const ULONG ulOldSetupsBytes = 100 * 13; // Prior to 3.0.7
72
73/**
74 * Fill States drop down list with known state names
75 */
76
77VOID fill_setups_list(VOID)
78{
79 WinSendMsg(hwndStatelist, LM_DELETEALL, MPVOID, MPVOID);
80 if (fUserComboBox) {
81 LINKDIRS *pld;
82 load_setups();
83 for (pld = pFirstSetup; pld; pld = pld->next) {
84 // DbgMsg(pszSrcFile, __LINE__, "Inserted %s", pld->path);
85 WinSendMsg(hwndStatelist,
86 LM_INSERTITEM,
87 MPFROM2SHORT(LIT_SORTASCENDING, 0),
88 MPFROMP(pld->path));
89 }
90 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
91 }
92}
93
94/**
95 * Lookup setup and do requested action
96 * @param - action, Support old/new style storage method
97 * @return 1 if found and action OK, 0 if not found and action OK, -1 if error during action
98 */
99
100#define LS_FIND 0
101#define LS_ADD 1
102#define LS_DELETE 2
103
104static INT lookup_setup(PSZ name, UINT action)
105{
106 LINKDIRS *pld;
107 LINKDIRS *pldLast = NULL;
108
109 if (!name || !*name) {
110 Runtime_Error(pszSrcFile, __LINE__, "no data");
111 return -1;
112 }
113
114 load_setups();
115
116 for (pld = pFirstSetup; pld; pld = pld->next) {
117 if (!stricmp(pld->path, name)) {
118 if (action == LS_DELETE) {
119 if (pldLast)
120 pldLast->next = pld->next;
121 else
122 pFirstSetup = pld->next;
123 xfree(pld->path);
124 xfree(pld);
125 }
126 return 1; // Found or added
127 }
128 pldLast = pld; // In case deleting
129 } // for
130
131 // Not found
132 if (action == LS_ADD) {
133 pld = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
134 if (!pld)
135 return -1;
136 pld->path = xstrdup(name, pszSrcFile, __LINE__);
137 if (!pld->path) {
138 xfree(pld);
139 return -1;
140 }
141 // Insert at front of list - drop down will sort
142 pld->next = pFirstSetup;
143 pFirstSetup = pld;
144 return 0;
145 }
146
147 return FALSE; // Not found
148}
149
150/**
151 * Load state names from ini
152 * Support old/new style storage method
153 */
154
155VOID load_setups(VOID)
156{
157 ULONG ulDataBytes;
158 ULONG l;
159 PSZ pszBuf;
160 PSZ psz;
161 LINKDIRS *pld;
162
163 if (fSetupsLoaded)
164 return;
165
166 if (!PrfQueryProfileSize(fmprof, FM3Str, pszLastSetups, &ulDataBytes)) {
167 // fixme to use generic hab
168 ERRORID eid = WinGetLastError((HAB)0);
169 if ((eid & 0xffff) != PMERR_NOT_IN_IDX) {
170 // Get error info back
171 PrfQueryProfileSize(fmprof, FM3Str, pszLastSetups, &ulDataBytes);
172 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, "PrfQueryProfileSize");
173 }
174 else
175 fSetupsLoaded = TRUE; // Nothing saved
176 return;
177 }
178
179 if (ulDataBytes == 0) {
180 Runtime_Error(pszSrcFile, __LINE__, "PrfQueryProfileSize reported 0 bytes");
181 return;
182 }
183
184 pszBuf = xmalloc(ulDataBytes + 1, pszSrcFile, __LINE__); // One extra for end marker
185 if (!pszBuf)
186 return;
187 l = ulDataBytes;
188 if (!PrfQueryProfileData(fmprof, FM3Str, pszLastSetups, pszBuf, &l)) {
189 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, "PrfQueryProfileData");
190 xfree(pszBuf);
191 return;
192 }
193
194 if (ulDataBytes != l) {
195 Runtime_Error(pszSrcFile, __LINE__, "PrfQueryProfileData reported %u expected %u", l, ulDataBytes);
196 xfree(pszBuf);
197 return;
198 }
199
200 *(pszBuf + ulDataBytes) = 0; // Insert end marker
201
202 psz = pszBuf;
203 if (!*psz && ulDataBytes == ulOldSetupsBytes)
204 psz += 13; // Rarely used 1st fixed width entry prior to 3.0.7
205
206 while (*psz) {
207 pld = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
208 if (!pld) {
209 xfree(pszBuf);
210 return;
211 }
212 pld->path = xstrdup(psz, pszSrcFile, __LINE__);
213 if (!pld->path) {
214 xfree(pszBuf);
215 xfree(pld);
216 return;
217 }
218
219 // Insert at front of list - drop down will sort
220 pld->next = pFirstSetup;
221 pFirstSetup = pld;
222 // DbgMsg(pszSrcFile, __LINE__, "Inserted %s", pld->path);
223
224 if (ulDataBytes == ulOldSetupsBytes)
225 psz += 13; // Buffers fixed width prior to 3.0.7
226 else
227 psz += strlen(psz) + 1;
228 } // while
229
230 xfree(pszBuf);
231
232 fSetupsLoaded = TRUE;
233}
234
235VOID save_setups(VOID)
236{
237 ULONG ulBufBytes;
238 ULONG ulFillBytes;
239 ULONG l;
240 PSZ pszBuf;
241 PSZ psz;
242 LINKDIRS *pld;
243
244 if (!fSetupsLoaded)
245 return;
246
247 ulBufBytes = 0;
248 for (pld = pFirstSetup; pld; pld = pld->next) {
249 ulBufBytes += strlen(pld->path) + 1;
250 } // for
251
252 if (!ulBufBytes)
253 pszBuf = NULL;
254 else {
255 // Ensure different than size prior to 3.0.7
256 ulFillBytes = ulBufBytes == ulOldSetupsBytes ? 1 : 0;
257 pszBuf = xmalloc(ulBufBytes + ulFillBytes, pszSrcFile, __LINE__);
258 if (!pszBuf)
259 return;
260
261 psz = pszBuf;
262 for (pld = pFirstSetup; pld; pld = pld->next) {
263 l = strlen(pld->path) + 1;
264 memcpy(psz, pld->path, l);
265 psz += l;
266 } // for
267 if (ulFillBytes)
268 *psz = 0;
269 }
270
271 if (!PrfWriteProfileData(fmprof,
272 FM3Str,
273 pszLastSetups, pszBuf, ulBufBytes)) {
274 // Win_Error(pszSrcFile, __LINE__, HWND_DESKTOP, HWND_DESKTOP, "PrfWriteProfileData");
275 ERRORID eid = WinGetLastError((HAB)0);
276 if ((eid & 0xffff) != PMERR_NOT_IN_IDX)
277 Runtime_Error(pszSrcFile, __LINE__, "PrfWriteProfileData returned %u", eid);
278 }
279
280 // Delete obsolete INI entry
281 PrfWriteProfileData(fmprof, FM3Str, "LastSetup", NULL, 0);
282}
283
284/**
285 * Add named state to setups list
286 * @return same as lookup_setup
287 */
288
289INT add_setup(PSZ name)
290{
291 return lookup_setup(name, LS_ADD);
292}
293
294/**
295 * Delete named state from setups list
296 * @return same as lookup_setup
297 */
298
299INT remove_setup(PSZ name)
300{
301 return lookup_setup(name, LS_DELETE);
302}
303
304VOID load_udirs(VOID)
305{
306 /* load linked list of user directories from USERDIRS.DAT file */
307
308 FILE *fp;
309 LINKDIRS *info;
310 LINKDIRS *last = NULL;
311 CHAR s[CCHMAXPATH + 24];
312
313 loadedudirs = TRUE;
314 fUdirsChanged = FALSE;
315 save_dir2(s);
316 if (s[strlen(s) - 1] != '\\')
317 strcat(s, "\\");
318 strcat(s, "USERDIRS.DAT");
319 fp = _fsopen(s, "r", SH_DENYWR);
320 if (fp) {
321 while (!feof(fp)) {
322 if (!xfgets(s, CCHMAXPATH + 24, fp, pszSrcFile, __LINE__))
323 break;
324 s[CCHMAXPATH] = 0;
325 bstripcr(s);
326 if (*s && *s != ';') {
327 info = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
328 if (info) {
329 info->path = xstrdup(s, pszSrcFile, __LINE__);
330 if (!info->path)
331 free(info);
332 else {
333 info->next = NULL;
334 if (!udirhead)
335 udirhead = info;
336 else
337 last->next = info;
338 last = info;
339 }
340 }
341 }
342 }
343 fclose(fp);
344 }
345}
346
347VOID save_udirs(VOID)
348{
349 FILE *fp;
350 LINKDIRS *info;
351 CHAR s[CCHMAXPATH + 14];
352
353 if (loadedudirs) {
354 fUdirsChanged = FALSE;
355 if (udirhead) {
356 save_dir2(s);
357 if (s[strlen(s) - 1] != '\\')
358 strcat(s, "\\");
359 strcat(s, "USERDIRS.DAT");
360 fp = xfopen(s, "w", pszSrcFile, __LINE__);
361 if (fp) {
362 fputs(GetPString(IDS_USERDEFDIRSTEXT), fp);
363 info = udirhead;
364 while (info) {
365 fprintf(fp, "%0.*s\n", CCHMAXPATH, info->path);
366 info = info->next;
367 }
368 fclose(fp);
369 }
370 }
371 }
372}
373
374/**
375 * Add path to user directory list or last used directory list.
376 * Callers need to check fUdirsChanged to know if user dirs change occured.
377 * Callers need to check return code to know if last dirs change occured.
378 * @param userdirs TRUE to process user directory list. Otherwise last used list.
379 * @return TRUE if added, FALSE if already in list or error.
380 */
381
382BOOL add_udir(BOOL userdirs, CHAR *inpath)
383{
384 CHAR path[CCHMAXPATH];
385 LINKDIRS *info;
386 LINKDIRS *last = NULL;
387 LINKDIRS *temp;
388
389 if (inpath && *inpath) {
390 if (DosQueryPathInfo(inpath, FIL_QUERYFULLNAME, path, sizeof(path)))
391 strcpy(path, inpath);
392 if (!userdirs && IsRoot(path))
393 return FALSE;
394 if (IsFullName(path)) {
395 if (!loadedudirs)
396 load_udirs();
397 // Search user dir list first unless doing last dirs
398 info = userdirs ? udirhead : ldirhead;
399 while (info) {
400 if (!stricmp(info->path, path))
401 return FALSE; // Already in list
402 last = info; // Remember append to location
403 info = info->next;
404 }
405 // Search last dir list unless doing just last dirs
406 if (!userdirs) {
407 info = udirhead;
408 while (info) {
409 if (!stricmp(info->path, path))
410 return FALSE;
411 info = info->next;
412 }
413 }
414 else {
415 /* if adding manual directory, remove from auto list if present */
416 info = ldirhead;
417 temp = NULL;
418 while (info) {
419 if (!stricmp(info->path, path)) {
420 if (temp)
421 temp->next = info->next;
422 else
423 ldirhead = info->next;
424 free(info->path);
425 free(info);
426 break;
427 }
428 temp = info;
429 info = info->next;
430 }
431 }
432 // Append entry to end of user dirs list
433 info = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
434 if (info) {
435 info->path = xstrdup(path, pszSrcFile, __LINE__);
436 if (!info->path)
437 free(info);
438 else {
439 info->next = NULL;
440 if (userdirs) {
441 fUdirsChanged = TRUE;
442 if (!udirhead)
443 udirhead = info;
444 else
445 last->next = info;
446 }
447 else {
448 if (!ldirhead)
449 ldirhead = info;
450 else
451 last->next = info;
452 }
453 return TRUE;
454 }
455 }
456 }
457 }
458 return FALSE;
459}
460
461//=== remove_udir - remove path from user dir list or last directory list ===
462
463BOOL remove_udir(CHAR * path)
464{
465 LINKDIRS *info;
466 LINKDIRS *last = NULL;
467
468 if (path && *path) {
469 if (!loadedudirs)
470 load_udirs();
471 info = udirhead;
472 while (info) {
473 if (!stricmp(info->path, path)) {
474 if (last)
475 last->next = info->next;
476 else
477 udirhead = info->next;
478 free(info->path);
479 free(info);
480 fUdirsChanged = TRUE;
481 return TRUE;
482 }
483 last = info;
484 info = info->next;
485 }
486
487 info = ldirhead;
488 last = NULL;
489 while (info) {
490 if (!stricmp(info->path, path)) {
491 if (last)
492 last->next = info->next;
493 else
494 ldirhead = info->next;
495 free(info->path);
496 free(info);
497 return TRUE;
498 }
499 last = info;
500 info = info->next;
501 }
502 }
503 return FALSE;
504}
505
506BOOL remove_ldir(CHAR * path)
507{
508 LINKDIRS *info;
509 LINKDIRS *last = NULL;
510
511 if (path && *path) {
512 info = ldirhead;
513 while (info) {
514 if (!stricmp(info->path, path)) {
515 if (last)
516 last->next = info->next;
517 else
518 ldirhead = info->next;
519 free(info->path);
520 free(info);
521 return TRUE;
522 }
523 last = info;
524 info = info->next;
525 }
526 }
527 return FALSE;
528}
529
530VOID FillPathListBox(HWND hwnd, HWND hwnddrive, HWND hwnddir, CHAR * pszPath,
531 BOOL nounwriteable)
532{
533 /*
534 * this function fills one or two list boxes with drive and directory
535 * information showing all available drives and all directories off of
536 * the directory represented by path. This works independently of the
537 * current directory.
538 */
539
540 CHAR szDrive[] = " :", szTemp[1032];
541 FILEFINDBUF3 findbuf;
542 HDIR hDir = HDIR_CREATE;
543 SHORT sDrive;
544 ULONG ulDriveNum, ulSearchCount = 1, ulDriveMap;
545
546 DosError(FERR_DISABLEHARDERR);
547 DosQCurDisk(&ulDriveNum, &ulDriveMap);
548 if (hwnddrive)
549 WinSendMsg(hwnddrive, LM_DELETEALL, MPVOID, MPVOID);
550 if (hwnddrive != hwnddir && hwnddir)
551 WinSendMsg(hwnddir, LM_DELETEALL, MPVOID, MPVOID);
552
553 if (hwnddrive) {
554 // Fill drive listbox
555 for (sDrive = 0; sDrive < 26; sDrive++) {
556 if (ulDriveMap & (1 << sDrive)) {
557 *szDrive = (CHAR) (sDrive + 'A');
558 if ((!nounwriteable || !(driveflags[sDrive] & DRIVE_NOTWRITEABLE)) &&
559 !(driveflags[sDrive] & (DRIVE_IGNORE | DRIVE_INVALID)))
560 WinSendMsg(hwnddrive, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0),
561 MPFROMP(szDrive));
562 }
563 }
564 if (hwnddrive != hwnddir && pszPath && isalpha(*pszPath)
565 && pszPath[1] == ':') {
566 *szDrive = toupper(*pszPath);
567 WinSetWindowText(hwnddrive, szDrive);
568 }
569 }
570
571 if (hwnddir) {
572 // Fill directory listbox
573 sprintf(szTemp,
574 "%s%s*",
575 pszPath, (pszPath[strlen(pszPath) - 1] == '\\') ? "" : "\\");
576 DosError(FERR_DISABLEHARDERR);
577 if (!DosFindFirst(szTemp,
578 &hDir,
579 FILE_DIRECTORY | MUST_HAVE_DIRECTORY |
580 FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM |
581 FILE_HIDDEN,
582 &findbuf,
583 sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD)) {
584 do {
585 if (findbuf.attrFile & FILE_DIRECTORY) {
586 // Skip .. unless full path supplied
587 if (strcmp(findbuf.achName, "..") ||
588 strlen(pszPath) > 3 || pszPath[1] != ':') {
589 // Skip . allow ..
590 if (findbuf.achName[0] != '.' || findbuf.achName[1]) {
591 WinSendMsg(hwnddir,
592 LM_INSERTITEM,
593 MPFROM2SHORT(LIT_SORTASCENDING, 0),
594 MPFROMP(findbuf.achName));
595 }
596 }
597 }
598 ulSearchCount = 1;
599 } while (!DosFindNext(hDir,
600 &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount));
601 DosFindClose(hDir);
602 }
603 DosError(FERR_DISABLEHARDERR);
604 }
605}
606
607MRESULT EXPENTRY TextSubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
608{
609 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
610
611 switch (msg) {
612 case WM_CHAR:
613 if (SHORT1FROMMP(mp1) & KC_KEYUP) {
614 if ((SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
615 (SHORT1FROMMP(mp2) & 255) == '\r')
616 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
617 MPFROM2SHORT(DID_OK, 0), MPVOID);
618 }
619 break;
620 }
621 return oldproc(hwnd, msg, mp1, mp2);
622}
623
624MRESULT EXPENTRY WalkDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
625{
626 WALKER *wa;
627 CHAR szBuff[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1], *p;
628 SHORT sSelect;
629 static BOOL okay; /* avoid combobox selecting as filled */
630 static CHAR lastdir[CCHMAXPATH + 1];
631
632 switch (msg) {
633 case UM_SETUP2:
634 case WM_INITDLG:
635 okay = FALSE;
636 *lastdir = 0;
637 if (!mp2) {
638 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
639 WinDismissDlg(hwnd, 0);
640 break;
641 }
642 wa = xmallocz(sizeof(WALKER), pszSrcFile, __LINE__);
643 if (!wa) {
644 WinDismissDlg(hwnd, 0);
645 break;
646 }
647 wa->size = (USHORT) sizeof(WALKER);
648 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) wa);
649 wa->szReturnPath = (CHAR *) mp2;
650 {
651 PFNWP oldproc;
652
653 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, WALK_PATH),
654 (PFNWP) TextSubProc);
655 if (oldproc)
656 WinSetWindowPtr(WinWindowFromID(hwnd, WALK_PATH),
657 QWL_USER, (PVOID) oldproc);
658 WinSendDlgItemMsg(WinWindowFromID(hwnd, WALK_RECENT),
659 CBID_EDIT,
660 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
661 WinSendDlgItemMsg(WinWindowFromID(hwnd, WALK_RECENT),
662 CBID_EDIT,
663 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
664 }
665 PosOverOkay(hwnd);
666 if (msg == UM_SETUP2)
667 wa->nounwriteable = FALSE;
668 else
669 wa->nounwriteable = TRUE;
670 if (!*wa->szReturnPath)
671 save_dir2(wa->szCurrentPath);
672 else {
673 strcpy(wa->szCurrentPath, wa->szReturnPath);
674 MakeFullName(wa->szCurrentPath);
675 }
676 if (wa->nounwriteable &&
677 (driveflags[toupper(*wa->szCurrentPath) - 'A'] &
678 DRIVE_NOTWRITEABLE)) {
679
680 ULONG bd;
681
682 strcpy(wa->szCurrentPath, "C:\\");
683 if (DosQuerySysInfo(QSV_BOOT_DRIVE,
684 QSV_BOOT_DRIVE,
685 (PVOID) & bd, (ULONG) sizeof(ULONG)))
686 bd = 3;
687 *wa->szCurrentPath = (CHAR) bd + '@';
688 }
689 WinSendDlgItemMsg(hwnd,
690 WALK_PATH,
691 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
692 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
693 if (!loadedudirs)
694 load_udirs();
695 { /* fill user list box */
696 ULONG ulDriveNum, ulDriveMap;
697 ULONG ulSearchCount;
698 FILEFINDBUF3 findbuf;
699 HDIR hDir;
700 APIRET rc;
701 LINKDIRS *info, *temp;
702
703 DosError(FERR_DISABLEHARDERR);
704 DosQCurDisk(&ulDriveNum, &ulDriveMap);
705 info = udirhead;
706 while (info) {
707 if (IsFullName(info->path) &&
708 !(driveflags[toupper(*info->path) - 'A'] &
709 (DRIVE_IGNORE | DRIVE_INVALID))) {
710 DosError(FERR_DISABLEHARDERR);
711 hDir = HDIR_CREATE;
712 ulSearchCount = 1;
713 if (!IsRoot(info->path))
714 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
715 MUST_HAVE_DIRECTORY | FILE_READONLY |
716 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
717 &findbuf, sizeof(FILEFINDBUF3),
718 &ulSearchCount, FIL_STANDARD);
719 else {
720 rc = 0;
721 findbuf.attrFile = FILE_DIRECTORY;
722 }
723 if (!rc) {
724 if (!IsRoot(info->path))
725 DosFindClose(hDir);
726 if (findbuf.attrFile & FILE_DIRECTORY)
727 WinSendDlgItemMsg(hwnd, WALK_USERLIST, LM_INSERTITEM,
728 MPFROM2SHORT(LIT_SORTASCENDING, 0),
729 MPFROMP(info->path));
730 else {
731 temp = info->next;
732 remove_udir(info->path);
733 info = temp;
734 continue;
735 }
736 }
737 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
738 temp = info->next;
739 remove_udir(info->path);
740 info = temp;
741 continue;
742 }
743 }
744 info = info->next;
745 }
746 info = ldirhead;
747 while (info) {
748 if (IsFullName(info->path) &&
749 !(driveflags[toupper(*info->path) - 'A'] &
750 (DRIVE_IGNORE | DRIVE_INVALID))) {
751 DosError(FERR_DISABLEHARDERR);
752 hDir = HDIR_CREATE;
753 ulSearchCount = 1;
754 if (!IsRoot(info->path))
755 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
756 MUST_HAVE_DIRECTORY | FILE_READONLY |
757 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
758 &findbuf, sizeof(FILEFINDBUF3),
759 &ulSearchCount, FIL_STANDARD);
760 else {
761 rc = 0;
762 findbuf.attrFile = FILE_DIRECTORY;
763 }
764 if (!rc) {
765 if (!IsRoot(info->path))
766 DosFindClose(hDir);
767 if (findbuf.attrFile & FILE_DIRECTORY)
768 WinSendDlgItemMsg(hwnd, WALK_RECENT, LM_INSERTITEM,
769 MPFROM2SHORT(LIT_SORTASCENDING, 0),
770 MPFROMP(info->path));
771 else {
772 temp = info->next;
773 remove_ldir(info->path);
774 info = temp;
775 continue;
776 }
777 WinSetDlgItemText(hwnd, WALK_RECENT,
778 GetPString(IDS_WALKRECENTDIRSTEXT));
779 }
780 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
781 temp = info->next;
782 remove_ldir(info->path);
783 info = temp;
784 continue;
785 }
786 }
787 info = info->next;
788 }
789 }
790 FillPathListBox(hwnd,
791 WinWindowFromID(hwnd, WALK_DRIVELIST),
792 WinWindowFromID(hwnd, WALK_DIRLIST),
793 wa->szCurrentPath, wa->nounwriteable);
794 if (!PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID))
795 okay = TRUE;
796 {
797 MRESULT ret;
798
799 ret = WinDefDlgProc(hwnd, WM_INITDLG, mp1, mp2);
800 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
801 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
802 return ret;
803 }
804
805 case UM_SETUP4:
806 okay = TRUE;
807 return 0;
808
809 case WM_ADJUSTWINDOWPOS:
810 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
811 break;
812
813 case UM_SETDIR:
814 PaintRecessedWindow(WinWindowFromID(hwnd, WALK_HELP), (HPS) 0, FALSE,
815 TRUE);
816 return 0;
817
818 case WM_PRESPARAMCHANGED:
819 {
820 ULONG AttrFound, AttrValue[64], cbRetLen;
821
822 cbRetLen = WinQueryPresParam(hwnd, (ULONG) mp1, 0, &AttrFound,
823 (ULONG) sizeof(AttrValue), &AttrValue, 0);
824 if (cbRetLen) {
825 switch (AttrFound) {
826 case PP_FONTNAMESIZE:
827 PrfWriteProfileData(fmprof,
828 appname,
829 "WalkFont", (PVOID) AttrValue, cbRetLen);
830 *WalkFont = 0;
831 WalkFontSize = sizeof(WalkFont);
832 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
833 break;
834 }
835 }
836 }
837 break;
838
839 case UM_SETUP3:
840 save_udirs();
841 if (hwndMain)
842 PostMsg(hwndMain, UM_FILLUSERLIST, MPVOID, MPVOID);
843 return 0;
844
845 case UM_SETUP:
846 {
847 INT x;
848 USHORT id[] = { WALK_PATH, WALK_DIRLIST, WALK_USERLIST,
849 WALK_RECENT, 0
850 };
851
852 if (*WalkFont ||
853 (PrfQueryProfileData(fmprof,
854 appname,
855 "WalkFont",
856 (PVOID) WalkFont,
857 &WalkFontSize) && WalkFontSize)) {
858 for (x = 0; id[x]; x++)
859 WinSetPresParam(WinWindowFromID(hwnd, id[x]),
860 PP_FONTNAMESIZE, WalkFontSize, (PVOID) WalkFont);
861 }
862 }
863 return 0;
864
865 case UM_CONTROL:
866 case WM_CONTROL:
867 wa = WinQueryWindowPtr(hwnd, QWL_USER);
868 if (SHORT1FROMMP(mp1) == WALK_DRIVELIST ||
869 SHORT1FROMMP(mp1) == WALK_DIRLIST ||
870 SHORT1FROMMP(mp1) == WALK_USERLIST ||
871 SHORT1FROMMP(mp1) == WALK_RECENT) {
872 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
873 SHORT1FROMMP(mp1),
874 LM_QUERYSELECTION, MPVOID, MPVOID);
875 *szBuffer = 0;
876 if (sSelect >= 0)
877 WinSendDlgItemMsg(hwnd, SHORT1FROMMP(mp1), LM_QUERYITEMTEXT,
878 MPFROM2SHORT(sSelect, CCHMAXPATH),
879 MPFROMP(szBuffer));
880 }
881 switch (SHORT1FROMMP(mp1)) {
882 case WALK_PATH:
883 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
884 WinSetDlgItemText(hwnd, WALK_HELP, GetPString(IDS_WALKCURRDIRTEXT));
885 else if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
886 WinSetDlgItemText(hwnd, WALK_HELP,
887 GetPString(IDS_WALKDEFAULTHELPTEXT));
888 break;
889
890 case WALK_RECENT:
891 if (okay && SHORT2FROMMP(mp1) == CBN_LBSELECT) {
892
893 ULONG ulSearchCount;
894 FILEFINDBUF3 findbuf;
895 HDIR hDir;
896 APIRET rc;
897
898 // *szBuffer = 0;
899 // WinQueryDlgItemText(hwnd,WALK_RECENT,CCHMAXPATH,szBuffer);
900 if (!*szBuffer)
901 break;
902 DosError(FERR_DISABLEHARDERR);
903 hDir = HDIR_CREATE;
904 ulSearchCount = 1;
905 if (!IsRoot(szBuffer)) {
906 rc = DosFindFirst(szBuffer, &hDir, FILE_DIRECTORY |
907 MUST_HAVE_DIRECTORY | FILE_READONLY |
908 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
909 &findbuf, sizeof(FILEFINDBUF3),
910 &ulSearchCount, FIL_STANDARD);
911 if (!rc)
912 DosFindClose(hDir);
913 }
914 else {
915 findbuf.attrFile = FILE_DIRECTORY;
916 rc = 0;
917 }
918 if (rc)
919 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
920 "xDosFindFirst");
921 else if (~findbuf.attrFile & FILE_DIRECTORY)
922 Runtime_Error(pszSrcFile, __LINE__, "not a directory");
923 else {
924 strcpy(wa->szCurrentPath, szBuffer);
925 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
926 WinSetDlgItemText(hwnd, WALK_RECENT, wa->szCurrentPath);
927 FillPathListBox(hwnd,
928 WinWindowFromID(hwnd, WALK_DRIVELIST),
929 WinWindowFromID(hwnd, WALK_DIRLIST),
930 wa->szCurrentPath, FALSE);
931 }
932 }
933 else if (SHORT2FROMMP(mp1) == CBN_ENTER)
934 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
935 else if (SHORT2FROMMP(mp1) == CBN_SHOWLIST)
936 WinSetDlgItemText(hwnd, WALK_HELP,
937 GetPString(IDS_WALKRECENTDIRSHELPTEXT));
938 break;
939
940 case WALK_USERLIST:
941 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_SELECT) {
942
943 ULONG ulSearchCount;
944 FILEFINDBUF3 findbuf;
945 HDIR hDir;
946 APIRET rc;
947
948 DosError(FERR_DISABLEHARDERR);
949 hDir = HDIR_CREATE;
950 ulSearchCount = 1;
951 if (!IsRoot(szBuffer)) {
952 rc = DosFindFirst(szBuffer,
953 &hDir,
954 FILE_DIRECTORY |
955 MUST_HAVE_DIRECTORY | FILE_READONLY |
956 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
957 &findbuf,
958 sizeof(FILEFINDBUF3),
959 &ulSearchCount, FIL_STANDARD);
960 if (!rc)
961 DosFindClose(hDir);
962 }
963 else {
964 findbuf.attrFile = FILE_DIRECTORY;
965 rc = 0;
966 }
967 if (rc)
968 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
969 "xDosFindFirst");
970 else if (~findbuf.attrFile & FILE_DIRECTORY)
971 Runtime_Error(pszSrcFile, __LINE__, "not a directory");
972 else {
973 strcpy(wa->szCurrentPath, szBuffer);
974 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
975 FillPathListBox(hwnd,
976 WinWindowFromID(hwnd, WALK_DRIVELIST),
977 WinWindowFromID(hwnd, WALK_DIRLIST),
978 wa->szCurrentPath, FALSE);
979 }
980 }
981 else if (SHORT2FROMMP(mp1) == LN_ENTER)
982 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
983 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
984 WinSetDlgItemText(hwnd,
985 WALK_HELP, GetPString(IDS_WALKUSERDIRSHELPTEXT));
986 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
987 WinSetDlgItemText(hwnd,
988 WALK_HELP, GetPString(IDS_WALKDEFAULTHELPTEXT));
989 break;
990
991 case WALK_DRIVELIST:
992 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) {
993
994 ULONG ulDirLen = CCHMAXPATH;
995 APIRET rc;
996
997 rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3], &ulDirLen);
998 if (!rc) {
999 strcpy(wa->szCurrentPath, "C:\\");
1000 *wa->szCurrentPath = toupper(*szBuffer);
1001 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1002 FillPathListBox(hwnd,
1003 WinWindowFromID(hwnd, WALK_DRIVELIST),
1004 WinWindowFromID(hwnd, WALK_DIRLIST),
1005 wa->szCurrentPath, FALSE);
1006 }
1007 }
1008 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
1009 WinSetDlgItemText(hwnd, WALK_HELP,
1010 GetPString(IDS_WALKDRIVELISTHELPTEXT));
1011 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
1012 WinSetDlgItemText(hwnd, WALK_HELP,
1013 GetPString(IDS_WALKDEFAULTHELPTEXT));
1014 break;
1015
1016 case WALK_DIRLIST:
1017 if (okay && SHORT2FROMMP(mp1) == LN_ENTER) {
1018
1019 ULONG ulSearchCount;
1020 FILEFINDBUF3 findbuf;
1021 HDIR hDir;
1022 APIRET rc;
1023
1024 bstrip(szBuffer);
1025 if (*szBuffer) {
1026 strcpy(szBuff, wa->szCurrentPath);
1027 if (szBuff[strlen(szBuff) - 1] != '\\')
1028 strcat(szBuff, "\\");
1029 strcat(szBuff, szBuffer);
1030 MakeFullName(szBuff);
1031 DosError(FERR_DISABLEHARDERR);
1032 hDir = HDIR_CREATE;
1033 ulSearchCount = 1;
1034 if (!IsRoot(szBuff)) {
1035 rc = DosFindFirst(szBuff,
1036 &hDir,
1037 FILE_DIRECTORY |
1038 MUST_HAVE_DIRECTORY | FILE_READONLY |
1039 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1040 &findbuf,
1041 sizeof(FILEFINDBUF3),
1042 &ulSearchCount, FIL_STANDARD);
1043 if (!rc)
1044 DosFindClose(hDir);
1045 }
1046 else {
1047 findbuf.attrFile = FILE_DIRECTORY;
1048 rc = 0;
1049 }
1050 if (!rc && (findbuf.attrFile & FILE_DIRECTORY)) {
1051 strcpy(wa->szCurrentPath, szBuff);
1052 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1053 FillPathListBox(hwnd,
1054 WinWindowFromID(hwnd, WALK_DRIVELIST),
1055 WinWindowFromID(hwnd, WALK_DIRLIST),
1056 wa->szCurrentPath, FALSE);
1057 }
1058 }
1059 }
1060 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
1061 WinSetDlgItemText(hwnd, WALK_HELP,
1062 GetPString(IDS_WALKDIRLISTHELPTEXT));
1063 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
1064 WinSetDlgItemText(hwnd, WALK_HELP,
1065 GetPString(IDS_WALKDEFAULTHELPTEXT));
1066 break;
1067 }
1068 return 0;
1069
1070 case WM_COMMAND:
1071 wa = WinQueryWindowPtr(hwnd, QWL_USER);
1072 if (!wa)
1073 WinDismissDlg(hwnd, 0);
1074 *szBuff = 0;
1075 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1076 bstrip(szBuff);
1077 while ((p = strchr(szBuff, '/')) != NULL)
1078 *p = '\\';
1079 while (strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\')
1080 szBuff[strlen(szBuff) - 1] = 0;
1081 MakeFullName(szBuff);
1082 if (*szBuff && stricmp(szBuff, wa->szCurrentPath) && SHORT1FROMMP(mp1) != DID_CANCEL) {
1083 if (!SetDir(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT),
1084 QW_OWNER), hwnd, szBuff, 0))
1085 strcpy(wa->szCurrentPath, szBuff);
1086 else
1087 return 0;
1088 }
1089 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1090 switch (SHORT1FROMMP(mp1)) {
1091 case WALK_ADD:
1092 *szBuff = 0;
1093 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1094 bstrip(szBuff);
1095 while ((p = strchr(szBuff, '/')) != NULL)
1096 *p = '\\';
1097 if (*szBuff && !IsFile(szBuff)) {
1098 MakeFullName(szBuff);
1099 add_udir(TRUE, szBuff);
1100 if (fUdirsChanged) {
1101 WinSendDlgItemMsg(hwnd,
1102 WALK_USERLIST,
1103 LM_INSERTITEM,
1104 MPFROM2SHORT(LIT_SORTASCENDING, 0),
1105 MPFROMP(szBuff));
1106 wa->changed = 1;
1107 }
1108 }
1109 break;
1110
1111 case WALK_DELETE:
1112 *szBuff = 0;
1113 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1114 bstrip(szBuff);
1115 while ((p = strchr(szBuff, '/')) != NULL)
1116 *p = '\\';
1117 if (*szBuff && !IsFile(szBuff)) {
1118 MakeFullName(szBuff);
1119 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
1120 WALK_USERLIST,
1121 LM_SEARCHSTRING,
1122 MPFROM2SHORT(0, LIT_FIRST),
1123 MPFROMP(szBuff));
1124 if (sSelect >= 0) {
1125 WinSendDlgItemMsg(hwnd,
1126 WALK_USERLIST,
1127 LM_DELETEITEM, MPFROM2SHORT(sSelect, 0), MPVOID);
1128 remove_udir(szBuff);
1129 wa->changed = 1;
1130 }
1131 }
1132 break;
1133
1134 case DID_OK:
1135 if (*wa->szCurrentPath) {
1136 strcpy(wa->szReturnPath, wa->szCurrentPath);
1137 MakeValidDir(wa->szReturnPath);
1138 if (fAutoAddAllDirs)
1139 add_udir(FALSE, wa->szReturnPath);
1140 if (fChangeTarget) {
1141 strcpy(targetdir, wa->szReturnPath);
1142 PrfWriteProfileString(fmprof, appname, "Targetdir", targetdir);
1143 }
1144 }
1145 if (wa->changed)
1146 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
1147 WinDismissDlg(hwnd, 1);
1148 break;
1149
1150 case IDM_HELP:
1151 if (hwndHelp)
1152 WinSendMsg(hwndHelp,
1153 HM_DISPLAY_HELP,
1154 MPFROM2SHORT(HELP_WALKEM, 0), MPFROMSHORT(HM_RESOURCEID));
1155 break;
1156
1157 case DID_CANCEL:
1158 if (wa->changed)
1159 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
1160 free(wa);
1161 WinDismissDlg(hwnd, 0);
1162 break;
1163 }
1164 return 0;
1165
1166 case WM_CLOSE:
1167 break;
1168 }
1169 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1170}
1171
1172MRESULT EXPENTRY WalkAllDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1173{
1174 switch (msg) {
1175 case WM_INITDLG:
1176 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1177 }
1178 return WalkDlgProc(hwnd, msg, mp1, mp2);
1179}
1180
1181MRESULT EXPENTRY WalkCopyDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1182{
1183 switch (msg) {
1184 case WM_INITDLG:
1185 WinSetWindowText(hwnd, GetPString(IDS_WALKCOPYDLGTEXT));
1186 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1187 }
1188 return WalkDlgProc(hwnd, msg, mp1, mp2);
1189}
1190
1191MRESULT EXPENTRY WalkMoveDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1192{
1193 switch (msg) {
1194 case WM_INITDLG:
1195 WinSetWindowText(hwnd, GetPString(IDS_WALKMOVEDLGTEXT));
1196 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1197 }
1198 return WalkDlgProc(hwnd, msg, mp1, mp2);
1199}
1200
1201MRESULT EXPENTRY WalkExtractDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1202 MPARAM mp2)
1203{
1204 switch (msg) {
1205 case WM_INITDLG:
1206 WinSetWindowText(hwnd, GetPString(IDS_WALKEXTRACTDLGTEXT));
1207 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1208 }
1209 return WalkDlgProc(hwnd, msg, mp1, mp2);
1210}
1211
1212MRESULT EXPENTRY WalkTargetDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1213 MPARAM mp2)
1214{
1215 switch (msg) {
1216 case WM_INITDLG:
1217 {
1218 char s[CCHMAXPATH + 32];
1219
1220 sprintf(s,
1221 GetPString(IDS_WALKTARGETDLGTEXT),
1222 (*targetdir) ?
1223 NullStr :
1224 " (",
1225 (*targetdir) ?
1226 NullStr : GetPString(IDS_NONE), (*targetdir) ? NullStr : ")");
1227 WinSetWindowText(hwnd, s);
1228 }
1229 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1230 }
1231 return WalkDlgProc(hwnd, msg, mp1, mp2);
1232}
1233
1234MRESULT EXPENTRY WalkTwoDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1235{
1236 WALK2 *wa;
1237 CHAR szBuff[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1], *p;
1238 SHORT sSelect;
1239 static BOOL okay; /* avoid combobox selecting as filled */
1240
1241 switch (msg) {
1242 case UM_SETUP2:
1243 case WM_INITDLG:
1244 okay = FALSE;
1245 if (!mp2) {
1246 WinDismissDlg(hwnd, 0);
1247 break;
1248 }
1249 WinSetWindowPtr(hwnd, QWL_USER, mp2);
1250 wa = mp2;
1251 {
1252 PFNWP oldproc;
1253
1254 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, WALK_PATH),
1255 (PFNWP) TextSubProc);
1256 if (oldproc)
1257 WinSetWindowPtr(WinWindowFromID(hwnd, WALK_PATH),
1258 QWL_USER, (PVOID) oldproc);
1259 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, WALK2_PATH),
1260 (PFNWP) TextSubProc);
1261 if (oldproc)
1262 WinSetWindowPtr(WinWindowFromID(hwnd, WALK2_PATH),
1263 QWL_USER, (PVOID) oldproc);
1264 }
1265 if (!*wa->szCurrentPath1)
1266 save_dir2(wa->szCurrentPath1);
1267 MakeFullName(wa->szCurrentPath1);
1268 if (!*wa->szCurrentPath2)
1269 save_dir2(wa->szCurrentPath2);
1270 MakeFullName(wa->szCurrentPath2);
1271 WinSendDlgItemMsg(hwnd,
1272 WALK_PATH,
1273 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1274 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1275 WinSendDlgItemMsg(hwnd, WALK2_PATH, EM_SETTEXTLIMIT,
1276 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1277 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1278 FillPathListBox(hwnd,
1279 WinWindowFromID(hwnd, WALK_DRIVELIST),
1280 WinWindowFromID(hwnd, WALK_DIRLIST),
1281 wa->szCurrentPath1, FALSE);
1282 FillPathListBox(hwnd,
1283 WinWindowFromID(hwnd, WALK2_DRIVELIST),
1284 WinWindowFromID(hwnd, WALK2_DIRLIST),
1285 wa->szCurrentPath2, FALSE);
1286 if (!PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID))
1287 okay = TRUE;
1288 {
1289 MRESULT ret;
1290
1291 ret = WinDefDlgProc(hwnd, WM_INITDLG, mp1, mp2);
1292 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
1293 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
1294 WinInvalidateRect(WinWindowFromID(hwnd, WALK2_PATH), NULL, TRUE);
1295 return ret;
1296 }
1297
1298 case UM_SETUP4:
1299 okay = TRUE;
1300 return 0;
1301
1302 case WM_PRESPARAMCHANGED:
1303 {
1304 ULONG AttrFound, AttrValue[64], cbRetLen;
1305
1306 cbRetLen = WinQueryPresParam(hwnd, (ULONG) mp1, 0, &AttrFound,
1307 (ULONG) sizeof(AttrValue), &AttrValue, 0);
1308 if (cbRetLen) {
1309 switch (AttrFound) {
1310 case PP_FONTNAMESIZE:
1311 PrfWriteProfileData(fmprof,
1312 appname,
1313 "WalkFont", (PVOID) AttrValue, cbRetLen);
1314 *WalkFont = 0;
1315 WalkFontSize = sizeof(WalkFont);
1316 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
1317 break;
1318 }
1319 }
1320 }
1321 break;
1322
1323 case UM_SETUP:
1324 {
1325 INT x;
1326 USHORT id[] = { WALK_PATH, WALK_DIRLIST,
1327 WALK2_PATH, WALK2_DIRLIST, 0
1328 };
1329
1330 if (*WalkFont ||
1331 (PrfQueryProfileData(fmprof,
1332 appname,
1333 "WalkFont",
1334 (PVOID) WalkFont,
1335 &WalkFontSize) && WalkFontSize)) {
1336 for (x = 0; id[x]; x++)
1337 WinSetPresParam(WinWindowFromID(hwnd, id[x]),
1338 PP_FONTNAMESIZE, WalkFontSize, (PVOID) WalkFont);
1339 }
1340 }
1341 return 0;
1342
1343 case UM_CONTROL:
1344 case WM_CONTROL:
1345 wa = WinQueryWindowPtr(hwnd, QWL_USER);
1346 if (SHORT1FROMMP(mp1) == WALK_DRIVELIST ||
1347 SHORT1FROMMP(mp1) == WALK_DIRLIST ||
1348 SHORT1FROMMP(mp1) == WALK2_DRIVELIST ||
1349 SHORT1FROMMP(mp1) == WALK2_DIRLIST) {
1350 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
1351 SHORT1FROMMP(mp1),
1352 LM_QUERYSELECTION, MPVOID, MPVOID);
1353 *szBuffer = 0;
1354 if (sSelect >= 0)
1355 WinSendDlgItemMsg(hwnd, SHORT1FROMMP(mp1), LM_QUERYITEMTEXT,
1356 MPFROM2SHORT(sSelect, CCHMAXPATH),
1357 MPFROMP(szBuffer));
1358 }
1359 switch (SHORT1FROMMP(mp1)) {
1360 case WALK_DRIVELIST:
1361 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) {
1362
1363 ULONG ulDirLen = CCHMAXPATH;
1364 APIRET rc;
1365
1366 rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3], &ulDirLen);
1367 if (!rc) {
1368 strcpy(wa->szCurrentPath1, "C:\\");
1369 *wa->szCurrentPath1 = toupper(*szBuffer);
1370 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1371 FillPathListBox(hwnd,
1372 WinWindowFromID(hwnd, WALK_DRIVELIST),
1373 WinWindowFromID(hwnd, WALK_DIRLIST),
1374 wa->szCurrentPath1, FALSE);
1375 }
1376 }
1377 break;
1378
1379 case WALK_DIRLIST:
1380 if (okay && SHORT2FROMMP(mp1) == LN_ENTER) {
1381
1382 ULONG ulSearchCount;
1383 FILEFINDBUF3 findbuf;
1384 HDIR hDir;
1385 APIRET rc;
1386
1387 bstrip(szBuffer);
1388 if (*szBuffer) {
1389 strcpy(szBuff, wa->szCurrentPath1);
1390 if (szBuff[strlen(szBuff) - 1] != '\\')
1391 strcat(szBuff, "\\");
1392 strcat(szBuff, szBuffer);
1393 MakeFullName(szBuff);
1394 DosError(FERR_DISABLEHARDERR);
1395 hDir = HDIR_CREATE;
1396 ulSearchCount = 1;
1397 if (!IsRoot(szBuff)) {
1398 rc = DosFindFirst(szBuff,
1399 &hDir,
1400 FILE_DIRECTORY |
1401 MUST_HAVE_DIRECTORY | FILE_READONLY |
1402 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1403 &findbuf,
1404 sizeof(FILEFINDBUF3),
1405 &ulSearchCount, FIL_STANDARD);
1406 if (!rc)
1407 DosFindClose(hDir);
1408 }
1409 else {
1410 findbuf.attrFile = FILE_DIRECTORY;
1411 rc = 0;
1412 }
1413 if (!rc && (findbuf.attrFile & FILE_DIRECTORY)) {
1414 strcpy(wa->szCurrentPath1, szBuff);
1415 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1416 FillPathListBox(hwnd,
1417 WinWindowFromID(hwnd, WALK_DRIVELIST),
1418 WinWindowFromID(hwnd, WALK_DIRLIST),
1419 wa->szCurrentPath1, FALSE);
1420 }
1421 }
1422 }
1423 break;
1424
1425 case WALK2_DRIVELIST:
1426 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) {
1427
1428 ULONG ulDirLen = CCHMAXPATH;
1429 APIRET rc;
1430
1431 rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3], &ulDirLen);
1432 if (!rc) {
1433 strcpy(wa->szCurrentPath2, "C:\\");
1434 *wa->szCurrentPath2 = toupper(*szBuffer);
1435 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1436 FillPathListBox(hwnd,
1437 WinWindowFromID(hwnd, WALK2_DRIVELIST),
1438 WinWindowFromID(hwnd, WALK2_DIRLIST),
1439 wa->szCurrentPath2, FALSE);
1440 }
1441 }
1442 break;
1443
1444 case WALK2_DIRLIST:
1445 if (okay && SHORT2FROMMP(mp1) == LN_ENTER) {
1446
1447 ULONG ulSearchCount;
1448 FILEFINDBUF3 findbuf;
1449 HDIR hDir;
1450 APIRET rc;
1451
1452 bstrip(szBuffer);
1453 if (*szBuffer) {
1454 strcpy(szBuff, wa->szCurrentPath2);
1455 if (szBuff[strlen(szBuff) - 1] != '\\')
1456 strcat(szBuff, "\\");
1457 strcat(szBuff, szBuffer);
1458 MakeFullName(szBuff);
1459 DosError(FERR_DISABLEHARDERR);
1460 hDir = HDIR_CREATE;
1461 ulSearchCount = 1;
1462 if (!IsRoot(szBuff)) {
1463 rc = DosFindFirst(szBuff,
1464 &hDir,
1465 FILE_DIRECTORY |
1466 MUST_HAVE_DIRECTORY | FILE_READONLY |
1467 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1468 &findbuf,
1469 sizeof(FILEFINDBUF3),
1470 &ulSearchCount, FIL_STANDARD);
1471 if (!rc)
1472 DosFindClose(hDir);
1473 }
1474 else {
1475 findbuf.attrFile = FILE_DIRECTORY;
1476 rc = 0;
1477 }
1478 if (!rc && (findbuf.attrFile & FILE_DIRECTORY)) {
1479 strcpy(wa->szCurrentPath2, szBuff);
1480 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1481 FillPathListBox(hwnd,
1482 WinWindowFromID(hwnd, WALK2_DRIVELIST),
1483 WinWindowFromID(hwnd, WALK2_DIRLIST),
1484 wa->szCurrentPath2, FALSE);
1485 }
1486 }
1487 }
1488 break;
1489 }
1490 return 0;
1491
1492 case WM_COMMAND:
1493 wa = WinQueryWindowPtr(hwnd, QWL_USER);
1494 if (!wa)
1495 WinDismissDlg(hwnd, 0);
1496 *szBuff = 0;
1497 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1498 bstrip(szBuff);
1499 while ((p = strchr(szBuff, '/')) != NULL)
1500 *p = '\\';
1501 while (strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\')
1502 szBuff[strlen(szBuff) - 1] = 0;
1503 MakeFullName(szBuff);
1504 if (*szBuff && stricmp(szBuff, wa->szCurrentPath1) && SHORT1FROMMP(mp1) != DID_CANCEL) {
1505 if (!SetDir(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT),
1506 QW_OWNER), hwnd, szBuff, 0))
1507 strcpy(wa->szCurrentPath1, szBuff);
1508 else
1509 return 0;
1510 }
1511 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1512 *szBuff = 0;
1513 WinQueryDlgItemText(hwnd, WALK2_PATH, CCHMAXPATH, szBuff);
1514 bstrip(szBuff);
1515 while ((p = strchr(szBuff, '/')) != NULL)
1516 *p = '\\';
1517 while (strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\')
1518 szBuff[strlen(szBuff) - 1] = 0;
1519 MakeFullName(szBuff);
1520 if (*szBuff && stricmp(szBuff, wa->szCurrentPath2) && SHORT1FROMMP(mp1) != DID_CANCEL) {
1521 if (!SetDir(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT),
1522 QW_OWNER), hwnd, szBuff, 0))
1523 strcpy(wa->szCurrentPath2, szBuff);
1524 else
1525 return 0;
1526 }
1527 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1528 switch (SHORT1FROMMP(mp1)) {
1529 case DID_OK:
1530 WinDismissDlg(hwnd, 1);
1531 break;
1532
1533 case IDM_HELP:
1534 if (hwndHelp)
1535 WinSendMsg(hwndHelp,
1536 HM_DISPLAY_HELP,
1537 MPFROM2SHORT(HELP_WALKEM2, 0), MPFROMSHORT(HM_RESOURCEID));
1538 break;
1539
1540 case DID_CANCEL:
1541 WinDismissDlg(hwnd, 0);
1542 break;
1543 }
1544 return 0;
1545
1546 case WM_CLOSE:
1547 break;
1548 }
1549 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1550}
1551
1552MRESULT EXPENTRY WalkTwoCmpDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1553 MPARAM mp2)
1554{
1555 switch (msg) {
1556 case WM_INITDLG:
1557 WinSetWindowText(hwnd, GetPString(IDS_WALKCOMPAREDLGTEXT));
1558 return WalkTwoDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1559 }
1560 return WalkTwoDlgProc(hwnd, msg, mp1, mp2);
1561}
1562
1563MRESULT EXPENTRY WalkTwoSetDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1564 MPARAM mp2)
1565{
1566 switch (msg) {
1567 case WM_INITDLG:
1568 WinSetWindowText(hwnd, GetPString(IDS_WALKSETDIRSDLGTEXT));
1569 return WalkTwoDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1570 }
1571 return WalkTwoDlgProc(hwnd, msg, mp1, mp2);
1572}
1573
1574#pragma alloc_text(WALKER,FillPathListBox,WalkDlgProc,TextSubProc)
1575#pragma alloc_text(WALKER,WalkAllDlgProc,WalkCopyDlgProc)
1576#pragma alloc_text(WALKER,WalkMoveDlgProc,WalkExtractDlgProc,WalkTargetDlgProc)
1577#pragma alloc_text(WALK2,WalkTwoDlgProc,WalkTwoCmpDlgProc,WalkTwoSetDlgProc)
1578#pragma alloc_text(UDIRS,add_udir,remove_udir,remove_ldir,load_udirs)
1579#pragma alloc_text(UDIRS,save_udirs,load_setups,save_setups,add_setups)
1580#pragma alloc_text(UDIRS,remove_setup)
Note: See TracBrowser for help on using the repository browser.