/**********************************************************************/
/**                       Microsoft Windows NT                       **/
/**                Copyright(c) Microsoft Corp., 1992                **/
/**********************************************************************/

/*
    bltlhour.hxx
    The logon hours custom control

    FILE HISTORY:
        beng        12-May-1992 Created

*/

#ifndef _BLTLHOUR_HXX_
#define _BLTLHOUR_HXX_

#include "lhourset.hxx"
#include "string.hxx"


/**********************************************************************

    NAME:       LOGON_HOURS_CONTROL

    SYNOPSIS:

    INTERFACE:
        LOGON_HOURS_CONTROL()   - Ctor

        QueryHours()            - Query and set the state of the control,
        SetHours()                using the LOGON_HOURS_SETTING auxclass.

        DoPermitButton()        - Hook for the dialog.
        DoBanButton()           - Another hook for the dialog

    PARENT:     CUSTOM_CONTROL, CONTROL_WINDOW

    USES:       LOGON_HOURS_SETTING, RESOURCE_STR, XYDIMENSION, XYPOINT

    CAVEATS:

    NOTES:

    HISTORY:
        beng        12-May-1992 Created
        beng        18-May-1992 Enabled mouse and keyboard handling

**********************************************************************/

DLL_CLASS LOGON_HOURS_CONTROL: public CONTROL_WINDOW, public CUSTOM_CONTROL
{
private:
    static const TCHAR * _pszClassName;

    HCURSOR     _hcurCross;     // Used within the grid.

    UINT        _dyRow;         // Size metrics, calc'd in CalcSizes,
    UINT        _dxFirstColumn; //  used all over the place
    UINT        _dxColumn;
    INT         _dxLabelFudge;

    RESOURCE_STR * _apnlsDayOfWeek[7]; // For button titles

    UINT _iButtonDown; // Index (1-based) of which button is depressed.
                       // 0 = None; 1-7 = Day; 8-31 = Hour; 32 = Corner.
                       // (Only one can be down at a time, so this works.)

    UINT _iWithFocus;  // Index, similar to above, but followed by every call,
                       // of which element within the control has the focus.
                       // 0 denotes none; 1-32 = buttons; 33-200 = cells,
                       // moving left to right, top to bottom in the control.
    UINT _iFocusSave;  // Saves the above while control doesn't have focus

    BOOL _fSpaceIsDown;     // In the middle of a spacebar sequence
    BOOL _fFocusVisible;    // Focus rectangle displayed (i.e. needs erase
                            // in some situations)

    BYTE _abSetting[24*7];  // The currently set logon hours.  Representation
                            // is an efficiency compromise between an array of
                            // 168 full BOOLs and a packed bitfield.

    BOOL _fCellsSelected;   // Set if some cells are selected
    UINT _iCellSelUpper;    // Index of selected cell
    UINT _iCellSelLower;    // If not same as previous, other corner of rect

    BOOL _fMouseTrap;       // In mid-click-sequence.

    BOOL DrawBackground( PAINT_DISPLAY_CONTEXT &dc ) const;
    BOOL DrawGridWires( PAINT_DISPLAY_CONTEXT &dc ) const;

    BOOL DrawAllButtons( PAINT_DISPLAY_CONTEXT &dc ) const;
    VOID DrawOneCornerButton( PAINT_DISPLAY_CONTEXT &dc, const XYRECT &r,
                              BOOL fDown,
                              HBRUSH hbrFace,
                              HPEN hpenShadow, HPEN hpenHlight ) const;
    VOID DrawOneFlatButton( PAINT_DISPLAY_CONTEXT &dc, const XYRECT &r,
                            BOOL fDown,
                            HBRUSH hbrFace,
                            HPEN hpenShadow, HPEN hpenHlight ) const;

    BOOL DrawGridSetting( PAINT_DISPLAY_CONTEXT &dc ) const;
    BOOL DrawOneDayBar( PAINT_DISPLAY_CONTEXT &dc,
                        INT iRow, INT iColHead, INT iColTail,
                        HBRUSH hbrBar ) const;

    VOID DrawFocusOnCell( const DISPLAY_CONTEXT &dc, INT iCell ) const;
    VOID DrawFocusOnDayButton( const DISPLAY_CONTEXT &dc, INT iDay ) const;
    VOID DrawFocusOnHourButton( const DISPLAY_CONTEXT &dc, INT iHour ) const;
    VOID DrawFocusOnCornerButton( const DISPLAY_CONTEXT &dc ) const;
    VOID DrawFocusSomewhere( const DISPLAY_CONTEXT &dc, INT iFocus ) const;

    VOID DrawCurrentSelection( const DISPLAY_CONTEXT &dc ) const;
    VOID DrawSelectionOnCell( const DISPLAY_CONTEXT &dc, INT iCell ) const;
    VOID DrawSelectionOnCells( const DISPLAY_CONTEXT &dc,
                               INT iFrom, INT iTo ) const;

    VOID EraseSelection( const DISPLAY_CONTEXT &dc );

    VOID SetSelection( INT iCell );
    VOID SetSelection( INT iFrom, INT iTo );

    VOID MoveFocusTo( INT iNewFocus );
    VOID MoveFocusUp();
    VOID MoveFocusDown();
    VOID MoveFocusLeft();
    VOID MoveFocusRight();

    VOID   CalcGridRect( XYRECT * pr ) const;
    APIERR CalcSizes( XYDIMENSION dxy );

    VOID CalcRectForCell( XYRECT * pr, INT iCell ) const;
    VOID CalcRectForHour( XYRECT * pr, INT iHour ) const;
    VOID CalcRectForDay( XYRECT * pr, INT iDay ) const;
    VOID CalcRectForCorner( XYRECT * pr ) const;
    INT  CalcButtonFromPoint( XYPOINT xy ) const;

    APIERR LoadLabels( MSGID idDay0 );
    VOID   UnloadLabels();

    VOID DoButtonDownVisuals();
    VOID DoButtonUpVisuals( BOOL fTrigger = TRUE );
    VOID DoButtonClick( INT iButton );
    VOID SetSelectedCells( BOOL fPermit );

    VOID InvalidateButton( INT iButtonOrCell );

    VOID Beep() const;
    BOOL IsButtonACell( INT iButton ) const;

protected:
    virtual BOOL OnPaintReq();
    virtual BOOL OnFocus( const FOCUS_EVENT & );
    virtual BOOL OnDefocus( const FOCUS_EVENT & );
    virtual BOOL OnKeyDown( const VKEY_EVENT & );
    virtual BOOL OnKeyUp( const VKEY_EVENT & );
    virtual BOOL OnLMouseButtonDown( const MOUSE_EVENT & );
    virtual BOOL OnLMouseButtonUp( const MOUSE_EVENT & );
    virtual BOOL OnMouseMove( const MOUSE_EVENT & );
    virtual BOOL OnQMouseCursor( const QMOUSEACT_EVENT & );
    virtual ULONG OnQDlgCode();
    virtual ULONG OnQHitTest( const XYPOINT & xy );
    virtual ULONG OnQMouseActivate( const QMOUSEACT_EVENT & );

public:
    LOGON_HOURS_CONTROL( OWNER_WINDOW *powin, CID cid );
    LOGON_HOURS_CONTROL( OWNER_WINDOW *powin, CID cid,
                         XYPOINT xy, XYDIMENSION dxy );
    ~LOGON_HOURS_CONTROL();

    APIERR QueryHours( LOGON_HOURS_SETTING * plhours ) const;
    APIERR SetHours( const LOGON_HOURS_SETTING * plhours );

    // External hooks with which a dialog coordinates this control
    // with its Permit and Ban buttons.

    VOID DoPermitButton();
    VOID DoBanButton();

    // subclasses and others can use this to determine the X-position
    // in pixels for a particular row separator,  1 <= iRow <= 25
    // 1 for left midnight, 13 for noon, 25 for right midnight
    UINT QueryXForRow( INT nRow );
};

#endif // _BLTLHOUR_HXX_ - end of file