Extension Template: DateTimeDisplay

Top  Previous  Next

The DateTimeDisplay Extension template displays the date and/or time in either a display-only STRING control or a section of the status bar. Of course, the status bar should be declared on the window.

#EXTENSION(DateTimeDisplay,'Display the date and/or time in the current window') %|

         ,HLP('~TPLExtensionDateTimeDisplay'),PROCEDURE

#BUTTON('Date and Time Display'),AT(10,,180)

 #BOXED('Date Display...')

   #PROMPT('Display the current day/date in the window',CHECK) %|

          ,%DisplayDate,DEFAULT(0),AT(10,,150)

   #ENABLE(%DisplayDate)          

     #PROMPT('Date Picture:',DROP('October 31, 1959|OCT 31,1959|10/31/59| %|

                               10/31/1959|31 OCT 59|31 OCT 1959|31/10/59| %|

                                         31/10/1959|Other')),%DatePicture %|

                                  ,DEFAULT('October 31, 1959')

     #ENABLE(%DatePicture = 'Other')

       #PROMPT('Other Date Picture:',@S20),%OtherDatePicture,REQ

     #ENDENABLE

     #PROMPT('Show the day of the week before the date',CHECK),%ShowDayOfWeek %|

             ,DEFAULT(1),AT(10,,150)

     #PROMPT('&Location of Date Display:',DROP('Control|Status Bar')) %|

             ,%DateDisplayLocation

     #ENABLE(%DateDisplayLocation='Status Bar')

       #PROMPT('Status Bar Section:',@n1),%DateStatusSection,REQ,DEFAULT(1)

     #ENDENABLE

     #ENABLE(%DateDisplayLocation='Control')

       #PROMPT('Date Display Control:',CONTROL),%DateControl,REQ

     #ENDENABLE

   #ENDENABLE

 #ENDBOXED

 #BOXED('Time Display...')

   #PROMPT('Display the current time in the window',CHECK),%DisplayTime %|

           ,DEFAULT(0),AT(10,,150)

   #ENABLE(%DisplayTime)          

     #PROMPT('Time Picture:',DROP('5:30PM|5:30:00PM|17:30|17:30:00| %|

                                  1730|173000|Other')),%TimePicture %|

                                  ,DEFAULT('5:30PM')

     #ENABLE(%TimePicture = 'Other')

       #PROMPT('Other Time Picture:',@S20),%OtherTimePicture,REQ

     #ENDENABLE

     #PROMPT('&Location of Time Display:',DROP('Control|Status Bar')) %|

             ,%TimeDisplayLocation

     #ENABLE(%TimeDisplayLocation='Status Bar')

       #PROMPT('Status Bar Section:',@n1),%TimeStatusSection,REQ,DEFAULT(2)

     #ENDENABLE

     #ENABLE(%TimeDisplayLocation='Control')

       #PROMPT('Time Display Control:',CONTROL),%TimeControl,REQ

     #ENDENABLE

   #ENDENABLE

 #ENDBOXED

#ENDBUTTON

#ATSTART

 #DECLARE(%TimerEventGenerated)

 #IF(%DisplayDate)

   #DECLARE(%DateUsePicture)

   #CASE(%DatePicture)

   #OF('10/31/59')

     #SET(%DateUsePicture,'@D1')

   #OF('10/31/1959')

     #SET(%DateUsePicture,'@D2')

   #OF('OCT 31,1959')

     #SET(%DateUsePicture,'@D3')

   #OF('October 31, 1959')

     #SET(%DateUsePicture,'@D4')

   #OF('31/10/59')

     #SET(%DateUsePicture,'@D5')

   #OF('31/10/1959')

     #SET(%DateUsePicture,'@D6')

   #OF('31 OCT 59')

     #SET(%DateUsePicture,'@D7')

   #OF('31 OCT 1959')

     #SET(%DateUsePicture,'@D8')

   #OF('Other')

     #SET(%DateUsePicture,%OtherDatePicture)

   #ENDCASE

 #ENDIF

 #IF(%DisplayTime)

   #DECLARE(%TimeUsePicture)

   #CASE(%TimePicture)

   #OF('17:30')

     #SET(%TimeUsePicture,'@T1')

   #OF('1730')

     #SET(%TimeUsePicture,'@T2')

   #OF('5:30PM')

     #SET(%TimeUsePicture,'@T3')

   #OF('17:30:00')

     #SET(%TimeUsePicture,'@T4')

   #OF('173000')

     #SET(%TimeUsePicture,'@T5')

   #OF('5:30:00PM')

     #SET(%TimeUsePicture,'@T6')

   #OF('Other')

     #SET(%TimeUsePicture,%OtherTimePicture)

   #ENDCASE

 #ENDIF

#ENDAT

#AT(%DataSectionBeforeWindow)

 #IF(%DisplayDate AND %ShowDayOfWeek)

DisplayDayString STRING('Sunday   Monday   Tuesday  WednesdayThursday %|

                        Friday   Saturday ')

DisplayDayText   STRING(9),DIM(7),OVER(DisplayDayString)

 #ENDIF

#ENDAT

#AT(%BeforeAccept)

 #IF(%DisplayTime OR %DisplayDate)

IF NOT INRANGE(%Window{Prop:Timer},1,100)

 %Window{Prop:Timer} = 100

END

#INSERT(%DateTimeDisplayCode)

 #ENDIF

#ENDAT

#AT(%WindowEventHandling,'Timer')

 #SET(%TimerEventGenerated,%True)

 #IF(%DisplayDate OR %DisplayTime)

#INSERT(%DateTimeDisplayCode)

 #ENDIF

#ENDAT

#AT(%WindowOtherEventHandling)

 #IF(%DisplayDate OR %DisplayTime)

   #IF(NOT %TimerEventGenerated)

IF EVENT() = EVENT:Timer

 #INSERT(%DateTimeDisplayCode)

END

   #ENDIF

 #ENDIF

#ENDAT

 

An Extension template starts with the #EXTENSION statement. The PROCEDURE attribute specifies the Extension template is available only at the procedure level, not the global level of the application.

The #BUTTON structure creates a separate page for all the prompts for this Extension template. These prompts ask the programmer for the format of the date and/or time to display, and whether to display them in a control or the status bar.

The #ATSTART statement begins a section of template code that executes before any source code generates for the procedure. This means it is only appropriate to initialize user-defined template symbols and perfrom any necessary set up to generate correct source for the control template into the procedure. This section does not generate source code.

The #DECLARE(%TimerEventGenerated) statement declares a symbol used only in this Extension template. It is used to flag whether an OF EVENT:Timer clause has been generated for the procedure.

The #IF(%DisplayDate) structure sets up to display the date by declaring a symbol to contain the programmer's choice of date formats. The #CASE structure assigns that choice to the %DateUsePicture symbol. The #IF(%DisplayTime) structure sets up to display the time by declaring a symbol to contain the programmer's choice of date formats. The #CASE structure assigns that choice to the %TimeUsePicture symbol. The #ENDAT statement terminates the #ATSTART section.

The next #AT generates code into the embed point that appears immediately before the window data structure. The #IF(%DisplayDate AND %ShowDayOfWeek) structure generates two local variable declarations for the procedure if the programmer is displaying the date with the day of week.

The next #AT generates code into the embed point that appears immediately before the ACCEPT loop. The #IF(%DisplayTime OR %DisplayDate) structure generates code that ensures the window has its TIMER attribute set. The IF NOT INRANGE(%Window{Prop:Timer},1,100) detects the lack of the attribute, then %Window{Prop:Timer} = 100 sets it to one second. The #INSERT(%DateTimeDisplayCode) adds the code that updates the display.

The next #AT generates code into the embed point for EVENT:Timer. This embed point only appears if the programmer has placed a TIMER attribute on the window. Therefore, the #SET(%TimerEventGenerated,%True) statement signals that code was generated in this embed point. The #IF(%DisplayTime OR %DisplayDate) structure ensures the #INSERT(%DateTimeDisplayCode) statement generates the code that updates the display every time EVENT:Timer is processed.

The next #AT generates code into the "Other Window Event Handling" embed point. This is the ELSE clause of the CASE EVENT() structure to handle field-independent events. #IF(NOT %TimerEventGenerated) detects that the previous #AT did not generate code because the programmer did not place the TIMER attribute on the window. Therefore, the IF EVENT() = EVENT:Timer structure is necessary for the code that updates the display whenever EVENT:Timer occurs.

See Also:     %DateTimeDisplayCode #GROUP