source: trunk/dll/walkem.c@ 1438

Last change on this file since 1438 was 1438, checked in by Gregg Young, 16 years ago

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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