#ifndef _BROWMENU_H_
#define _BROWMENU_H_

#include "cowsite.h"

// IShellMenuCallback implementation
class CFavoritesCallback : public IShellMenuCallback,
                           public CObjectWithSite
{
public:
    // *** IUnknown methods ***
    STDMETHODIMP QueryInterface (REFIID riid, LPVOID * ppvObj);
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG)  Release();

    // *** CObjectWithSite methods (override)***
    STDMETHODIMP SetSite(IUnknown* punk);

    // *** IShellMenuCallback methods ***
    STDMETHODIMP CallbackSM(LPSMDATA smd, UINT uMsg, WPARAM wParam, LPARAM lParam);

    CFavoritesCallback();
private:
    virtual ~CFavoritesCallback();
    int     _cRef;
    BOOL    _fOffline;
    BOOL    _fRefresh;
    BOOL    _fExpandoMenus;
    BOOL    _fShowingTip;

    HRESULT _GetHmenuInfo(HMENU hMenu, UINT uId, SMINFO* psminfo);
    HRESULT _SelectItem(LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidl);
    HRESULT _Init(HMENU hMenu, UINT uIdParent, IUnknown* punk);
    HRESULT _Exit();
    HRESULT _GetObject(LPSMDATA psmd, REFIID riid, void** ppvObj);
    HRESULT _GetDefaultIcon(TCHAR* psz, int* piIndex);
    HRESULT _GetSFInfo(SMDATA* psmd, SMINFO* psminfo);
    HRESULT _Demote(LPSMDATA psmd);
    HRESULT _Promote(LPSMDATA psmd);
    HRESULT _HandleNew(LPSMDATA psmd);
    DWORD   _GetDemote(SMDATA* psmd);
    HRESULT _GetTip(LPTSTR pstrTitle, LPTSTR pstrTip);
    HRESULT _ProcessChangeNotify(SMDATA* psmd, LONG lEvent, 
                                 LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
    BOOL _AllowDrop(IDataObject* pIDataObject, HWND hwnd);

    IShellMenu* _psmFavCache;

    void _RefreshItem(HMENU hmenu, int idCmd, IShellMenu* psm);
};

#endif
