|
|
/****************************************************************************/ /* */ /* WINFILE.C - */ /* */ /* Windows File System Application */ /* */ /****************************************************************************/
#define NO_WF_GLOBALS
#include "winfile.h"
#include "winnet.h"
#include "lfn.h"
#include "stdlib.h"
/*--------------------------------------------------------------------------*/ /* */ /* Global Variables - */ /* */ /*--------------------------------------------------------------------------*/
BOOL bNetAdmin = FALSE; BOOL bMinOnRun = FALSE; BOOL bStatusBar = TRUE; BOOL bConfirmDelete = TRUE; BOOL bConfirmSubDel = TRUE; BOOL bConfirmReplace = TRUE; BOOL bConfirmMouse = TRUE; BOOL bConfirmFormat = TRUE; BOOL bSearchSubs = TRUE; BOOL bUserAbort = FALSE; BOOL bConnect = FALSE; BOOL bDisconnect = FALSE; BOOL bFileSysChanging = FALSE; BOOL fShowSourceBitmaps = TRUE; BOOL bMultiple; // used to indicate multiple selection
BOOL bFSCTimerSet = FALSE; BOOL bStoleTreeData = FALSE; BOOL bSaveSettings = TRUE;
CHAR chFirstDrive; /* 'A' or 'a' */
CHAR szExtensions[] = "Extensions"; CHAR szFrameClass[] = "WOS_Frame"; CHAR szTreeClass[] = "WOS_Tree"; CHAR szDrivesClass[] = "WOS_Drives"; CHAR szTreeControlClass[] = "DirTree"; CHAR szDirClass[] = "WOS_Dir"; CHAR szSearchClass[] = "WOS_Search";
CHAR szMinOnRun[] = "MinOnRun"; CHAR szStatusBar[] = "StatusBar"; CHAR szSaveSettings[] = "Save Settings";
CHAR szConfirmDelete[] = "ConfirmDelete"; CHAR szConfirmSubDel[] = "ConfirmSubDel"; CHAR szConfirmReplace[] = "ConfirmReplace"; CHAR szConfirmMouse[] = "ConfirmMouse"; CHAR szConfirmFormat[] = "ConfirmFormat"; CHAR szDirKeyFormat[] = "dir%d"; CHAR szWindow[] = "Window"; CHAR szFace[] = "Face"; CHAR szSize[] = "Size"; CHAR szLowerCase[] = "LowerCase"; CHAR szAddons[] = "AddOns"; CHAR szUndelete[] = "UNDELETE.DLL";
CHAR szDefPrograms[] = "EXE COM BAT PIF"; CHAR szINIFile[] = "WINOBJ.INI"; CHAR szWindows[] = "Windows"; CHAR szPrevious[] = "Previous"; CHAR szSettings[] = "Settings"; CHAR szInternational[] = "Intl"; CHAR szStarDotStar[] = "*.*"; CHAR szNULL[] = ""; CHAR szBlank[] = " "; CHAR szEllipses[] = "..."; CHAR szReservedMarker[] = "FAT16 "; CHAR szNetwork[] = "Network";
CHAR szDirsRead[32]; CHAR szCurrentFileSpec[14] = "*.*"; CHAR szShortDate[11] = "MM/dd/yy"; CHAR szTime[2] = ":"; CHAR sz1159[9] = "AM"; CHAR sz2359[9] = "PM"; CHAR szComma[2] = ","; CHAR szListbox[] = "ListBox"; // window style
CHAR szTheINIFile[64+12+3]; CHAR szTitle[128]; CHAR szMessage[MAXMESSAGELEN+1]; CHAR szSearch[MAXPATHLEN+1]; CHAR szStatusTree[80]; CHAR szStatusDir[80]; CHAR szOriginalDirPath[64+12+3]; /* OEM string!!!!!! */ CHAR szBytes[10]; CHAR szSBytes[10];
EFCB VolumeEFCB ={ 0xFF, 0, 0, 0, 0, 0, ATTR_VOLUME, 0, '?','?','?','?','?','?','?','?','?','?','?', 0, 0, 0, 0, 0, '?','?','?','?','?','?','?','?','?','?','?', 0, 0, 0, 0, 0, 0, 0, 0, 0 };
INT cDrives; INT dxDrive; INT dyDrive; INT dxDriveBitmap; INT dyDriveBitmap; INT dxEllipses; INT dxFolder; INT dyFolder; INT dyBorder; /* System Border Width/Height */ INT dyBorderx2; /* System Border Width/Height * 2 */ INT dyStatus; /* Status Bar height */ INT dxStatusField; INT dxText; /* System Font Width 'M' */ INT dyText; /* System Font Height */ //INT dxFileName;
INT dyFileName; INT iCurrentDrive; /* Logical # of the current drive */ INT iFormatDrive; /* Logical # of the drive to format */ INT nFloppies; /* Number of Removable Drives */ INT rgiDrive[26]; INT rgiDriveType[26]; VOLINFO *(apVolInfo[26]); INT rgiDrivesOffset[26]; INT iSelHilite = -1; INT iTime = 0; /* Default to 12-hour time */ INT iTLZero = TRUE; /* Default to leading zeros */ INT cDisableFSC = 0; /* has fsc been disabled? */ INT iReadLevel = 0; // global. if !0 someone is reading a tree
INT dxFrame; INT dxClickRect; INT dyClickRect;
BOOL bCancelTree;
HANDLE hAccel = NULL; HANDLE hAppInstance;
HBITMAP hbmBitmaps = NULL; HDC hdcMem = NULL;
INT iCurDrag = 0;
HICON hicoTree = NULL; HICON hicoTreeDir = NULL; HICON hicoDir = NULL;
HWND hdlgProgress; HWND hwndFrame = NULL; HWND hwndMDIClient = NULL; HWND hwndSearch = NULL; HWND hwndDragging = NULL;
LPSTR szPrograms; LPSTR szDocuments;
WORD wTextAttribs = TA_LOWERCASE; WORD wSuperDlgMode; WORD wFATSector = (WORD)0xFFFF; WORD wFATMode = 0; WORD wDOSversion; UINT wHelpMessage; UINT wBrowseMessage; WORD xTreeMax = 0; // current width of widest tree window
WORD wNewView = VIEW_NAMEONLY; WORD wNewSort = IDD_NAME; DWORD dwNewAttribs = ATTR_DEFAULT;
LONG lFreeSpace = -1L; LONG lTotalSpace = -1L;
HFONT hFont; HFONT hFontStatus; CHAR szWinObjHelp[] = "WINOBJ.HLP";
INT iNumExtensions = 0; EXTENSION extensions[MAX_EXTENSIONS];
FM_UNDELETE_PROC lpfpUndelete = NULL; BOOL EnablePropertiesMenu (HWND,PSTR); HHOOK hhkMessageFilter = NULL;
WORD wMenuID = 0; HMENU hMenu = 0; WORD wMenuFlags = 0; DWORD dwContext = 0L;
HANDLE hModUndelete = NULL;
/*--------------------------------------------------------------------------*/ /* */ /* WinMain() - */ /* */ /*--------------------------------------------------------------------------*/
MMain( hInst, hPrevInst, lpCmdLine, nCmdShow ) //{
MSG msg;
FBREAK(BF_START); ENTER("MMain"); PRINT(BF_PARMTRACE, "lpCmdLine=%s", lpCmdLine); PRINT(BF_PARMTRACE, "nCmdShow=%ld", IntToPtr(nCmdShow));
if (!InitFileManager(hInst, hPrevInst, lpCmdLine, nCmdShow)) { FreeFileManager(); return FALSE; }
while (GetMessage(&msg, NULL, 0, 0)) {
// since we use RETURN as an accelerator we have to manually
// restore ourselves when we see VK_RETURN and we are minimized
if (msg.message == WM_SYSKEYDOWN && msg.wParam == VK_RETURN && IsIconic(hwndFrame)) { ShowWindow(hwndFrame, SW_NORMAL); } else { if (!TranslateMDISysAccel(hwndMDIClient, &msg) && (!hwndFrame || !TranslateAccelerator(hwndFrame, hAccel, &msg))) { TranslateMessage(&msg); DispatchMessage(&msg); } } }
FreeFileManager();
LEAVE("MMain"); return (int)msg.wParam; }
VOID NoRunInLongDir( HWND hwndActive, HMENU hMenu ) { char szTemp[MAXPATHLEN]; WORD wMenuFlags;
// cannot run in a long directory
SendMessage(hwndActive, FS_GETDIRECTORY, MAXPATHLEN, (LPARAM)szTemp); StripBackslash(szTemp); //wMenuFlags = IsLFN(szTemp) ? MF_BYCOMMAND | MF_GRAYED
// : MF_BYCOMMAND | MF_ENABLED;
wMenuFlags = MF_BYCOMMAND | MF_ENABLED; EnableMenuItem(hMenu, IDM_RUN, wMenuFlags); }
/*--------------------------------------------------------------------------*/ /* */ /* FrameWndProc() - */ /* */ /*--------------------------------------------------------------------------*/
INT_PTR APIENTRY FrameWndProc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam ) { RECT rc; HMENU hMenu = NULL;
STKCHK();
switch (wMsg) { case WM_CREATE: TRACE(BF_WM_CREATE, "FrameWndProc - WM_CREATE"); { CLIENTCREATESTRUCT ccs;
/* Store the Frame's hwnd. */ hwndFrame = hWnd;
// ccs.hWindowMenu = GetSubMenu(GetMenu(hWnd), IDM_WINDOW);
// the extensions haven't been loaded yet so the window
// menu is in the position of the first extensions menu
ccs.hWindowMenu = GetSubMenu(GetMenu(hWnd), IDM_EXTENSIONS); ccs.idFirstChild = IDM_CHILDSTART;
// create the MDI client at aproximate size to make sure
// "run minimized" works
GetClientRect(hwndFrame, &rc);
hwndMDIClient = CreateWindow("MDIClient", NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_BORDER, // -dyBorder, -dyBorder,
// rc.right + dyBorder,
// rc.bottom - dyBorder - (bStatusBar ? dyStatus + dyBorder : 0),
0, 0, rc.right, rc.bottom, hWnd, (HMENU)1, hAppInstance, (LPSTR)&ccs); if (!hwndMDIClient) { MSG("FrameWndProc", "WM_CREATE failed!"); return -1L; }
break; }
case WM_INITMENUPOPUP: MSG("FrameWndProc", "WM_INITMENUPOPUP"); { BOOL bMaxed; WORD wSort; WORD wView; WORD wMenuFlags; HWND hwndActive; HWND hwndTree, hwndDir; BOOL bLFN;
hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); if (hwndActive && GetWindowLong(hwndActive, GWL_STYLE) & WS_MAXIMIZE) bMaxed = 1; else bMaxed = 0;
hwndTree = HasTreeWindow(hwndActive); hwndDir = HasDirWindow(hwndActive); wSort = (WORD)GetWindowLong(hwndActive, GWL_SORT); wView = (WORD)GetWindowLong(hwndActive, GWL_VIEW);
hMenu = (HMENU)wParam;
wMenuFlags = MF_BYCOMMAND | MF_ENABLED;
// bLFN = IsLFNSelected();
bLFN = FALSE; // For now, ignore the case.
switch (LOWORD(lParam)-bMaxed) { case IDM_FILE: MSG("FrameWndProc", "IDM_FILE"); { LPSTR pSel; BOOL fDir;
if (!hwndDir) wMenuFlags = MF_BYCOMMAND | MF_GRAYED;
// EnableMenuItem(hMenu, IDM_PRINT, wMenuFlags);
EnableMenuItem(hMenu, IDM_SELALL, wMenuFlags); EnableMenuItem(hMenu, IDM_DESELALL, wMenuFlags);
if (hwndActive == hwndSearch || hwndDir) wMenuFlags = MF_BYCOMMAND; else wMenuFlags = MF_BYCOMMAND | MF_GRAYED;
// EnableMenuItem(hMenu, IDM_ATTRIBS, wMenuFlags);
EnableMenuItem(hMenu, IDM_SELECT, wMenuFlags);
pSel = (LPSTR)SendMessage(hwndActive, FS_GETSELECTION, 1, (LPARAM)&fDir);
// can't print an lfn thing or a directory.
wMenuFlags = (WORD)((bLFN || fDir) ? MF_BYCOMMAND | MF_DISABLED | MF_GRAYED : MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_PRINT, wMenuFlags);
// can't open an LFN file but can open an LFN dir
wMenuFlags = (WORD)((bLFN && !fDir) ? MF_BYCOMMAND | MF_DISABLED | MF_GRAYED : MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_OPEN, wMenuFlags);
// See if we can enable the Properties... menu
if (EnablePropertiesMenu (hwndActive,pSel)) wMenuFlags = MF_BYCOMMAND; else wMenuFlags = MF_BYCOMMAND | MF_GRAYED; EnableMenuItem (hMenu, IDM_ATTRIBS, wMenuFlags);
LocalFree((HANDLE)pSel);
NoRunInLongDir(hwndActive, hMenu); break; }
case IDM_DISK: MSG("FrameWndProc", "IDM_DISK");
// be sure not to allow disconnect while any trees
// are still being read (iReadLevel != 0)
if (bDisconnect) { INT i;
wMenuFlags = MF_BYCOMMAND | MF_GRAYED;
if (!iReadLevel) { for (i=0; i < cDrives; i++) { wParam = rgiDrive[i]; if ((!IsCDRomDrive((INT)wParam)) && (IsNetDrive((INT)wParam))) { wMenuFlags = MF_BYCOMMAND | MF_ENABLED; break; } } } EnableMenuItem(hMenu, IDM_DISCONNECT, wMenuFlags); } else { if (iReadLevel) EnableMenuItem(hMenu, IDM_CONNECTIONS, MF_BYCOMMAND | MF_GRAYED); else EnableMenuItem(hMenu, IDM_CONNECTIONS, MF_BYCOMMAND | MF_ENABLED); }
break;
case IDM_TREE: MSG("FrameWndProc", "IDM_TREE"); if (!hwndTree || iReadLevel) wMenuFlags = MF_BYCOMMAND | MF_GRAYED;
EnableMenuItem(hMenu, IDM_EXPONE, wMenuFlags); EnableMenuItem(hMenu, IDM_EXPSUB, wMenuFlags); EnableMenuItem(hMenu, IDM_EXPALL, wMenuFlags); EnableMenuItem(hMenu, IDM_COLLAPSE, wMenuFlags); EnableMenuItem(hMenu, IDM_ADDPLUSES, wMenuFlags);
if (hwndTree) CheckMenuItem(hMenu, IDM_ADDPLUSES, GetWindowLong(hwndActive, GWL_VIEW) & VIEW_PLUSES ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND);
break;
case IDM_VIEW: MSG("FrameWndProc", "IDM_VIEW"); EnableMenuItem(hMenu, IDM_VNAME, wMenuFlags); EnableMenuItem(hMenu, IDM_VDETAILS, wMenuFlags); EnableMenuItem(hMenu, IDM_VOTHER, wMenuFlags);
if (hwndActive == hwndSearch || IsIconic(hwndActive)) wMenuFlags = MF_BYCOMMAND | MF_GRAYED; else { CheckMenuItem(hMenu, IDM_BOTH, hwndTree && hwndDir ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); CheckMenuItem(hMenu, IDM_DIRONLY, !hwndTree && hwndDir ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); CheckMenuItem(hMenu, IDM_TREEONLY, hwndTree && !hwndDir ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); }
EnableMenuItem(hMenu, IDM_BOTH, wMenuFlags); EnableMenuItem(hMenu, IDM_TREEONLY, wMenuFlags); EnableMenuItem(hMenu, IDM_DIRONLY, wMenuFlags); EnableMenuItem(hMenu, IDM_SPLIT, wMenuFlags);
EnableMenuItem(hMenu, IDM_VINCLUDE, wMenuFlags);
wView &= VIEW_EVERYTHING;
CheckMenuItem(hMenu, IDM_VNAME, (wView == VIEW_NAMEONLY) ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); CheckMenuItem(hMenu, IDM_VDETAILS,(wView == VIEW_EVERYTHING) ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); CheckMenuItem(hMenu, IDM_VOTHER, (wView != VIEW_NAMEONLY && wView != VIEW_EVERYTHING) ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND);
CheckMenuItem(hMenu, IDM_BYNAME, (wSort == IDD_NAME) ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); CheckMenuItem(hMenu, IDM_BYTYPE, (wSort == IDD_TYPE) ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); CheckMenuItem(hMenu, IDM_BYSIZE, (wSort == IDD_SIZE) ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND); CheckMenuItem(hMenu, IDM_BYDATE, (wSort == IDD_DATE) ? MF_CHECKED | MF_BYCOMMAND : MF_UNCHECKED | MF_BYCOMMAND);
if (hwndDir) wMenuFlags = MF_BYCOMMAND | MF_ENABLED; else wMenuFlags = MF_BYCOMMAND | MF_GRAYED;
EnableMenuItem(hMenu, IDM_BYNAME, wMenuFlags); EnableMenuItem(hMenu, IDM_BYTYPE, wMenuFlags); EnableMenuItem(hMenu, IDM_BYSIZE, wMenuFlags); EnableMenuItem(hMenu, IDM_BYDATE, wMenuFlags);
break;
case IDM_OPTIONS: MSG("FrameWndProc", "IDM_OPTIONS"); if (iReadLevel) wMenuFlags = MF_BYCOMMAND | MF_GRAYED;
EnableMenuItem(hMenu, IDM_ADDPLUSES, wMenuFlags); EnableMenuItem(hMenu, IDM_EXPANDTREE, wMenuFlags);
break;
default: MSG("FrameWndProc", "default WM_COMMAND"); { INT pos = (INT)LOWORD(lParam) - bMaxed; INT index;
if ((pos >= IDM_EXTENSIONS) && (pos < (iNumExtensions + IDM_EXTENSIONS))) { // HIWORD(lParam) is the menu handle
// LOWORD(lParam) is menu item delta. DLL should
// add this to it's menu id if it want's to
// change the menu.
index = pos - IDM_EXTENSIONS;
(extensions[index].ExtProc)(hwndFrame, FMEVENT_INITMENU, (LPARAM)(hMenu)); } break; } } break; }
case WM_PAINT: MSG("FrameWndProc", "WM_PAINT"); { HDC hdc; RECT rcTemp; HBRUSH hBrush; PAINTSTRUCT ps; BOOL bEGA; HFONT hFontOld;
hdc = BeginPaint(hWnd, &ps);
if (!IsIconic(hWnd) && bStatusBar) {
GetClientRect(hWnd, &rc); hFontOld = SelectObject(hdc, hFontStatus);
// status area, leave room for the top border
rc.top = rc.bottom - dyStatus + dyBorder;
bEGA = GetNearestColor(hdc, GetSysColor(COLOR_BTNHIGHLIGHT)) == GetNearestColor(hdc, GetSysColor(COLOR_BTNFACE));
if (!bEGA) {
// displays with button shadows
// draw the frame
if (hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE))) {
// top bottom
rcTemp = rc; rcTemp.bottom = rcTemp.top + dyBorderx2; FillRect(hdc, &rcTemp, hBrush);
rcTemp = rc; rcTemp.top = rcTemp.bottom - dyBorderx2; FillRect(hdc, &rcTemp, hBrush);
// left right
rcTemp = rc; rcTemp.right = 8 * dyBorder; FillRect(hdc, &rcTemp, hBrush);
rcTemp = rc; rcTemp.left = dxStatusField * 2 - 8 * dyBorder; FillRect(hdc, &rcTemp, hBrush);
// middle
rcTemp = rc; rcTemp.left = dxStatusField - 4 * dyBorder; rcTemp.right = dxStatusField + 4 * dyBorder; FillRect(hdc, &rcTemp, hBrush);
DeleteObject(hBrush); }
// shadow
if (hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW))) {
// left
rcTemp.left = 8 * dyBorder; rcTemp.right = dxStatusField - 4 * dyBorder; rcTemp.top = rc.top + dyBorderx2; rcTemp.bottom = rcTemp.top + dyBorder; FillRect(hdc, &rcTemp, hBrush);
// right
rcTemp.left = dxStatusField + 4 * dyBorder; rcTemp.right = dxStatusField * 2 - 8 * dyBorder; FillRect(hdc, &rcTemp, hBrush);
// left side 1
rcTemp = rc; rcTemp.left = 8 * dyBorder; rcTemp.right = rcTemp.left + dyBorder; rcTemp.top += dyBorderx2; rcTemp.bottom -= dyBorderx2; FillRect(hdc, &rcTemp, hBrush);
// left side 2
rcTemp.left = dxStatusField + 4 * dyBorder; rcTemp.right = rcTemp.left + dyBorder; FillRect(hdc, &rcTemp, hBrush);
DeleteObject(hBrush); } // the hilight
// hilight
if (hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT))) {
// left
rcTemp.left = 8 * dyBorder; rcTemp.right = dxStatusField - 4 * dyBorder; rcTemp.top = rc.bottom - 3 * dyBorder; rcTemp.bottom = rcTemp.top + dyBorder; FillRect(hdc, &rcTemp, hBrush);
// right
rcTemp.left = dxStatusField + 4 * dyBorder; rcTemp.right = dxStatusField * 2 - 8 * dyBorder; FillRect(hdc, &rcTemp, hBrush);
// left side 1
rcTemp = rc; rcTemp.left = dxStatusField - 5 * dyBorder; rcTemp.right = rcTemp.left + dyBorder; rcTemp.top += dyBorderx2; rcTemp.bottom -= dyBorderx2; FillRect(hdc, &rcTemp, hBrush);
// left side 2
rcTemp.left = 2 * dxStatusField - 9 * dyBorder; rcTemp.right = rcTemp.left + dyBorder; FillRect(hdc, &rcTemp, hBrush);
DeleteObject(hBrush); } }
// solid black line across top (above the status rc)
if (hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNTEXT))) { rcTemp = rc; rcTemp.bottom = rcTemp.top; rcTemp.top -= dyBorder; FillRect(hdc, &rcTemp, hBrush); DeleteObject(hBrush); }
// set the text and background colors
SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT)); SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
// now the text, with a gray background
rcTemp.top = rc.top + 3 * dyBorder; rcTemp.bottom = rc.bottom - 3 * dyBorder; rcTemp.left = 9 * dyBorder; rcTemp.right = dxStatusField - 5 * dyBorder;
ExtTextOut(hdc, rcTemp.left + dyBorderx2, rcTemp.top, ETO_OPAQUE | ETO_CLIPPED, bEGA ? &rc : &rcTemp, szStatusTree, lstrlen(szStatusTree), NULL);
rcTemp.left = dxStatusField + 5 * dyBorder; rcTemp.right = dxStatusField * 2 - 9 * dyBorder;
ExtTextOut(hdc, rcTemp.left + dyBorderx2, rcTemp.top, bEGA ? ETO_CLIPPED : ETO_OPAQUE | ETO_CLIPPED, &rcTemp, szStatusDir, lstrlen(szStatusDir), NULL);
if (hFontOld) SelectObject(hdc, hFontOld); }
EndPaint(hWnd, &ps); break; }
case WM_DESTROY: MSG("FrameWndProc", "WM_DESTROY"); //FileCDR(NULL);
if (!WinHelp(hwndFrame, szWinObjHelp, HELP_QUIT, 0L)) { MyMessageBox(hwndFrame, IDS_WINFILE, IDS_WINHELPERR, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL); } hwndFrame = NULL; PostQuitMessage(0); break;
case WM_SIZE: MSG("FrameWndProc", "WM_SIZE"); if (wParam != SIZEICONIC) { INT dx, dy;
// make things look good by putting WS_BORDER on the
// client, then adjust the thing so it gets clipped
dx = LOWORD(lParam) + 2 * dyBorder; dy = HIWORD(lParam) + 2 * dyBorder; if (bStatusBar) dy -= dyStatus;
MoveWindow(hwndMDIClient, -dyBorder, -dyBorder, dx, dy, TRUE);
if (bStatusBar) { GetClientRect(hwndFrame, &rc); rc.top = rc.bottom - dyStatus; InvalidateRect(hWnd, &rc, TRUE); } } break;
case WM_TIMER:
MSG("FrameWndProc", "WM_TIMER"); // this came from a FSC that wasn't generated by us
bFSCTimerSet = FALSE; KillTimer(hWnd, 1); EnableFSC(); break;
case WM_FILESYSCHANGE: MSG("FrameWndProc", "WM_FILESYSCHANGE"); { LPSTR lpTo;
// if its a rename (including those trapped by kernel)
// find the destination
if (wParam == FSC_RENAME || wParam == 0x8056) { if (wParam == 0x8056) lpTo = (LPSTR)LOWORD(lParam); else lpTo = (LPSTR)lParam; while (*lpTo++) ; } else lpTo = NULL;
ChangeFileSystem((WORD)wParam, (LPSTR)lParam, lpTo); break; }
case WM_SYSCOLORCHANGE: case WM_WININICHANGE: MSG("FrameWndProc", "WM_SYSCOLORCHANGE/WININICHANGE"); if (!lParam || !lstrcmpi((LPSTR)lParam, szInternational)) { HWND hwnd; GetInternational();
for (hwnd = GetWindow(hwndMDIClient,GW_CHILD); hwnd; hwnd = GetWindow(hwnd,GW_HWNDNEXT)) {
if (!GetWindow(hwnd, GW_OWNER)) InvalidateRect(hwnd, NULL, TRUE); } } if (!lParam || !lstrcmpi((LPSTR)lParam, "colors")) { // win.ini section [colors]
HWND hwnd;
DeleteBitmaps(); LoadBitmaps();
InitDriveBitmaps(); // reset the drive bitmaps
// we need to recread the drives windows to change
// the bitmaps
for (hwnd = GetWindow(hwndMDIClient,GW_CHILD); hwnd; hwnd = GetWindow(hwnd,GW_HWNDNEXT)) {
if (!GetWindow(hwnd, GW_OWNER)) SendMessage(hwnd, FS_CHANGEDRIVES, 0, 0L); } } break;
case FM_GETFOCUS: case FM_GETDRIVEINFO: case FM_GETSELCOUNT: case FM_GETSELCOUNTLFN: case FM_GETFILESEL: case FM_GETFILESELLFN: case FM_REFRESH_WINDOWS: case FM_RELOAD_EXTENSIONS: return ExtensionMsgProc(wMsg, wParam, lParam); break;
case WM_MENUSELECT: MSG("FrameWndProc", "WM_MENUSELECT"); if (GET_WM_MENUSELECT_HMENU(wParam, lParam)) { // Save the menu the user selected
wMenuID = GET_WM_MENUSELECT_CMD(wParam, lParam); wMenuFlags = GET_WM_MENUSELECT_FLAGS(wParam, lParam); hMenu = GET_WM_MENUSELECT_HMENU(wParam, lParam); if (wMenuID >= IDM_CHILDSTART && wMenuID < IDM_HELPINDEX) wMenuID = IDM_CHILDSTART; } break;
case WM_ENDSESSION: if (wParam) { #ifdef ORGCODE
/* Yeah, I know I shouldn't have to save this, but I don't
* trust anybody */ BOOL bSaveExit = bExitWindows; bExitWindows = FALSE;
/* Simulate an exit command to clean up, but don't display
* the "are you sure you want to exit", since somebody should * have already taken care of that, and hitting Cancel has no * effect anyway. */ AppCommandProc(IDM_EXIT, 0L); bExitWindows = bSaveExit; #else
AppCommandProc(IDM_EXIT); #endif
} break;
case WM_CLOSE:
MSG("FrameWndProc", "WM_ENDSESSION/WM_CLOSE"); if (iReadLevel) { bCancelTree = 2; break; }
wParam = IDM_EXIT;
/*** FALL THRU ***/
case WM_COMMAND: if (AppCommandProc(GET_WM_COMMAND_ID(wParam, lParam))) break; if (GET_WM_COMMAND_ID(wParam, lParam) == IDM_EXIT) {
FreeExtensions(); if (hModUndelete >= (HANDLE)32) FreeLibrary(hModUndelete);
DestroyWindow(hWnd); break; } /*** FALL THRU ***/
default:
if (wMsg == wHelpMessage) {
if (GET_WM_COMMAND_ID(wParam, lParam) == MSGF_MENU) {
// Get outta menu mode if help for a menu item
if (wMenuID && hMenu) { WORD m = wMenuID; // save
HMENU hM = hMenu; WORD mf = wMenuFlags;
SendMessage(hWnd, WM_CANCELMODE, 0, 0L);
wMenuID = m; // restore
hMenu = hM; wMenuFlags = mf; }
if (!(wMenuFlags & MF_POPUP)) {
if (wMenuFlags & MF_SYSMENU) dwContext = IDH_SYSMENU; else dwContext = wMenuID + IDH_HELPFIRST;
WFHelp(hWnd); }
} else if (GET_WM_COMMAND_ID(wParam, lParam) == MSGF_DIALOGBOX) {
// context range for message boxes
if (dwContext >= IDH_MBFIRST && dwContext <= IDH_MBLAST) WFHelp(hWnd); else // let dialog box deal with it
PostMessage(GetRealParent(GET_WM_COMMAND_HWND(wParam, lParam)), wHelpMessage, 0, 0L); }
} else { DEFMSG("FrameWndProc", (WORD)wMsg); return DefFrameProc(hWnd, hwndMDIClient, wMsg, wParam, lParam); } }
return 0L; }
LRESULT APIENTRY MessageFilter( INT nCode, WPARAM wParam, LPARAM lParam ) { LPMSG lpMsg = (LPMSG) lParam; if (nCode == MSGF_MENU) {
if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1) { // Window of menu we want help for is in loword of lParam.
PostMessage(hwndFrame, wHelpMessage, MSGF_MENU, MAKELONG((WORD)lpMsg->hwnd,0)); return 1; }
} else if (nCode == MSGF_DIALOGBOX) {
if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1) { // Dialog box we want help for is in loword of lParam
PostMessage(hwndFrame, wHelpMessage, MSGF_DIALOGBOX, MAKELONG(lpMsg->hwnd, 0)); return 1; }
}
return (INT)DefHookProc(nCode, wParam, (LPARAM)lpMsg, &hhkMessageFilter); }
/*============================================================================
; ; EnablePropertiesMenu ; ; The following function checks to see if we can enable the Properties... ; item in the File menu. The Properties... menu should be disabled if: ; ; 1) The root directory is selected in the current tree window. ; 2) ONLY the .. directory is selected in the current directory window. ; 3) Nothing is selected in the window having the focus. ; ; Parameters: ; ; hwndActive - Currently active window, contains a listbox in LASTFOCUS ; pSel - Currently selected item. ; ; Return Value: This function returns TRUE if the Properties... menu item ; should be enabled. ; ============================================================================*/
BOOL EnablePropertiesMenu ( HWND hwndActive, PSTR pSel )
{ HANDLE hDTA; /* Handle to list box DTA data */ WORD wHighlight; /* Number of highlighted entries in listbox */ LPMYDTA lpmydta; /* Pointer to listbox DTA data */ BOOL bRet; /* Return value */ HWND hwndLB;
bRet = FALSE;
/* Can't get properties on root directory */
if ((lstrlen (pSel) == 3 && pSel[2] == '\\')) return (FALSE);
if (hwndActive == hwndSearch) hwndLB = (HWND)GetWindowLongPtr(hwndActive, GWLP_LASTFOCUSSEARCH); else hwndLB = (HWND)GetWindowLongPtr(hwndActive, GWLP_LASTFOCUS);
if (!hwndLB) return (TRUE);
wHighlight = (WORD) SendMessage (hwndLB,LB_GETSELCOUNT,0,0L);
if (hwndActive == hwndSearch) return (wHighlight >= 1);
/* Lock down DTA data */ if (!(hDTA = (HANDLE)GetWindowLongPtr (GetParent(hwndLB),GWLP_HDTA))) return (TRUE);
if (!(lpmydta = (LPMYDTA) LocalLock (hDTA))) return (TRUE);
if (wHighlight <= 0) goto ReturnFalse;
if (wHighlight > 1) goto ReturnTrue;
/* If exactly one element is highlighted, make sure it is not .. */
if (!(BOOL) SendMessage (hwndLB,LB_GETSEL,0,0L)) goto ReturnTrue;
/* Get the DTA index. */
SendMessage (hwndLB,LB_GETTEXT,0,(LPARAM) &lpmydta); if (!lpmydta) goto ReturnFalse;
if ((lpmydta->my_dwAttrs & ATTR_DIR) && (lpmydta->my_dwAttrs & ATTR_PARENT)) goto ReturnFalse;
ReturnTrue:
bRet = TRUE;
ReturnFalse:
LocalUnlock (hDTA); return (bRet); }
LONG lmul( WORD w1, WORD w2 ) { return (LONG)w1 * (LONG)w2; }
|