#ifndef _NEW_WSBCONTROL_H
#define _NEW_WSBCONTROL_H

//
//  When a screen reader is running, we switch to system metrics rather
//  than using the app metrics.  All the metrics are kept in this structure
//  so we can switch between them easily.
//
typedef struct WSBMETRICS {
    int cxVSBArrow;     //  x size of arrow for vertical scrollbar.
    int cxHSBArrow;
    int cxHSBThumb;

    int cyVSBArrow;
    int cyHSBArrow;
    int cyVSBThumb;

} WSBMETRICS, *PWSBMETRICS;

typedef struct WSBState {
    PWSBMETRICS pmet;       // The metrics that are active
    int style;          //  Win style.
                            //  px: Current coord. Used in Tracking.
    int px;                 //  Mouse message coord.
    int pxStart;            //  back to pxStart if tracking out of box.
    int dpxThumb;           //  pxThumbTop - px
    int pxBottom;       
    int pxDownArrow;
    int pxLeft;
    int pxOld;
    int pxRight;
    int pxThumbBottom;
    int pxThumbTop;
    int pxTop;
    int pxUpArrow;
    int cpxThumb;           //  cpx: Current size.
    int cpxArrow;
    int cpxSpace;

    int cmdSB;              //  Current scroll command.
    int posOld;             //  Thumb pos of last time.
    int posNew;             //  To support GetScrollInfo with SIF_TRACKPOS
    int posStart;           //  Thumb pos when we start tracking.

    void ( * pfnSB )(struct WSBState *, int, WPARAM, LPARAM);
    BOOL    fVertSB;        //  This variable shows if the last valid 
                            //  computation is on Vertical SB.
    BOOL    fHitOld;
    BOOL    fTrackVert;     //  This variable shows which scrollbar we are
                            //  tracking.
    BOOL    fTracking;      //  Critical section lock for locMouse.

    BOOL    fVActive;       //  Is mouse hovering on vertical SB?
    BOOL    fHActive;
    int     fInDoScroll;    //  Are we in the middle of a DoScroll?

    UINT_PTR hTimerSB;
    UINT_PTR hTrackSB;

    RECT rcSB;
    RECT rcClient;
    RECT rcTrack;
    
    int vStyle;             //  Style.
    int hStyle;

#define WSB_MOUSELOC_OUTSIDE    0
#define WSB_MOUSELOC_ARROWUP    1
#define WSB_MOUSELOC_ARROWDN    2
#define WSB_MOUSELOC_V_THUMB    3
#define WSB_MOUSELOC_V_GROOVE   4
#define WSB_MOUSELOC_ARROWLF    5
#define WSB_MOUSELOC_ARROWRG    6
#define WSB_MOUSELOC_H_THUMB    7
#define WSB_MOUSELOC_H_GROOVE   8

    POINT ptMouse;          //  to left-top corner of window
    int locMouse;

    COLORREF col_VSBBkg;
    COLORREF col_HSBBkg;
    HBRUSH hbr_VSBBkg;
    HBRUSH hbr_HSBBkg;
    HBRUSH hbr_Bkg;
    HBITMAP hbm_Bkg;
    HPALETTE hPalette;
    HWND sbHwnd;

    int sbFlags;
    int sbHMinPos;
    int sbHMaxPos;
    int sbHPage;
    int sbHThumbPos;
    int sbVMinPos;
    int sbVMaxPos;
    int sbVPage;
    int sbVThumbPos;
    int sbGutter;

    //
    //  Since OLEACC assumes that all scrollbars are the standard size,
    //  we revert to normal-sized scrollbars when a screenreader is running.
    //  The pmet member tells us which of these two is the one to use.
    WSBMETRICS metApp;      // The metrics the app selected
    WSBMETRICS metSys;      // The metrics from the system
} WSBState;

//
//  These macros let you get at the current metrics without realizing that
//  they could be shunted between the app metrics and system metrics.
//
#define x_VSBArrow      pmet->cxVSBArrow
#define x_HSBArrow      pmet->cxHSBArrow
#define x_HSBThumb      pmet->cxHSBThumb
#define y_VSBArrow      pmet->cyVSBArrow
#define y_HSBArrow      pmet->cyHSBArrow
#define y_VSBThumb      pmet->cyVSBThumb

#define WSB_HORZ_LF  0x0001  // Represents the Left arrow of the horizontal scroll bar.
#define WSB_HORZ_RT  0x0002  // Represents the Right arrow of the horizontal scroll bar.
#define WSB_VERT_UP  0x0004  // Represents the Up arrow of the vert scroll bar.
#define WSB_VERT_DN  0x0008  // Represents the Down arrow of the vert scroll bar.

#define WSB_VERT   (WSB_VERT_UP | WSB_VERT_DN)
#define WSB_HORZ   (WSB_HORZ_LF | WSB_HORZ_RT)

#define LTUPFLAG    0x0001
#define RTDNFLAG    0x0002
#define WFVPRESENT  0x00000002L
#define WFHPRESENT  0x00000004L

#define SBO_MIN     0
#define SBO_MAX     1
#define SBO_PAGE    2
#define SBO_POS     3   

#define TestSTYLE(STYLE, MASK) ((STYLE) & (MASK))
#define DMultDiv(A, B, C)   (((C) == 0)? (A):(MulDiv((A), (B), (C))))

#define VMODE(WSTATE)   ((WSTATE)->vStyle == FSB_FLAT_MODE) ? (WSTATE)->vMode \
                                :(((WSTATE)->vStyle == FSB_ENCARTA_MODE)?   \
                                WSB_2D_MODE : WSB_3D_MODE))
#define HMODE(WSTATE)   ((WSTATE)->hStyle == FSB_FLAT_MODE) ? (WSTATE)->hMode \
                                :(((WSTATE)->hStyle == FSB_ENCARTA_MODE)?   \
                                WSB_2D_MODE : WSB_3D_MODE))
#define ISINACTIVE(WSTATE) ((WSTATE) == WSB_UNINIT_HANDLE || (WSTATE)->fScreenRead)


//  This IDSYS_SCROLL has the same value we used in 'user' code.
#define IDSYS_SCROLL    0x0000FFFEL
//  Following ID is for tracking. I hope it won't conflict with 
//  interest of anybody else.
//  IDWSB_TRACK is now following the ID_MOUSExxxx we use in TrackMe.c
#define IDWSB_TRACK     0xFFFFFFF2L

#define MINITHUMBSIZE       10

#define WSB_SYS_FONT        TEXT("MARLETT")

#define WSB_UNINIT_HANDLE   ((WSBState *)-1)

#endif  //  _NEW_WSBCONTROL_H