/*--------------------------------------------------------------------------*
 *
 *  Microsoft Windows
 *  Copyright (C) Microsoft Corporation, 1992 - 1999
 *
 *  File:      wrapper.h
 *
 *  Contents:  Interface file for simple wrapper classes
 *
 *  History:   02-Feb-98 jeffro     Created
 *
 *--------------------------------------------------------------------------*/

#ifndef WRAPPER_H
#define WRAPPER_H


/*----------------*/
/* HACCEL wrapper */
/*----------------*/
class CAccel : public CObject
{
public:
    HACCEL  m_hAccel;

    CAccel (HACCEL hAccel = NULL);
    CAccel (LPACCEL paccl, int cEntries);
    ~CAccel ();

    bool CreateAcceleratorTable (LPACCEL paccl, int cEntries);
    int  CopyAcceleratorTable (LPACCEL paccl, int cEntries) const;
    bool TranslateAccelerator (HWND hwnd, LPMSG pmsg) const;
    void DestroyAcceleratorTable ();

    bool LoadAccelerators (int nAccelID);
    bool LoadAccelerators (LPCTSTR pszAccelName);
    bool LoadAccelerators (HINSTANCE hInst, LPCTSTR pszAccelName);

    bool operator== (int i) const
        { ASSERT (i == NULL); return (m_hAccel == NULL); }

    bool operator!= (int i) const
        { ASSERT (i == NULL); return (m_hAccel != NULL); }

    operator HACCEL() const
        { return (m_hAccel); }
};



/*---------------------------------*/
/* Begin/EndDeferWindowPos wrapper */
/*---------------------------------*/
class CDeferWindowPos
{
public:
    HDWP    m_hdwp;

    CDeferWindowPos (int cWindows = 0, bool fSynchronousPositioningForDebugging = false);
    ~CDeferWindowPos ();

    bool Begin (int cWindows);
    bool End ();
    bool AddWindow (const CWnd* pwnd, const CRect& rect, DWORD dwFlags, const CWnd* pwndInsertAfter = NULL);

    bool operator== (int i) const
        { ASSERT (i == NULL); return (m_hdwp == NULL); }

    bool operator!= (int i) const
        { ASSERT (i == NULL); return (m_hdwp != NULL); }

    operator HDWP() const
        { return (m_hdwp); }


private:
    const bool m_fSynchronousPositioningForDebugging;

};


/*-------------------*/
/* Rectangle helpers */
/*-------------------*/
class CWindowRect : public CRect
{
public:
    CWindowRect (const CWnd* pwnd)
    {
        if (pwnd != NULL)
            pwnd->GetWindowRect (this);
        else
            SetRectEmpty();
    }

    /*
     * just forward other ctors
     */
    CWindowRect(int l, int t, int r, int b)         : CRect(l, t, r, b) {} 
    CWindowRect(const RECT& srcRect)                : CRect(srcRect) {} 
    CWindowRect(LPCRECT lpSrcRect)                  : CRect(lpSrcRect) {} 
    CWindowRect(POINT point, SIZE size)             : CRect(point, size) {} 
    CWindowRect(POINT topLeft, POINT bottomRight)   : CRect(topLeft, bottomRight) {} 
};

class CClientRect : public CRect
{
public:
    CClientRect (const CWnd* pwnd)
    {
        if (pwnd != NULL)
            pwnd->GetClientRect (this);
        else
            SetRectEmpty();
    }

    /*
     * just forward other ctors
     */
    CClientRect(int l, int t, int r, int b)         : CRect(l, t, r, b) {} 
    CClientRect(const RECT& srcRect)                : CRect(srcRect) {} 
    CClientRect(LPCRECT lpSrcRect)                  : CRect(lpSrcRect) {} 
    CClientRect(POINT point, SIZE size)             : CRect(point, size) {} 
    CClientRect(POINT topLeft, POINT bottomRight)   : CRect(topLeft, bottomRight) {} 
};


/*+-------------------------------------------------------------------------*
 * AMCGetSysColorBrush 
 *
 * Returns a (temporary) MFC-friendly system color brush.
 *--------------------------------------------------------------------------*/

inline CBrush* AMCGetSysColorBrush (int nIndex)
{
    return (CBrush::FromHandle (::GetSysColorBrush (nIndex)));
}


#endif /* WRAPPER.H */