source: trunk/dll/walkem.c@ 1877

Last change on this file since 1877 was 1877, checked in by Gregg Young, 10 years ago

Remove debug code

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