windows-nt/Source/XPSP1/NT/shell/shell32/unicpp/dcomp.h
2020-09-26 16:20:57 +08:00

208 lines
7.6 KiB
C++

#ifndef _DCOMP_H_
#define _DCOMP_H_
#include <cowsite.h>
EXTERN_C IActiveDesktop * g_pActiveDeskAdv;
//
// Whether a particular desktop icon is shown or not depends on whether start panel is on or off.
// So, the individual preferences are persisted in two different registry locations given below!
#define REGSTR_PATH_HIDDEN_DESKTOP_ICONS REGSTR_PATH_EXPLORER TEXT("\\HideDesktopIcons\\%s")
#define REGSTR_VALUE_STARTPANEL TEXT("NewStartPanel")
#define REGSTR_VALUE_CLASSICMENU TEXT("ClassicStartMenu")
#define REGSTR_PATH_HIDDEN_MYCOMP_ICONS REGSTR_PATH_EXPLORER TEXT("\\HideMyComputerIcons")
#define REGSTR_PATH_EXP_SHELLFOLDER REGSTR_PATH_EXPLORER TEXT("\\CLSID\\%s\\ShellFolder")
#define REGVAL_ATTRIBUTES TEXT("Attributes")
// The following array has the two registry sub-locations where the desktop icon on/off data
// is stored based on whether start panel is off/on.
const LPTSTR c_apstrRegLocation[] =
{
REGSTR_VALUE_CLASSICMENU, // Use this if classic menu is on.
REGSTR_VALUE_STARTPANEL // Use this if start panel is on.
};
// Name of the file that holds each icon, and an index for which icon to use in the file
typedef struct tagIconKeys
{
TCHAR szOldFile[MAX_PATH];
int iOldIndex;
TCHAR szNewFile[MAX_PATH];
int iNewIndex;
}ICONDATA;
extern GUID CLSID_EffectsPage;
// Registry Info for the icons
typedef struct tagIconRegKeys
{
const CLSID* pclsid;
TCHAR szIconValue[16];
int iTitleResource;
int iDefaultTitleResource;
LPCWSTR pszDefault;
int nDefaultIndex;
}ICONREGKEYS;
static const ICONREGKEYS c_aIconRegKeys[] =
{
{ &CLSID_MyComputer, TEXT("\0"), 0, IDS_MYCOMPUTER, L"%WinDir%\\explorer.exe", 0},
{ &CLSID_MyDocuments, TEXT("\0"), 0, IDS_MYDOCUMENTS2, L"%WinDir%\\system32\\mydocs.dll", 0},
{ &CLSID_NetworkPlaces, TEXT("\0"), 0, IDS_NETNEIGHBOUR, L"%WinDir%\\system32\\shell32.dll", 17},
{ &CLSID_RecycleBin, TEXT("full"), IDS_FULL, IDS_TRASHFULL, L"%WinDir%\\system32\\shell32.dll", 32},
{ &CLSID_RecycleBin, TEXT("empty"), IDS_EMPTY2, IDS_TRASHEMPTY, L"%WinDir%\\system32\\shell32.dll", 31},
};
#define NUM_ICONS (ARRAYSIZE(c_aIconRegKeys))
enum ICON_SIZE_TYPES {
ICON_DEFAULT = 0,
ICON_LARGE = 1,
ICON_INDETERMINATE = 2
};
#define ICON_DEFAULT_SMALL 16
#define ICON_DEFAULT_NORMAL 32
#define ICON_DEFAULT_LARGE 48
typedef struct tagDeskIconId {
int iDeskIconDlgItemId;
LPCWSTR pwszCLSID;
const CLSID *pclsid;
BOOL fCheckNonEnumAttrib;
BOOL fCheckNonEnumPolicy;
} DESKICONID;
// Array if desktop icons we would like to turn-on/off individually
static const DESKICONID c_aDeskIconId[] =
{
{IDC_DESKTOP_ICON_MYDOCS, L"{450D8FBA-AD25-11D0-98A8-0800361B1103}", &CLSID_MyDocuments, TRUE , TRUE }, // My Documents
{IDC_DESKTOP_ICON_MYCOMP, L"{20D04FE0-3AEA-1069-A2D8-08002B30309D}", &CLSID_MyComputer, FALSE , TRUE }, // My Computer
{IDC_DESKTOP_ICON_MYNET, L"{208D2C60-3AEA-1069-A2D7-08002B30309D}", &CLSID_NetworkPlaces, TRUE , TRUE }, // Network Places
{IDC_DESKTOP_ICON_IE, L"{871C5380-42A0-1069-A2EA-08002B30309D}", &CLSID_Internet, TRUE , TRUE } // Internet Explorer
};
// The sub-string that preceeds the CLSID when passed as the property name.
// For example, when "SP_1{645FF040-5081-101B-9F08-00AA002F954E}" is passed as the property name,
// it refers to the recycle icon when StartPage is ON.
//
static const LPWSTR c_awszSP[] =
{
L"SP_0", //Indicates StartPage Off.
L"SP_1", //Indicates StartPage On.
L"POLI" //Indicates that we want the policy info!
};
static const LPWSTR c_wszPropNameFormat = L"%s%s";
#define STARTPAGE_ON_PREFIX c_awszSP[1] //The prefix string for StartPage_On.
#define STARTPAGE_OFF_PREFIX c_awszSP[0] //The prefix string for StartPage_Off.
#define LEN_PROP_PREFIX lstrlenW(c_awszSP[0]) //Length of the prefix string.
#define POLICY_PREFIX c_awszSP[2]
#define NUM_DESKICONS (ARRAYSIZE(c_aDeskIconId))
#ifndef EXCLUDE_COMPPROPSHEET
class CCompPropSheetPage : public CObjectWithSite
, public IAdvancedDialog
{
public:
//////////////////////////////////////////////////////
// Public Interfaces
//////////////////////////////////////////////////////
// *** IUnknown ***
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void);
virtual STDMETHODIMP_(ULONG) Release(void);
// *** IAdvancedDialog ***
virtual STDMETHODIMP DisplayAdvancedDialog(IN HWND hwndParent, IN IPropertyBag * pAdvPage, IN BOOL * pfEnableApply);
CCompPropSheetPage(void);
protected:
int _cRef;
ICONDATA _IconData[NUM_ICONS];
HWND _hwndLV;
BOOL _fAllowAdd;
BOOL _fAllowDel;
BOOL _fAllowEdit;
BOOL _fAllowClose;
BOOL _fAllowReset;
BOOL _fLockDesktopItems;
BOOL _fForceAD;
BOOL _fLaunchGallery; // Did we launch the gallery at any time?
BOOL _fInitialized; // Did we finished adding the items to the list view?
HWND _hWndList; // handle to the list view window
HIMAGELIST _hIconList; // handles to image lists for large icons
BOOL _fCustomizeDesktopOK; // was OK clicked when the customize desktop property sheet dialog was closed?
int _iStartPanelOn;
BOOL _afHideIcon[2][NUM_DESKICONS];
BOOL _afDisableCheckBox[NUM_DESKICONS];
int _iPreviousSelection;
int m_nIndex;
void _ConstructLVString(COMPONENTA *pcomp, LPTSTR pszBuf, DWORD cchBuf);
void _AddComponentToLV(COMPONENTA *pcomp);
void _SetUIFromDeskState(BOOL fEmpty);
void _OnInitDialog(HWND hwnd, INT iPage);
void _OnNotify(HWND hwnd, WPARAM wParam, LPNMHDR lpnm);
void _OnCommand(HWND hwnd, WORD wNotifyCode, WORD wID, HWND hwndCtl);
void _OnDestroy(INT iPage);
void _OnGetCurSel(int *piIndex);
void _EnableControls(HWND hwnd);
BOOL _VerifyFolderOptions(void);
void _SelectComponent(LPWSTR pwszUrl);
HRESULT _OnInitDesktopOptionsUI(HWND hwnd);
HRESULT _LoadIconState(IN IPropertyBag * pAdvPage);
HWND _CreateListView(HWND hWndParent);
void _NewComponent(HWND hwnd);
void _EditComponent(HWND hwnd);
void _DeleteComponent(HWND hwnd);
void _SynchronizeAllComponents(IActiveDesktop *pActDesktop);
void _TryIt(void);
void _DesktopCleaner(HWND hwnd);
HRESULT _IsDirty(IN BOOL * pIsDirty);
HRESULT _MergeIconState(IN IPropertyBag * pAdvPage);
HRESULT _LoadDeskIconState(IN IPropertyBag * pAdvPage);
HRESULT _MergeDeskIconState(IN IPropertyBag * pAdvPage);
HRESULT _UpdateDesktopIconsUI(HWND hwnd);
private:
virtual ~CCompPropSheetPage(void);
// Private Member Functions
INT_PTR _CustomizeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam, INT iPage);
static INT_PTR _CustomizeDlgProcHelper(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam, INT iPage);
static INT_PTR CALLBACK CustomizeDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
static INT_PTR CALLBACK WebDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
};
BOOL FindComponent(IN LPCTSTR pszUrl, IN IActiveDesktop * pActiveDesktop);
void CreateComponent(COMPONENTA *pcomp, LPCTSTR pszUrl);
INT_PTR NewComponent(HWND hwndOwner, IActiveDesktop * pad, BOOL fDeferGallery, COMPONENT * pcomp);
BOOL LooksLikeFile(LPCTSTR psz);
BOOL IsUrlPicture(LPCTSTR pszUrl);
#endif // EXCLUDE_COMPPROPSHEET
#define WM_COMP_GETCURSEL (WM_USER+1)
#endif