source: trunk/dll/walkem.c@ 858

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

Removed large file APIs from code where hey are not needed.

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