source: trunk/dll/walkem.c@ 242

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

Indent

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