599 lines
18 KiB
C
599 lines
18 KiB
C
/****************************************************************************/
|
|
/* */
|
|
/* WFDLGS.C - */
|
|
/* */
|
|
/* Windows File System Dialog procedures */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
#include "winfile.h"
|
|
#include "winnet.h"
|
|
#include "lfn.h"
|
|
#include "wfcopy.h"
|
|
#include "commdlg.h"
|
|
#include "dlgs.h"
|
|
|
|
typedef BOOL (APIENTRY *LPFNFONTPROC)(HWND, UINT, DWORD, LONG);
|
|
|
|
VOID
|
|
APIENTRY
|
|
SaveWindows(
|
|
HWND hwndMain
|
|
)
|
|
{
|
|
CHAR szPath[MAXPATHLEN];
|
|
CHAR buf2[MAXPATHLEN + 6*12];
|
|
CHAR key[10];
|
|
INT dir_num;
|
|
UINT sw;
|
|
HWND hwnd;
|
|
BOOL bCounting;
|
|
POINT ptIcon;
|
|
RECT rcWindow;
|
|
LONG view, sort, attribs;
|
|
|
|
// save main window position
|
|
|
|
sw = GetInternalWindowPos(hwndMain, &rcWindow, &ptIcon);
|
|
|
|
wsprintf(buf2, "%d,%d,%d,%d, , ,%d", rcWindow.left, rcWindow.top,
|
|
rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, sw);
|
|
|
|
WritePrivateProfileString(szSettings, szWindow, buf2, szTheINIFile);
|
|
|
|
// write out dir window strings in reverse order
|
|
// so that when we read them back in we get the same Z order
|
|
|
|
bCounting = TRUE;
|
|
dir_num = 0;
|
|
|
|
DO_AGAIN:
|
|
|
|
for (hwnd = GetWindow(hwndMDIClient, GW_CHILD); hwnd; hwnd = GetWindow(hwnd, GW_HWNDNEXT)) {
|
|
HWND ht = HasTreeWindow(hwnd);
|
|
INT nReadLevel = ht? GetWindowLong(ht, GWL_READLEVEL) : 0;
|
|
|
|
// don't save MDI icon title windows or search windows,
|
|
// or any dir window which is currently recursing
|
|
|
|
if ((GetWindow(hwnd, GW_OWNER) == NULL) &&
|
|
GetWindowLong(hwnd, GWL_TYPE) != TYPE_SEARCH)
|
|
//nReadLevel == 0)
|
|
{
|
|
if (bCounting) {
|
|
dir_num++;
|
|
continue;
|
|
}
|
|
|
|
sw = GetInternalWindowPos(hwnd, &rcWindow, &ptIcon);
|
|
view = GetWindowLong(hwnd, GWL_VIEW);
|
|
sort = GetWindowLong(hwnd, GWL_SORT);
|
|
attribs = GetWindowLong(hwnd, GWL_ATTRIBS);
|
|
|
|
GetMDIWindowText(hwnd, szPath, sizeof(szPath));
|
|
|
|
wsprintf(key, szDirKeyFormat, dir_num--);
|
|
|
|
// format:
|
|
// x_win, y_win,
|
|
// x_win, y_win,
|
|
// x_icon, y_icon,
|
|
// show_window, view, sort, attribs, split, directory
|
|
|
|
wsprintf(buf2, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s",
|
|
rcWindow.left, rcWindow.top,
|
|
rcWindow.right, rcWindow.bottom,
|
|
ptIcon.x, ptIcon.y,
|
|
sw, view, sort, attribs,
|
|
GetSplit(hwnd),
|
|
(LPSTR)szPath);
|
|
|
|
// the dir is an ANSI string (?)
|
|
|
|
WritePrivateProfileString(szSettings, key, buf2, szTheINIFile);
|
|
}
|
|
}
|
|
|
|
if (bCounting) {
|
|
bCounting = FALSE;
|
|
|
|
// erase the last dir window so that if they save with
|
|
// fewer dirs open we don't pull in old open windows
|
|
|
|
wsprintf(key, szDirKeyFormat, dir_num + 1);
|
|
WritePrivateProfileString(szSettings, key, NULL, szTheINIFile);
|
|
|
|
goto DO_AGAIN;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* */
|
|
/* OtherDlgProc() - */
|
|
/* */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
INT_PTR
|
|
APIENTRY
|
|
OtherDlgProc(
|
|
register HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
LONG wView;
|
|
register HWND hwndActive;
|
|
|
|
hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L);
|
|
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
|
|
wView = GetWindowLong(hwndActive, GWL_VIEW);
|
|
CheckDlgButton(hDlg, IDD_SIZE, wView & VIEW_SIZE);
|
|
CheckDlgButton(hDlg, IDD_DATE, wView & VIEW_DATE);
|
|
CheckDlgButton(hDlg, IDD_TIME, wView & VIEW_TIME);
|
|
CheckDlgButton(hDlg, IDD_FLAGS, wView & VIEW_FLAGS);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case IDD_HELP:
|
|
goto DoHelp;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
case IDOK:
|
|
{
|
|
HWND hwnd;
|
|
|
|
wView = GetWindowLong(hwndActive, GWL_VIEW) & VIEW_PLUSES;
|
|
|
|
if (IsDlgButtonChecked(hDlg, IDD_SIZE))
|
|
wView |= VIEW_SIZE;
|
|
if (IsDlgButtonChecked(hDlg, IDD_DATE))
|
|
wView |= VIEW_DATE;
|
|
if (IsDlgButtonChecked(hDlg, IDD_TIME))
|
|
wView |= VIEW_TIME;
|
|
if (IsDlgButtonChecked(hDlg, IDD_FLAGS))
|
|
wView |= VIEW_FLAGS;
|
|
|
|
EndDialog(hDlg, TRUE);
|
|
|
|
if (hwnd = HasDirWindow(hwndActive))
|
|
SendMessage(hwnd, FS_CHANGEDISPLAY, CD_VIEW, (DWORD)wView);
|
|
else if (hwndActive == hwndSearch) {
|
|
SetWindowLong(hwndActive, GWL_VIEW, wView);
|
|
InvalidateRect(hwndActive, NULL, TRUE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
|
|
if (wMsg == wHelpMessage) {
|
|
DoHelp:
|
|
WFHelp(hDlg);
|
|
|
|
return TRUE;
|
|
} else
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* */
|
|
/* IncludeDlgProc() - */
|
|
/* */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
INT_PTR
|
|
APIENTRY
|
|
IncludeDlgProc(
|
|
HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
DWORD dwAttribs;
|
|
HWND hwndActive;
|
|
CHAR szTemp[MAXPATHLEN];
|
|
CHAR szInclude[MAXFILENAMELEN];
|
|
HWND hwndDir;
|
|
|
|
hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L);
|
|
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
|
|
SendMessage(hwndActive, FS_GETFILESPEC, sizeof(szTemp), (LPARAM)szTemp);
|
|
SetDlgItemText(hDlg, IDD_NAME, szTemp);
|
|
SendDlgItemMessage(hDlg, IDD_NAME, EM_LIMITTEXT, MAXFILENAMELEN-1, 0L);
|
|
|
|
dwAttribs = (DWORD)GetWindowLong(hwndActive, GWL_ATTRIBS);
|
|
|
|
CheckDlgButton(hDlg, IDD_DIR, dwAttribs & ATTR_DIR);
|
|
CheckDlgButton(hDlg, IDD_PROGRAMS, dwAttribs & ATTR_PROGRAMS);
|
|
CheckDlgButton(hDlg, IDD_DOCS, dwAttribs & ATTR_DOCS);
|
|
CheckDlgButton(hDlg, IDD_OTHER, dwAttribs & ATTR_OTHER);
|
|
CheckDlgButton(hDlg, IDD_SHOWHIDDEN, dwAttribs & ATTR_HIDDEN);
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case IDD_HELP:
|
|
goto DoHelp;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
case IDOK:
|
|
|
|
GetDlgItemText(hDlg, IDD_NAME, szInclude, sizeof(szInclude));
|
|
|
|
if (szInclude[0] == 0L)
|
|
lstrcpy(szInclude, szStarDotStar);
|
|
|
|
dwAttribs = 0;
|
|
if (IsDlgButtonChecked(hDlg, IDD_DIR))
|
|
dwAttribs |= ATTR_DIR;
|
|
if (IsDlgButtonChecked(hDlg, IDD_PROGRAMS))
|
|
dwAttribs |= ATTR_PROGRAMS;
|
|
if (IsDlgButtonChecked(hDlg, IDD_DOCS))
|
|
dwAttribs |= ATTR_DOCS;
|
|
if (IsDlgButtonChecked(hDlg, IDD_OTHER))
|
|
dwAttribs |= ATTR_OTHER;
|
|
if (IsDlgButtonChecked(hDlg, IDD_SHOWHIDDEN))
|
|
dwAttribs |= ATTR_HS;
|
|
|
|
if (!dwAttribs)
|
|
dwAttribs = ATTR_EVERYTHING;
|
|
|
|
EndDialog(hDlg, TRUE); // here to avoid exces repaints
|
|
|
|
// we need to update the tree if they changed the system/hidden
|
|
// flags. major bummer... FIX31
|
|
|
|
if (hwndDir = HasDirWindow(hwndActive)) {
|
|
SendMessage(hwndDir, FS_GETDIRECTORY, sizeof(szTemp), (LPARAM)szTemp);
|
|
lstrcat(szTemp, szInclude);
|
|
SetWindowText(hwndActive, szTemp);
|
|
SetWindowLong(hwndActive, GWL_ATTRIBS, dwAttribs);
|
|
SendMessage(hwndDir, FS_CHANGEDISPLAY, CD_PATH, 0L);
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
if (wMsg == wHelpMessage) {
|
|
DoHelp:
|
|
WFHelp(hDlg);
|
|
|
|
return TRUE;
|
|
} else
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT_PTR
|
|
APIENTRY
|
|
SelectDlgProc(
|
|
HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
HWND hwndActive, hwnd;
|
|
CHAR szList[128];
|
|
CHAR szSpec[MAXFILENAMELEN];
|
|
LPSTR p;
|
|
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
SendDlgItemMessage(hDlg, IDD_NAME, EM_LIMITTEXT, sizeof(szList)-1, 0L);
|
|
SetDlgItemText(hDlg, IDD_NAME, szStarDotStar);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case IDD_HELP:
|
|
goto DoHelp;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
case IDOK: // select
|
|
case IDYES: // unselect
|
|
|
|
// change "Cancel" to "Close"
|
|
|
|
LoadString(hAppInstance, IDS_CLOSE, szSpec, sizeof(szSpec));
|
|
SetDlgItemText(hDlg, IDCANCEL, szSpec);
|
|
|
|
hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L);
|
|
|
|
if (!hwndActive)
|
|
break;
|
|
|
|
GetDlgItemText(hDlg, IDD_NAME, szList, sizeof(szList));
|
|
|
|
if (hwndActive == hwndSearch)
|
|
hwnd = hwndSearch;
|
|
else
|
|
hwnd = HasDirWindow(hwndActive);
|
|
|
|
if (hwnd) {
|
|
|
|
p = szList;
|
|
|
|
while (p = GetNextFile(p, szSpec, sizeof(szSpec)))
|
|
SendMessage(hwnd, FS_SETSELECTION, (BOOL)(GET_WM_COMMAND_ID(wParam, lParam) == IDOK), (LPARAM)szSpec);
|
|
}
|
|
|
|
UpdateStatus(hwndActive);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
if (wMsg == wHelpMessage) {
|
|
DoHelp:
|
|
WFHelp(hDlg);
|
|
|
|
return TRUE;
|
|
} else
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
UINT_PTR
|
|
FontHookProc(
|
|
HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
CheckDlgButton(hDlg, chx3, wTextAttribs & TA_LOWERCASE);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam) {
|
|
case pshHelp:
|
|
SendMessage(hwndFrame, wHelpMessage, 0, 0L);
|
|
break;
|
|
|
|
case IDOK:
|
|
if (IsDlgButtonChecked(hDlg, chx3))
|
|
wTextAttribs |= TA_LOWERCASE;
|
|
else
|
|
wTextAttribs &= ~TA_LOWERCASE;
|
|
break;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
#define abs(x) ((x < 0) ? -x : x)
|
|
|
|
VOID
|
|
APIENTRY
|
|
NewFont()
|
|
{
|
|
HFONT hOldFont;
|
|
HANDLE hOld;
|
|
HWND hwnd, hwndT;
|
|
HDC hdc;
|
|
RECT rc;
|
|
LOGFONT lf;
|
|
CHOOSEFONT cf;
|
|
CHAR szBuf[10];
|
|
INT res;
|
|
WORD iOld,iNew;
|
|
|
|
#define MAX_PT_SIZE 36
|
|
|
|
GetObject(hFont, sizeof(lf), (LPSTR)(LPLOGFONT)&lf);
|
|
iOld = (WORD)abs(lf.lfHeight);
|
|
|
|
cf.lStructSize = sizeof(cf);
|
|
cf.hwndOwner = hwndFrame;
|
|
cf.lpLogFont = &lf;
|
|
cf.hInstance = hAppInstance;
|
|
cf.lpTemplateName = MAKEINTRESOURCE(FONTDLG);
|
|
cf.lpfnHook = FontHookProc;
|
|
cf.nSizeMin = 4;
|
|
cf.nSizeMax = 36;
|
|
cf.Flags = CF_SCREENFONTS | CF_ANSIONLY | CF_SHOWHELP |
|
|
CF_ENABLEHOOK | CF_ENABLETEMPLATE |
|
|
CF_INITTOLOGFONTSTRUCT | CF_LIMITSIZE;
|
|
|
|
res = ChooseFont(&cf);
|
|
|
|
if (!res)
|
|
return;
|
|
|
|
wsprintf(szBuf, "%d", cf.iPointSize / 10);
|
|
iNew = (WORD)abs(lf.lfHeight);
|
|
|
|
// Set wTextAttribs BOLD and ITALIC flags
|
|
|
|
if (lf.lfWeight == 700)
|
|
wTextAttribs |= TA_BOLD;
|
|
else
|
|
wTextAttribs &= ~TA_BOLD;
|
|
if (lf.lfItalic != 0)
|
|
wTextAttribs |= TA_ITALIC;
|
|
else
|
|
wTextAttribs &= ~TA_ITALIC;
|
|
|
|
WritePrivateProfileString(szSettings, szFace, lf.lfFaceName, szTheINIFile);
|
|
WritePrivateProfileString(szSettings, szSize, szBuf, szTheINIFile);
|
|
WritePrivateProfileBool(szLowerCase, wTextAttribs);
|
|
|
|
hOldFont = hFont;
|
|
|
|
hFont = CreateFontIndirect(&lf);
|
|
|
|
if (!hFont) {
|
|
DeleteObject(hOldFont);
|
|
return;
|
|
}
|
|
|
|
// recalc all the metrics for the new font
|
|
|
|
hdc = GetDC(NULL);
|
|
hOld = SelectObject(hdc, hFont);
|
|
GetTextStuff(hdc);
|
|
if (hOld)
|
|
SelectObject(hdc, hOld);
|
|
ReleaseDC(NULL, hdc);
|
|
|
|
// now update all listboxes that are using the old
|
|
// font with the new font
|
|
|
|
for (hwnd = GetWindow(hwndMDIClient, GW_CHILD); hwnd;
|
|
hwnd = GetWindow(hwnd, GW_HWNDNEXT)) {
|
|
|
|
if (GetWindow(hwnd, GW_OWNER))
|
|
continue;
|
|
|
|
if ((INT)GetWindowLong(hwnd, GWL_TYPE) == TYPE_SEARCH) {
|
|
SendMessage((HWND)GetDlgItem(hwnd, IDCW_LISTBOX), WM_SETFONT, (WPARAM)hFont, 0L);
|
|
SendMessage((HWND)GetDlgItem(hwnd, IDCW_LISTBOX), LB_SETITEMHEIGHT, 0, (LONG)dyFileName);
|
|
// we should really update the case of the search
|
|
// window here. but this is a rare case...
|
|
} else {
|
|
|
|
// resize the drives, tree, dir
|
|
|
|
if (hwndT = HasDrivesWindow(hwnd)) {
|
|
GetClientRect(hwnd, &rc);
|
|
SendMessage(hwnd, WM_SIZE, SIZENOMDICRAP, MAKELONG(rc.right, rc.bottom));
|
|
}
|
|
|
|
if (hwndT = HasDirWindow(hwnd))
|
|
SetLBFont(hwndT, GetDlgItem(hwndT, IDCW_LISTBOX), hFont);
|
|
|
|
if (hwndT = HasTreeWindow(hwnd)) {
|
|
|
|
// the tree list box
|
|
|
|
hwndT = GetDlgItem(hwndT, IDCW_TREELISTBOX);
|
|
|
|
/*
|
|
Kludge alert: xTreeMax is a single var representing the width of
|
|
all tree windows. It always grows, never shrinks (like the budget
|
|
deficit).
|
|
*/
|
|
xTreeMax = (WORD)((xTreeMax * iNew) / iOld);
|
|
SendMessage(hwndT, LB_SETHORIZONTALEXTENT, xTreeMax, 0L);
|
|
SendMessage(hwndT, WM_SETFONT, (WPARAM)hFont, 0L);
|
|
SendMessage(hwndT, LB_SETITEMHEIGHT, 0, (LONG)dyFileName);
|
|
}
|
|
}
|
|
|
|
// now repaint after all the font changes
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
}
|
|
DeleteObject(hOldFont); // done with this now, delete it
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* */
|
|
/* ConfirmDlgProc() - */
|
|
/* */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
INT_PTR
|
|
APIENTRY
|
|
ConfirmDlgProc(
|
|
HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
CheckDlgButton(hDlg, IDD_DELETE, bConfirmDelete);
|
|
CheckDlgButton(hDlg, IDD_SUBDEL, bConfirmSubDel);
|
|
CheckDlgButton(hDlg, IDD_REPLACE, bConfirmReplace);
|
|
CheckDlgButton(hDlg, IDD_MOUSE, bConfirmMouse);
|
|
CheckDlgButton(hDlg, IDD_CONFIG, bConfirmFormat);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case IDD_HELP:
|
|
goto DoHelp;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
case IDOK:
|
|
bConfirmDelete = IsDlgButtonChecked(hDlg, IDD_DELETE);
|
|
bConfirmSubDel = IsDlgButtonChecked(hDlg, IDD_SUBDEL);
|
|
bConfirmReplace = IsDlgButtonChecked(hDlg, IDD_REPLACE);
|
|
bConfirmMouse = IsDlgButtonChecked(hDlg, IDD_MOUSE);
|
|
bConfirmFormat = IsDlgButtonChecked(hDlg, IDD_CONFIG);
|
|
|
|
WritePrivateProfileBool(szConfirmDelete, bConfirmDelete);
|
|
WritePrivateProfileBool(szConfirmSubDel, bConfirmSubDel);
|
|
WritePrivateProfileBool(szConfirmReplace, bConfirmReplace);
|
|
WritePrivateProfileBool(szConfirmMouse, bConfirmMouse);
|
|
WritePrivateProfileBool(szConfirmFormat, bConfirmFormat);
|
|
|
|
EndDialog(hDlg, TRUE);
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
if (wMsg == wHelpMessage) {
|
|
DoHelp:
|
|
WFHelp(hDlg);
|
|
|
|
return TRUE;
|
|
} else
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|