source: trunk/dll/walkem.c@ 574

Last change on this file since 574 was 574, checked in by Gregg Young, 18 years ago

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

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