/*********************************************************************** $Id: archive.c 1498 2010-01-18 00:57:01Z gyoung $ Archive create/update dialog procedure Copyright (c) 1993-98 M. Kimes Copyright (c) 2004, 2010 Steven H.Levine 01 Aug 04 SHL Rework lstrip/rstrip usage 28 Jun 06 SHL Drop obsoletes 17 Jul 06 SHL Use Runtime_Error 22 Mar 07 GKY Use QWL_USER 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook. 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *. ***********************************************************************/ #include #define INCL_WIN #define INCL_DOS #define INCL_LONGLONG // dircnrs.h #include "fm3dll.h" #include "fm3dll2.h" // #define's for UM_*, control id's, etc. #include "notebook.h" // Data declaration(s) #include "fm3dlg.h" #include "fm3str.h" #include "strutil.h" // GetPString #include "errutil.h" // Runtime_Error #include "archive.h" #include "systemf.h" // ExecOnList #include "chklist.h" // PosOverOkay #include "getnames.h" // export_filename #include "misc.h" // PaintRecessedWindow #include "strips.h" // bstrip static PSZ pszSrcFile = __FILE__; MRESULT EXPENTRY ArchiveDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { DIRCNRDATA *arcdata = NULL; switch (msg) { case WM_INITDLG: WinSetWindowPtr(hwnd, QWL_USER, mp2); arcdata = (DIRCNRDATA *) mp2; WinSendDlgItemMsg(hwnd, ARCH_ARCNAME, EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID); if (!arcdata->namecanchange) { WinSendDlgItemMsg(hwnd, ARCH_ARCNAME, EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID); WinEnableWindow(WinWindowFromID(hwnd, ARCH_FIND), FALSE); WinShowWindow(WinWindowFromID(hwnd, ARCH_FIND), FALSE); } WinSendDlgItemMsg(hwnd, ARCH_COMMAND, EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), MPVOID); WinSendDlgItemMsg(hwnd, ARCH_MASKS, EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), MPVOID); WinSetDlgItemText(hwnd, ARCH_ARCNAME, arcdata->arcname); if (arcdata->fmoving && arcdata->info->move) { WinSetDlgItemText(hwnd, ARCH_COMMAND, arcdata->info->move); WinSendDlgItemMsg(hwnd, ARCH_MOVE, BM_SETCHECK, MPFROM2SHORT(TRUE, 0), MPVOID); } else WinSetDlgItemText(hwnd, ARCH_COMMAND, arcdata->info->create); if (!arcdata->info->createrecurse) WinEnableWindow(WinWindowFromID(hwnd, ARCH_RECURSE), FALSE); if (!arcdata->info->move && !arcdata->info->movewdirs) WinEnableWindow(WinWindowFromID(hwnd, ARCH_MOVE), FALSE); if (!arcdata->info->createwdirs && !arcdata->info->movewdirs) WinEnableWindow(WinWindowFromID(hwnd, ARCH_INCLPATH), FALSE); *arcdata->command = 0; PosOverOkay(hwnd); break; case WM_ADJUSTWINDOWPOS: PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID); break; case UM_SETDIR: PaintRecessedWindow(WinWindowFromID(hwnd, ARCH_HELP), (HPS) 0, FALSE, TRUE); return 0; case WM_CONTROL: arcdata = (DIRCNRDATA *) WinQueryWindowPtr(hwnd, QWL_USER); switch (SHORT1FROMMP(mp1)) { case ARCH_ARCNAME: if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) WinSetDlgItemText(hwnd, ARCH_HELP, (CHAR *) GetPString(IDS_ARCDEFAULTHELPTEXT)); if (SHORT2FROMMP(mp1) == EN_SETFOCUS) WinSetDlgItemText(hwnd, ARCH_HELP, (CHAR *) GetPString(IDS_ARCARCNAMEHELPTEXT)); break; case ARCH_COMMAND: if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) WinSetDlgItemText(hwnd, ARCH_HELP, (CHAR *) GetPString(IDS_ARCDEFAULTHELPTEXT)); if (SHORT2FROMMP(mp1) == EN_SETFOCUS) WinSetDlgItemText(hwnd, ARCH_HELP, (CHAR *) GetPString(IDS_ARCCMDHELPTEXT)); break; case ARCH_MASKS: if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) WinSetDlgItemText(hwnd, ARCH_HELP, (CHAR *) GetPString(IDS_ARCDEFAULTHELPTEXT)); if (SHORT2FROMMP(mp1) == EN_SETFOCUS) WinSetDlgItemText(hwnd, ARCH_HELP, (CHAR *) GetPString(IDS_ARCMASKHELPTEXT)); break; case ARCH_INCLPATH: case ARCH_RECURSE: case ARCH_MOVE: { BOOL fRecurse = FALSE, fMove = FALSE, fInclDirs = FALSE; CHAR *cmd; if ((BOOL) WinSendDlgItemMsg(hwnd, ARCH_RECURSE, BM_QUERYCHECK, MPVOID, MPVOID)) { fRecurse = TRUE; if (SHORT1FROMMP(mp1) == ARCH_RECURSE) { if (arcdata->info->createrecurse && *arcdata->info->createrecurse) { fMove = FALSE; fInclDirs = FALSE; WinSendDlgItemMsg(hwnd, ARCH_INCLPATH, BM_SETCHECK, MPVOID, MPVOID); WinSendDlgItemMsg(hwnd, ARCH_MOVE, BM_SETCHECK, MPVOID, MPVOID); } else { fRecurse = FALSE; WinSendDlgItemMsg(hwnd, ARCH_RECURSE, BM_SETCHECK, MPVOID, MPVOID); } } } else fRecurse = FALSE; if ((BOOL) WinSendDlgItemMsg(hwnd, ARCH_MOVE, BM_QUERYCHECK, MPVOID, MPVOID)) { fMove = TRUE; fRecurse = FALSE; WinSendDlgItemMsg(hwnd, ARCH_RECURSE, BM_SETCHECK, MPVOID, MPVOID); } else fMove = FALSE; if ((BOOL) WinSendDlgItemMsg(hwnd, ARCH_INCLPATH, BM_QUERYCHECK, MPVOID, MPVOID)) { fInclDirs = TRUE; fRecurse = FALSE; WinSendDlgItemMsg(hwnd, ARCH_RECURSE, BM_SETCHECK, MPVOID, MPVOID); } else fInclDirs = FALSE; cmd = NULL; if (fMove) { if (fInclDirs || fRecurse) cmd = arcdata->info->movewdirs; else cmd = arcdata->info->move; if (!cmd || !*cmd) cmd = arcdata->info->move; } if (!cmd || !*cmd) { if (fInclDirs) { cmd = arcdata->info->createwdirs; if (!cmd || !*cmd) cmd = arcdata->info->createrecurse; } else if (fRecurse) { cmd = arcdata->info->createrecurse; if (!cmd || !*cmd) cmd = arcdata->info->createwdirs; } if (!cmd || !*cmd) cmd = arcdata->info->create; } if (cmd) WinSetDlgItemText(hwnd, ARCH_COMMAND, cmd); } break; } return 0; case WM_COMMAND: arcdata = (DIRCNRDATA *) WinQueryWindowPtr(hwnd, QWL_USER); if (!arcdata) { Runtime_Error(pszSrcFile, __LINE__, NULL); return 0; } switch (SHORT1FROMMP(mp1)) { case DID_CANCEL: WinDismissDlg(hwnd, 0); break; case DID_OK: { CHAR s[CCHMAXPATH + 1]; *s = 0; WinQueryDlgItemText(hwnd, ARCH_ARCNAME, CCHMAXPATH, s); bstrip(s); if (*s) { if (DosQueryPathInfo(s, FIL_QUERYFULLNAME, arcdata->arcname, CCHMAXPATH)) strcpy(arcdata->arcname, s); *s = 0; WinQueryDlgItemText(hwnd, ARCH_COMMAND, 256, s); if (*s) { strcpy(arcdata->command, s); *s = 0; WinQueryDlgItemText(hwnd, ARCH_MASKS, 256, s); *arcdata->mask.szMask = 0; strcpy(arcdata->mask.szMask, s); WinDismissDlg(hwnd, 1); break; } } } if (!fAlertBeepOff) DosBeep(50, 100); break; case IDM_HELP: if (hwndHelp) WinSendMsg(hwndHelp, HM_DISPLAY_HELP, MPFROM2SHORT(HELP_ARCHIVE, 0), MPFROMSHORT(HM_RESOURCEID)); break; case ARCH_FIND: if (arcdata->namecanchange) { CHAR arcname[CCHMAXPATH], s[CCHMAXPATH], *p; *s = 0; WinQueryDlgItemText(hwnd, ARCH_ARCNAME, CCHMAXPATH, s); bstrip(s); if (DosQueryPathInfo(s, FIL_QUERYFULLNAME, arcname, CCHMAXPATH)) strcpy(arcname, s); p = strrchr(arcname, '\\'); if (p) { p++; p = strrchr(arcname, '.'); } if (!p && arcdata->info->ext && *arcdata->info->ext) { strcat(arcname, "*."); strcat(arcname, arcdata->info->ext); } if (export_filename(hwnd, arcname, FALSE)) WinSetDlgItemText(hwnd, ARCH_ARCNAME, arcname); } break; case ARCH_SEE: { CHAR s[1001], *p; *s = 0; WinQueryDlgItemText(hwnd, ARCH_COMMAND, 256, s); bstrip(s); if (*s) { p = strchr(s, ' '); if (p) *p = 0; ExecOnList(hwnd, s, WINDOWED | SEPARATEKEEP | MAXIMIZED | PROMPT, NULL, NULL, NULL, GetPString(IDS_ARCEXECHELPTEXT), pszSrcFile, __LINE__); } else if (!fErrorBeepOff) DosBeep(50, 100); } break; } return 0; case WM_CLOSE: break; } return WinDefDlgProc(hwnd, msg, mp1, mp2); } #pragma alloc_text(FMARCHIVE,ArchiveDlgProc)