File "DatePicker.inc"

Path: /HotKeyMgr/inc/DatePicker.inc
File size: 5.12 KB
MIME-type:
Charset: utf-8

'------------------------------------------------------------------------------
'   ** Includes **
'------------------------------------------------------------------------------
#INCLUDE ONCE "WIN32API.INC"
#INCLUDE ONCE "INC\JULIAN.INC"
#INCLUDE ONCE "INC\CLIPBOARDHTML.INC"
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Constants **
'------------------------------------------------------------------------------
%IDC_CALENDAR1      = 1001
%MCM_GETMONTHRANGE  = &H1000 + 7
%MCN_SELCHANGE      = (0-750) + 1
%GMR_VISIBLE        = 0
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Types **
'------------------------------------------------------------------------------
TYPE NMSELCHANGE
  hdr AS NMHDR
  stSelStart AS SYSTEMTIME
  stSelEnd AS SYSTEMTIME
END TYPE
'--------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Globals **
'------------------------------------------------------------------------------
GLOBAL DateFormat   AS STRING
'------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
'   ** CallBacks **
'--------------------------------------------------------------------------------
MACRO GET_FIRST_DATE_DISPLAYED
    SendMessage hCal, %MCM_GETMONTHRANGE, _             ' Get range of dates displayed by the calendar
        %GMR_VISIBLE, BYVAL VARPTR(stRng(0))
    staD = DateStr(stRng(0).wYear, stRng(0).wMonth, _   ' Extract the starting date
                   stRng(0).wDay, DateFormat)
END MACRO
'--------------------------------------------------------------------------------
CALLBACK FUNCTION ProcDatePicker
    LOCAL  pNMSC    AS NMSELCHANGE PTR  ' SysMonthCal32 selection
    STATIC stRng()  AS SYSTEMTIME       ' range of dates
    STATIC selD     AS STRING           ' currently selected date
    STATIC staD     AS STRING           ' starting date (displayed in the top-left corner of the calendar)
    STATIC hCal     AS DWORD            ' handle to the SysMonthCal32 control
    STATIC oselD    AS STRING
    STATIC ostaD    AS STRING

    SELECT CASE CB.MSG
        CASE %WM_INITDIALOG
            ' Initialization handler
            CONTROL HANDLE CB.HNDL,%IDC_CALENDAR1 TO hCal
            LOCAL day, month, year AS LONG
            day   = VAL(MID$(DATE$,4,2))
            month = VAL(LEFT$(DATE$,2))
            year  = VAL(RIGHT$(DATE$,4))
            selD = DateStr(year, month, day, DateFormat)
            REDIM stRng(1)
            GET_FIRST_DATE_DISPLAYED
            ostaD = staD

        CASE %WM_COMMAND
            ' Process control notifications
            IF CB.CTL = %IDCANCEL THEN DIALOG END CB.HNDL, 0

        CASE %WM_NOTIFY
            ' Detect changes in the calendar control
            pNMSC = CB.LPARAM
            IF @pNMSC.hdr.code = %MCN_SELCHANGE THEN                ' Selection changed
                selD = DateStr(@pNMSC.stSelStart.wYear, _
                               @pNMSC.stSelStart.wMonth, _
                               @pNMSC.stSelStart.wDay, _
                               DateFormat)

            ELSEIF @pNMSC.hdr.code = %NM_RELEASEDCAPTURE THEN       ' Mouse click released
                GET_FIRST_DATE_DISPLAYED
                IF ostaD <> staD THEN ostaD = staD : EXIT FUNCTION  ' New starting date
                IF oselD <> selD THEN oselD = selD : EXIT FUNCTION  ' New selected date
                ' ...if we're here, it means the user double-clicked on a selected date!
                ClipBoardHtmlSet CB.HNDL, selD
                DIALOG END CB.HNDL, -1
            END IF

   END SELECT
END FUNCTION
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
'   ** Dialogs **
'--------------------------------------------------------------------------------
FUNCTION ShowDatePicker(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRes  AS LONG
    LOCAL hDlg  AS DWORD
    LOCAL hIco  AS DWORD

    DIALOG NEW PIXELS, hParent, "Date Picker", 310, 210, 456, 308, %WS_POPUP OR _
        %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _
        %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _
        %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _
        %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg

    hIco = ExtractIcon(GetModuleHandle(""), "imageres.dll", 272)
    SetClassLong(hDlg, %GCL_HICONSM, hIco)
    SetClassLong(hDlg, %GCL_HICON, hIco)

    CONTROL ADD BUTTON, hDlg, %IDCANCEL, "Cancel", -2, -2, 0, 0

    CONTROL ADD "SysMonthCal32", hDlg, %IDC_CALENDAR1, "", 0, 0, 456, 308, _
        %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP, %WS_EX_CLIENTEDGE

    DIALOG SHOW MODAL hDlg CALL ProcDatePicker TO lRes
    FUNCTION = lRes
END FUNCTION
'--------------------------------------------------------------------------------