245 lines
6.6 KiB
C
245 lines
6.6 KiB
C
|
//-------------------------------------------------------------------------
|
||
|
// 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;
|
||
|
}
|