'------------------------------------------------------------------------------------------- 
'    QCalendar Control by Pasquale P.C.B.        4-2001 
'    Dedicated to my beautiful wife Ana  
'------------------------------------------------------------------------------------------- 
$include "apidate.bas"
TYPE qcalendar EXTENDS Qpanel
    PUBLIC:
    M AS INTEGER
    Y AS INTEGER
    D AS INTEGER
    week1% AS INTEGER '------------------------------------------<<<<<<<<<<<<<<<<<<' 
    PopupMenu AS QPopupMenu
    mesi(1 to 12) AS QmenuItem
    Today AS Qcoolbtn    

    Grid AS QSTRINGGRID
    
    Panel1 AS QPANEL
        BTNprev AS QCOOLBTN
        btnnext AS QCOOLBTN
        bntupy AS QcooLBTN
        bntdowny AS QCOOLBTN
    Panel2 AS QPANEL
'-- ************************************************************************************' 
    SUB LoadCal(datum$ as string) 

        nowd$=field$(datum$,"-",2) 

        qcalendar.d=val(nowd$)
        nowm$=field$(datum$,"-",1) 
        qcalendar.m=val(nowm$)
        nowy$=field$(datum$,"-",3)
        qcalendar.y=val(nowy$)
        qcalendar.panel1.caption=qcalendar.mesi(val(nowm$)).caption
        qcalendar.panel1.caption=qcalendar.panel1.caption+" "+nowy$
        qcalendar.week1%=weekday(nowm$+"-"+"01"+"-"+nowy$)

        if qcalendar.week1%=1 then qcalendar.week1%=8
        dim v as integer
        
        if qcalendar.m=1 then
            lastd%=val(field$(lastdaym("12-1-"+str$(qcalendar.y-1)),"-",2)) 
        else
            lastd%=val(field$(lastdaym(str$(qcalendar.m-1)+"-1-"+str$(qcalendar.y)),"-",2))
        end if
        v=0

        for i=qcalendar.week1%-2 to 0 step -1
            qcalendar.grid.cell(i,1)=str$(lastd%-v)
 
            v++
        next
        
        lb%=val(field$(lastdaym(datum$),"-",2))
        ri=1:co=0
        if qcalendar.week1%=8 then
            ri=2:co=0
        else
            co=qcalendar.week1%-1
        end if
        i=0

        do      
            for c=co to 6
                i++
                qcalendar.grid.cell(c,ri)=str$(i)
                if i=lb% then exit do
            next
            ri++
            co=0
        loop until i=lb%
        
        i=1
        if c=6 then
            ri++:co=0
        else
            co=c+1
        end if
        do

            for c=co to 6
                qcalendar.grid.cell(c,ri)=str$(i)  
                i++
            next
        
            co=0:ri++
        loop until ri=8

        ri=int((val(nowd$)+qcalendar.week1%-2)/7)+1  
        
        co=weekday(nowm$+"-"+nowd$+"-"+nowy$)-2     '!!!    1  cause error !!! 

        qcalendar.grid.row=ri:
        qcalendar.grid.col=co             
 
    END SUB
'-- ************************************************************************************' 
    SUB mnuclick(s as QmenuItem)
      qcalendar.loadcal(str$(s.menuindex+1)+"-"+str$(qcalendar.d)+"-"+str$(qcalendar.y))        
    END SUB 
'-- ************************************************************************************' 
    SUB INIT(inidatum$)
        Dim pBuffer As String , ST As SYSTEMTIME
        if inidatum$<>"" then
            st.wYear=val(field$(inidatum$,"-",3))
            st.wmonth=val(field$(inidatum$,"-",1))
            st.wDay =val(field$(inidatum$,"-",2))
            pbuffer="Init"
            pBuffer = String$(255, 0)
            r=GetDateFormat( ByVal 0&, 0, st, "ddd", Varptr(pBuffer), Len(pBuffer))
            pBuffer = Left$(pBuffer, InStr(1, pBuffer, Chr$(0)) - 1)
            if len(pbuffer)=0 then
                 showmessage inidatum$+" it's not valid. Format must be 'MM-DD-YYYYY' ie. '04-23-2001' and the date must be exist"
                 qcalendar.visible=0
                 exit sub
            end if
        end if
        dim b as string
        b=string$(4,0)  
        getlocaleinfo(ByVal 0&, 5  ,varptr(b),len(b))
        dim todayC as string
        select case val(b)
            case 386
                todayC="Danes"
            case 39
                todayC="Oggi"
            case 33
                todayC="Aujourd'hui"
            case 55,52,34
                todayC="Hoy"
            case 49
                todayC="Heute"
            case else
                todayC="Today"
        end select
        for i = 1 to 12
             b=string$(10,0)  
             getlocaleinfo(ByVal 0&, i+55,varptr(b),len(b))
             qcalendar.mesi(i).OnClick=qcalendar.mnuClick
             qcalendar.mesi(i).Caption = b 
             qcalendar.PopupMenu.AddItems qcalendar.mesi(i)
        next
        qcalendar.panel1.popupmenu=qcalendar.popupmenu
        dim week(1 to 7)as string
        for i=1 to 7
            b=string$(3,0)  
            getlocaleinfo(ByVal 0&, i+48  ,varptr(b),len(b))    
            week(i)=b
        next
        for i=1 to qcalendar.grid.colcount+1
            qcalendar.grid.cell(i-1,0)=week(i)
        next
        ST.wDay = val(field$(date$,"-",2))
        ST.wMonth = val(field$(date$,"-",1))
        ST.wYear = val(field$(date$,"-",3))
        b=string$(15,0)  
        getlocaleinfo(ByVal 0&, &H20,varptr(b),len(b))
        pBuffer = String$(255, 0)
        GetDateFormat( ByVal 0&, 0, ST, b, Varptr(pBuffer), Len(pBuffer))
        pBuffer = Left$(pBuffer, InStr(1, pBuffer, Chr$(0)) - 1)        
        qcalendar.today.caption=todayC+": "+pbuffer
        qcalendar.grid.deloptions 4
        if inidatum$="" then
            qcalendar.loadcal(date$)
        else
            qcalendar.loadcal(inidatum$)
        end if
    END SUB

'-- ************************************************************************************' 
    EVENT grid.onselectcell (Col%, Row%, CanSelect%,s as qstringgrid)
       qcalendar.d=val(s.cell(col%,row%))
       if row%=1 then
           if col%<qcalendar.week1%-1 then
               canselect%=0         
               exit sub
           end if
       end if
       if row%>4 then
            if val(s.cell(col%,row%))<22 then
                canselect%=0
                exit sub
            end if
       end if
       Dim pBuffer As String, ST As SYSTEMTIME
       ST.wDay =qcalendar.d
       ST.wMonth = qcalendar.m
       ST.wYear = qcalendar.y
       dim b as string
       b=string$(15,0)  
       getlocaleinfo(ByVal 0&, &H20,varptr(b),len(b))
       pBuffer = String$(255, 0)
       GetDateFormat( ByVal 0&, 0, ST, b, Varptr(pBuffer), Len(pBuffer))
       pBuffer = Left$(pBuffer, InStr(1, pBuffer, Chr$(0)) - 1)        
       qcalendar.panel2.caption=pBuffer
    END EVENT
'-- ************************************************************************************' 
    EVENT bntupy.onclick
        qcalendar.y=qcalendar.y+1
        if val(field$(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)),"-",2))<qcalendar.d then 
            qcalendar.loadcal(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)))
        else
            qcalendar.loadcal(str$(qcalendar.m)+"-"+str$(qcalendar.d)+"-"+str$(qcalendar.y))
        end if    
    END EVENT
'-- ************************************************************************************' 
    EVENT  btnnext.onclick(s as qcoolbtn)
        if qcalendar.m=12 then
            qcalendar.m=1:qcalendar.y=qcalendar.y+1
        else
            qcalendar.m=qcalendar.m+1
        end if
        if val(field$(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)),"-",2))<qcalendar.d then 
            qcalendar.loadcal(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)))
        else
            qcalendar.loadcal(str$(qcalendar.m)+"-"+str$(qcalendar.d)+"-"+str$(qcalendar.y))
        end if
    END EVENT
'-- ************************************************************************************' 
    EVENT bntdowny.onclick
        if qcalendar.y>1753 then
            qcalendar.y=qcalendar.y-1
        else 
            exit sub
        end if    
        if val(field$(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)),"-",2))<qcalendar.d then
            qcalendar.loadcal(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)))
            exit sub
        else
            qcalendar.loadcal(str$(qcalendar.m)+"-"+str$(qcalendar.d)+"-"+str$(qcalendar.y))
        end if        
    END EVENT          
'-- ************************************************************************************' 
    EVENT btnprev.onclick(s as qcoolbtn)
        if qcalendar.m=1 then
            if qcalendar.y=1753 then exit sub
            qcalendar.m=12:qcalendar.y=qcalendar.y-1
        else
            qcalendar.m=qcalendar.m-1
        end if
        if val(field$(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)),"-",2))<qcalendar.d then
            qcalendar.loadcal(lastdaym(str$(qcalendar.m)+"-01-"+str$(qcalendar.y)))
            exit sub
        else
            qcalendar.loadcal(str$(qcalendar.m)+"-"+str$(qcalendar.d)+"-"+str$(qcalendar.y))
        end if
    END EVENT
'-- ************************************************************************************' 
    EVENT Today.onclick(s as qcoolbtn)
        qcalendar.loadcal(date$)
    END EVENT
'-- ************************************************************************************' 
    EVENT grid.onDrawcell (Col% AS LONG, Row% AS LONG, State AS LONG, R AS QRECT, S AS QSTRINGGRID)
        w=((s.colwidths(col%)-s.textwidth(s.cell(col%,row%)))\2)-1
        s.fillrect(r.left,r.top,r.right,r.bottom,-2147483643)  
        if row%=1 then
            if col%<qcalendar.week1%-1 then
                s.textout(r.left+w,r.top+1,s.cell(col%,row%),-2147483631,-1)
                exit sub
            end if
        end if    
        if row%>4 then
            if val(s.cell(col%,row%))<22 then
                s.textout(r.left+w,r.top+1,s.cell(col%,row%),-2147483631,-1)
                exit sub
            end if
        end if   
        if state=1 then
            s.circle(r.left,r.top,r.right,r.bottom,9437183,9437183)
        end if
        if format$("%.2d-%.2d-%d",qcalendar.m,val(s.cell(col%,row%)),qcalendar.y)=date$ then
            s.circle(r.left,r.top,r.right,r.bottom,8716543,-1)
            s.circle(r.left+1,r.top+1,r.right-1,r.bottom-1,8716543,-1)        
        end if
        if col%=6 then 
            s.textout(r.left+w,r.top+1,s.cell(col%,row%),5732096,-1)
        else
            s.textout(r.left+w,r.top+1,s.cell(col%,row%),-2147483640,-1)
        end if
    END EVENT
'-- ************************************************************************************' 
    FUNCTION QDate$ as string
       result=str$(qcalendar.m)+"-"+str$(qcalendar.d)+"-"+str$(qcalendar.y)
    END FUNCTION 
'-- ************************************************************************************' 
    CONSTRUCTOR
        Caption = "Calendar"
        Width = 179
        Height = 183
        BevelInner = 1
        'BevelOuter = 1 
            panel2.parent=qcalendar
            panel2.Left = 0
            panel2.Top = 146
            panel2.Caption = "QCalendar by P.C.B."
            panel2.Width = 173
            panel2.Height = 25
            panel2.BevelInner = 1
            'BevelOuter = 1 
            panel2.Align = 1
            panel2.TabOrder = 2    
                bntdowny.parent=qcalendar.panel1
                'BMP = "C:\RapidQ\cdx.bmp" 
                bntdowny.caption="6"
                bntdowny.font.name="Webdings"            
                bntdowny.Left = 25
                bntdowny.Top = 1
                bntdowny.Width = 15
                bntdowny.Height = 21
                bntdowny.Flat = 1
                bntdowny.font.color=-2147483639  
                bntdowny.Align = 3
               'BMP = "C:\RapidQ\cdx.bmp" 
                bntupy.parent=qcalendar.panel1
                bntupy.caption="5"
                bntupy.font.name="Webdings"            
                bntupy.Left = 100
                bntupy.Top = 1
                bntupy.Width = 15
                bntupy.Height = 13
                bntupy.Flat = 1
                bntupy.font.color=-2147483639  
                bntupy.Align = 4
                btnnext.parent=qcalendar.panel1
                'BMP = "C:\RapidQ\cdx.bmp" 
                btnnext.caption="è"
                btnnext.font.name="Wingdings"            
                btnnext.Left = 148
                btnnext.Top = 1
                btnnext.Width = 23
                btnnext.Height = 21
                btnnext.Flat = 1
                btnnext.font.color=-2147483639  
                btnnext.Align = 4
                'btnnext.onclick=btnnextc             
                BTNprev.parent=qcalendar.panel1
                'BMP = "C:\RapidQ\csx.bmp" 
                BTNprev.caption="ç"
                BTNprev.font.name="Wingdings"
                BTNprev.Left = 2
                BTNprev.Top = 1
                BTNprev.Width = 23
                BTNprev.Height = 21
                BTNprev.Flat = 1
                btnprev.font.color=-2147483639  
                BTNprev.Align = 3
                'BTNprev.onclick=btnprevc 
            Panel1.parent=qcalendar
            Panel1.Left = 0
            Panel1.Top = 0
            Panel1.Caption = "Panel1"
            Panel1.Width = 173
            Panel1.Height = 29
            Panel1.bevelinner=1
            Panel1.Align = 1
            Panel1.TabOrder = 1
            Panel1.font.addstyles 0
            Panel1.color=-2147483646
            Panel1.font.color=-2147483639            
            grid.parent=qcalendar
            grid.borderstyle=0
            grid.Left = 0
            grid.Top = 25
            grid.Height = 106
            grid.Width = 173
            grid.Align = 1
            grid.ScrollBars = 0
            grid.GridLineWidth = 0
            grid.ColCount =7'' 8 '-- was 7 - and error occures 
            grid.RowCount =7'' 8 '-- was 7 - and error occures 
            grid.Col = 0
            grid.DefaultColWidth = 25
            grid.DefaultRowHeight = 15
            grid.FixedCols = 0
            Today.parent=qcalendar
            Today.Caption = "Today"
            Today.Left = 0
            Today.Top = 110
            Today.flat=1
            Today.Width = 173
            Today.Align = 1
            Today.height=18
            Today.font.addstyles=0
    END CONSTRUCTOR    
END TYPE