source: trunk/dll/walkem.c@ 544

Last change on this file since 544 was 544, checked in by root, 19 years ago

Correct FillPathListBox regression

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