January 26, 2021, 12:47:00 PM

Author Topic: [bmx] CalendarGadget by degac [ 1+ years ago ]  (Read 613 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] CalendarGadget by degac [ 1+ years ago ]
« on: June 29, 2017, 12:28:39 AM »
Title : CalendarGadget
Author : degac
Posted : 1+ years ago

Description : Standard Calendar Gadget



Today button + Pick a date



Today button



This gadget creates a Calendar that shows appointments (if any) and festivity (they can be changed with the function SetCalendarHolidays).
The source code is already formatted to become part of a module, so you can see help for the documented commands:
 - CreateCalendar
 - SetCalendarAppointment
 - GetCalendarAppointment
 - RemoveAppointments
 - SetCalendarHoliday
 - SetCalendarLocale
You can see more info here <a href="../Community/posts12a8.html?topic=85151" target="_blank">http://www.blitzbasic.com/Community/posts.php?topic=85151[/url]
I need to thanks Sebholl for the DrawCalendar implementation (day's button are hidden and/or renamed when not needed).
There can be some different graphics layout (or bugs) on other OS platforms.

This code is public domain.
* some time function (Julian conversion) are taken from another source code here in the Code Archives

edit: Update on 14-aug-2010

Added:
SetCalendarLocale - adds localized name for days and monts
SetCalendarHoliday - adds localized dates and names for national-religious holiday

Support TODAY button and PICK DAY (for a day picker implementation)

Edit: 15-08-2010

You can grab all the 'extra gadgets' from <a href="http://www.graphio.net/download/maxgui_extragadget.zip" target="_blank">here[/url]
This zip file contains:
- a calendar
- a datepicker
- a listboxmanager
- a checklist
- a new progressbar


Code :
Code: BlitzMax
  1. Rem
  2.                 Calendar gadget
  3.                
  4.                 degac + sebholl gadget redraw improvements
  5.                
  6.                 07 jun 2009             first release, some basic fixes
  7.                 08 jun 2009             the Calendar Gadget returns (every time you click/change the date) the new date
  8.                                         in the EventExtra field
  9.                                         you can have multiple appointments in the same date (dd-mm)
  10.                                         you can have 'fixed' appointment for a specific year (dd-mm-yyyy)
  11.                                        
  12.                 13 jun 2009             SetGadgetColor support
  13.                                         Some bug fix with calendar length & panel
  14.                                         CreateCalendar has 2 styles
  15.                                         - CAL_WEEKEND (1) : the SUNDAY and SATURDAY label are both 'coloured'
  16.                                         - CAL_HIDDEN  (2) : the selected day is not showed on the calendar     
  17.                                         Changed GetCalendarAppointment & RemoveAppointments to get / remove a single appointment
  18.                                         Appointments are 'numbered' and displayed automatically
  19.  
  20.  
  21.                 02 ago 2010
  22.                
  23.                                         Added:
  24.                                        
  25.                                                 + SetCalendarLocale(calendar:tcalendar,weeks,months)
  26.                                                
  27.                                                 To localize days name and months
  28.                                                 usage:
  29.                                                
  30.                                                 SetCalendarLocale(cal,"Lu,Ma,Me,Gi,Ve,Sa,Do","Gen,Feb,Mar,Apr,Mag,Giu,Lug,Ago,Set,Ott,Nov,Dic")
  31.                                                
  32.                                                 Day week and months *MUST* be separated by commas
  33.                                                
  34.  
  35.                                                 + SetCalendarHoliday(calendar:tcalendar,date,descriptions)
  36.                                                
  37.                                                 To add an holidays calendar
  38.                                                
  39.                                                 Usage:
  40.                                                
  41.                                                 SetCalendarHoliday("01-01,25-12","New Year,Christmas")
  42.                                                
  43.                                                 dates and descriptions *MUST* be separated by commas
  44.                                                
  45.                                                 dates are written as DAY-MONTH
  46.                                                
  47.                 14 AGO 2010
  48.                
  49.                                 Fixed:  - Replaced const with CAL_WEEKEND,CAL_HIDDEN,CAL_TODAY,CAL_PICKER
  50.                                 - fixed WEEKEND behaviour
  51.                 Added:  - 2 new constant:      
  52.                                 CAL_TODAY       : to come back to the current date
  53.                                 CAL_PICKER      : to allow the user to choose a date and close the gadget
  54.        
  55. End Rem
  56.  
  57. SuperStrict
  58. Import MaxGUI.Drivers
  59.  
  60. Local window:TGadget = CreateWindow("Calendar v. 1.3",100,100,210,300,,window_titlebar|window_center|WINDOW_RESIZABLE)
  61. Local data:TCalendar = CreateCalendar(10,40,180,,window,CAL_WEEKEND|CAL_TODAY|CAL_PICKER)
  62. 'Local data2:TCalendar = CreateCalendar(210,40,180,,window,CAL_WEEKEND|CAL_HIDDEN)
  63. SetGadgetLayout data, EDGE_RELATIVE,EDGE_RELATIVE,EDGE_RELATIVE,EDGE_RELATIVE
  64. Local label:TGadget = CreateLabel(" ",10,5,200,25,window)
  65.  
  66. SetGadgetColor data,200,200,200
  67. 'SetGadgetLayout data2, EDGE_RELATIVE,EDGE_RELATIVE,EDGE_RELATIVE,EDGE_RELATIVE
  68. 'Local label2:TGadget = CreateLabel("Label",210,5,200,25,window)
  69.  
  70. 'this method to set an Appointment-reminder on the calendar
  71.  
  72. SetCalendarAppointment(data,"10-06","Test application!")
  73. SetCalendarAppointment(data,"10-06","Second appointment...~nRemember to conquer the world!")
  74. SetCalendarAppointment(data,"10-06","Buy the milk")
  75. SetCalendarAppointment(data,"12-06","World launch!")
  76. SetCalendarAppointment(data,"12-08-2010","---appointment---1")
  77. SetCalendarAppointment(data,"12-08-2010","---appointment---2")
  78. SetCalendarAppointment(data,"09-06-2009","This is a fixed date")
  79. RemoveAppointments(data,"10-06",2)
  80. 'RemoveAppointments(data,"12-06")
  81. 'SetCalendarHoliday(data,"15-08,16-08","Ferragosto")
  82. 'SetCalendarLocale(data,"Lu,Ma,Me,Gi,Ve,Sa,Do","Gen,Feb,Mar,Apr,Mag,Giu,Lug,Ago,Set,Ott,Nov,Dic")
  83. 'SetCalendarLocale(data,"Lu,Ma,Me,Gi,Ve,Sa,Do","Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre")
  84. RedrawGadget data 'you need to 'redraw' the gadget to see the appointments set for the current month
  85. 'RedrawGadget data2
  86.  
  87. Local app$[]=GetCalendarAppointment(data,"10-06",1)
  88.  
  89. For Local ss$=EachIn app
  90.         Print "Appointment: {"+ss+"}"
  91. Next
  92.  
  93.  
  94. While True
  95.         WaitEvent
  96.                 Select EventID()
  97.                 Case EVENT_GADGETCLOSE
  98.                         If EventSource()=DATA
  99.                                 Print "Data finale : "+String(EventExtra())
  100.                                 Print "Oppure : "+EventX()+" "+EventY()+" "+EventData()
  101.                         End If
  102.                 Case event_gadgetaction
  103.                        
  104.                         If EventSource() = data
  105.                                 SetGadgetText label,String(EventExtra())
  106.                         End If
  107.                        
  108.                         'If EventSource() = data2
  109.                 '                       SetGadgetText label2,String(EventExtra())
  110.                 '       End If
  111.                        
  112.                                                
  113.                 Case event_windowclose
  114.                         If EventSource() = window End
  115.                 End Select
  116. Wend
  117.  
  118. End
  119. Rem
  120.  
  121.                 Calendar gadget
  122.                 v.1.3 - 14 aug 2010
  123.                
  124.                 Fixed:  - Replaced const with CAL_WEEKEND,CAL_HIDDEN,CAL_TODAY,CAL_PICKER
  125.                                 - fixed WEEKEND behaviour
  126.                 Added:  - 2 new constant:       CAL_TODAY : to come back to the current date
  127.                                                         CAL_PICKER: to allow the user to choose a date and close the gadget
  128.                        
  129.                
  130.                
  131.  
  132. End Rem
  133.  
  134.  
  135. Rem
  136. bbdoc: Create a basic calendar.
  137. about: Displays a simple calendar for year/month reporting the (eventual) appointments or festivity<br>
  138. it returns the new date in the @{TEvent.Extra} field.
  139.  
  140. @x, @y are the initial position, while @w and @h (if specified) are the width and the height of the
  141. calendar.
  142.  
  143. Remember that there are @minimum size dimensions for wide and height.
  144.  
  145. [ @Style | @Description
  146. * WEEKEND | Saturday and Sunday are coloured
  147. * HIDDEN | The day selected is not shown
  148. ]
  149. <br>
  150. See also: #SetCalendarAppointment, #GetCalendarAppointment, #RemoveAppointments
  151. End Rem
  152. Function CreateCalendar:TCalendar(x:Int,y:Int,w:Int = 152,h:Int = 191,group:TGadget = Null,_style:Int = 0)
  153.         If group = Null Return Null    
  154.         Local min_w:Int = 152,min_h:Int = 191
  155.         If w<min_w w = min_w
  156.         If h<min_h Or h>min_h h = min_h
  157.         If _style&CAL_TODAY Or _style&CAL_PICKER h:+25
  158.        
  159.         Return TCalendar.Create(x,y,w,h,group,_style)
  160. End Function
  161. Rem
  162. bbdoc: Set an appointment for the date (DD-MM) or (DD-MM-YYYY)
  163. about: You can specify a simple date (Day-Month) and the appointment will be repeated every year.<br>
  164. Or you can specify a complete date (day-month-year) in the form of DD-MM-YYYY, and in this case the appointment will be displayed only in the year YYYY.<br>
  165. For the same date you can specify more appointments, they will be queued.<br>
  166.  
  167. See also: #CreateCalendar, #GetCalendarAppointment, #RemoveAppointments
  168. End Rem
  169. Function SetCalendarAppointment(calendar:TCalendar,date$ = "",app$ = "")
  170.         If calendar = Null Return
  171.         If date = "" Return
  172.         calendar.SetAppointment(date,app)
  173. End Function
  174.  
  175. Rem
  176. bbdoc: Set Holidays
  177. about: It creates the national/religious holiday
  178.  
  179. @week and @description MUST be string with value separated by commas.
  180. The date format must be in the format 01-02
  181.  
  182. Example: "01-01,25-12","New year,Christmas"
  183. End Rem
  184. Function SetCalendarHoliday(calendar:tcalendar,week$,description$)
  185.         If calendar=Null Return
  186.         If week="" Or description="" Return
  187.         calendar.SetHoliday(week,description)
  188. End Function
  189.  
  190. Rem
  191. bbdoc: Set Calendar Locale
  192. about: It uses the local name for months and days
  193. @week and @month must contain value separated by commas
  194. Day week starts with MONDAY.
  195. Example:
  196.  
  197. SetCalendarLocale(data,"Lu,Ma,Me,Gi,Ve,Sa,Do","Gen,Feb,Mar,Apr,Mag,Giu,Lug,Ago,Set,Ott,Nov,Dic")
  198.  
  199. End Rem
  200. Function SetCalendarLocale(calendar:tcalendar,week$,month$)
  201.         If calendar=Null Return
  202.         If week="" Or month="" Return
  203.         calendar.SetLocale(week,month)
  204. End Function
  205.  
  206. Rem
  207.         bbdoc: Get the appointment(s) for a determinated date (DD-MM) or (DD-MM-YYYY)
  208.         about: It returns an array of string of the appointment(s) of that @date.<br>
  209.         If @index is specified ONLY the appointment number Index will be returned. Index is between 1 and number of appointments.<br>
  210.        
  211.         See also: #CreateCalendar, #SetCalendarAppointment, #RemoveAppointments
  212. End Rem
  213. Function GetCalendarAppointment:String[](Calendar:TCalendar,date$ = "",index:Int=-1)
  214. If date = "" Or calendar = Null Return [""]
  215.         Return calendar.GetAppointment(date,index-1)
  216. End Function
  217.  
  218. Rem
  219. bbdoc: Remove all appointments
  220. about: This function will remove all the appointments from a calendar<br>
  221. If a @date is specified only the appointment(s) on that @date will be removed<br>
  222. If @index is specified ONLY the appointment number Index will be deleted. Index is between 1 and number of appointments.<br>
  223.  
  224. See also: #CreateCalendar, #SetCalendarAppointment, #GetCalendarAppointment
  225. End Rem
  226. Function RemoveAppointments(calendar:TCalendar,date$ = "",index:Int=-1)
  227. If date = ""
  228.         ClearMap(calendar.map_appointment)
  229. Else
  230.         If index=-1
  231.                 MapRemove calendar.map_appointment,date
  232.         Else
  233.                 'remove the INDEX appointments (0..n)
  234.                 index:-1
  235.                 Local _array_des$[],_new_array$[]
  236.                 _array_des = String[](MapValueForKey(calendar.map_appointment,date))
  237.                 If index>=0 And index<_Array_des.length
  238.                 _array_des[index]=""
  239.                         Local coco:Int
  240.                         For Local co$=EachIn _Array_Des
  241.                                 If co<>""
  242.                                 _new_array=_new_array[..coco+1]
  243.                                 _new_array[coco]=co
  244.                                 coco:+1
  245.                                 End If
  246.                         Next
  247.                         MapRemove calendar.map_appointment,date
  248.                         MapInsert calendar.map_appointment,date,_new_Array
  249.                
  250.                 End If         
  251.         End If
  252. End If
  253. End Function
  254.  
  255.         Const CAL_WEEKEND:Int1
  256.         Const CAL_HIDDEN:Int=           2
  257.         Const CAL_TODAY:Int=            4
  258.         Const CAL_PICKER:Int=           8
  259.  
  260.  
  261. Type TCalendar Extends Tproxygadget
  262.  
  263.         Global day_name$[] = ["Mo","Tu","We","Th","Fr","Sa","Su"]'["Lu","Ma","Me","Gi","Ve","Sa","Do"]
  264.         Global month_name$[] = ["January","February","March","April","May","June","July","August","September","October","November","December"]
  265.         Global month_days:Int[] = [31,28,31,30,31,30,31,31,30,31,30,31]
  266.  
  267.         Field map_dayfest:tmap = CreateMap()
  268.         Field map_appointment:tmap = CreateMap()
  269.         Field _fest_data$[] = ["01-01","06-01","25-04","01-05","02-06","15-08","01-11","08-12","25-12","26-12"]
  270.         Field _fest_Desc$[] = ["New year","Epifany","Liberation day","Worker day","Republic Day","Ferragosto","All saints","Immaculate conception","Nativity","S.Steven"]
  271.         Field _app_data$[]
  272.         Field _app_desc$[]
  273.         Field lbl_day:tgadget[]
  274.        
  275.         Field _keephidden:Int
  276.         Field panel:TGadget
  277.         Field style:Int
  278.         Field year_dec:TGadget,year_inc:TGadget,year:TGadget
  279.         Field month_dec:TGadget,month_inc:TGadget,month:TGadget
  280.         Field day_panel:TGadget
  281.         Field days:TGadget[49],label:TGadget[7]
  282.         Field current_year:Int,current_month:Int,current_day:Int
  283.         Field day_wide:Int = 21,day_height:Int = 21
  284.         Field max_wide:Int = 146,max_heigth:Int = 191
  285.         Field data$
  286.         Field pickday:tgadget,today:tgadget
  287.        
  288.         Method SetLocale(_week$="",_month$="")
  289.                 If _week="" Or _month="" Return
  290.                
  291.                 day_name=_week.split(",")
  292.                 month_name=_month.split(",")
  293.                
  294.                 If Len(day_name)<7 day_name=day_name[..7]
  295.                 If Len(month_name)<12 month_name=month_name[..12]
  296.                
  297.                 Local con:Int
  298.                 For Local kd:tgadget=EachIn label
  299.                         SetGadgetText kd,day_name[con]
  300.                         con:+1
  301.                 Next
  302.        
  303.         End Method
  304.        
  305.         Method SetHoliday(_day$="",_desc$="")
  306.                 If _day="" Or _desc="" Return
  307.                
  308.                 Local _dday:String[]=_day.split(",")
  309.                 Local _ddesc:String[]=_desc.split(",")
  310.                
  311.                 If Len(_dday)<Len(_ddesc) _dday=_dday[..Len(_ddesc)]
  312.                 If Len(_dday)>Len(_ddesc) _ddesc=_ddesc[..Len(_dday)]
  313.                
  314.                
  315.                 ClearMap(map_dayfest)
  316.                 _fest_data=_dday
  317.                 _fest_desc=_ddesc
  318.                 For Local s:Int = 0 Until _Fest_data.length
  319.                                 MapInsert(map_dayfest,_fest_data[s],_fest_desc[s])
  320.                 Next
  321.  
  322.         End Method
  323.        
  324.  
  325.         Method SetEnabled(sta:Int = True)
  326.  
  327.                 Local k:TGadget
  328.                
  329.                 If sta = False
  330.                         DisableGadget panel
  331.                         DisableGadget year_dec
  332.                         DisableGadget year_inc
  333.                         DisableGadget year
  334.                         DisableGadget month_dec
  335.                         DisableGadget month_inc
  336.                         DisableGadget month
  337.                        
  338.                         For k = EachIn days
  339.                                 DisableGadget k
  340.                         Next
  341.                        
  342.                         For k = EachIn label
  343.                                 DisableGadget k
  344.                         Next
  345.                 Else
  346.                         EnableGadget panel
  347.                         EnableGadget year_dec
  348.                         EnableGadget year_inc
  349.                         EnableGadget year
  350.                         EnableGadget month_dec
  351.                         EnableGadget month_inc
  352.                         EnableGadget month
  353.                        
  354.                         For k = EachIn days
  355.                                 EnableGadget k
  356.                         Next
  357.                         For k = EachIn label
  358.                                 EnableGadget k
  359.                         Next
  360.  
  361.  
  362.                 End If
  363.                
  364.         End Method
  365.        
  366.         Method Close()
  367.                 EmitEvent CreateEvent(EVENT_GADGETCLOSE,Self,current_year,0,current_day,current_month,data)
  368.                 end Method
  369.        
  370.         Method Free()
  371.                 RemoveHook EmitEventHook,EventHandler,Self
  372.                 If panel FreeGadget panel
  373.        
  374.                 If year_dec FreeGadget year_dec
  375.                 If year_inc FreeGadget year_inc
  376.                 If year FreeGadget year
  377.                 If month_dec FreeGadget month_dec
  378.                 If month_inc FreeGadget month_inc
  379.                 If month FreeGadget month
  380.                
  381.                 Local gg:TGadget
  382.                
  383.                 For Local kd:tgadget=EachIn lbl_Day
  384.                         FreeGadget kd
  385.                 Next
  386.                 lbl_day=Null
  387.                
  388.                 If days
  389.                         For gg = EachIn days
  390.                                 FreeGadget gg
  391.                                 gg = Null
  392.                         Next
  393.                         days = Null
  394.                 End If
  395.                
  396.                 If label
  397.                         For gg = EachIn label
  398.                                 FreeGadget gg
  399.                                 gg = Null
  400.                         Next
  401.                         label = Null
  402.                 End If
  403.                
  404.                 _app_desc=Null
  405.                 _app_data=Null
  406.                 _fest_desc=Null
  407.                 _fest_Data=Null
  408.                 ClearMap map_dayfest
  409.                 ClearMap map_appointment
  410.                 map_dayfest=Null
  411.                 map_appointment=Null
  412.        
  413.                 panel = Null
  414.                 Super.Free
  415.         End Method
  416.  
  417.         Method SetColor(red:Int,green:Int,blue:Int)
  418.                 SetPanelColor panel,red,green,blue
  419.         End Method
  420.  
  421.        
  422.         Function Create:TCalendar(x:Int,y:Int,w:Int,h:Int,group:TGadget,style:Int = 0)
  423.                 Local sp:TCalendar = New TCalendar
  424.                 sp.panel =              CreatePanel(x,y,w,h+(style&CAL_TODAY=True)*25,group,PANEL_BORDER)
  425.                
  426.                 w =  sp.panel.ClientWidth()
  427.                 h =  sp.panel.ClientHeight()'-(style&TODAY=True)*25
  428.                
  429.                 HideGadget sp.panel
  430.                 SetPanelColor sp.panel, 255, 255, 255
  431.                
  432.                 sp.year_dec =   CreateButton("<",0,0,20,20,sp.panel )
  433.                 SetGadgetLayout sp.year_dec, EDGE_ALIGNED, EDGE_CENTERED, EDGE_ALIGNED, EDGE_CENTERED
  434.                
  435.                 sp.year_inc =   CreateButton(">",w-20,0,20,20,sp.panel )
  436.                 SetGadgetLayout sp.year_inc, EDGE_CENTERED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED
  437.                
  438.                 sp.year  =      CreateLabel ("year",20,0,W-40,20,sp.panel,LABEL_CENTER )
  439.                 SetGadgetLayout sp.year, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED
  440.                
  441.                 sp.month_dec =  CreateButton("<",0,20,20,20,sp.panel )
  442.                 SetGadgetLayout sp.month_dec, EDGE_ALIGNED, EDGE_CENTERED, EDGE_ALIGNED, EDGE_CENTERED
  443.                
  444.                 sp.month_inc =  CreateButton(">",w-20,20,20,20,sp.panel )
  445.                 SetGadgetLayout sp.month_inc, EDGE_CENTERED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED
  446.                
  447.                 sp.month =              CreateLabel ("month",20,20,W-40,20,sp.panel,LABEL_CENTER )
  448.                 SetGadgetLayout sp.month, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED
  449.        
  450.                 SetGadgetLayout CreateLabel("",0,40,W,2,sp.panel,LABEL_SEPARATOR), EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED
  451.        
  452.                 Local XX:Int,YY:Int = 62
  453.                 Local nam$,k:Int,lbl:TGadget,counter:Int
  454.                
  455.                 sp._keepHidden = style&CAL_HIDDEN 'Dont' show the selected day...
  456.                
  457.                 If style&CAL_TODAY And Not (style&CAL_PICKER)
  458.                         sp.today=CreateButton("Today",0,h-22,w-1,22,sp.panel)
  459.                 ElseIf (style&CAL_TODAY) And (style&CAL_PICKER)
  460.                         sp.today=CreateButton("Today",0,h-22,w/2-1,22,sp.panel)
  461.                         sp.pickday=CreateButton("Pick date",w/2+1,h-22,w/2-1,22,sp.panel)
  462.  
  463.                 End If 
  464.                 sp.style=Style
  465.                
  466.                 sp.day_wide = w/7
  467.                 sp.max_wide = w-sp.day_wide
  468.                
  469.                 Local dyear:Int,dmonth:Int,dday:Int,ddate:String
  470.                
  471.                
  472.                 Local dinfo:String[]
  473.                 dinfo=GetCurrentDate(CurrentDate())
  474.                 'with my CurrentDate() hack everything will be faster...
  475.                 'so at the moment I need to convert the months in an index...
  476.        
  477.                 sp.current_day =                Int(dinfo[0])
  478.                 sp.current_month =      Int(dinfo[1])
  479.                 sp.current_year =       Int(dinfo[2])
  480.                
  481.                 SetGadgetText sp.year,dinfo[2]
  482.                 SetGadgetText sp.month,month_name[Int(dinfo[1])-1]             
  483.                 Local tmpOffset:Int =  (w-(sp.day_wide*7))/2           
  484.                 sp.day_panel =  CreatePanel( tmpOffset, yy-20, w-(tmpOffset*2), sp.day_height*7, sp.panel )
  485.                 SetGadgetLayout sp.day_panel, EDGE_ALIGNED, EDGE_RELATIVE, EDGE_ALIGNED, EDGE_ALIGNED
  486.                
  487.                 For counter = 0 Until 7
  488.                         lbl = CreateLabel(day_name[counter],xx,0,sp.day_wide,18,sp.day_panel,LABEL_CENTER)
  489.                         SetGadgetLayout lbl,EDGE_RELATIVE,EDGE_RELATIVE,EDGE_ALIGNED,EDGE_CENTERED
  490.                         xx:+sp.day_wide
  491.                         If counter = 6 SetGadgetColor lbl,128,128,128
  492.                         If STYLE&CAL_WEEKEND And counter=5 SetGadgetColor lbl,168,168,168
  493.                         sp.label[counter] = lbl
  494.        
  495.                 Next
  496.                
  497.                 Local julian_time:Int = Conv_Date2Julian(ddate)
  498.                 Local day_week:Int = DayOfTheWeek(julian_time) ' 0 : Sunday, 1 : Monday...
  499.                
  500.                 For Local i:Int =  0 Until 49
  501.                         sp.days[i] =  CreateButton("",(i Mod 7) * sp.day_wide,20+(i/7)*sp.day_height,sp.day_wide,sp.day_height,sp.day_panel)
  502.                         SetGadgetLayout sp.days[i],EDGE_RELATIVE,EDGE_RELATIVE,EDGE_RELATIVE,EDGE_RELATIVE
  503.                 Next
  504.                
  505.                 sp.DrawCalendar(-1,dinfo) ' it reports the CURRENT DATA
  506.                 AddHook EmitEventHook,EventHandler,sp
  507.                 sp.data = ddate
  508.                 sp.SetProxy sp.panel
  509.                
  510.                 'add festivity
  511.                 'change the global array for your purposes
  512.                
  513.                 For Local s:Int = 0 Until sp._Fest_data.length
  514.                                 MapInsert(sp.map_dayfest,sp._fest_data[s],sp._fest_desc[s])
  515.                 Next
  516.                
  517.                 ShowGadget sp.panel
  518. RedrawGadget sp
  519.  
  520.                 Return sp
  521.         End Function
  522.        
  523.         Method SetToday()
  524.                 Local dinfo:String[]
  525.                 dinfo=GetCurrentDate(CurrentDate())
  526.                 current_day =   Int(dinfo[0])
  527.                 current_month = Int(dinfo[1])
  528.                 current_year =  Int(dinfo[2])
  529.                 SetGadgetText year,dinfo[2]
  530.                 SetGadgetText month,month_name[Int(dinfo[1])-1]
  531.                 RedrawGadget Self
  532.         End Method
  533.        
  534.         Function GetCurrentDate:String[](ddate:String)
  535.                 Local dinfo:String[3]
  536.                 ddate = ddate.ToLower()
  537.                 dinfo = ddate.split(" ")
  538.                 Local mcounter:Int = 0
  539.                 For Local ch$ = EachIn month_name$
  540.                         mcounter:+1
  541.                         If dinfo[1][..3] = ch.ToLower()[..3] Then dinfo[1] = String(mcounter)'for linux compatibility
  542.                 Next
  543.                        
  544.                 ddate = dinfo[0]+" "+dinfo[1]+" "+dinfo[2]
  545.                 Return dinfo
  546.         End Function
  547.        
  548.         Method DrawCalendar(day_offset:Int = 0,info:String[])
  549.                 Local yy:Int = 62,nam$,k:Int,counter:Int
  550.                 Local max_days:Int = month_days[Int(info[1])-1]
  551.                 If AnnoBisesto(Int(info[2])) = 1 And Int(info[1]) = 2 Then max_days = 29
  552.                
  553.                 Local festday$[],_array_des$[],_tool$
  554.                                
  555.                 For Local k:Int =  0 Until days.length
  556.                         If k>=day_offset And k<(max_days+day_offset) Then
  557.                                        
  558.                                 nam = String((k-day_offset)+1)
  559.                                 SetGadgetText days[k], nam
  560.                                
  561.                                 _tool = ""
  562.                        
  563.                        
  564.                                
  565.                                 SetGadgetColor days[k],200,200,200
  566.                                 SetGadgetColor days[k],0,0,0,False
  567.                        
  568.                                 If counter = 6 SetGadgetColor days[k],128,128,128
  569.                                 If (STYLE&CAL_WEEKEND)=CAL_WEEKEND And counter =5 SetGadgetColor days[k],168,168,168                           
  570.                                 If Int(GadgetText(days[k]))  = Int(info[0]) And _keephidden = 0
  571.                                         SetGadgetColor days[k],125,125,230
  572.                                         SetGadgetColor days[k],255,255,255,False
  573.                                 End If
  574.                                         'check for fest day
  575.                                                                
  576.                                 For Local fd:String = EachIn MapKeys(map_dayfest)
  577.                                         festday = fd.split("-")
  578.                                        
  579.                                         If Int(GadgetText(days[k])) = Int(festday[0]) And Int(info[1]) = Int(festday[1])        
  580.                                                         SetGadgetColor days[k],128,128,128
  581.                                                         SetGadgetToolTip days[k],String(MapValueForKey(map_dayfest,fd))
  582.                                         End If
  583.                                        
  584.                                 Next
  585.                
  586.                                        
  587.                                 'check for appointment day
  588.                                
  589.                                 For Local fd:String = EachIn MapKeys(map_appointment)
  590.                                         festday = fd.split("-")
  591.                                
  592.                                         If festday.length = 2
  593.        
  594.                                                 If Int(GadgetText(days[k])) = Int(festday[0]) And Int(info[1]) = Int(festday[1])
  595.                                                         SetGadgetColor days[k],0,200,20
  596.                                                         _array_des = String[](MapValueForKey(map_appointment,fd))
  597.                                                         Local coco:Int=0
  598.                                                         For Local sas$ = EachIn _array_des
  599.                                                                 If sas<>""
  600.                                                                         If _array_des.length>1 'more than 1 appointment
  601.                                                                                 _tool = _tool+"("+String(coco+1)+") "+sas+"~n";coco:+1
  602.                                                                         Else
  603.                                                                                 _tool = _tool+sas+"~n"
  604.                                                                         End If
  605.                                                                 End If
  606.                                                         Next
  607.                                                         _tool = _tool[..Len(_tool)-1]
  608.                                                         SetGadgetToolTip days[k],_tool
  609.                                                 End If
  610.                                         ElseIf festday.length = 3
  611.                                                 'Print "This is a FIXED appointment DD-MM-YYYY"
  612.                                                 If Int(GadgetText(days[k])) = Int(festday[0]) And  Int(info[1]) = Int(festday[1]) And Int(info[2]) = Int(festday[2])
  613.                                                         SetGadgetColor days[k],0,200,20
  614.                                                         _array_des = String[](MapValueForKey(map_appointment,fd))
  615.                                                         Local coco:Int=0
  616.                                                         For Local sas$ = EachIn _array_des
  617.  
  618.                                                         If sas<>""
  619.                                                                 If _Array_Des.length>1
  620.                                                                         _tool =_tool+"("+String(coco+1)+") "+sas+"~n";coco:+1
  621.                                                                 Else
  622.                                                                         _tool = _tool+sas+"~n"
  623.  
  624.                                                                 End If
  625.                                                         End If
  626.                                                         Next
  627.                                                         _tool = _tool[..Len(_tool)-1]
  628.                                                         SetGadgetToolTip days[k],_tool
  629.                                                 End If
  630.        
  631.        
  632.                                         End If
  633.                                
  634.                                                
  635.                                 Next
  636.                                
  637.                                 If GadgetHidden(days[k]) Then ShowGadget(days[k])
  638.                                
  639.                         Else
  640.                                 If Not GadgetHidden(days[k]) Then HideGadget(days[k])
  641.                         EndIf
  642.                         counter=(counter+1) Mod 7
  643.  
  644.                 Next
  645.         End Method
  646.        
  647.         Method GetAppointment$[](_Dat$ = "",index:Int=-1)
  648.                 If _dat = "" Return [""]
  649.                
  650.                 If index=-1
  651.                         Return String[](MapValueForKey(map_appointment,_dat))
  652.                 Else
  653.                         Local _array_des$[]=String[](MapValueForKey(map_appointment,_dat))
  654.                         If index>=0 And index<_array_des.length
  655.                                 Return [_array_des[index]]
  656.                         End If
  657.                 End If
  658.         End Method
  659.        
  660.         Method SetAppointment(_dat$ = "",_des$ = "")
  661.                 If _dat = "" Or _des = "" Return
  662.                 'check if any appointments is already present and add it to a string array
  663.                 Local _array_des$[]
  664.                 _array_des = String[](MapValueForKey(map_appointment,_dat))
  665.                 _array_des = _array_des[.._array_des.length+1]
  666.                 _array_des[_array_des.length-1] = _des
  667.  
  668.                 MapInsert(map_appointment,_dat,_array_des)
  669.         End Method
  670.        
  671.         Method Activate(command:Int)
  672.                 SetDate()
  673.         End Method
  674.  
  675.         Method SetDate()
  676.                 If current_month>12 current_month = 1
  677.                 If current_month<1 current_month = 12
  678.                 Local newdate$ = Right("00"+String(current_day),2)+" "+Right("00"+String(current_month),2)+" "+String(current_year)
  679.                 SetGadgetText year,String(current_year)
  680.                 SetGadgetText month,month_name[current_month-1]
  681.                
  682.                 Local xx:Int,dinfo:String[] = [String(current_Day),String(current_month),String(current_year)]
  683.        
  684.                 Local julian_time:Int = Conv_Date2Julian("01 "+dinfo[1]+" "+dinfo[2])'the first day of the month
  685.                 Local day_week:Int = DayOfTheWeek(julian_time)
  686.                
  687.                 DrawCalendar(day_week,dinfo)
  688.                 data = newdate
  689.         End Method
  690.        
  691.        
  692.         Function eventHandler:Object( pID%, pData:Object, pContext:Object )
  693.                 Local pEvent:TEvent =  TEvent(pData)
  694.                 Local obj:TCalendar = TCalendar(pContext)
  695.                
  696.                 If pEvent
  697.                
  698.                                
  699.                         Select pEvent.Source
  700.                                 Case obj.year_Inc
  701.                                 '       Print "Anno +"
  702.                                         obj.current_year:+1
  703.                                         obj.SetDate()
  704.                                         pevent.extra = obj.data
  705.                                         pevent.source = obj
  706.                                         Return pevent
  707.  
  708.                                                
  709.                                 Case obj.year_dec
  710.                                 '       Print "Anno -"
  711.                                         obj.current_year:-1
  712.                                         obj.SetDate()
  713.                                         pevent.extra = obj.data
  714.                                         pevent.source = obj
  715.                                         Return pevent
  716.  
  717.                                 Case obj.month_Inc
  718.                                 '       Print "Mese +"
  719.                                         obj.current_month:+1
  720.                                         obj.SetDate()
  721.                                         pevent.extra = obj.data
  722.                                         pevent.source = obj                                    
  723.                                         Return pevent
  724.  
  725.                                 Case obj.month_dec
  726.                                         'Print "Mese -"
  727.                                         obj.current_month:-1
  728.                                         obj.SetDate()
  729.                                         pevent.extra = obj.data
  730.                                         pevent.source = obj
  731.                                         Return pevent
  732.                        
  733.                                 Case obj.today
  734.                                         obj.SetToday()                                 
  735.                                         Return pevent
  736.                                 Case obj.pickday
  737.                                         pevent.extra=obj.data
  738.                                         obj.Close()
  739.                                         Return pevent
  740.  
  741.                         End Select                     
  742.  
  743.                         For Local dgad:TGadget = EachIn obj.days
  744.                                 If pevent.Source = dgad
  745.                                         'Print "Pressed DAY: "+GadgetText(dgad)
  746.                                         obj.current_day = Int(GadgetText(dgad))
  747.                                         obj.SetDate()
  748.                                         pevent.extra = obj.data
  749.                                         pevent.source = obj
  750.                                         Return pevent
  751.                                 End If
  752.                         Next
  753.                        
  754.                        
  755.                 End If
  756.                
  757.                 Return pData
  758.         EndFunction
  759.  
  760.        
  761. End Type
  762.  
  763. Function AnnoBisesto:Int(anno:Int = 0)
  764. If anno = 0 Return 0
  765. Local bisesto:Int = 0
  766.         If (anno Mod 4) = 0 bisesto = 1
  767.         If (anno Mod 100) = 0
  768.                 If (anno Mod 400) = 0
  769.                         bisesto = 1
  770.                 Else
  771.                         bisesto = 0
  772.                 End If
  773.         End If
  774.         Return bisesto
  775. End Function
  776.  
  777. Function Conv_Date2Julian:Int(_data$ = "")
  778.         If _data$ = "" Return 0
  779.  
  780.         Local year:Int,month:Int,day:Int
  781.         Local _din$[] = _Data.split(" ")
  782.         year = Int(_din[2])
  783.         month = Int(_din[1])
  784.         day = Int(_din[0])
  785.        
  786.         Local JulianDate:Int
  787.         ' conversion taken from a website (lost link)
  788.         JulianDate =  367 * Year - ((7 * (Year + 5001 + ((Month - 9) / 7))) / 4) + ((275 * Month) / 9) + Day + 1729777
  789.        
  790.         Return JulianDate
  791. End Function
  792.  
  793. Function DayOfTheWeek:Int(pjulian:Int)
  794.         Local Jt:Float = Float(pjulian)+1.5
  795.         Return (jt Mod 7)
  796. End Function


Comments :


degac(Posted 1+ years ago)

 Update for Locale and Holidays. See description


degac(Posted 1+ years ago)

 Rev. 1.3 - support for TODAY button and PICK DATE


degac(Posted 1+ years ago)

 15-08-2010: see update in the main post


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal