#ifndef _DBAPP_H
#define _DBAPP_H

class CDeskBarApp : public CDeskBar
                    ,public IContextMenu3
{
public:
    STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj);
    STDMETHODIMP_(ULONG) AddRef(void) {return CDeskBar::AddRef();};
    STDMETHODIMP_(ULONG) Release(void) { return CDeskBar::Release();};
    
    STDMETHOD(QueryService)(REFGUID guidService,
                                 REFIID riid, void **ppvObj);

    // *** IInputObject methods ***
    virtual STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg);

    // *** IPersistStreamInit methods ***
    virtual STDMETHODIMP GetClassID(CLSID *pClassID);
    virtual STDMETHODIMP IsDirty(void);
    virtual STDMETHODIMP Load(IStream *pStm);
    virtual STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty);
    virtual STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize);
    virtual STDMETHODIMP InitNew(void);

    // *** IPersistPropertyBag ***
    virtual HRESULT STDMETHODCALLTYPE Load(IPropertyBag *pPropBag,
                                           IErrorLog *pErrorLog);

    // *** IContextMenu3 methods ***
    STDMETHOD(QueryContextMenu)(HMENU hmenu,
                                UINT indexMenu,
                                UINT idCmdFirst,
                                UINT idCmdLast,
                                UINT uFlags);

    STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO lpici);
    STDMETHOD(GetCommandString)(UINT_PTR    idCmd,
                                UINT        uType,
                                UINT      * pwReserved,
                                LPSTR       pszName,
                                UINT        cchMax);
    STDMETHOD(HandleMenuMsg)(UINT uMsg,
                              WPARAM wParam,
                              LPARAM lParam);
    STDMETHOD(HandleMenuMsg2)(UINT uMsg,
                              WPARAM wParam,
                              LPARAM lParam,
                              LRESULT* plres);


    // *** IOleCommandTarget methods ***
    virtual STDMETHODIMP Exec(const GUID *pguidCmdGroup,
        DWORD nCmdID, DWORD nCmdexecopt,
        VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
    
protected:
    virtual void _SetModeSide(UINT eMode, UINT uSide, HMONITOR hMon, BOOL fNoMerge);
    virtual void _UpdateCaptionTitle();
    virtual void _NotifyModeChange(DWORD dwMode);
    virtual LRESULT v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

    void _LeaveSide();

    virtual ~CDeskBarApp();
    void _CreateBandSiteMenu();


    BOOL _OnCloseBar(BOOL fConfirm); // Override dockbar's _OnCloseBar to add UI confirmation


    HRESULT _MergeSide(IBandSite *pdbDst);

    IContextMenu3* _pcm;
    
    // this class explicitely knows about CBandSite.  this is the distinction between deskbar and dbapp.
    CBandSite* _pbs;
    UINT    _eInitLoaded:2;
    int _idCmdDeskBarFirst;
    

    friend HRESULT DeskBarApp_Create(IUnknown** ppunk);
};

extern HRESULT DeskBarApp_Create(IUnknown** ppunk, IUnknown** ppbs);

#endif // _DBAPP_H
