source: trunk/dll/walkem.c@ 304

Last change on this file since 304 was 259, checked in by root, 20 years ago

remove_udir - avoid corrupting last dirs list

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