source: trunk/dll/walkem.c@ 1104

Last change on this file since 1104 was 1104, checked in by Gregg Young, 17 years ago

Replace save_dir2(dir) with strcpy(dir, pFM2SaveDirectory)

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