/* Windows Info-ZIP Unzip Window Procedure, wndproc.c. * Author: Robert A. Heath, 157 Chartwell Rd., Columbia, SC 29210 * I, Robert Heath, place this source code module in the public domain. * * Modifications: 1995 M. White */ #include #include #include #include #include #include "wingui\wizunzip.h" #include "wingui\helpids.h" #include "wingui\password.h" #define UNZIP_INTERNAL #include "unzip.h" #include "crypt.h" #include #include #define MAKE_TABSTOP_TABLE_ENTRY(WNDHANDLE, ID) \ { \ TabStopTable[ID - TABSTOP_ID_BASE].lpfnOldFunc = \ (FARPROC)GetWindowLong(WNDHANDLE, GWL_WNDPROC); \ SetWindowLong(WNDHANDLE, GWL_WNDPROC, (LONG)lpfnKbd); \ TabStopTable[ID - TABSTOP_ID_BASE].hWnd = WNDHANDLE; \ } #ifdef USEWIZUNZDLL char Far HeadersS[] = " Length Date Time Name"; char Far HeadersS1[] = " ------ ---- ---- ----"; char Far HeadersL[] = " Length Method Size Ratio Date Time CRC-32 Name"; char Far HeadersL1[] = " ------ ------ ---- ----- ---- ---- ------ ----"; char Far *Headers[][2] = { {HeadersS, HeadersS1}, {HeadersL, HeadersL1} }; #endif /* Forward Refs */ static void GetArchiveDir(LPSTR lpszDestDir); void GetDirectory(LPSTR lpDir); HWND hPatternSelectDlg; /* pattern select modeless dialog */ static UINT uCommDlgHelpMsg; /* common dialog help message ID */ static DWORD dwCommDlgHelpId = HELPID_HELP; /* what to pass to WinHelp() */ static char szFormatKeyword[2][6] = { "short", "long" }; static BOOL move_flag = FALSE; static BOOL rename_flag = FALSE; LPSTR lpchLast; /* Trailers are the lines just above the totals */ static char * __based(__segname("STRINGS_TEXT")) szTrailers[2] = { " ------ -------", " ------ ------ --- -------" } ; static char __based(__segname("STRINGS_TEXT")) szCantChDir[] = "Internal error: Cannot change directory. Common dialog error code is 0x%lX."; /* size of char in SYSTEM font in pixels */ #ifndef WIN32 short dxChar, dyChar; #else long dxChar, dyChar; #endif /* button control table -- one entry for * each of 4 entries. Indexed by the window ID relative to * the first tabstop (TABSTOP_ID_BASE). */ TabStopEntry TabStopTable[TABSTOP_TABLE_ENTRIES]; LPSTR lstrrchr(LPSTR lpszSrc, char chFind) { LPSTR lpszFound = (LPSTR)0; LPSTR lpszT; if ( lpszSrc ) { for (lpszT = lpszSrc; *lpszT; ++lpszT) { if ((*lpszT) == chFind) lpszFound = lpszT; } } return lpszFound; } /* Copy only the path portion of current file name into * given buffer, lpszDestDir, translate into ANSI. */ static void GetArchiveDir(LPSTR lpszDestDir) { LPSTR lpchLast; /* strip off filename to make directory name */ OemToAnsi(lpumb->szFileName, lpszDestDir); if ((lpchLast = lstrrchr(lpszDestDir, '\\'))!=0) *lpchLast = '\0'; else if ((lpchLast = lstrrchr(lpszDestDir, ':'))!=0) *(++lpchLast) = '\0'; /* clobber char AFTER the colon! */ } void GetDirectory(LPSTR lpDir) { LPSTR lpchLast; /* If no '\\' then set directory name to "" */ if ((lpchLast = lstrrchr(lpDir, '\\')) == 0) { lpDir[0] = '\0'; return; } /* strip off filename to make directory name */ if ((lpchLast = lstrrchr(lpDir, '\\'))!=0) *lpchLast = '\0'; else if ((lpchLast = lstrrchr(lpDir, ':'))!=0) *(++lpchLast) = '\0'; /* clobber char AFTER the colon! */ } /* * FUNCTION: SetCaption(HWND hWnd) * PURPOSE: Set new caption for main window */ void SetCaption(HWND hWnd) { #define SIMPLE_NAME_LEN 15 static BOOL FirstTime = TRUE; WORD wMenuState; char szSimpleFileName[SIMPLE_NAME_LEN+1]; /* just the 8.3 part in ANSI char set */ LPSTR lpszFileNameT; /* pointer to simple filename */ BOOL fIconic = IsIconic(hWnd); /* is window iconic ? */ BOOL fWndEnabled; /* Is button to be enabled? */ /* point to simple filename in OEM char set */ if ((((lpszFileNameT = lstrrchr(lpumb->szFileName, '\\'))!=0) || ((lpszFileNameT = lstrrchr(lpumb->szFileName, ':')))!=0)) lpszFileNameT++; else lpszFileNameT = lpumb->szFileName; #ifndef WIN32 _fstrncpy(szSimpleFileName, lpszFileNameT, SIMPLE_NAME_LEN); #else strncpy(szSimpleFileName, lpszFileNameT, SIMPLE_NAME_LEN); #endif szSimpleFileName[SIMPLE_NAME_LEN] = '\0'; /* force termination */ wMenuState = (WORD)(szSimpleFileName[0] ? MF_ENABLED : MF_GRAYED); fWndEnabled = (BOOL) (szSimpleFileName[0] ? TRUE : FALSE); /* Enable/Disable menu items */ EnableMenuItem(hMenu, IDM_SELECT_ALL, wMenuState|MF_BYCOMMAND); EnableMenuItem(hMenu, IDM_DESELECT_ALL, wMenuState|MF_BYCOMMAND); EnableMenuItem(hMenu, IDM_SELECT_BY_PATTERN, wMenuState|MF_BYCOMMAND); /* Enable/Disable buttons */ if (!FirstTime) { WinAssert(hSelectAll); EnableWindow( hSelectAll, fWndEnabled); WinAssert(hDeselectAll); EnableWindow( hDeselectAll, fWndEnabled); WinAssert(hSelectPattern); EnableWindow( hSelectPattern, fWndEnabled); } if (!szSimpleFileName[0]) lstrcpy(szSimpleFileName, "No Zip File"); OemToAnsi(szSimpleFileName, szSimpleFileName); wsprintf(lpumb->szBuffer, "%s - %s %s %s", (LPSTR)szAppName, (LPSTR)(szSimpleFileName), (LPSTR)(!fIconic && lpumb->szUnzipToDirName[0] ? " - " : ""), (LPSTR)(!fIconic ? lpumb->szUnzipToDirName : "")); SetWindowText(hWnd, lpumb->szBuffer); FirstTime = FALSE; } static void ManageStatusWnd(WPARAM wParam); static void ManageStatusWnd(WPARAM wParam) { int nWndState; /* ShowWindow state */ BOOL fWndEnabled; /* Enable Window state */ if (LOWORD(wParam) == IDM_SPLIT) { WinAssert(hWndStatus); ShowWindow(hWndStatus, SW_RESTORE); UpdateWindow(hWndStatus); fWndEnabled = TRUE; nWndState = SW_SHOWNORMAL; } else /* Message window goes to maximum state */ { nWndState = SW_HIDE; /* assume max state */ fWndEnabled = FALSE; } wWindowSelection = LOWORD(wParam); /* window selection: listbox, status, both */ WinAssert(hWndList); EnableWindow( hWndList, fWndEnabled); UpdateWindow( hWndList); ShowWindow( hWndList, nWndState); if (LOWORD(wParam) == IDM_SPLIT) /* uncover buttons */ { UpdateButtons(hWndMain); /* restore to proper state */ } else { /* Disable Extract, Display, Test, and Comment buttons */ WinAssert(hExtract); EnableWindow( hExtract, fWndEnabled); WinAssert(hTest); EnableWindow( hTest, fWndEnabled); WinAssert(hDisplay); EnableWindow( hDisplay, fWndEnabled); WinAssert(hShowComment); EnableWindow( hShowComment, fWndEnabled); } UpdateWindow(hExtract); UpdateWindow(hTest); UpdateWindow(hDisplay); UpdateWindow(hShowComment); if (LOWORD(wParam) == IDM_MAX_STATUS) /* message box max'd out */ { WinAssert(hWndStatus); ShowWindow(hWndStatus, SW_SHOWMAXIMIZED); } SetFocus(hWndStatus); SizeWindow(hWndMain, FALSE); } /* * FUNCTION: WizunzipWndProc(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages * * MESSAGES: * * WM_DESTROY - destroy window * WM_SIZE - window size has changed * WM_QUERYENDSESSION - willing to end session? * WM_ENDSESSION - end Windows session * WM_CLOSE - close the window * WM_SIZE - window resized * WM_PAINT - windows needs to be painted * WM_DROPFILES - open a dropped file * COMMENTS: * WM_COMMAND processing: * IDM_OPEN - open a new file. * IDM_EXIT - exit. * IDM_ABOUT - display "About" box. */ long WINAPI WizUnzipWndProc(HWND hWnd, WORD wMessage, WPARAM wParam, LPARAM lParam) { HDC hDC; /* device context */ TEXTMETRIC tm; /* text metric structure */ POINT point; char drive; #ifndef WIN32 FARPROC lpfnAbout, lpfnSelectDir; #endif FARPROC lpfnKbd; char *ptr; switch (wMessage) { case WM_CREATE: /* create window */ hInst = ((LPCREATESTRUCT)lParam)->hInstance; lpfnKbd = MakeProcInstance((FARPROC)KbdProc, hInst); hAccTable = LoadAccelerators(hInst, "WizunzipAccels"); hBrush = CreateSolidBrush(GetSysColor(BG_SYS_COLOR)); /* background */ hMenu = GetMenu(hWnd); /* Check Menu items to reflect .INI settings */ CheckMenuItem(hMenu, IDM_RECR_DIR_STRUCT, MF_BYCOMMAND | (uf.fRecreateDirs ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hMenu, IDM_SHOW_BUBBLE_HELP, MF_BYCOMMAND | (uf.fShowBubbleHelp ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hMenu, (IDM_SHORT+uf.fFormatLong), MF_BYCOMMAND | MF_CHECKED); CheckMenuItem(hMenu, IDM_PROMPT_TO_OVERWRITE, MF_BYCOMMAND | (lpDCL->PromptToOverwrite ? MF_CHECKED : MF_UNCHECKED)); if (!lpDCL->PromptToOverwrite) { ModifyMenu(hMenu, IDM_OVERWRITE, MF_BYCOMMAND | MF_ENABLED, IDM_OVERWRITE, (lpDCL->Overwrite ? "Always Overwrite Existing Files": "Never Overwrite Existing Files")); CheckMenuItem(hMenu, IDM_OVERWRITE, MF_BYCOMMAND |MF_CHECKED); CheckMenuItem(hMenu, IDM_EXTRACT_ONLY_NEWER, MF_BYCOMMAND | (lpDCL->ExtractOnlyNewer ? MF_CHECKED : MF_UNCHECKED)); } else { EnableMenuItem(hMenu, IDM_OVERWRITE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); EnableMenuItem(hMenu, IDM_EXTRACT_ONLY_NEWER, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); } CheckMenuItem(hMenu, IDM_TRANSLATE, MF_BYCOMMAND | (uf.fTranslate ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hMenu, IDM_SPACE_TO_UNDERSCORE, MF_BYCOMMAND | (lpDCL->SpaceToUnderscore ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hMenu, IDM_SAVE_UNZIP_TO_DIR, MF_BYCOMMAND | (uf.fSaveUnZipToDir ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hMenu, IDM_SAVE_UNZIP_FROM_DIR, MF_BYCOMMAND | (uf.fSaveUnZipFromDir ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hMenu, wLBSelection, MF_BYCOMMAND | MF_CHECKED); CheckMenuItem(hMenu, IDM_UNZIP_TO_ZIP_DIR, MF_BYCOMMAND | (uf.fUnzipToZipDir ? MF_CHECKED : MF_UNCHECKED)); EnableMenuItem(hMenu, IDM_CHDIR, MF_BYCOMMAND | (uf.fUnzipToZipDir ? MF_GRAYED : MF_ENABLED)); CheckMenuItem(hMenu, IDM_AUTOCLEAR_STATUS, MF_BYCOMMAND | (uf.fAutoClearStatus ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hMenu, IDM_AUTOCLEAR_DISPLAY, MF_BYCOMMAND | (uf.fAutoClearDisplay ? MF_CHECKED : MF_UNCHECKED)); EnableMenuItem(hMenu, IDM_COPY, MF_GRAYED); /* Get an hourglass cursor to use during file transfers */ hHourGlass = LoadCursor(0, IDC_WAIT); hFixedFont = GetStockObject(SYSTEM_FIXED_FONT); hDC = GetDC(hWnd); /* get device context */ hOldFont = SelectObject(hDC, hFixedFont); GetTextMetrics(hDC, &tm); ReleaseDC(hWnd, hDC); dxChar = tm.tmAveCharWidth; dyChar = tm.tmHeight + tm.tmExternalLeading; WinAssert(hWnd); #ifndef WIN32 hWndList = CreateWindow("listbox", NULL, WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|LBS_NOTIFY| LBS_EXTENDEDSEL, 0, 0, 0, 0, hWnd, (HMENU)IDM_LISTBOX, GetWindowWord (hWnd, GWW_HINSTANCE), NULL); #else hWndList = CreateWindow("listbox", NULL, WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|LBS_NOTIFY| LBS_EXTENDEDSEL, 0, 0, 0, 0, hWnd, (HMENU)IDM_LISTBOX, (HANDLE)GetWindowLong (hWnd, GWL_HINSTANCE), NULL); #endif WinAssert(hWndList); MAKE_TABSTOP_TABLE_ENTRY(hWndList, IDM_LISTBOX); SendMessage(hWndList, WM_SETFONT, (WPARAM)hFixedFont, FALSE); ShowWindow(hWndList, SW_SHOW); UpdateWindow(hWndList); /* show it now! */ WinAssert(hWnd); #ifndef WIN32 hWndStatus = CreateWindow(szStatusClass, "Status/Display", WS_CHILD|WS_SYSMENU|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|WS_MAXIMIZEBOX|WS_CAPTION, 0, 0, 0, 0, hWnd, (HMENU)IDM_STATUS, GetWindowWord (hWnd, GWW_HINSTANCE), NULL); #else hWndStatus = CreateWindow(szStatusClass, "Status/Display", WS_CHILD|WS_SYSMENU|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|WS_MAXIMIZEBOX|WS_CAPTION, 0, 0, 0, 0, hWnd, (HMENU)IDM_STATUS, (HANDLE)GetWindowLong (hWnd, GWL_HINSTANCE), NULL); #endif WinAssert(hWndStatus); SendMessage(hWndStatus, WM_SETFONT, (WPARAM)hFixedFont, TRUE); MAKE_TABSTOP_TABLE_ENTRY(hWndStatus, IDM_STATUS); /* if file spec'd on entry */ if (lpumb->szFileName[0]) { LPSTR lpch; extern int ofretval; /* return value from initial open if filename given during WinMain() */ /* If valid filename change dir to where it lives */ if (ofretval >= 0) { GetArchiveDir(lpumb->szDirName); /* get archive dir. in ANSI char set */ if (uf.fUnzipToZipDir || /* unzipping to same directory as archive */ lpumb->szUnzipToDirName[0] == '\0') /* or no default */ { /* take only path portion */ lstrcpy(lpumb->szUnzipToDirName, lpumb->szDirName); } lstrcpy(lpumb->szBuffer, lpumb->szDirName); DlgDirList(hWnd, lpumb->szBuffer, 0, 0, 0); /* go to where archive lives */ } else /* bad file name */ { OemToAnsi(lpumb->szFileName, lpumb->szFileName); /* temporarily OEM */ if ((((lpch = lstrrchr(lpumb->szFileName, '\\'))!=0) || ((lpch = lstrrchr(lpumb->szFileName, ':')))!=0)) lpch++; /* point to filename */ else lpch = lpumb->szFileName; wsprintf (lpumb->szBuffer, "Cannot open %s", lpch); MessageBox (hWnd, lpumb->szBuffer, szAppName, MB_ICONINFORMATION | MB_OK); lpumb->szFileName[0] = '\0'; /* pretend filename doesn't exist */ lpumb->szDirName[0] = '\0'; /* pretend archive dir. doesn't exist */ } } SetCaption(hWnd); UpdateListBox(hWnd); SendMessage(hWndList, LB_SETSEL, 1, 0L); uCommDlgHelpMsg = RegisterWindowMessage((LPSTR)HELPMSGSTRING); /* register open help message */ if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case WM_SETFOCUS: SetFocus((wWindowSelection == IDM_MAX_STATUS) ? hWndStatus : hWndList); break; case WM_ACTIVATE: SetCaption(hWnd); return DefWindowProc(hWnd, wMessage, wParam, lParam); case WM_SIZE: SizeWindow(hWnd, FALSE); break; /* * NOTE: WM_CTLCOLOR is not a supported code under Win 32 */ #ifdef WIN32 case WM_CTLCOLORBTN: case WM_CTLCOLORSTATIC: #else case WM_CTLCOLOR: /* color background of buttons and statics */ if (HIWORD(lParam) == CTLCOLOR_STATIC) #endif { SetBkMode((HDC)wParam, TRANSPARENT); SetBkColor((HDC)wParam, GetSysColor(BG_SYS_COLOR)); /* custom b.g. color */ SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT)); UnrealizeObject(hBrush); point.x = point.y = 0; ClientToScreen(hWnd, &point); #ifndef WIN32 SetBrushOrg((HDC)wParam, point.x, point.y); #else SetBrushOrgEx((HDC)wParam, point.x, point.y, NULL); #endif return ((DWORD)hBrush); } /* fall thru to WM_SYSCOMMAND */ case WM_SYSCOMMAND: return DefWindowProc( hWnd, wMessage, wParam, lParam ); case WM_INITMENUPOPUP: /* popup menu pre-display */ { /* BOOL bOutcome; MW: Removed to allow multiple pop-up menus */ switch (LOWORD(lParam)) { case EDIT_MENUITEM_POS: /* index of Edit pop-up */ /* bOutcome = EnableMenuItem((HMENU)wParam, IDM_COPY, */ EnableMenuItem((HMENU)wParam, IDM_COPY, (UINT)(StatusInWindow() ? MF_ENABLED : MF_GRAYED)); EnableWindow(hCopyStatus, (UINT)(StatusInWindow() ? TRUE : FALSE)); /* assert(bOutcome != -1); -1 => Menu item doesn't exist */ break; } } break; case WM_COMMAND: /* Was F1 just pressed in a menu, or are we in help mode */ /* (Shift-F1)? */ if (uf.fHelp) { DWORD dwHelpContextId = (LOWORD(wParam) == IDM_OPEN) ? (DWORD) HELPID_OPEN : (LOWORD(wParam) == IDM_EXIT) ? (DWORD) HELPID_EXIT_CMD : (LOWORD(wParam) == IDM_CHDIR) ? (DWORD) HELPID_CHDIR : (LOWORD(wParam) == IDM_SHORT) ? (DWORD) HELPID_SHORT : (LOWORD(wParam) == IDM_LONG) ? (DWORD) HELPID_LONG : (LOWORD(wParam) == IDM_HELP) ? (DWORD) HELPID_HELP : (LOWORD(wParam) == IDM_HELP_HELP) ? (DWORD) HELPID_HELP_HELP : (LOWORD(wParam) == IDM_ABOUT) ? (DWORD) HELPID_ABOUT : (LOWORD(wParam) == IDM_RECR_DIR_STRUCT) ? (DWORD) HELPID_RECR_DIR_STRUCT : (LOWORD(wParam) == IDM_SHOW_BUBBLE_HELP) ? (DWORD) HELPID_SHOW_BUBBLE_HELP : (LOWORD(wParam) == IDM_OVERWRITE) ? (DWORD) HELPID_OVERWRITE : (LOWORD(wParam) == IDM_PROMPT_TO_OVERWRITE) ? (DWORD) HELPID_PROMPT_TO_OVERWRITE : (LOWORD(wParam) == IDM_TRANSLATE) ? (DWORD) HELPID_TRANSLATE : (LOWORD(wParam) == IDM_UNZIP_TO_ZIP_DIR)? (DWORD) HELPID_UNZIP_TO_ZIP_DIR : (LOWORD(wParam) == IDM_UNZIP_FROM_DIR)? (DWORD) HELPID_UNZIP_FROM_DIR : (LOWORD(wParam) == IDM_LISTBOX) ? (DWORD) HELPID_LISTBOX : (LOWORD(wParam) == IDM_EXTRACT) ? (DWORD) HELPID_EXTRACT : (LOWORD(wParam) == IDM_DISPLAY) ? (DWORD) HELPID_DISPLAY : (LOWORD(wParam) == IDM_TEST) ? (DWORD) HELPID_TEST : (LOWORD(wParam) == IDM_SHOW_COMMENT) ? (DWORD) HELPID_SHOW_COMMENT : (LOWORD(wParam) == IDM_LB_EXTRACT) ? (DWORD) HELPID_LB_EXTRACT : (LOWORD(wParam) == IDM_LB_DISPLAY) ? (DWORD) HELPID_LB_DISPLAY : (LOWORD(wParam) == IDM_LB_TEST) ? (DWORD) HELPID_LB_TEST : (LOWORD(wParam) == IDM_DESELECT_ALL) ? (DWORD) HELPID_DESELECT_ALL : (LOWORD(wParam) == IDM_SELECT_ALL) ? (DWORD) HELPID_SELECT_ALL : (LOWORD(wParam) == IDM_SELECT_BY_PATTERN) ? (DWORD) HELPID_SELECT_BY_PATTERN : (LOWORD(wParam) == IDM_AUTOCLEAR_STATUS) ? (DWORD) HELPID_AUTOCLEAR_STATUS : (LOWORD(wParam) == IDM_AUTOCLEAR_DISPLAY) ? (DWORD) HELPID_AUTOCLEAR_DISPLAY : (LOWORD(wParam) == IDM_CLEAR_STATUS) ? (DWORD) HELPID_CLEAR_STATUS : (LOWORD(wParam) == IDM_SOUND_OPTIONS) ? (DWORD) HELPID_SOUND_OPTIONS : (LOWORD(wParam) == IDM_MAX_LISTBOX) ? (DWORD) HELPID_MAX_LISTBOX : (LOWORD(wParam) == IDM_MAX_STATUS) ? (DWORD) HELPID_MAX_STATUS : (LOWORD(wParam) == IDM_SPLIT) ? (DWORD) HELPID_SPLIT : (LOWORD(wParam) == IDM_SAVE_UNZIP_FROM_DIR) ? (DWORD) HELPID_SAVE_UNZIP_FROM_DIR : (LOWORD(wParam) == IDM_SAVE_UNZIP_TO_DIR) ? (DWORD) HELPID_SAVE_UNZIP_TO_DIR : (LOWORD(wParam) == IDM_EXTRACT_ONLY_NEWER) ? (DWORD) HELPID_EXTRACT_ONLY_NEWER : (LOWORD(wParam) == IDM_SPACE_TO_UNDERSCORE) ? (DWORD) HELPID_SPACE_TO_UNDERSCORE : (LOWORD(wParam) == IDM_EDIT) ? (DWORD) HELPID_EDIT : (LOWORD(wParam) == IDM_PATH) ? (DWORD) HELPID_PATH : (LOWORD(wParam) == IDM_COMMENT) ? (DWORD) HELPID_COMMENT : (LOWORD(wParam) == IDM_COPY) ? (DWORD) HELPID_COPY : (LOWORD(wParam) == IDM_STATUS) ? (DWORD) HELPID_STATUS : (LOWORD(wParam) == IDM_CHDIR) ? (DWORD) HELPID_CHDIR : (LOWORD(wParam) == IDM_PASSWORD_HELP) ? (DWORD) HELPID_PASSWORD : (LOWORD(wParam) == IDM_COPY_ARCHIVE) ? (DWORD) HELPID_COPY_ARCHIVE : (LOWORD(wParam) == IDM_MOVE_ARCHIVE) ? (DWORD) HELPID_MOVE_ARCHIVE : (LOWORD(wParam) == IDM_DELETE_ARCHIVE) ? (DWORD) HELPID_DELETE_ARCHIVE : (LOWORD(wParam) == IDM_RENAME_ARCHIVE) ? (DWORD) HELPID_RENAME_ARCHIVE : (LOWORD(wParam) == IDM_MAKE_DIR) ? (DWORD) HELPID_MAKEDIR_HELP : (LOWORD(wParam) == IDM_MAKEDIR_HELP) ? (DWORD) HELPID_MAKEDIR_HELP : (LOWORD(wParam) == IDM_SAVE_AS_DEFAULT) ? (DWORD) HELPID_SAVE_AS_DEFAULT : (DWORD) 0L; if (!dwHelpContextId) { MessageBox( hWnd, "Help not available for Help Menu item", "Help Example", MB_OK); return DefWindowProc(hWnd, wMessage, wParam, lParam); } uf.fHelp = FALSE; WinHelp(hWnd,szHelpFileName,HELP_CONTEXT,dwHelpContextId); } else /* not in help mode */ { RECT rClient; switch (LOWORD(wParam)) { case IDM_OPEN: /* If unzipping separately and previous file exists, * go to directory where archive lives. */ if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); /* If not unzipping to same directory as archive and * file already open, go to where file lives. * If extracting to different directory, return to * that directory after selecting archive to open. */ if (lpumb->szUnzipFromDirName[0]) { lstrcpy(lpumb->szDirName, lpumb->szUnzipFromDirName); } if (lpumb->szFileName[0]) { /* strip off filename to make directory name */ GetArchiveDir(lpumb->szDirName); } else { if (!lpumb->szUnzipFromDirName[0]) lpumb->szDirName[0] = '\0'; /* assume no dir */ } lpumb->szBuffer[0] = '\0'; #ifndef WIN32 _fmemset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */ #else memset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */ #endif lpumb->ofn.lStructSize = sizeof(OPENFILENAME); lpumb->ofn.hwndOwner = hWnd; lpumb->ofn.lpstrFilter = "Zip Files (*.zip)\0*.zip\0Self-extracting Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0\0"; lpumb->ofn.nFilterIndex = 1; lpumb->ofn.lpstrFile = lpumb->szFileName; lpumb->szFileName[0] = '\0'; /* no initial filename */ lpumb->ofn.nMaxFile = WIZUNZIP_MAX_PATH; lpumb->ofn.lpstrFileTitle = lpumb->szBuffer; /* ignored */ lpumb->ofn.lpstrInitialDir = (LPSTR)(!lpumb->szDirName[0] ? NULL : lpumb->szDirName); lpumb->ofn.nMaxFileTitle = OPTIONS_BUFFER_LEN; lpumb->ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; dwCommDlgHelpId = HELPID_OPEN; /* specify correct help for open dlg */ #if defined (CRYPT) && !defined (USEWIZUNZDLL) /* This if statement insures that when you go between zip files, the password is nulled out. Not necessary if using dll. */ if (G.key) G.key = (char *)NULL; #endif if (GetOpenFileName(&lpumb->ofn)) /* if successful file open */ { AnsiToOem(lpumb->szFileName, lpumb->szFileName); /* retain as OEM */ GetArchiveDir(lpumb->szDirName); /* get archive dir name in ANSI */ /* Save the last "unzip from" directory */ if (lpumb->szUnzipFromDirName[1] == ':') drive = lpumb->szUnzipFromDirName[0]; else drive = '\0'; if (uf.fSaveUnZipFromDir && (toupper(drive) != 'A') && (toupper(drive) != 'B')) { lstrcpy(lpumb->szUnzipFromDirName, lpumb->szDirName); if (lpumb->szUnzipFromDirName[strlen(lpumb->szUnzipFromDirName)-1] == ':') lstrcat(lpumb->szUnzipFromDirName, "\\"); WritePrivateProfileString(szAppName, szDefaultUnzipFromDir, lpumb->szUnzipFromDirName, szWizUnzipIniFile); } else WritePrivateProfileString(szAppName, szDefaultUnzipFromDir, "", szWizUnzipIniFile); if (uf.fUnzipToZipDir || /* unzipping to same directory as archive */ lpumb->szUnzipToDirName[0] == '\0') /* or no default */ { /* strip off filename to make directory name */ lstrcpy(lpumb->szUnzipToDirName, lpumb->szDirName); } } UpdateListBox(hWnd); /* fill in list box */ SendMessage(hWndList, LB_SETSEL, 1, 0L); UpdateButtons(hWnd); /* update state of buttons */ /* Update archive totals area */ WinAssert(hWndList); GetClientRect( hWndList, &rClient ); OffsetRect( &rClient, 0, dyChar ); rClient.top = rClient.bottom; rClient.bottom = rClient.top + (6*dyChar); InvalidateRect( hWnd, &rClient, TRUE); UpdateWindow( hWnd ); SetCaption(hWnd); if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case IDM_CHDIR: if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); #ifndef WIN32 _fmemset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */ #else memset(&lpumb->ofn, '\0', sizeof(OPENFILENAME)); /* initialize struct */ #endif lpumb->ofn.lStructSize = sizeof(OPENFILENAME); lpumb->ofn.hwndOwner = hWnd; lpumb->ofn.hInstance = hInst; lpumb->ofn.lpstrFilter = "All Files (*.*)\0*.*\0\0"; lpumb->ofn.nFilterIndex = 1; lstrcpy(lpumb->szUnzipToDirNameTmp, lpumb->szUnzipToDirName); /* initialize */ { /* Braces are here to allow the declaration of uDirNameLen */ #ifndef WIN32 size_t uDirNameLen = _fstrlen(lpumb->szUnzipToDirNameTmp); #else size_t uDirNameLen = strlen(lpumb->szUnzipToDirNameTmp); #endif /* If '\\' not at end of directory name, add it now. */ if (uDirNameLen > 0 && lpumb->szUnzipToDirNameTmp[uDirNameLen-1] != '\\') lstrcat(lpumb->szUnzipToDirNameTmp, "\\"); } lstrcat(lpumb->szUnzipToDirNameTmp, "johnny\376\376.\375\374\373"); /* fake name */ lpumb->ofn.lpstrFile = lpumb->szUnzipToDirNameTmp; /* result goes here! */ lpumb->ofn.nMaxFile = WIZUNZIP_MAX_PATH; lpumb->ofn.lpstrFileTitle = NULL; lpumb->ofn.nMaxFileTitle = OPTIONS_BUFFER_LEN; /* ignored ! */ lpumb->ofn.lpstrInitialDir = lpumb->szUnzipToDirName; lpumb->ofn.lpstrTitle = (LPSTR)"Unzip To"; lpumb->ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_ENABLEHOOK | OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_NOCHANGEDIR; #ifndef WIN32 lpfnSelectDir = MakeProcInstance((FARPROC)SelectDirProc, hInst); #ifndef MSC (UINT CALLBACK *)lpumb->ofn.lpfnHook = (UINT CALLBACK *)lpfnSelectDir; #else lpumb->ofn.lpfnHook = lpfnSelectDir; #endif #else lpumb->ofn.lpfnHook = (LPOFNHOOKPROC)SelectDirProc; #endif lpumb->ofn.lpTemplateName = "SELDIR"; /* see seldir.dlg */ dwCommDlgHelpId = HELPID_CHDIR; /* in case user hits "help" button */ if (GetSaveFileName(&lpumb->ofn)) /* successfully got dir name ? */ { #ifndef WIN32 ptr = _fstrrchr(lpumb->ofn.lpstrFile, '\\'); #else ptr = strrchr(lpumb->ofn.lpstrFile, '\\'); #endif if (ptr != NULL) lpumb->ofn.lpstrFile[(int)(ptr - lpumb->ofn.lpstrFile)] = '\0'; lstrcpy(lpumb->szUnzipToDirName, lpumb->ofn.lpstrFile); /* save result */ if (lpumb->szUnzipToDirName[1] == ':') { drive = lpumb->szUnzipToDirName[0]; if (lstrlen(lpumb->szUnzipToDirName) == 2) { /* We only have a drive letter and a colon */ lstrcat(lpumb->szUnzipToDirName, "\\"); } } else drive = '\0'; if (uf.fSaveUnZipToDir && (toupper(drive) != 'A') && (toupper(drive) != 'B')) { /* MW: Always save last directory written to */ WritePrivateProfileString(szAppName, szDefaultUnzipToDir, lpumb->szUnzipToDirName, szWizUnzipIniFile); } SetCaption(hWnd); } else /* either real error or canceled */ { DWORD dwExtdError = CommDlgExtendedError(); /* debugging */ if (dwExtdError != 0L) /* if not canceled then real error */ { wsprintf (lpumb->szBuffer, szCantChDir, dwExtdError); MessageBox (hWnd, lpumb->szBuffer, szAppName, MB_ICONINFORMATION | MB_OK); } else { RECT mRect; GetWindowRect(hWndMain, &mRect); InvalidateRect(hWndMain, &mRect, TRUE); SendMessage(hWndMain, WM_SIZE, SIZE_RESTORED, MAKELONG(mRect.right-mRect.left, mRect.top-mRect.bottom)); UpdateWindow(hWndMain); } } #ifndef WIN32 FreeProcInstance(lpfnSelectDir); #endif if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case IDM_DELETE_ARCHIVE: { char szStr[WIZUNZIP_MAX_PATH]; if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); sprintf(szStr, "Are you sure you want to delete\n%s", lpumb->szFileName); if (MessageBox(hWnd, szStr, "Deleting File", MB_ICONSTOP | MB_OKCANCEL) == IDOK) { remove(lpumb->szFileName); fprintf(stdout,"Deleting %s\n", lpumb->szFileName); SendMessage(hWndList, LB_RESETCONTENT, 0, 0); lpumb->szFileName[0] = '\0'; SetCaption(hWnd); UpdateButtons(hWnd); /* update state of buttons */ } if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; } case IDM_MOVE_ARCHIVE: /* * Yes - this can be done under Win32 differently, but * you have to go through some hoops, and this just makes * it easier. */ move_flag = TRUE; dwCommDlgHelpId = HELPID_MOVE_ARCHIVE; /* in case user hits "help" button */ case IDM_RENAME_ARCHIVE: if (!move_flag) { rename_flag = TRUE; dwCommDlgHelpId = HELPID_RENAME_ARCHIVE; /* in case user hits "help" button */ } case IDM_COPY_ARCHIVE: if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); if ((!move_flag) && (!rename_flag)) dwCommDlgHelpId = HELPID_COPY_ARCHIVE; /* in case user hits "help" button */ CopyArchive(hWnd, move_flag, rename_flag); if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); move_flag = FALSE; rename_flag = FALSE; break; case IDM_EXIT: SendMessage(hWnd, WM_CLOSE, 0, 0L); break; case IDM_HELP: /* Display Help */ WinHelp(hWnd,szHelpFileName,HELP_INDEX,0L); break; case IDM_HELP_HELP: WinHelp(hWnd,"WINHELP.HLP",HELP_INDEX,0L); break; case IDM_ABOUT: if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); #ifndef WIN32 lpfnAbout = MakeProcInstance(AboutProc, hInst); DialogBox(hInst, "About", hWnd, lpfnAbout); FreeProcInstance(lpfnAbout); #else DialogBox(hInst, "About", hWnd, AboutProc); #endif if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case IDM_LISTBOX: /* command from listbox */ if (cZippedFiles) { switch (GET_WM_COMMAND_CMD(wParam, lParam)) { case LBN_SELCHANGE: UpdateButtons(hWnd); break; case LBN_DBLCLK: UpdateButtons(hWnd); if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); if (uf.fAutoClearStatus && wLBSelection == IDM_LB_DISPLAY) /* if autoclear on display */ SendMessage(hWndStatus, WM_COMMAND, IDM_CLEAR_STATUS, 0L); Action(hWnd, (WPARAM)(wLBSelection - IDM_LB_EXTRACT)); if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; } } break; case IDM_LONG: case IDM_SHORT: /* If format change, uncheck old, check new. */ if ((LOWORD(wParam) - IDM_SHORT) != (signed int)uf.fFormatLong) { WPARAM wFormatTmp = (WPARAM)(LOWORD(wParam) - IDM_SHORT); int __far *pnSelItems; /* pointer to list of selected items */ HANDLE hnd = 0; int cSelLBItems ; /* no. selected items in listbox */ RECT rClient; cSelLBItems = CLBItemsGet(hWndList, &pnSelItems, &hnd); CheckMenuItem(hMenu, (IDM_SHORT+uf.fFormatLong), MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hMenu, (IDM_SHORT+wFormatTmp), MF_BYCOMMAND|MF_CHECKED); uf.fFormatLong = wFormatTmp; UpdateListBox(hWnd); SizeWindow(hWnd, TRUE); WritePrivateProfileString(szAppName, szFormatKey, (LPSTR)(szFormatKeyword[uf.fFormatLong]), szWizUnzipIniFile); /* anything previously selected ? */ if (cSelLBItems > 0) { ReselectLB(hWndList, cSelLBItems, pnSelItems); GlobalUnlock(hnd); GlobalFree(hnd); } /* enable or disable buttons */ UpdateButtons(hWnd); /* make sure labels & Zip archive totals get updated */ WinAssert(hWnd); GetClientRect( hWnd, &rClient ); rClient.top = 0; rClient.bottom = rClient.top + (4*dyChar); InvalidateRect( hWnd, &rClient, TRUE); WinAssert(hWndList); GetClientRect( hWndList, &rClient ); OffsetRect( &rClient, 0, dyChar ); rClient.top = rClient.bottom; rClient.bottom = rClient.top + (4*dyChar); InvalidateRect( hWnd, &rClient, TRUE); UpdateWindow( hWnd ); } break; case IDM_PROMPT_TO_OVERWRITE: lpDCL->PromptToOverwrite = !lpDCL->PromptToOverwrite; CheckMenuItem(hMenu,IDM_PROMPT_TO_OVERWRITE,MF_BYCOMMAND| (lpDCL->PromptToOverwrite) ? MF_CHECKED: MF_UNCHECKED); if (lpDCL->PromptToOverwrite) { CheckMenuItem(hMenu,IDM_EXTRACT_ONLY_NEWER, MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hMenu,IDM_OVERWRITE, MF_BYCOMMAND|MF_UNCHECKED); EnableMenuItem(hMenu, IDM_EXTRACT_ONLY_NEWER, MF_DISABLED|MF_GRAYED|MF_BYCOMMAND); ModifyMenu(hMenu, IDM_OVERWRITE, MF_BYCOMMAND | MF_DISABLED|MF_GRAYED, IDM_OVERWRITE, "Never Overwrite Existing Files"); lpDCL->Overwrite = FALSE; WritePrivateProfileString(szAppName, szOverwriteKey, (LPSTR)(lpDCL->Overwrite ? szYes : szNo ), szWizUnzipIniFile); EnableMenuItem(hMenu, IDM_OVERWRITE, MF_DISABLED|MF_GRAYED|MF_BYCOMMAND); } else { CheckMenuItem(hMenu,IDM_EXTRACT_ONLY_NEWER,MF_BYCOMMAND| (WORD)(lpDCL->ExtractOnlyNewer ? MF_CHECKED: MF_UNCHECKED)); CheckMenuItem(hMenu,IDM_OVERWRITE,MF_BYCOMMAND|MF_CHECKED); EnableMenuItem(hMenu, IDM_OVERWRITE, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(hMenu, IDM_EXTRACT_ONLY_NEWER, MF_ENABLED|MF_BYCOMMAND); } WritePrivateProfileString(szAppName, szPromptOverwriteKey, (LPSTR)(lpDCL->PromptToOverwrite ? szYes : szNo ), szWizUnzipIniFile); break; case IDM_OVERWRITE: /* Toggle value of overwrite flag. */ lpDCL->Overwrite = !lpDCL->Overwrite; ModifyMenu(hMenu, IDM_OVERWRITE, MF_BYCOMMAND | MF_ENABLED, IDM_OVERWRITE, (lpDCL->Overwrite ? "Always Overwrite Existing Files": "Never Overwrite Existing Files")); CheckMenuItem(hMenu,IDM_OVERWRITE,MF_BYCOMMAND|MF_CHECKED); WritePrivateProfileString(szAppName, szOverwriteKey, (LPSTR)(lpDCL->Overwrite ? szYes : szNo ), szWizUnzipIniFile); break; case IDM_EXTRACT_ONLY_NEWER: /* Toggle value of extract_only_newer flag. */ lpDCL->ExtractOnlyNewer = !lpDCL->ExtractOnlyNewer; CheckMenuItem(hMenu,IDM_EXTRACT_ONLY_NEWER,MF_BYCOMMAND| (WORD)(lpDCL->ExtractOnlyNewer ? MF_CHECKED: MF_UNCHECKED)); WritePrivateProfileString(szAppName, szExtractOnlyNewerKey, (LPSTR)(lpDCL->ExtractOnlyNewer ? szYes : szNo ), szWizUnzipIniFile); break; case IDM_TRANSLATE: /* Toggle value of translate flag. */ uf.fTranslate = !uf.fTranslate; CheckMenuItem(hMenu,IDM_TRANSLATE,MF_BYCOMMAND| (WORD)(uf.fTranslate ? MF_CHECKED: MF_UNCHECKED)); WritePrivateProfileString(szAppName, szTranslateKey, (LPSTR)(uf.fTranslate ? szYes : szNo ), szWizUnzipIniFile); break; case IDM_SPACE_TO_UNDERSCORE: /* Toggle value of space to underscore flag. */ lpDCL->SpaceToUnderscore = !lpDCL->SpaceToUnderscore; CheckMenuItem(hMenu,IDM_SPACE_TO_UNDERSCORE,MF_BYCOMMAND| (WORD)(lpDCL->SpaceToUnderscore ? MF_CHECKED: MF_UNCHECKED)); WritePrivateProfileString(szAppName, szSpaceToUnderscoreKey, (LPSTR)(lpDCL->SpaceToUnderscore ? szYes : szNo ), szWizUnzipIniFile); break; case IDM_SAVE_UNZIP_TO_DIR: /* Toggle value of fSaveUnzipToDir flag. */ uf.fSaveUnZipToDir = !uf.fSaveUnZipToDir; CheckMenuItem(hMenu,IDM_SAVE_UNZIP_TO_DIR,MF_BYCOMMAND| (WORD)(uf.fSaveUnZipToDir ? MF_CHECKED: MF_UNCHECKED)); WritePrivateProfileString(szAppName, szSaveUnZipToKey, (LPSTR)(uf.fSaveUnZipToDir ? szYes : szNo ), szWizUnzipIniFile); if (uf.fSaveUnZipToDir) WritePrivateProfileString(szAppName, szDefaultUnzipToDir, "", szWizUnzipIniFile); break; case IDM_SAVE_UNZIP_FROM_DIR: /* Toggle value of fSaveUnzipToDir flag. */ uf.fSaveUnZipFromDir = !uf.fSaveUnZipFromDir; CheckMenuItem(hMenu,IDM_SAVE_UNZIP_FROM_DIR,MF_BYCOMMAND| (WORD)(uf.fSaveUnZipFromDir ? MF_CHECKED: MF_UNCHECKED)); WritePrivateProfileString(szAppName, szSaveUnZipFromKey, (LPSTR)(uf.fSaveUnZipFromDir ? szYes : szNo ), szWizUnzipIniFile); if (uf.fSaveUnZipFromDir) WritePrivateProfileString(szAppName, szDefaultUnzipFromDir, "", szWizUnzipIniFile); break; case IDM_UNZIP_TO_ZIP_DIR: /* toggle value of Unzip to .ZIP */ uf.fUnzipToZipDir = !uf.fUnzipToZipDir; CheckMenuItem(hMenu,IDM_UNZIP_TO_ZIP_DIR,MF_BYCOMMAND| (WORD)(uf.fUnzipToZipDir ? MF_CHECKED:MF_UNCHECKED)); EnableMenuItem(hMenu,IDM_CHDIR,MF_BYCOMMAND| (WORD)(uf.fUnzipToZipDir ? MF_GRAYED:MF_ENABLED)); WritePrivateProfileString(szAppName, szUnzipToZipDirKey, (LPSTR)(uf.fUnzipToZipDir ? szYes : szNo ), szWizUnzipIniFile); if (uf.fUnzipToZipDir && lpumb->szDirName[0]) { lstrcpy(lpumb->szUnzipToDirName, lpumb->szDirName); /* get new dirname */ SetCaption(hWnd); } break; case IDM_MAKE_DIR: { FARPROC lpfnMakeDir; dwCommDlgHelpId = HELPID_MAKEDIR_HELP; /* if someone hits help */ lpfnMakeDir = MakeProcInstance(MakeDirProc, hInst); DialogBox(hInst, "MAKEDIR", hWnd, lpfnMakeDir); #ifndef WIN32 FreeProcInstance(lpfnMakeDir); #endif } break; case IDM_SOUND_OPTIONS: /* launch Sound Options dialog box */ { FARPROC lpfnSoundOptions; dwCommDlgHelpId = HELPID_SOUND_OPTIONS; /* if someone hits "help" */ lpfnSoundOptions = MakeProcInstance(SoundProc, hInst); DialogBox(hInst, "SOUND", hWnd, lpfnSoundOptions); #ifndef WIN32 FreeProcInstance(lpfnSoundOptions); #endif } break; case IDM_AUTOCLEAR_STATUS: /* automatically clear status window before displaying */ uf.fAutoClearStatus = !uf.fAutoClearStatus; CheckMenuItem(hMenu,IDM_AUTOCLEAR_STATUS,MF_BYCOMMAND| (WORD)(uf.fAutoClearStatus ? MF_CHECKED:MF_UNCHECKED)); WritePrivateProfileString(szAppName, szAutoClearStatusKey, (LPSTR)(uf.fAutoClearStatus ? szYes : szNo ), szWizUnzipIniFile); break; case IDM_AUTOCLEAR_DISPLAY: uf.fAutoClearDisplay = !uf.fAutoClearDisplay; CheckMenuItem(hMenu,IDM_AUTOCLEAR_DISPLAY,MF_BYCOMMAND| (WORD)(uf.fAutoClearDisplay ? MF_CHECKED:MF_UNCHECKED)); WritePrivateProfileString(szAppName, szAutoClearDisplayKey, (LPSTR)(uf.fAutoClearDisplay ? szYes : szNo ), szWizUnzipIniFile); break; case IDM_LB_EXTRACT: case IDM_LB_DISPLAY: case IDM_LB_TEST: /* If overwrite change, uncheck old, check new. */ /* wParam is the new default action */ if (LOWORD(wParam) != wLBSelection) { RECT rClient, rButton; POINT ptUpperLeft, ptLowerRight; CheckMenuItem(hMenu,wLBSelection,MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hMenu,wParam,MF_BYCOMMAND|MF_CHECKED); wLBSelection = LOWORD(wParam); WritePrivateProfileString(szAppName, szLBSelectionKey, (LPSTR)(LBSelectionTable[LOWORD(wParam) - IDM_LB_EXTRACT]), szWizUnzipIniFile); WinAssert(hWnd); GetClientRect(hWnd, &rClient); GetWindowRect(hExtract, &rButton); /* any button will do */ ptUpperLeft.x = rButton.left; ptUpperLeft.y = rButton.top; ptLowerRight.x = rButton.right; ptLowerRight.y = rButton.bottom; ScreenToClient(hWnd, &ptUpperLeft); ScreenToClient(hWnd, &ptLowerRight); rClient.top = ptUpperLeft.y; rClient.bottom = ptLowerRight.y; InvalidateRect( hWnd, &rClient, TRUE); /* redraw button area */ UpdateWindow( hWnd ); } break; case IDM_SHOW_COMMENT: /* display the archive comment in mesg window */ if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); DisplayComment(hWnd); if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case IDM_RECR_DIR_STRUCT: /* re-create directories structure */ uf.fRecreateDirs = !uf.fRecreateDirs; CheckMenuItem(hMenu, IDM_RECR_DIR_STRUCT, MF_BYCOMMAND | (uf.fRecreateDirs ? MF_CHECKED : MF_UNCHECKED)); WritePrivateProfileString(szAppName, szRecreateDirsKey, (LPSTR)(uf.fRecreateDirs ? szYes : szNo), szWizUnzipIniFile); break; case IDM_SHOW_BUBBLE_HELP: /* Show toolbar help */ uf.fShowBubbleHelp = !uf.fShowBubbleHelp; CheckMenuItem(hMenu, IDM_SHOW_BUBBLE_HELP, MF_BYCOMMAND | (uf.fShowBubbleHelp ? MF_CHECKED : MF_UNCHECKED)); WritePrivateProfileString(szAppName, szShowBubbleHelpKey, (LPSTR)(uf.fShowBubbleHelp ? szYes : szNo), szWizUnzipIniFile); break; case IDM_DISPLAY: case IDM_TEST: case IDM_EXTRACT: if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); if (uf.fAutoClearStatus && LOWORD(wParam) == IDM_DISPLAY) /* if autoclear on display */ SendMessage(hWndStatus, WM_COMMAND, IDM_CLEAR_STATUS, 0L); Action(hWnd, (WPARAM)(LOWORD(wParam) - IDM_EXTRACT)); if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, TRUE ); break; case IDM_SELECT_ALL: case IDM_DESELECT_ALL: if (cZippedFiles) { SendMessage(hWndList , LB_SELITEMRANGE, (WPARAM)(LOWORD(wParam) == IDM_DESELECT_ALL ? FALSE : TRUE), MAKELONG(0, (cZippedFiles-1))); UpdateButtons(hWnd); } break; case IDM_SELECT_BY_PATTERN: if (!hPatternSelectDlg) { DLGPROC lpfnPatternSelect; dwCommDlgHelpId = HELPID_SELECT_BY_PATTERN; lpfnPatternSelect = (DLGPROC)MakeProcInstance(PatternSelectProc, hInst); WinAssert(lpfnPatternSelect) hPatternSelectDlg = CreateDialog(hInst, "PATTERN", hWnd, lpfnPatternSelect); WinAssert(hPatternSelectDlg); } break; case IDM_COPY: /* copy from "Status" window value to clipboard */ CopyStatusToClipboard(hWnd); break; case IDM_CLEAR_STATUS: /* forward to status window */ PostMessage(hWndStatus, WM_COMMAND, IDM_CLEAR_STATUS, 0L); EnableWindow(hCopyStatus, FALSE); EnableMenuItem(hMenu, IDM_COPY, MF_GRAYED); break; case IDM_MAX_LISTBOX: case IDM_MAX_STATUS: case IDM_SPLIT: { RECT rClient; if (wWindowSelection != LOWORD(wParam) ) /* If state change */ { CheckMenuItem(hMenu, wWindowSelection, MF_BYCOMMAND | MF_UNCHECKED); switch (wWindowSelection) { case IDM_MAX_STATUS: ManageStatusWnd(IDM_SPLIT); break; case IDM_MAX_LISTBOX: /* status window has been hidden */ WinAssert(hWndStatus); EnableWindow( hWndStatus, TRUE ); ShowWindow(hWndStatus, SW_SHOWNORMAL); wWindowSelection = IDM_SPLIT; /* save new state */ SizeWindow(hWnd, FALSE); break; } /* listbox and status window are in split state at this point */ switch (LOWORD(wParam)) { case IDM_MAX_STATUS: ManageStatusWnd(wParam); break; case IDM_MAX_LISTBOX: WinAssert(hWndStatus); EnableWindow( hWndStatus, FALSE ); ShowWindow(hWndStatus, SW_HIDE); break; } /* Insure "header" is updated as necessary */ WinAssert(hWnd); GetClientRect( hWnd, &rClient ); rClient.top = 2 * dyChar; rClient.left += dxChar/2; InvalidateRect(hWnd, &rClient, TRUE); UpdateWindow(hWnd); wWindowSelection = LOWORD(wParam) ; /* save new state */ SizeWindow(hWnd, FALSE); CheckMenuItem(hMenu, wWindowSelection, MF_BYCOMMAND | MF_CHECKED); } break; } case IDM_SETFOCUS_ON_STATUS: /* posted from Action() following extract-to-Status */ SetFocus(hWndStatus); /* set focus on Status so user can scroll */ break; default: return DefWindowProc(hWnd, wMessage, wParam, lParam); } } /* bottom of not in help mode */ break; case WM_SETCURSOR: /* In help mode it is necessary to reset the cursor in response */ /* to every WM_SETCURSOR message.Otherwise, by default, Windows */ /* will reset the cursor to that of the window class. */ if (uf.fHelp) { SetCursor(hHelpCursor); break; } return DefWindowProc(hWnd, wMessage, wParam, lParam); case WM_INITMENU: if (uf.fHelp) { SetCursor(hHelpCursor); } return TRUE; case WM_ENTERIDLE: if ((LOWORD(wParam) == MSGF_MENU) && (GetKeyState(VK_F1) & 0x8000)) { uf.fHelp = TRUE; PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0L); } break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: if ( uf.fCanDragDrop ) DragAcceptFiles( hWnd, FALSE ); DeleteObject(hBrush); WinHelp(hWnd, szHelpFileName, HELP_QUIT, 0L); PostQuitMessage(0); break; case WM_DROPFILES: { WORD cFiles; /* Get the number of files that have been dropped */ cFiles = (WORD)DragQueryFile( (HDROP)wParam, (UINT)-1, lpumb->szBuffer, (UINT)256); /* Only handle one dropped file until MDI-ness happens */ if (cFiles == 1) { RECT rClient; DragQueryFile( (HDROP)wParam, 0, lpumb->szFileName, WIZUNZIP_MAX_PATH); AnsiToOem(lpumb->szFileName, lpumb->szFileName); /* retain as OEM */ GetArchiveDir(lpumb->szDirName); /* get archive dir name in ANSI */ if (uf.fUnzipToZipDir || /* unzipping to same directory as archive */ lpumb->szUnzipToDirName[0] == '\0') /* or no default */ { /* strip off filename to make directory name */ lstrcpy(lpumb->szUnzipToDirName, lpumb->szDirName); } lstrcpy(lpumb->szBuffer, lpumb->szDirName); /* get scratch copy */ DlgDirList (hWnd, lpumb->szBuffer, 0, 0, 0); /* change dir */ UpdateListBox(hWnd); /* fill in list box */ SendMessage(hWndList, LB_SETSEL, 1, 0L); UpdateButtons(hWnd); /* update state of buttons */ WinAssert(hWndList); GetClientRect( hWndList, &rClient ); OffsetRect( &rClient, 0, dyChar ); rClient.top = rClient.bottom; rClient.bottom = rClient.top + (2*dyChar); InvalidateRect( hWnd, &rClient, TRUE); UpdateWindow( hWnd ); SetCaption(hWnd); } DragFinish( (HDROP)wParam ); } break; case WM_PAINT: if (wWindowSelection != IDM_MAX_STATUS) { PAINTSTRUCT ps; RECT rClient; DWORD dwBackColor; hDC = BeginPaint( hWnd, &ps ); if ( hDC ) { WinAssert(hWndList); GetClientRect( hWndList, &rClient ); if (RectVisible( hDC, &rClient )) UpdateWindow( hWndList ); hOldFont = SelectObject ( hDC, hFixedFont); WinAssert(hWnd); GetClientRect( hWnd, &rClient ); dwBackColor = SetBkColor(hDC,GetSysColor(BG_SYS_COLOR)); /* Move "header" down two lines for button room at top */ rClient.top = 2 * dyChar; rClient.left += dxChar/2; DrawText( hDC, (LPSTR)Headers[uf.fFormatLong][0], -1, &rClient, DT_NOPREFIX | DT_TOP); if (lpumb->szFileName[0]) /* if file selected */ { WinAssert(hWndList); GetClientRect( hWndList, &rClient ); OffsetRect( &rClient, 0, dyChar+2); rClient.left += dxChar/2; /* Move totals "trailer" down two lines for button room */ rClient.top = rClient.bottom + (2 * dyChar); rClient.bottom = rClient.top + dyChar; DrawText( hDC, (LPSTR)szTrailers[uf.fFormatLong], -1, &rClient, DT_NOPREFIX | DT_TOP); /* Display totals line at bottom of listbox */ rClient.top += dyChar; rClient.bottom += dyChar; DrawText( hDC, lpumb->szTotalsLine, -1, &rClient, DT_NOPREFIX | DT_TOP); } SetBkColor(hDC, dwBackColor); (void)SelectObject ( hDC, hOldFont); } EndPaint(hWnd, &ps); break; } return DefWindowProc(hWnd, wMessage, wParam, lParam); default: if (wMessage == uCommDlgHelpMsg) /* common dialog help message ID */ { WinHelp(hWnd, szHelpFileName, HELP_CONTEXT, dwCommDlgHelpId ); return 0; } return DefWindowProc(hWnd, wMessage, wParam, lParam); } return 0; }