#ifndef _DBACK_H_ #define _DBACK_H_ #include #include "theme.h" #include "dcomp.h" #include "colorctrl.h" #define SZ_ICONHEADER L"CLSID\\{" HRESULT GetActiveDesktop(IActiveDesktop ** ppActiveDesktop); HRESULT ReleaseActiveDesktop(IActiveDesktop ** ppActiveDesktop); EXTERN_C BOOL g_fDirtyAdvanced; EXTERN_C BOOL g_fLaunchGallery; typedef struct tagDESKICONDATA { BOOL fHideIcon; //To hide the icon on desktop? BOOL fDirty; //Has this entry been modified and we not yet saved. } DESKICONDATA; typedef struct tagDeskIconNonEnumData { ULONG rgfAttributes; // ShellFolder\Attributes are saved here. BOOL fNonEnumPolicySet; // Disable the control because of policy Set. } DESKICON_NONENUMDATA; class CBackPropSheetPage : public CObjectWithSite , public CObjectCLSID , public IBasePropPage , public IPropertyBag { public: // *** IUnknown *** virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObj); virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); // *** IBasePropPage *** virtual STDMETHODIMP GetAdvancedDialog(OUT IAdvancedDialog ** ppAdvDialog); virtual STDMETHODIMP OnApply(IN PROPPAGEONAPPLY oaAction); // *** IPropertyBag *** virtual STDMETHODIMP Read(IN LPCOLESTR pszPropName, IN VARIANT * pVar, IN IErrorLog *pErrorLog); virtual STDMETHODIMP Write(IN LPCOLESTR pszPropName, IN VARIANT *pVar); // *** IShellPropSheetExt *** virtual STDMETHODIMP AddPages(IN LPFNSVADDPROPSHEETPAGE pfnAddPage, IN LPARAM lParam); virtual STDMETHODIMP ReplacePage(IN EXPPS uPageID, IN LPFNSVADDPROPSHEETPAGE pfnReplaceWith, IN LPARAM lParam) {return E_NOTIMPL;} CBackPropSheetPage(void); virtual ~CBackPropSheetPage(void); protected: ICONDATA _IconData[NUM_ICONS]; DESKICONDATA _aHideDesktopIcon[2][NUM_DESKICONS]; BOOL _fHideDesktopIconDirty; DESKICON_NONENUMDATA _aDeskIconNonEnumData[NUM_DESKICONS]; BOOL _fStateLoaded; // Have we loaded the state yet? BOOL _fOpenAdvOnInit; // Does the caller want us to open the Advanced dialog when we initialize? HWND _hwnd; // This is the hwnd of the property page. HWND _hwndLV; HWND _hwndWPStyle; BOOL _fAllowHtml; BOOL _fAllowAD; BOOL _fAllowChanges; BOOL _fPolicyForWallpaper; //Is there a policy for wallpaper? BOOL _fPolicyForStyle; //Is there a policy for Wallpaper style? BOOL _fForceAD; //Is there a policy to force Active desktop to be ON? BOOL _fSelectionFromUser; // Is the user making the selection? DWORD _dwApplyFlags; //Is there a policy to force Active desktop to be ON? CColorControl _colorControl; COLORREF _rgbBkgdColor; void _AddPicturesFromDir(LPCTSTR pszDirName, BOOL fCount, BOOL fShouldAllowHTML); int _AddAFileToLV(LPCTSTR pszDir, LPTSTR pszFile, UINT nBitmap); int _FindWallpaper(LPCTSTR pszFile); HRESULT _SetNewWallpaper(IN LPCTSTR pszFile, IN BOOL fUpdateThemePage); void _UpdatePreview(IN WPARAM flags, IN BOOL fUpdateThemePage); void _EnableControls(void); int _GetImageIndex(LPCTSTR pszFile); static int CALLBACK _SortBackgrounds(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); HRESULT _LoadState(void); HRESULT _LoadIconState(void); HRESULT _LoadDesktopOptionsState(void); HRESULT _SaveIconState(void); HRESULT _SaveDesktopOptionsState(void); HRESULT _GetIconPath(IN CLSID clsid, IN LPCWSTR pszName, IN BOOL fOldIcon, IN LPWSTR pszPath, IN DWORD cchSize); HRESULT _SetIconPath(IN CLSID clsid, IN LPCWSTR pszName, IN LPCWSTR pszPath, IN int nResourceID); void _OnInitDialog(HWND hwnd); void _OnNotify(LPNMHDR lpnm); void _OnCommand(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void _OnDestroy(void); HRESULT _OnApply(void); HRESULT _AddFilesToList(void); HRESULT _AddPicturesFromDirRecursively(IN LPCTSTR pszDirName, BOOL fCount, BOOL fShouldAllowHTML); HRESULT _GetHardDirThemesDir(LPTSTR pszPath, DWORD cchSize); HRESULT _GetKidsThemesDir(LPTSTR pszPath, DWORD cchSize); HRESULT _GetPlus95ThemesDir(LPTSTR pszPath, DWORD cchSize); HRESULT _GetPlus98ThemesDir(LPTSTR pszPath, DWORD cchSize); HRESULT _StartSizeChecker(void); DWORD _SizeCheckerThreadProc(void); static DWORD CALLBACK SizeCheckerThreadProc(LPVOID pvThis) { return ((CBackPropSheetPage *) pvThis)->_SizeCheckerThreadProc(); }; private: UINT _cRef; // Reference count BOOL _fThemePreviewCreated; IThemePreview* _pThemePreview; LPTSTR _pszOriginalFile; // If we are using a temp file, this is the original file selected. (non-.bmp). This updates as the user selects different files. LPTSTR _pszOrigLastApplied; // Same as _pszOriginalFile except it doesn't change until apply is pressed. LPWSTR _pszWallpaperInUse; // If using a temp file, keep the name in use so we don't stomp it while the user is previewing other files. LPWSTR _pszLastSourcePath; // This will always be the last wallpaper set and it will be the pre-converted path. FILETIME _ftLastWrite; // The date that the original file was last written to. BOOL _fWallpaperChanged; // Did another tab change the wallpaper? IMruDataList * _pSizeMRU; // MRU of Background wallpapers. BOOL _fScanFinished; // Did we finish the background scan? BOOL _fInitialized; // int _nFileCount; // This is used when counting how many pictures are in the "My Pictures" folder. int _nFileMax; // This is used when counting how many pictures are in the "My Pictures" folder. // These objects are owned by the background thread. IMruDataList * _pSizeMRUBk; // WARNING: Owned by SizeCheckerThreadProc background thread. IShellImageDataFactory * _pImgFactBk; // Image factory used to compute size of background image to decide to default to tile or stretch // Private Member Functions HRESULT _LoadTempWallpaperSettings(IN LPCWSTR pszWallpaperFile); HRESULT _LaunchAdvancedDisplayProperties(HWND hwnd); INT_PTR _BackgroundDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); HRESULT _SetNewWallpaperTile(IN DWORD dwMode, IN BOOL fUpdateThemePage); HRESULT _BrowseForBackground(void); HRESULT _LoadBackgroundColor(IN BOOL fInit); HRESULT _Initialize(void); BOOL _DoesDirHaveMoreThanMax(LPCTSTR pszPath, int nMax); DWORD _GetStretchMode(IN LPCTSTR pszPath); HRESULT _GetMRUObject(IMruDataList ** ppSizeMRU); HRESULT _CalcSizeFromDir(IN LPCTSTR szPath, IN OUT DWORD * pdwAdded, IN BOOL fRecursive); HRESULT _CalcSizeForFile(IN LPCTSTR pszPath, IN WIN32_FIND_DATA * pfdFile, IN OUT DWORD * pdwAdded); static INT_PTR CALLBACK BackgroundDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam); }; #endif