// // Plug-in to enumerate a list of folders from a registry key // // // Property bag: // // "Target" - name of registry key to enumerate // #include "sfthost.h" class SpecialFolderList : public SFTBarHost { public: friend SFTBarHost *SpecList_CreateInstance() { return new SpecialFolderList(); } SpecialFolderList() : SFTBarHost(HOSTF_CANRENAME | HOSTF_REVALIDATE | HOSTF_RELOADTEXT | HOSTF_CASCADEMENU) { _iThemePart = SPP_PLACESLIST; _iThemePartSep = SPP_PLACESLISTSEPARATOR; } private: ~SpecialFolderList(); HRESULT Initialize(); void EnumItems(); int CompareItems(PaneItem *p1, PaneItem *p2); HRESULT GetFolderAndPidl(PaneItem *pitem, IShellFolder **ppsfOut, LPCITEMIDLIST *ppidlOut); HRESULT ContextMenuRenameItem(PaneItem *p, LPCTSTR ptszNewName); BOOL IsItemStillValid(PaneItem *p); HRESULT GetCascadeMenu(PaneItem *pitem, IShellMenu **ppsm); int ReadIconSize() { return ICONSIZE_MEDIUM; } BOOL NeedBackgroundEnum() { return TRUE; } int AddImageForItem(PaneItem *p, IShellFolder *psf, LPCITEMIDLIST pidl, int iPos); LPTSTR DisplayNameOfItem(PaneItem *p, IShellFolder *psf, LPCITEMIDLIST pidlItem, SHGNO shgno); TCHAR GetItemAccelerator(PaneItem *pitem, int iItemStart); void OnChangeNotify(UINT id, LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); BOOL IsBold(PaneItem *pitem); void GetItemInfoTip(PaneItem *pitem, LPTSTR pszText, DWORD cch); void UpdateImage(int iImage) { } HRESULT ContextMenuInvokeItem(PaneItem *p, IContextMenu *pcm, CMINVOKECOMMANDINFOEX *pici, LPCTSTR pszVerb); UINT AdjustDeleteMenuItem(PaneItem *pitem, UINT *puiFlags); LRESULT OnWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HRESULT _GetUIObjectOfItem(PaneItem *p, REFIID riid, LPVOID *ppv); private: static DWORD WINAPI _HasEnoughChildrenThreadProc(LPVOID pvData); UINT _cNotify; };