//------------------------------------------------------------------------- // File Manager Extensions support routines // // // radical // //------------------------------------------------------------------------- #include "winfile.h" #include "winnet.h" LONG GetExtSelection( HWND hWnd, WORD wItem, LPFMS_GETFILESEL lpSel, BOOL bSearch, BOOL bGetCount, BOOL bLFNAware ) { HANDLE hDTA; LPMYDTA lpmydta; LPDTASEARCH lpdtasch, lpdtaschT; INT count, sel_ind, i; HWND hwndLB; CHAR szPath[MAXPATHLEN]; FMS_GETFILESEL file; if (bGetCount) lpSel = &file; if (bSearch) { hDTA = (HANDLE)GetWindowLongPtr(hWnd, GWLP_HDTASEARCH); lpdtasch = (LPDTASEARCH)LocalLock(hDTA); hwndLB = GetDlgItem(hWnd, IDCW_LISTBOX); } else { hDTA = (HANDLE)GetWindowLongPtr(HasDirWindow(hWnd), GWLP_HDTA); hwndLB = GetDlgItem(HasDirWindow(hWnd), IDCW_LISTBOX); LocalLock(hDTA); } count = (WORD)SendMessage(hwndLB, LB_GETCOUNT, 0, 0L); sel_ind = 0; // index of current selected item for (i = 0; i < count; i++) { if ((BOOL)SendMessage(hwndLB, LB_GETSEL, i, 0L)) { if (bSearch) { lpdtaschT = &(lpdtasch[(INT)SendMessage(hwndLB, LB_GETITEMDATA, i, 0L)]); SendMessage(hwndLB, LB_GETTEXT, i, (LPARAM)szPath); lpSel->bAttr = (BYTE)lpdtaschT->sch_dwAttrs; lpSel->ftTime = lpdtaschT->sch_ftLastWriteTime; lpSel->dwSize = lpdtaschT->sch_nFileSizeLow; } else { SendMessage(hwndLB, LB_GETTEXT, i, (LPARAM)&lpmydta); if (lpmydta->my_dwAttrs & ATTR_PARENT) continue; SendMessage(hWnd, FS_GETDIRECTORY, sizeof(szPath), (LPARAM)szPath); lstrcat(szPath, lpmydta->my_cFileName); lpSel->bAttr = (BYTE)lpmydta->my_dwAttrs; lpSel->ftTime = lpmydta->my_ftLastWriteTime; lpSel->dwSize = lpmydta->my_nFileSizeLow; } // skip LFN stuff for non LFN aware dudes! if (!bLFNAware && (lpSel->bAttr & ATTR_LFN)) continue; FixAnsiPathForDos(szPath); lstrcpy(lpSel->szName, szPath); if (!bGetCount) { if (wItem == (WORD)sel_ind) goto BailOutDude; } sel_ind++; } } BailOutDude: LocalUnlock(hDTA); return (LONG)sel_ind; } LONG GetDriveInfo( HWND hwnd, LPFMS_GETDRIVEINFO lpSel ) { CHAR szPath[MAXPATHLEN]; CHAR szVol[14]; // this has to work for hwnd a tree or search window SendMessage(hwnd, FS_GETDIRECTORY, sizeof(szPath), (LPARAM)szPath); StripBackslash(szPath); FixAnsiPathForDos(szPath); lstrcpy(lpSel->szPath, szPath); lpSel->dwTotalSpace = lTotalSpace; lpSel->dwFreeSpace = lFreeSpace; GetVolumeLabel((szPath[0] & ~0x20) - 'A', szVol, FALSE); lstrcpy(lpSel->szVolume, szVol); szPath[2] = 0; if (WFGetConnection(szPath, lpSel->szShare, FALSE) != WN_SUCCESS) lpSel->szShare[0] = 0; return 1L; } VOID APIENTRY FreeExtensions() { INT i; HMENU hMenuFrame; INT iMax; HWND hwndActive; hMenuFrame = GetMenu(hwndFrame); hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); if (hwndActive && GetWindowLong(hwndActive, GWL_STYLE) & WS_MAXIMIZE) iMax = 1; else iMax = 0; for (i = 0; i < iNumExtensions; i++) { (extensions[i].ExtProc)(NULL, FMEVENT_UNLOAD, 0L); DeleteMenu(hMenuFrame, IDM_EXTENSIONS + iMax, MF_BYPOSITION); FreeLibrary((HANDLE)extensions[i].hModule); } iNumExtensions = 0; } INT_PTR APIENTRY ExtensionMsgProc( UINT wMsg, WPARAM wParam, LPARAM lParam ) { HWND hwndActive; HWND hwndTree, hwndDir, hwndDrives, hwndFocus; hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); GetTreeWindows(hwndActive, &hwndTree, &hwndDir, &hwndDrives); switch (wMsg) { case FM_RELOAD_EXTENSIONS: SendMessage(hwndFrame, WM_CANCELMODE, 0, 0L); FreeExtensions(); InitExtensions(); DrawMenuBar(hwndFrame); break; case FM_GETFOCUS: // wParam unused // lParam unused // return window tyep with focus if (hwndActive == hwndSearch) return FMFOCUS_SEARCH; hwndFocus = GetTreeFocus(hwndActive); if (hwndFocus == hwndTree) return FMFOCUS_TREE; else if (hwndFocus == hwndDir) return FMFOCUS_DIR; else if (hwndFocus == hwndDrives) return FMFOCUS_DRIVES; break; case FM_GETDRIVEINFO: // wParam unused // lParam LPFMS_GETDRIVEINFO structure to be filled in return GetDriveInfo(hwndActive, (LPFMS_GETDRIVEINFO)lParam); break; case FM_REFRESH_WINDOWS: // wParam 0 refresh the current window // non zero refresh all windows // lParam unused if (wParam == 0) RefreshWindow(hwndActive); else { HWND hwndT, hwndNext; hwndT = GetWindow(hwndMDIClient, GW_CHILD); while (hwndT) { hwndNext = GetWindow(hwndT, GW_HWNDNEXT); if (!GetWindow(hwndT, GW_OWNER)) RefreshWindow(hwndT); hwndT = hwndNext; } } lFreeSpace = -1L; UpdateStatus(hwndActive); break; case FM_GETSELCOUNT: case FM_GETSELCOUNTLFN: // wParam unused // lParam unused // return # of selected items case FM_GETFILESEL: case FM_GETFILESELLFN: // wParam index of selected item to get // lParam LPFMS_GETFILESEL structure to be filled in if (hwndActive != hwndSearch && !hwndDir) return 0L; // note, this uses the fact that LFN messages are odd! return GetExtSelection(hwndActive, (WORD)wParam, (LPFMS_GETFILESEL)lParam, hwndActive == hwndSearch, (wMsg & ~1) == FM_GETSELCOUNT, (BOOL)(wMsg & 1)); } return 0; }