#define INCL_WIN #define INCL_DOS #define INCL_DOSERRORS #include #include #include #include #include #include #include #include "fm3dll.h" #include "fm3dlg.h" #include "fm3str.h" #pragma data_seg(DATA1) #pragma alloc_text(WALKER,FillPathListBox,WalkDlgProc,TextSubProc) #pragma alloc_text(WALKER,WalkAllDlgProc,WalkCopyDlgProc) #pragma alloc_text(WALKER,WalkMoveDlgProc,WalkExtractDlgProc,WalkTargetDlgProc) #pragma alloc_text(WALK2,WalkTwoDlgProc,WalkTwoCmpDlgProc,WalkTwoSetDlgProc) #pragma alloc_text(UDIRS,add_udir,remove_udir,remove_ldir,load_udirs) #pragma alloc_text(UDIRS,save_udirs,load_setup,save_setup,add_setup) #pragma alloc_text(UDIRS,remove_setup) typedef struct { USHORT size; USHORT changed; BOOL nounwriteable; CHAR szCurrentPath[CCHMAXPATH]; CHAR *szReturnPath; } WALKER; static CHAR WalkFont[CCHMAXPATH] = ""; static ULONG WalkFontSize = sizeof(WalkFont); VOID load_setups (VOID) { ULONG len = sizeof(lastsetups); memset(lastsetups,0,len); PrfQueryProfileData(fmprof, FM3Str, "LastSetups", lastsetups, &len); len = sizeof(INT); lastsetup = 0; PrfQueryProfileData(fmprof, FM3Str, "LastSetup", &lastsetup, &len); loadedsetups = TRUE; } VOID save_setups (VOID) { if(!loadedsetups) return; PrfWriteProfileData(fmprof, FM3Str, "LastSetups", lastsetups, (ULONG)sizeof(lastsetups)); PrfWriteProfileData(fmprof, FM3Str, "LastSetup", &lastsetup, (ULONG)sizeof(INT)); } BOOL add_setup (CHAR *name) { INT x; if(!name || !*name) return FALSE; if(!loadedsetups) load_setups(); for(x = 0;x < MAXNUMSETUPS;x++) { if(!stricmp(lastsetups[x],name)) return FALSE; } lastsetup++; if(lastsetup >= MAXNUMSETUPS) lastsetup = 0; strcpy(lastsetups[lastsetup],name); return TRUE; } BOOL remove_setup (CHAR *name) { INT x,y; if(!name || !*name) return FALSE; if(!loadedsetups) load_setups(); for(x = 0;x < MAXNUMSETUPS;x++) { if(!stricmp(lastsetups[x],name)) { *lastsetups[x] = 0; for(y = x + 1;y < MAXNUMSETUPS;y++) strcpy(lastsetups[y - 1],lastsetups[y]); *lastsetups[MAXNUMSETUPS - 1] = 0; if(lastsetup >= x) lastsetup--; return TRUE; } } return FALSE; } VOID load_udirs (VOID) { /* load linked list of user directories from USERDIRS.DAT file */ FILE *fp; LINKDIRS *info,*last = NULL; CHAR s[CCHMAXPATH + 24]; loadedudirs = TRUE; fUdirsChanged = FALSE; save_dir2(s); if(s[strlen(s) - 1] != '\\') strcat(s,"\\"); strcat(s,"USERDIRS.DAT"); fp = _fsopen(s,"r",SH_DENYWR); if(fp) { while(!feof(fp)) { if(!fgets(s,CCHMAXPATH + 24,fp)) break; s[CCHMAXPATH] = 0; stripcr(s); lstrip(rstrip(s)); if(*s && *s != ';') { info = malloc(sizeof(LINKDIRS)); if(info) { info->path = strdup(s); if(info->path) { info->next = NULL; if(!udirhead) udirhead = info; else last->next = info; last = info; } else free(info); } } } fclose(fp); } } VOID save_udirs (VOID) { FILE *fp; LINKDIRS *info; CHAR s[CCHMAXPATH + 14]; if(loadedudirs) { fUdirsChanged = FALSE; if(udirhead) { save_dir2(s); if(s[strlen(s) - 1] != '\\') strcat(s,"\\"); strcat(s,"USERDIRS.DAT"); fp = fopen(s,"w"); if(fp) { fputs(GetPString(IDS_USERDEFDIRSTEXT),fp); info = udirhead; while(info) { fprintf(fp, "%0.*s\n", CCHMAXPATH, info->path); info = info->next; } fclose(fp); } } } } BOOL add_udir (BOOL userdirs,CHAR *inpath) { CHAR path[CCHMAXPATH]; LINKDIRS *info,*last = NULL,*temp = NULL; if(inpath && *inpath) { if(DosQueryPathInfo(inpath, FIL_QUERYFULLNAME, path, sizeof(path))) strcpy(path,inpath); if(!userdirs && IsRoot(path)) return FALSE; if(IsFullName(path)) { if(!loadedudirs) load_udirs(); info = (userdirs) ? udirhead : ldirhead; while(info) { if(!stricmp(info->path,path)) return FALSE; last = info; info = info->next; } if(!userdirs) { info = udirhead; while(info) { if(!stricmp(info->path,path)) return FALSE; info = info->next; } } else { /* if adding manual directory, remove from auto list if present */ info = ldirhead; while(info) { if(!stricmp(info->path,path)) { if(temp) temp->next = info->next; else ldirhead = info->next; free(info->path); free(info); break; } temp = info; info = info->next; } } info = malloc(sizeof(LINKDIRS)); if(info) { info->path = strdup(path); if(info->path) { info->next = NULL; if(userdirs) { fUdirsChanged = TRUE; if(!udirhead) udirhead = info; else last->next = info; } else { if(!ldirhead) ldirhead = info; else last->next = info; } return TRUE; } else free(info); } } } return FALSE; } BOOL remove_udir (CHAR *path) { LINKDIRS *info,*last = NULL; if(path && *path) { if(!loadedudirs) load_udirs(); info = udirhead; while(info) { if(!stricmp(info->path,path)) { if(last) last->next = info->next; else udirhead = info->next; free(info->path); free(info); fUdirsChanged = TRUE; return TRUE; } last = info; info = info->next; } info = ldirhead; while(info) { if(!stricmp(info->path,path)) { if(last) last->next = info->next; else ldirhead = info->next; free(info->path); free(info); return TRUE; } last = info; info = info->next; } } return FALSE; } BOOL remove_ldir (CHAR *path) { LINKDIRS *info,*last = NULL; if(path && *path) { info = ldirhead; while(info) { if(!stricmp(info->path,path)) { if(last) last->next = info->next; else ldirhead = info->next; free(info->path); free(info); return TRUE; } last = info; info = info->next; } } return FALSE; } VOID FillPathListBox (HWND hwnd,HWND hwnddrive,HWND hwnddir,CHAR *path, BOOL nounwriteable) { /* * this function fills one or two list boxes with drive and directory * information showing all available drives and all directories off of * the directory represented by path. This works independently of the * current directory. */ CHAR szDrive[] = " :",szTemp[1032]; FILEFINDBUF3 findbuf; HDIR hDir = HDIR_CREATE; SHORT sDrive; ULONG ulDriveNum,ulSearchCount = 1L,ulDriveMap; DosError(FERR_DISABLEHARDERR); DosQCurDisk(&ulDriveNum,&ulDriveMap); if(hwnddrive) WinSendMsg(hwnddrive,LM_DELETEALL,MPVOID,MPVOID); if(hwnddrive != hwnddir && hwnddir) WinSendMsg(hwnddir,LM_DELETEALL,MPVOID,MPVOID); if(hwnddrive) { for(sDrive = 0;sDrive < 26;sDrive++) { if(ulDriveMap & (1L << sDrive)) { *szDrive = (CHAR)(sDrive + 'A'); if((!nounwriteable || !(driveflags[sDrive] & DRIVE_NOTWRITEABLE)) && !(driveflags[sDrive] & (DRIVE_IGNORE | DRIVE_INVALID))) WinSendMsg(hwnddrive,LM_INSERTITEM,MPFROM2SHORT(LIT_END,0), MPFROMP(szDrive)); } } if(hwnddrive != hwnddir && path && isalpha(*path) && path[1] == ':') { *szDrive = toupper(*path); WinSetWindowText(hwnddrive,szDrive); } } if(hwnddir) { sprintf(szTemp, "%s%s*", path, (path[strlen(path) - 1] == '\\') ? "" : "\\"); DosError(FERR_DISABLEHARDERR); if(!DosFindFirst(szTemp, &hDir, FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD)) { do { if(findbuf.attrFile & FILE_DIRECTORY) { if(strcmp(findbuf.achName,"..") || strlen(path) > 3 || path[1] != ':') { if(findbuf.achName[0] != '.' || findbuf.achName[1]) WinSendMsg(hwnddir, LM_INSERTITEM, MPFROM2SHORT(LIT_SORTASCENDING,0), MPFROMP(findbuf.achName)); } } ulSearchCount = 1L; } while(!DosFindNext(hDir, &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount)); DosFindClose(hDir); } DosError(FERR_DISABLEHARDERR); } } MRESULT EXPENTRY TextSubProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { PFNWP oldproc = (PFNWP)WinQueryWindowPtr(hwnd,0); switch(msg) { case WM_CHAR: if(SHORT1FROMMP(mp1) & KC_KEYUP) { if((SHORT1FROMMP(mp1) & KC_VIRTUALKEY) && (SHORT1FROMMP(mp2) & 255) == '\r') PostMsg(WinQueryWindow(hwnd,QW_PARENT),WM_COMMAND, MPFROM2SHORT(DID_OK,0),MPVOID); } break; } return oldproc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { WALKER *wa; CHAR szBuff[CCHMAXPATH + 1],szBuffer[CCHMAXPATH + 1],*p; SHORT sSelect; static BOOL okay; /* avoid combobox selecting as filled */ static CHAR lastdir[CCHMAXPATH + 1]; switch(msg) { case UM_SETUP2: case WM_INITDLG: okay = FALSE; *lastdir = 0; if(!mp2) { WinDismissDlg(hwnd,0); break; } wa = malloc(sizeof(WALKER)); if(!wa) { DosBeep(50,100); WinDismissDlg(hwnd,0); break; } memset(wa,0,sizeof(WALKER)); wa->size = (USHORT)sizeof(WALKER); WinSetWindowPtr(hwnd,0,(PVOID)wa); wa->szReturnPath = (CHAR *)mp2; { PFNWP oldproc; oldproc = WinSubclassWindow(WinWindowFromID(hwnd,WALK_PATH), (PFNWP)TextSubProc); if(oldproc) WinSetWindowPtr(WinWindowFromID(hwnd,WALK_PATH), 0, (PVOID)oldproc); WinSendDlgItemMsg(WinWindowFromID(hwnd,WALK_RECENT), CBID_EDIT, EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH,0), MPVOID); WinSendDlgItemMsg(WinWindowFromID(hwnd,WALK_RECENT), CBID_EDIT, EM_SETREADONLY, MPFROM2SHORT(TRUE,0), MPVOID); } PosOverOkay(hwnd); if(msg == UM_SETUP2) wa->nounwriteable = FALSE; else wa->nounwriteable = TRUE; if(!*wa->szReturnPath) save_dir2(wa->szCurrentPath); else { strcpy(wa->szCurrentPath, wa->szReturnPath); MakeFullName(wa->szCurrentPath); } if(wa->nounwriteable && (driveflags[toupper(*wa->szCurrentPath) - 'A'] & DRIVE_NOTWRITEABLE)) { ULONG bd; strcpy(wa->szCurrentPath,"C:\\"); if(DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, (PVOID)&bd, (ULONG)sizeof(ULONG))) bd = 3L; *wa->szCurrentPath = (CHAR)bd + '@'; } WinSendDlgItemMsg(hwnd, WALK_PATH, EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH,0), MPVOID); WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath); if(!loadedudirs) load_udirs(); { /* fill user list box */ ULONG ulDriveNum,ulDriveMap; ULONG ulSearchCount; FILEFINDBUF3 findbuf; HDIR hDir; APIRET rc; LINKDIRS *info,*temp; DosError(FERR_DISABLEHARDERR); DosQCurDisk(&ulDriveNum,&ulDriveMap); info = udirhead; while(info) { if(IsFullName(info->path) && !(driveflags[toupper(*info->path) - 'A'] & (DRIVE_IGNORE | DRIVE_INVALID))) { DosError(FERR_DISABLEHARDERR); hDir = HDIR_CREATE; ulSearchCount = 1L; if(!IsRoot(info->path)) rc = DosFindFirst(info->path,&hDir,FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf,sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD); else { rc = 0; findbuf.attrFile = FILE_DIRECTORY; } if(!rc) { if(!IsRoot(info->path)) DosFindClose(hDir); if(findbuf.attrFile & FILE_DIRECTORY) WinSendDlgItemMsg(hwnd,WALK_USERLIST,LM_INSERTITEM, MPFROM2SHORT(LIT_SORTASCENDING,0), MPFROMP(info->path)); else { temp = info->next; remove_udir(info->path); info = temp; continue; } } else if(!(ulDriveMap & (1L << (toupper(*info->path) - 'A')))) { temp = info->next; remove_udir(info->path); info = temp; continue; } } info = info->next; } info = ldirhead; while(info) { if(IsFullName(info->path) && !(driveflags[toupper(*info->path) - 'A'] & (DRIVE_IGNORE | DRIVE_INVALID))) { DosError(FERR_DISABLEHARDERR); hDir = HDIR_CREATE; ulSearchCount = 1L; if(!IsRoot(info->path)) rc = DosFindFirst(info->path,&hDir,FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf,sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD); else { rc = 0; findbuf.attrFile = FILE_DIRECTORY; } if(!rc) { if(!IsRoot(info->path)) DosFindClose(hDir); if(findbuf.attrFile & FILE_DIRECTORY) WinSendDlgItemMsg(hwnd,WALK_RECENT,LM_INSERTITEM, MPFROM2SHORT(LIT_SORTASCENDING,0), MPFROMP(info->path)); else { temp = info->next; remove_ldir(info->path); info = temp; continue; } WinSetDlgItemText(hwnd,WALK_RECENT, GetPString(IDS_WALKRECENTDIRSTEXT)); } else if(!(ulDriveMap & (1L << (toupper(*info->path) - 'A')))) { temp = info->next; remove_ldir(info->path); info = temp; continue; } } info = info->next; } } FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath,wa->nounwriteable); if(!PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID)) okay = TRUE; { MRESULT ret; ret = WinDefDlgProc(hwnd,WM_INITDLG,mp1,mp2); WinSendMsg(hwnd,UM_SETUP,MPVOID,MPVOID); WinInvalidateRect(WinWindowFromID(hwnd,WALK_PATH),NULL,TRUE); return ret; } case UM_SETUP4: okay = TRUE; return 0; case WM_ADJUSTWINDOWPOS: PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID); break; case UM_SETDIR: PaintRecessedWindow(WinWindowFromID(hwnd,WALK_HELP),(HPS)0,FALSE,TRUE); return 0; case WM_PRESPARAMCHANGED: { ULONG AttrFound,AttrValue[64],cbRetLen; cbRetLen = WinQueryPresParam(hwnd,(ULONG)mp1,0,&AttrFound, (ULONG)sizeof(AttrValue), &AttrValue,0); if(cbRetLen) { switch(AttrFound) { case PP_FONTNAMESIZE: PrfWriteProfileData(fmprof, appname, "WalkFont", (PVOID)AttrValue, cbRetLen); *WalkFont = 0; WalkFontSize = sizeof(WalkFont); WinInvalidateRect(WinWindowFromID(hwnd,WALK_PATH), NULL, TRUE); break; } } } break; case UM_SETUP3: save_udirs(); if(hwndMain) PostMsg(hwndMain, UM_FILLUSERLIST, MPVOID, MPVOID); return 0; case UM_SETUP: { INT x; USHORT id[] = {WALK_PATH,WALK_DIRLIST,WALK_USERLIST, WALK_RECENT,0}; if(*WalkFont || (PrfQueryProfileData(fmprof, appname, "WalkFont", (PVOID)WalkFont, &WalkFontSize) && WalkFontSize)) { for(x = 0;id[x];x++) WinSetPresParam(WinWindowFromID(hwnd,id[x]), PP_FONTNAMESIZE, WalkFontSize, (PVOID)WalkFont); } } return 0; case UM_CONTROL: case WM_CONTROL: wa = WinQueryWindowPtr(hwnd,0); if(SHORT1FROMMP(mp1) == WALK_DRIVELIST || SHORT1FROMMP(mp1) == WALK_DIRLIST || SHORT1FROMMP(mp1) == WALK_USERLIST || SHORT1FROMMP(mp1) == WALK_RECENT) { sSelect = (USHORT)WinSendDlgItemMsg(hwnd, SHORT1FROMMP(mp1), LM_QUERYSELECTION, MPVOID,MPVOID); *szBuffer = 0; if(sSelect >= 0) WinSendDlgItemMsg(hwnd,SHORT1FROMMP(mp1),LM_QUERYITEMTEXT, MPFROM2SHORT(sSelect,CCHMAXPATH), MPFROMP(szBuffer)); } switch(SHORT1FROMMP(mp1)) { case WALK_PATH: if(SHORT2FROMMP(mp1) == EN_SETFOCUS) WinSetDlgItemText(hwnd,WALK_HELP, GetPString(IDS_WALKCURRDIRTEXT)); else if(SHORT2FROMMP(mp1) == EN_KILLFOCUS) WinSetDlgItemText(hwnd,WALK_HELP, GetPString(IDS_WALKDEFAULTHELPTEXT)); break; case WALK_RECENT: if(okay && SHORT2FROMMP(mp1) == CBN_LBSELECT) { ULONG ulSearchCount; FILEFINDBUF3 findbuf; HDIR hDir; APIRET rc; // *szBuffer = 0; // WinQueryDlgItemText(hwnd,WALK_RECENT,CCHMAXPATH,szBuffer); if(!*szBuffer) break; DosError(FERR_DISABLEHARDERR); hDir = HDIR_CREATE; ulSearchCount = 1L; if(!IsRoot(szBuffer)) { rc = DosFindFirst(szBuffer,&hDir,FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf,sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD); if(!rc) DosFindClose(hDir); } else { findbuf.attrFile = FILE_DIRECTORY; rc = 0; } if(!rc && (findbuf.attrFile & FILE_DIRECTORY)) { strcpy(wa->szCurrentPath,szBuffer); WinSetDlgItemText(hwnd,WALK_PATH,wa->szCurrentPath); WinSetDlgItemText(hwnd,WALK_RECENT,wa->szCurrentPath); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath,FALSE); } else DosBeep(50,100); } else if(SHORT2FROMMP(mp1) == CBN_ENTER) PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(DID_OK,0),MPVOID); else if(SHORT2FROMMP(mp1) == CBN_SHOWLIST) WinSetDlgItemText(hwnd,WALK_HELP, GetPString(IDS_WALKRECENTDIRSHELPTEXT)); break; case WALK_USERLIST: if(okay && *szBuffer && SHORT2FROMMP(mp1) == LN_SELECT) { ULONG ulSearchCount; FILEFINDBUF3 findbuf; HDIR hDir; APIRET rc; DosError(FERR_DISABLEHARDERR); hDir = HDIR_CREATE; ulSearchCount = 1L; if(!IsRoot(szBuffer)) { rc = DosFindFirst(szBuffer, &hDir, FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD); if(!rc) DosFindClose(hDir); } else { findbuf.attrFile = FILE_DIRECTORY; rc = 0; } if(!rc && (findbuf.attrFile & FILE_DIRECTORY)) { strcpy(wa->szCurrentPath,szBuffer); WinSetDlgItemText(hwnd,WALK_PATH,wa->szCurrentPath); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath,FALSE); } else DosBeep(50,100); } else if(SHORT2FROMMP(mp1) == LN_ENTER) PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK,0), MPVOID); else if(SHORT2FROMMP(mp1) == LN_SETFOCUS) WinSetDlgItemText(hwnd, WALK_HELP, GetPString(IDS_WALKUSERDIRSHELPTEXT)); else if(SHORT2FROMMP(mp1) == LN_KILLFOCUS) WinSetDlgItemText(hwnd, WALK_HELP, GetPString(IDS_WALKDEFAULTHELPTEXT)); break; case WALK_DRIVELIST: if(okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) { ULONG ulDirLen = CCHMAXPATH; APIRET rc; rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3],&ulDirLen); if(!rc) { strcpy(wa->szCurrentPath,"C:\\"); *wa->szCurrentPath = toupper(*szBuffer); WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath,FALSE); } } else if(SHORT2FROMMP(mp1) == LN_SETFOCUS) WinSetDlgItemText(hwnd,WALK_HELP, GetPString(IDS_WALKDRIVELISTHELPTEXT)); else if(SHORT2FROMMP(mp1) == LN_KILLFOCUS) WinSetDlgItemText(hwnd,WALK_HELP, GetPString(IDS_WALKDEFAULTHELPTEXT)); break; case WALK_DIRLIST: if(okay && SHORT2FROMMP(mp1) == LN_ENTER) { ULONG ulSearchCount; FILEFINDBUF3 findbuf; HDIR hDir; APIRET rc; lstrip(rstrip(szBuffer)); if(*szBuffer) { strcpy(szBuff,wa->szCurrentPath); if(szBuff[strlen(szBuff) - 1] != '\\') strcat(szBuff,"\\"); strcat(szBuff, szBuffer); MakeFullName(szBuff); DosError(FERR_DISABLEHARDERR); hDir = HDIR_CREATE; ulSearchCount = 1L; if(!IsRoot(szBuff)) { rc = DosFindFirst(szBuff, &hDir, FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD); if(!rc) DosFindClose(hDir); } else { findbuf.attrFile = FILE_DIRECTORY; rc = 0; } if(!rc && (findbuf.attrFile & FILE_DIRECTORY)) { strcpy(wa->szCurrentPath,szBuff); WinSetDlgItemText(hwnd,WALK_PATH,wa->szCurrentPath); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath,FALSE); } } } else if(SHORT2FROMMP(mp1) == LN_SETFOCUS) WinSetDlgItemText(hwnd,WALK_HELP, GetPString(IDS_WALKDIRLISTHELPTEXT)); else if(SHORT2FROMMP(mp1) == LN_KILLFOCUS) WinSetDlgItemText(hwnd,WALK_HELP, GetPString(IDS_WALKDEFAULTHELPTEXT)); break; } return 0; case WM_COMMAND: wa = WinQueryWindowPtr(hwnd,0); if(!wa) WinDismissDlg(hwnd,0); *szBuff = 0; WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff); lstrip(rstrip(szBuff)); while((p = strchr(szBuff,'/')) != NULL) *p = '\\'; while(strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\') szBuff[strlen(szBuff) - 1] = 0; MakeFullName(szBuff); if(*szBuff && stricmp(szBuff,wa->szCurrentPath)) { if(!SetDir(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT), QW_OWNER), hwnd, szBuff, 0)) strcpy(wa->szCurrentPath, szBuff); else if(SHORT1FROMMP(mp1) != DID_CANCEL) return 0; } WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath); switch(SHORT1FROMMP(mp1)) { case WALK_ADD: *szBuff = 0; WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff); lstrip(rstrip(szBuff)); while((p = strchr(szBuff,'/')) != NULL) *p = '\\'; if(*szBuff && !IsFile(szBuff)) { MakeFullName(szBuff); if(add_udir(TRUE, szBuff)) { WinSendDlgItemMsg(hwnd, WALK_USERLIST, LM_INSERTITEM, MPFROM2SHORT(LIT_SORTASCENDING,0), MPFROMP(szBuff)); wa->changed = 1; } else DosBeep(50,100); } break; case WALK_DELETE: *szBuff = 0; WinQueryDlgItemText(hwnd,WALK_PATH,CCHMAXPATH,szBuff); lstrip(rstrip(szBuff)); while((p = strchr(szBuff,'/')) != NULL) *p = '\\'; if(*szBuff && !IsFile(szBuff)) { MakeFullName(szBuff); sSelect = (SHORT)WinSendDlgItemMsg(hwnd, WALK_USERLIST, LM_SEARCHSTRING, MPFROM2SHORT(0,LIT_FIRST), MPFROMP(szBuff)); if(sSelect >= 0) { WinSendDlgItemMsg(hwnd, WALK_USERLIST, LM_DELETEITEM, MPFROM2SHORT(sSelect,0), MPVOID); remove_udir(szBuff); wa->changed = 1; } } break; case DID_OK: if(*wa->szCurrentPath) { strcpy(wa->szReturnPath, wa->szCurrentPath); MakeValidDir(wa->szReturnPath); if(fAutoAddAllDirs) add_udir(FALSE, wa->szReturnPath); if(fChangeTarget) { strcpy(targetdir, wa->szReturnPath); PrfWriteProfileString(fmprof, appname, "Targetdir", targetdir); } } if(wa->changed) WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID); WinDismissDlg(hwnd,1); break; case IDM_HELP: if(hwndHelp) WinSendMsg(hwndHelp, HM_DISPLAY_HELP, MPFROM2SHORT(HELP_WALKEM,0), MPFROMSHORT(HM_RESOURCEID)); break; case DID_CANCEL: if(wa->changed) WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID); free(wa); WinDismissDlg(hwnd,0); break; } return 0; case WM_CLOSE: break; } return WinDefDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkAllDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { switch(msg) { case WM_INITDLG: return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2); } return WalkDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkCopyDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { switch(msg) { case WM_INITDLG: WinSetWindowText(hwnd, GetPString(IDS_WALKCOPYDLGTEXT)); return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2); } return WalkDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkMoveDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { switch(msg) { case WM_INITDLG: WinSetWindowText(hwnd, GetPString(IDS_WALKMOVEDLGTEXT)); return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2); } return WalkDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkExtractDlgProc (HWND hwnd,ULONG msg,MPARAM mp1, MPARAM mp2) { switch(msg) { case WM_INITDLG: WinSetWindowText(hwnd, GetPString(IDS_WALKEXTRACTDLGTEXT)); return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2); } return WalkDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkTargetDlgProc (HWND hwnd,ULONG msg,MPARAM mp1, MPARAM mp2) { switch(msg) { case WM_INITDLG: { char s[CCHMAXPATH + 32]; sprintf(s, GetPString(IDS_WALKTARGETDLGTEXT), (*targetdir) ? NullStr : " (", (*targetdir) ? NullStr : GetPString(IDS_NONE), (*targetdir) ? NullStr : ")"); WinSetWindowText(hwnd,s); } return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2); } return WalkDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkTwoDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { WALK2 *wa; CHAR szBuff[CCHMAXPATH + 1],szBuffer[CCHMAXPATH + 1],*p; SHORT sSelect; static BOOL okay; /* avoid combobox selecting as filled */ switch(msg) { case UM_SETUP2: case WM_INITDLG: okay = FALSE; if(!mp2) { WinDismissDlg(hwnd,0); break; } WinSetWindowPtr(hwnd,0,mp2); wa = mp2; { PFNWP oldproc; oldproc = WinSubclassWindow(WinWindowFromID(hwnd,WALK_PATH), (PFNWP)TextSubProc); if(oldproc) WinSetWindowPtr(WinWindowFromID(hwnd,WALK_PATH), 0, (PVOID)oldproc); oldproc = WinSubclassWindow(WinWindowFromID(hwnd,WALK2_PATH), (PFNWP)TextSubProc); if(oldproc) WinSetWindowPtr(WinWindowFromID(hwnd,WALK2_PATH), 0, (PVOID)oldproc); } if(!*wa->szCurrentPath1) save_dir2(wa->szCurrentPath1); MakeFullName(wa->szCurrentPath1); if(!*wa->szCurrentPath2) save_dir2(wa->szCurrentPath2); MakeFullName(wa->szCurrentPath2); WinSendDlgItemMsg(hwnd, WALK_PATH, EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH,0), MPVOID); WinSetDlgItemText(hwnd,WALK_PATH,wa->szCurrentPath1); WinSendDlgItemMsg(hwnd,WALK2_PATH,EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH,0),MPVOID); WinSetDlgItemText(hwnd,WALK2_PATH,wa->szCurrentPath2); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath1,FALSE); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK2_DRIVELIST), WinWindowFromID(hwnd,WALK2_DIRLIST), wa->szCurrentPath2,FALSE); if(!PostMsg(hwnd,UM_SETUP4,MPVOID,MPVOID)) okay = TRUE; { MRESULT ret; ret = WinDefDlgProc(hwnd,WM_INITDLG,mp1,mp2); WinSendMsg(hwnd,UM_SETUP,MPVOID,MPVOID); WinInvalidateRect(WinWindowFromID(hwnd,WALK_PATH),NULL,TRUE); WinInvalidateRect(WinWindowFromID(hwnd,WALK2_PATH),NULL,TRUE); return ret; } case UM_SETUP4: okay = TRUE; return 0; case WM_PRESPARAMCHANGED: { ULONG AttrFound,AttrValue[64],cbRetLen; cbRetLen = WinQueryPresParam(hwnd,(ULONG)mp1,0,&AttrFound, (ULONG)sizeof(AttrValue), &AttrValue,0); if(cbRetLen) { switch(AttrFound) { case PP_FONTNAMESIZE: PrfWriteProfileData(fmprof, appname, "WalkFont", (PVOID)AttrValue, cbRetLen); *WalkFont = 0; WalkFontSize = sizeof(WalkFont); WinInvalidateRect(WinWindowFromID(hwnd,WALK_PATH), NULL, TRUE); break; } } } break; case UM_SETUP: { INT x; USHORT id[] = {WALK_PATH,WALK_DIRLIST, WALK2_PATH,WALK2_DIRLIST,0}; if(*WalkFont || (PrfQueryProfileData(fmprof, appname, "WalkFont", (PVOID)WalkFont, &WalkFontSize) && WalkFontSize)) { for(x = 0;id[x];x++) WinSetPresParam(WinWindowFromID(hwnd,id[x]), PP_FONTNAMESIZE, WalkFontSize, (PVOID)WalkFont); } } return 0; case UM_CONTROL: case WM_CONTROL: wa = WinQueryWindowPtr(hwnd,0); if(SHORT1FROMMP(mp1) == WALK_DRIVELIST || SHORT1FROMMP(mp1) == WALK_DIRLIST || SHORT1FROMMP(mp1) == WALK2_DRIVELIST || SHORT1FROMMP(mp1) == WALK2_DIRLIST) { sSelect = (USHORT)WinSendDlgItemMsg(hwnd, SHORT1FROMMP(mp1), LM_QUERYSELECTION, MPVOID,MPVOID); *szBuffer = 0; if(sSelect >= 0) WinSendDlgItemMsg(hwnd,SHORT1FROMMP(mp1),LM_QUERYITEMTEXT, MPFROM2SHORT(sSelect,CCHMAXPATH), MPFROMP(szBuffer)); } switch(SHORT1FROMMP(mp1)) { case WALK_DRIVELIST: if(okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) { ULONG ulDirLen = CCHMAXPATH; APIRET rc; rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3],&ulDirLen); if(!rc) { strcpy(wa->szCurrentPath1,"C:\\"); *wa->szCurrentPath1 = toupper(*szBuffer); WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath1,FALSE); } } break; case WALK_DIRLIST: if(okay && SHORT2FROMMP(mp1) == LN_ENTER) { ULONG ulSearchCount; FILEFINDBUF3 findbuf; HDIR hDir; APIRET rc; lstrip(rstrip(szBuffer)); if(*szBuffer) { strcpy(szBuff,wa->szCurrentPath1); if(szBuff[strlen(szBuff) - 1] != '\\') strcat(szBuff,"\\"); strcat(szBuff,szBuffer); MakeFullName(szBuff); DosError(FERR_DISABLEHARDERR); hDir = HDIR_CREATE; ulSearchCount = 1L; if(!IsRoot(szBuff)) { rc = DosFindFirst(szBuff, &hDir, FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD); if(!rc) DosFindClose(hDir); } else { findbuf.attrFile = FILE_DIRECTORY; rc = 0; } if(!rc && (findbuf.attrFile & FILE_DIRECTORY)) { strcpy(wa->szCurrentPath1,szBuff); WinSetDlgItemText(hwnd,WALK_PATH,wa->szCurrentPath1); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK_DRIVELIST), WinWindowFromID(hwnd,WALK_DIRLIST), wa->szCurrentPath1,FALSE); } } } break; case WALK2_DRIVELIST: if(okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) { ULONG ulDirLen = CCHMAXPATH; APIRET rc; rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3],&ulDirLen); if(!rc) { strcpy(wa->szCurrentPath2,"C:\\"); *wa->szCurrentPath2 = toupper(*szBuffer); WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK2_DRIVELIST), WinWindowFromID(hwnd,WALK2_DIRLIST), wa->szCurrentPath2,FALSE); } } break; case WALK2_DIRLIST: if(okay && SHORT2FROMMP(mp1) == LN_ENTER) { ULONG ulSearchCount; FILEFINDBUF3 findbuf; HDIR hDir; APIRET rc; lstrip(rstrip(szBuffer)); if(*szBuffer) { strcpy(szBuff,wa->szCurrentPath2); if(szBuff[strlen(szBuff) - 1] != '\\') strcat(szBuff,"\\"); strcat(szBuff,szBuffer); MakeFullName(szBuff); DosError(FERR_DISABLEHARDERR); hDir = HDIR_CREATE; ulSearchCount = 1L; if(!IsRoot(szBuff)) { rc = DosFindFirst(szBuff, &hDir, FILE_DIRECTORY | MUST_HAVE_DIRECTORY | FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN, &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD); if(!rc) DosFindClose(hDir); } else { findbuf.attrFile = FILE_DIRECTORY; rc = 0; } if(!rc && (findbuf.attrFile & FILE_DIRECTORY)) { strcpy(wa->szCurrentPath2,szBuff); WinSetDlgItemText(hwnd,WALK2_PATH,wa->szCurrentPath2); FillPathListBox(hwnd, WinWindowFromID(hwnd,WALK2_DRIVELIST), WinWindowFromID(hwnd,WALK2_DIRLIST), wa->szCurrentPath2,FALSE); } } } break; } return 0; case WM_COMMAND: wa = WinQueryWindowPtr(hwnd,0); if(!wa) WinDismissDlg(hwnd,0); *szBuff = 0; WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff); lstrip(rstrip(szBuff)); while((p = strchr(szBuff,'/')) != NULL) *p = '\\'; while(strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\') szBuff[strlen(szBuff) - 1] = 0; MakeFullName(szBuff); if(*szBuff && stricmp(szBuff,wa->szCurrentPath1)) { if(!SetDir(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT), QW_OWNER), hwnd, szBuff, 0)) strcpy(wa->szCurrentPath1,szBuff); else if(SHORT1FROMMP(mp1) != DID_CANCEL) return 0; } WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1); *szBuff = 0; WinQueryDlgItemText(hwnd, WALK2_PATH, CCHMAXPATH, szBuff); lstrip(rstrip(szBuff)); while((p = strchr(szBuff,'/')) != NULL) *p = '\\'; while(strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\') szBuff[strlen(szBuff) - 1] = 0; MakeFullName(szBuff); if(*szBuff && stricmp(szBuff,wa->szCurrentPath2)) { if(!SetDir(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT), QW_OWNER), hwnd, szBuff, 0)) strcpy(wa->szCurrentPath2,szBuff); else if(SHORT1FROMMP(mp1) != DID_CANCEL) return 0; } WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2); switch(SHORT1FROMMP(mp1)) { case DID_OK: WinDismissDlg(hwnd,1); break; case IDM_HELP: if(hwndHelp) WinSendMsg(hwndHelp, HM_DISPLAY_HELP, MPFROM2SHORT(HELP_WALKEM2,0), MPFROMSHORT(HM_RESOURCEID)); break; case DID_CANCEL: WinDismissDlg(hwnd,0); break; } return 0; case WM_CLOSE: break; } return WinDefDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkTwoCmpDlgProc (HWND hwnd,ULONG msg,MPARAM mp1, MPARAM mp2) { switch(msg) { case WM_INITDLG: WinSetWindowText(hwnd, GetPString(IDS_WALKCOMPAREDLGTEXT)); return WalkTwoDlgProc(hwnd, UM_SETUP2, mp1, mp2); } return WalkTwoDlgProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY WalkTwoSetDlgProc (HWND hwnd,ULONG msg,MPARAM mp1, MPARAM mp2) { switch(msg) { case WM_INITDLG: WinSetWindowText(hwnd, GetPString(IDS_WALKSETDIRSDLGTEXT)); return WalkTwoDlgProc(hwnd, UM_SETUP2, mp1, mp2); } return WalkTwoDlgProc(hwnd,msg,mp1,mp2); }