windows-nt/Source/XPSP1/NT/sdktools/tweakui/explorer.cpp
2020-09-26 16:20:57 +08:00

983 lines
27 KiB
C++

/*
* explorer - Dialog box property sheet for "explorer ui tweaks"
*/
#include "tweakui.h"
#pragma BEGIN_CONST_DATA
typedef struct SCEI { /* Shortcut effect info */
PCTSTR ptszDll;
int iIcon;
} SCEI;
const SCEI CODESEG rgscei[] = {
{ g_tszPathShell32, 29 },
{ g_tszPathMe, IDI_ALTLINK - 1 },
{ g_tszPathMe, IDI_BLANK - 1 },
};
KL const c_klHackPtui = { &g_hkLMSMWCV, c_tszAppletTweakUI, c_tszHackPtui };
KL const c_klLinkOvl = { &pcdii->hkLMExplorer, c_tszShellIcons, c_tszLinkOvl };
KL const c_klWelcome = { &pcdii->hkCUExplorer, c_tszTips, c_tszShow };
KL const c_klAltColor = { &pcdii->hkCUExplorer, 0, c_tszAltColor };
KL const c_klHotlight = { &c_hkCU, c_tszCplColors, c_tszHotTrackColor };
KL const c_klNoConnection = { &pcdii->hkCUExplorer, 0, TEXT("NoFileFolderConnection") };
#define clrDefAlt RGB(0x00, 0x00, 0xFF)
#define clrDefHot RGB(0x00, 0x00, 0xFF)
const static DWORD CODESEG rgdwHelp[] = {
IDC_LINKGROUP, IDH_LINKEFFECT,
IDC_LINKARROW, IDH_LINKEFFECT,
IDC_LIGHTARROW, IDH_LINKEFFECT,
IDC_NOARROW, IDH_LINKEFFECT,
IDC_CUSTOMARROW, IDH_LINKEFFECT,
IDC_CUSTOMCHANGE, IDH_LINKEFFECT,
IDC_LINKBEFORETEXT, IDH_LINKEFFECT,
IDC_LINKBEFORE, IDH_LINKEFFECT,
IDC_LINKAFTERTEXT, IDH_LINKEFFECT,
IDC_LINKAFTER, IDH_LINKEFFECT,
IDC_LINKHELP, IDH_LINKEFFECT,
IDC_SETGROUP, IDH_GROUP,
IDC_CLRGROUP, IDH_GROUP,
IDC_COMPRESSTXT, IDH_COMPRESSCLR,
IDC_COMPRESSCLR, IDH_COMPRESSCLR,
IDC_COMPRESSBTN, IDH_COMPRESSCLR,
IDC_HOTTRACKTXT, IDH_HOTTRACKCLR,
IDC_HOTTRACKCLR, IDH_HOTTRACKCLR,
IDC_HOTTRACKBTN, IDH_HOTTRACKCLR,
IDC_RESET, IDH_RESET,
0, 0,
};
#pragma END_CONST_DATA
/*****************************************************************************
*
* CustomColor
*
* A little class the manages the little custom color buttons.
*
*****************************************************************************/
class CustomColor {
public:
void Init(HWND hwnd);
void Destroy();
void SetColor(COLORREF clr);
COLORREF GetColor();
private:
COLORREF _clr; /* The color */
HWND _hwnd; /* Button control we party on */
HBITMAP _hbm; /* Solid bitmap for button */
RECT _rc; /* Rectangle dimensions of bitmap */
};
/*****************************************************************************
*
* CustomColor::Init
*
* Say which control is in charge.
*
*****************************************************************************/
void CustomColor::Init(HWND hwnd)
{
HDC hdc;
_hwnd = hwnd;
GetClientRect(_hwnd, &_rc);
hdc = GetDC(hwnd);
if (hdc) {
_hbm = CreateCompatibleBitmap(hdc, _rc.right, _rc.bottom);
ReleaseDC(hwnd, hdc);
} else {
_hbm = NULL;
}
SendMessage(_hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)_hbm);
}
/*****************************************************************************
*
* CustomColor::Destroy
*
* Clean up the custom color stuff.
*
*****************************************************************************/
void
CustomColor::Destroy()
{
if (_hwnd) {
SendMessage(_hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)NULL);
}
if (_hbm) {
DeleteObject(_hbm);
}
}
/*****************************************************************************
*
* CustomColor::SetColor
*
* Set the custom color.
*
*****************************************************************************/
void
CustomColor::SetColor(COLORREF clr)
{
/*
* Fill the bitmap with the new color.
*/
_clr = clr;
HDC hdc = CreateCompatibleDC(NULL);
if (hdc) {
HBITMAP hbmPrev = SelectBitmap(hdc, _hbm);
SetBkColor(hdc, _clr);
ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &_rc, NULL, 0, NULL);
SelectObject(hdc, hbmPrev);
DeleteDC(hdc);
}
/*
* Okay, repaint with the new bitmap.
*/
InvalidateRect(_hwnd, NULL, TRUE);
}
/*****************************************************************************
*
* CustomColor::GetColor
*
* Get the custom color.
*
*****************************************************************************/
COLORREF __inline
CustomColor::GetColor()
{
return _clr;
}
/*****************************************************************************
*
* EDII
*
*****************************************************************************/
typedef struct EDII {
HIMAGELIST himl; /* Private image list */
WNDPROC wpAfter; /* Subclass procedure */
UINT idcCurEffect; /* currently selected effect */
BOOL fIconDirty; /* if the shortcut icon is dirty */
int iIcon; /* Custom shortcut effect icon */
CustomColor ccComp; /* Compressed files */
CustomColor ccHot; /* Hot-track */
TCH tszPathDll[MAX_PATH]; /* Custom shortcut effect dll */
} EDII, *PEDII;
EDII edii;
#define pedii (&edii)
/*****************************************************************************
*
* GetRestriction
*
* Determine whether a restriction is set. Restrictions are reverse-sense,
* so we un-reverse them here, so that this returns 1 if the feature is
* enabled.
*
*****************************************************************************/
BOOL PASCAL
GetRestriction(LPCTSTR ptszKey)
{
return GetRegDword(g_hkCUSMWCV, c_tszRestrictions, ptszKey, 0) == 0;
}
/*****************************************************************************
*
* SetRestriction
*
* Set a restriction. Again, since restrictions are reverse-sense, we
* un-reverse them here, so that passing 1 enables the feature.
*
*****************************************************************************/
BOOL PASCAL
SetRestriction(LPCTSTR ptszKey, BOOL f)
{
return SetRegDword(g_hkCUSMWCV, c_tszRestrictions, ptszKey, !f);
}
/*****************************************************************************
*
* Explorer_HackPtui
*
* Patch up a bug in comctl32, where a blank overlay image gets
* the wrong rectangle set into it because comctl32 gets confused
* when all the pixels are transparent. As a result, the link
* overlay becomes THE ENTIRE IMAGELIST instead of nothing.
*
* We do this by (hack!) swiping himlIcons and himlIconsSmall
* from SHELL32, and then (ptui!) partying DIRECTLY INTO THEM
* and fixing up the rectangle coordinates.
*
* I'm really sorry I have to do this, but if I don't, people will
* just keep complaining.
*
* Helper procedures:
*
* Explorer_HackPtuiCough - fixes one himl COMCTL32's data structures.
*
*****************************************************************************/
/*
* On entry to Explorer_HackPtuiCough, the pointer has already been
* validated.
*/
BOOL PASCAL
Explorer_HackPtuiCough(LPBYTE lpb, LPVOID pvRef)
{
#if 0
if (*(LPWORD)lpb == 0x4C49 &&
*(LPDWORD)(lpb + 0x78) == 0 && *(LPDWORD)(lpb + 0x88) == 0) {
#else
if (*(LPWORD)lpb == 0x4C49) {
#endif
*(LPDWORD)(lpb + 0x78) = 1;
*(LPDWORD)(lpb + 0x88) = 1;
return 1;
} else {
return 0;
}
}
void PASCAL
Explorer_HackPtui(void)
{
if (g_fBuggyComCtl32 && GetIntPkl(0, &c_klHackPtui)) {
if (WithSelector((DWORD_PTR)GetSystemImageList(0),
0x8C, (WITHPROC)Explorer_HackPtuiCough, 0, 1) &&
WithSelector((DWORD_PTR)GetSystemImageList(SHGFI_SMALLICON),
0x8C, (WITHPROC)Explorer_HackPtuiCough, 0, 1)) {
RedrawWindow(0, 0, 0, RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
}
/*****************************************************************************
*
* Explorer_SetAfterImage
*
* The link overlay image has changed, so update the "after" image, too.
* All we have to do is invalidate the window; our WM_PAINT handler will
* paint the new effect.
*
*****************************************************************************/
INLINE void
Explorer_SetAfterImage(HWND hdlg)
{
InvalidateRect(GetDlgItem(hdlg, IDC_LINKAFTER), 0, 1);
}
/*****************************************************************************
*
* Explorer_After_OnPaint
*
* Paint the merged images.
*
* I used to use ILD_TRANSPARENT, except for some reason the background
* wasn't erased by WM_ERASEBKGND. (Probably because statics don't
* process that message.)
*
*****************************************************************************/
LRESULT PASCAL
Explorer_After_OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
if (hdc) {
ImageList_SetBkColor(pedii->himl, GetSysColor(COLOR_BTNFACE));
ImageList_Draw(pedii->himl, 0, hdc, 0, 0,
ILD_NORMAL | INDEXTOOVERLAYMASK(1));
EndPaint(hwnd, &ps);
}
return 0;
}
/*****************************************************************************
*
* Explorer_After_WndProc
*
* Subclass window procedure for the after-image.
*
*****************************************************************************/
LRESULT EXPORT
Explorer_After_WndProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_PAINT: return Explorer_After_OnPaint(hwnd);
}
return CallWindowProc(pedii->wpAfter, hwnd, wm, wp, lp);
}
/*****************************************************************************
*
* Explorer_GetIconSpecFromRegistry
*
* The output buffer must be MAX_PATH characters in length.
*
* Returns the icon index.
*
*****************************************************************************/
int PASCAL
Explorer_GetIconSpecFromRegistry(LPTSTR ptszBuf)
{
int iIcon;
if (GetStrPkl(ptszBuf, cbCtch(MAX_PATH), &c_klLinkOvl)) {
iIcon = ParseIconSpec(ptszBuf);
} else {
ptszBuf[0] = TEXT('\0');
iIcon = 0;
}
return iIcon;
}
/*****************************************************************************
*
* Explorer_RefreshOverlayImage
*
* There was a change to the shortcut effects. Put a new overlay
* image into the imagelist and update the After image as well.
*
*****************************************************************************/
void PASCAL
Explorer_RefreshOverlayImage(HWND hdlg)
{
HICON hicon = ExtractIcon(hinstCur, pedii->tszPathDll, pedii->iIcon);
if ((UINT_PTR)hicon <= 1) {
hicon = ExtractIcon(hinstCur, g_tszPathShell32, 29); /* default */
}
ImageList_ReplaceIcon(pedii->himl, 1, hicon);
SafeDestroyIcon(hicon);
Explorer_SetAfterImage(hdlg);
}
/*****************************************************************************
*
* Explorer_OnEffectChange
*
* There was a change to the shortcut effects.
*
* Put the new effect icon into the image list and update stuff.
*
*****************************************************************************/
void PASCAL
Explorer_OnEffectChange(HWND hdlg, UINT id)
{
if (id != pedii->idcCurEffect) {
if (id == IDC_CUSTOMARROW) {
EnableDlgItem(hdlg, IDC_CUSTOMCHANGE, TRUE);
} else {
EnableDlgItem(hdlg, IDC_CUSTOMCHANGE, FALSE);
lstrcpy(pedii->tszPathDll, rgscei[id - IDC_LINKFIRST].ptszDll);
pedii->iIcon = rgscei[id - IDC_LINKFIRST].iIcon;
}
pedii->idcCurEffect = id;
pedii->fIconDirty = 1;
Explorer_RefreshOverlayImage(hdlg);
Common_SetDirty(hdlg);
}
}
/*****************************************************************************
*
* Explorer_ChangeEffect
*
* The user wants to customize the link effect.
*
*****************************************************************************/
void PASCAL
Explorer_ChangeEffect(HWND hdlg)
{
if (PickIcon(hdlg, pedii->tszPathDll, cA(pedii->tszPathDll),
&pedii->iIcon)) {
pedii->fIconDirty = 1;
Explorer_RefreshOverlayImage(hdlg);
Common_SetDirty(hdlg);
}
}
#if 0
/*****************************************************************************
*
* Explorer_FactoryReset
*
* Restore to factory settings.
*
*****************************************************************************/
BOOL PASCAL
Explorer_FactoryReset(HWND hdlg)
{
if (pedii->idcCurEffect != IDC_LINKARROW) {
if (pedii->idcCurEffect) {
CheckDlgButton(hdlg, pedii->idcCurEffect, 0);
}
CheckDlgButton(hdlg, IDC_LINKARROW, 1);
Explorer_OnEffectChange(hdlg, IDC_LINKARROW);
}
CheckDlgButton(hdlg, IDC_PREFIX, 1);
CheckDlgButton(hdlg, IDC_EXITSAVE, 1);
CheckDlgButton(hdlg, IDC_BANNER, 1);
CheckDlgButton(hdlg, IDC_WELCOME, 1);
if (mit.ReadCabinetState) {
CheckDlgButton(hdlg, IDC_MAKEPRETTY, 1);
pedii->ccComp.SetColor(clrDefAlt);
}
if (GetSysColorBrush(COLOR_HOTLIGHT)) {
pedii->ccHot.SetColor(clrDefHot);
}
Common_SetDirty(hdlg);
return 1;
}
#endif
/*****************************************************************************
*
* Explorer_ChangeColor
*
*****************************************************************************/
BOOL PASCAL
Explorer_ChangeColor(HWND hdlg, int id)
{
CHOOSECOLOR cc;
CustomColor *pcc = id == IDC_COMPRESSBTN ? &pedii->ccComp : &pedii->ccHot;
DWORD rgdw[16];
HKEY hk;
ZeroMemory(rgdw, cbX(rgdw));
if (RegOpenKey(HKEY_CURRENT_USER, c_tszRegPathAppearance, &hk) == 0) {
DWORD cb = cbX(rgdw);
RegQueryValueEx(hk, c_tszCustomColors, 0, 0, (LPBYTE)rgdw, &cb);
RegCloseKey(hk);
}
cc.lStructSize = cbX(cc);
cc.hwndOwner = hdlg;
cc.rgbResult = pcc->GetColor();
cc.lpCustColors = rgdw;
cc.Flags = CC_RGBINIT;
if (ChooseColor(&cc) && pcc->GetColor() != cc.rgbResult) {
pcc->SetColor(cc.rgbResult);
Common_SetDirty(hdlg);
}
return 1;
}
/*****************************************************************************
*
* Explorer_OnCommand
*
* Ooh, we got a command.
*
*****************************************************************************/
void PASCAL
Explorer_OnCommand(HWND hdlg, int id, UINT codeNotify)
{
switch (id) {
case IDC_LINKARROW:
case IDC_LIGHTARROW:
case IDC_NOARROW:
case IDC_CUSTOMARROW:
if (codeNotify == BN_CLICKED) {
Explorer_OnEffectChange(hdlg, id);
}
break;
case IDC_CUSTOMCHANGE:
if (codeNotify == BN_CLICKED) Explorer_ChangeEffect(hdlg);
break;
case IDC_COMPRESSBTN:
case IDC_HOTTRACKBTN:
if (codeNotify == BN_CLICKED) Explorer_ChangeColor(hdlg, id);
break;
#if 0
case IDC_RESET: /* Reset to factory default */
if (codeNotify == BN_CLICKED) Explorer_FactoryReset(hdlg);
break;
#endif
}
}
/*****************************************************************************
*
* Explorer_GetLinkPrefix
* Explorer_SetLinkPrefix
*
*****************************************************************************/
BOOL PASCAL
Explorer_GetLinkPrefix(LPARAM lParam, LPVOID pvRef)
{
return Link_GetShortcutTo();
}
BOOL PASCAL
Explorer_SetLinkPrefix(BOOL f, LPARAM lParam, LPVOID pvRef)
{
if (!Link_SetShortcutTo(f) && pvRef) {
LPBOOL pf = (LPBOOL)pvRef;
*pf = TRUE;
}
return TRUE;
}
/*****************************************************************************
*
* Explorer_GetRestriction
* Explorer_GetRestrictionClassic
* Explorer_SetRestriction
*
*****************************************************************************/
BOOL PASCAL
Explorer_GetRestriction(LPARAM lParam, LPVOID pvRef)
{
LPCTSTR pszRest = (LPCTSTR)pvRef;
return GetRestriction(pszRest);
}
BOOL PASCAL
Explorer_GetRestrictionClassic(LPARAM lParam, LPVOID pvRef)
{
if (g_fIE4) {
return -1;
} else {
LPCTSTR pszRest = (LPCTSTR)pvRef;
return GetRestriction(pszRest);
}
}
BOOL PASCAL
Explorer_SetRestriction(BOOL f, LPARAM lParam, LPVOID pvRef)
{
LPCTSTR pszRest = (LPCTSTR)pvRef;
BOOL fRc = SetRestriction(pszRest, f);
return fRc;
}
/*****************************************************************************
*
* Explorer_GetWelcome
* Explorer_SetWelcome
*
*****************************************************************************/
BOOL PASCAL
Explorer_GetWelcome(LPARAM lParam, LPVOID pvRef)
{
if (g_fIE4) {
return -1;
} else {
return GetDwordPkl(&c_klWelcome, 1);
}
}
BOOL PASCAL
Explorer_SetWelcome(BOOL f, LPARAM lParam, LPVOID pvRef)
{
BOOL fRc = SetDwordPkl(&c_klWelcome, f);
return fRc;
}
/*****************************************************************************
*
* Explorer_Get8Dot3
* Explorer_Set8Dot3
*
* The setting is valid only if ReadCabinetState exists and we are not v5.
*
*****************************************************************************/
BOOL PASCAL
Explorer_Get8Dot3(LPARAM lParam, LPVOID pvRef)
{
CABINETSTATE cs;
if (!g_fShell5 && mit.ReadCabinetState && mit.ReadCabinetState(&cs, cbX(cs))) {
return !cs.fDontPrettyNames;
} else {
return -1;
}
}
BOOL PASCAL
Explorer_Set8Dot3(BOOL f, LPARAM lParam, LPVOID pvRef)
{
BOOL fRc = FALSE;
CABINETSTATE cs;
if (mit.ReadCabinetState(&cs, cbX(cs))) {
if (cs.fDontPrettyNames == f) {
fRc = TRUE;
} else {
cs.fDontPrettyNames = f;
fRc = mit.WriteCabinetState(&cs);
if (fRc && pvRef) {
LPBOOL pf = (LPBOOL)pvRef;
*pf = TRUE;
}
}
}
return fRc;
}
/*****************************************************************************
*
* Explorer_GetConnectedFiles
* Explorer_SetConnectedFiles
*
*****************************************************************************/
BOOL PASCAL
Explorer_GetConnectedFiles(LPARAM lParam, LPVOID pvRef)
{
if (g_fShell5) {
return !GetDwordPkl(&c_klNoConnection, 0);
} else {
return -1;
}
}
BOOL PASCAL
Explorer_SetConnectedFiles(BOOL f, LPARAM lParam, LPVOID pvRef)
{
BOOL fRc = SetDwordPkl(&c_klNoConnection, !f);
return fRc;
}
/*****************************************************************************
*
* c_rgcliExplorer
*
*****************************************************************************/
/*
* Note that this needs to be in sync with the IDS_EXPLOREREFFECTS
* strings.
*/
CHECKLISTITEM c_rgcliExplorer[] = {
{ Explorer_GetLinkPrefix, Explorer_SetLinkPrefix, 0, },
{ Explorer_GetRestriction, Explorer_SetRestriction, (LPARAM)c_tszNoExitSave, },
{ Explorer_GetRestrictionClassic, Explorer_SetRestriction, (LPARAM)c_tszNoBanner, },
{ Explorer_GetWelcome, Explorer_SetWelcome, 0, },
{ Explorer_Get8Dot3, Explorer_Set8Dot3, 0, },
{ Explorer_GetConnectedFiles,
Explorer_SetConnectedFiles, 0 },
};
/*****************************************************************************
*
* Explorer_OnInitDialog
*
* Find out which link icon people are using.
*
* When we initialize the image list, we just throw something random
* into position 1. Explorer_OnEffectChange will put the right thing in.
*
*****************************************************************************/
BOOL PASCAL
Explorer_OnInitDialog(HWND hwndList)
{
int iscei;
CABINETSTATE cs;
HWND hdlg = GetParent(hwndList);
pedii->iIcon = Explorer_GetIconSpecFromRegistry(pedii->tszPathDll);
if (pedii->tszPathDll[0]) {
for (iscei = 0; iscei < cA(rgscei); iscei++) {
if (pedii->iIcon == rgscei[iscei].iIcon &&
lstrcmpi(pedii->tszPathDll, rgscei[iscei].ptszDll) == 0) {
break;
}
}
} else {
iscei = 0; /* Default */
}
if (iscei == IDC_LINKARROW - IDC_LINKFIRST && GetIntPkl(0, &c_klHackPtui)) {
iscei = IDC_NOARROW - IDC_LINKFIRST;
}
/*
* Don't need to listen to WM_SETTINGCHANGE because we place the
* icon inside a static control which will not resize dynamically.
*/
pedii->himl = ImageList_Create(GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON), 1,
2, 1);
if (pedii->himl) {
HICON hicon;
hicon = (HICON)SendDlgItemMessage(hdlg, IDC_LINKBEFORE,
STM_GETICON, 0, 0L);
/* We start with whatever icon got dropped into IDC_BEFORE. */
ImageList_AddIcon(pedii->himl, hicon); /* zero */
ImageList_AddIcon(pedii->himl, hicon); /* one */
if (pedii->tszPathDll[0]) {
hicon = ExtractIcon(hinstCur, pedii->tszPathDll, pedii->iIcon);
if (ImageList_AddIcon(pedii->himl, hicon) != 1) {
/* Oh dear */
}
SafeDestroyIcon(hicon);
}
ImageList_SetOverlayImage(pedii->himl, 1, 1);
pedii->wpAfter = SubclassWindow(GetDlgItem(hdlg, IDC_LINKAFTER),
Explorer_After_WndProc);
} else {
/* Oh dear */
}
CheckDlgButton(hdlg, IDC_LINKFIRST + iscei, TRUE);
pedii->idcCurEffect = -1;
Explorer_OnEffectChange(hdlg, IDC_LINKFIRST + iscei);
if (!RegCanModifyKey(pcdii->hkLMExplorer, c_tszShellIcons)) {
EnableDlgItems(hdlg, IDC_LINKFIRST, IDC_LINKLAST, FALSE);
}
int iColorsLeft = 2;
if (mit.ReadCabinetState && g_fNT) {
pedii->ccComp.Init(GetDlgItem(hdlg, IDC_COMPRESSBTN));
pedii->ccComp.SetColor(GetDwordPkl(&c_klAltColor, clrDefAlt));
} else {
DestroyDlgItems(hdlg, IDC_COMPRESSFIRST, IDC_COMPRESSLAST);
iColorsLeft--;
}
/*
* If COLOR_HOTLIGHT is supported, then do that too.
*/
if (GetSysColorBrush(COLOR_HOTLIGHT)) {
pedii->ccHot.Init(GetDlgItem(hdlg, IDC_HOTTRACKBTN));
pedii->ccHot.SetColor(GetSysColor(COLOR_HOTLIGHT));
} else {
DestroyDlgItems(hdlg, IDC_HOTTRACKFIRST, IDC_HOTTRACKLAST);
iColorsLeft--;
}
if (!iColorsLeft) {
DestroyDlgItems(hdlg, IDC_CLRGROUP, IDC_CLRGROUP);
}
pedii->fIconDirty = 0;
Checklist_OnInitDialog(hwndList, c_rgcliExplorer, cA(c_rgcliExplorer),
IDS_EXPLOREREFFECTS, 0);
PropSheet_UnChanged(GetParent(hdlg), hdlg);
return 1;
}
/*****************************************************************************
*
* Explorer_ApplyOverlay
*
* This applies the overlay customization.
*
* HackPtui makes life (unfortunately) difficult. We signal that
* HackPtui is necessary by setting the "HackPtui" registry
* entry to 1.
*
*****************************************************************************/
void PASCAL
Explorer_ApplyOverlay(void)
{
/*
* Assume that nothing special is needed.
*/
DelPkl(&c_klLinkOvl);
DelPkl(&c_klHackPtui);
switch (pedii->idcCurEffect) {
case IDC_LINKARROW:
break; /* Nothing to do */
case IDC_NOARROW: /* This is the tough one */
if (g_fBuggyComCtl32) {
SetIntPkl(1, &c_klHackPtui);
} else {
TCH tszBuild[MAX_PATH + 1 + 6]; /* comma + 65535 */
default:
wsprintf(tszBuild, c_tszSCommaU, pedii->tszPathDll, pedii->iIcon);
SetStrPkl(&c_klLinkOvl, tszBuild);
}
break;
}
Misc_RebuildIcoCache();
pedii->fIconDirty = 0;
}
/*****************************************************************************
*
* Explorer_OnApply
*
* Write the changes to the registry and force a refresh.
*
* HackPtui makes life (unfortunately) difficult. We signal that
* HackPtui is necessary by setting the "HackPtui" registry
* entry to 1.
*
*****************************************************************************/
void NEAR PASCAL
Explorer_OnApply(HWND hdlg)
{
CABINETSTATE cs;
BOOL fNeedLogoff = FALSE;
Checklist_OnApply(hdlg, c_rgcliExplorer, &fNeedLogoff, FALSE);
if (fNeedLogoff) {
Common_NeedLogoff(hdlg);
}
if (pedii->fIconDirty) {
Explorer_ApplyOverlay();
}
if (mit.ReadCabinetState) {
if (g_fNT && pedii->ccComp.GetColor() !=
GetDwordPkl(&c_klAltColor, clrDefAlt)) {
SetDwordPkl(&c_klAltColor, pedii->ccComp.GetColor());
if (g_fNT5) {
SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
} else {
Common_NeedLogoff(hdlg);
}
}
}
if (GetSysColorBrush(COLOR_HOTLIGHT)) {
if (GetSysColor(COLOR_HOTLIGHT) != pedii->ccHot.GetColor()) {
COLORREF clrHotlight = pedii->ccHot.GetColor();
TCHAR tsz[64];
int iColor = COLOR_HOTLIGHT;
wsprintf(tsz, TEXT("%d %d %d"), GetRValue(clrHotlight),
GetGValue(clrHotlight), GetBValue(clrHotlight));
SetStrPkl(&c_klHotlight, tsz);
SetSysColors(1, &iColor, &clrHotlight);
}
}
}
/*****************************************************************************
*
* Explorer_OnDestroy
*
* Clean up
*
*****************************************************************************/
void PASCAL
Explorer_OnDestroy(HWND hdlg)
{
ImageList_Destroy(pedii->himl);
pedii->ccComp.Destroy();
pedii->ccHot.Destroy();
}
/*****************************************************************************
*
* Explorer_OnWhatsThis
*
*****************************************************************************/
void PASCAL
Explorer_OnWhatsThis(HWND hwnd, int iItem)
{
LV_ITEM lvi;
Misc_LV_GetItemInfo(hwnd, &lvi, iItem, LVIF_PARAM);
WinHelp(hwnd, c_tszMyHelp, HELP_CONTEXTPOPUP, IDH_PREFIX + lvi.lParam);
}
/*****************************************************************************
*
* Oh yeah, we need this too.
*
*****************************************************************************/
#pragma BEGIN_CONST_DATA
LVCI lvciExplorer[] = {
{ IDC_WHATSTHIS, Explorer_OnWhatsThis },
{ 0, 0 },
};
LVV lvvExplorer = {
Explorer_OnCommand,
0, /* Explorer_OnInitContextMenu */
0, /* Explorer_Dirtify */
0, /* Explorer_GetIcon */
Explorer_OnInitDialog,
Explorer_OnApply,
Explorer_OnDestroy,
0, /* Explorer_OnSelChange */
6, /* iMenu */
rgdwHelp,
0, /* Double-click action */
lvvflCanCheck, /* We need check boxes */
lvciExplorer,
};
#pragma END_CONST_DATA
/*****************************************************************************
*
* Our window procedure.
*
*****************************************************************************/
INT_PTR EXPORT
Explorer_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam)
{
return LV_DlgProc(&lvvExplorer, hdlg, wm, wParam, lParam);
}