home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 May / CHIPCD5_98.iso / coreldrw / Scripts / schedule.csc < prev    next >
Text File  |  1997-05-23  |  41KB  |  1,247 lines

  1. REM Runs programs at specified intervals
  2. REM Schedule.csc  April 26, 1996
  3. REM Copyright 1996 Corel Corporation. All rights reserved.
  4.  
  5. REM ***************************************************************
  6. REM * Global Data                                                 *
  7. REM ***************************************************************
  8.  
  9. 'Standard constants
  10. #include "ScpConst.csi"
  11. DIM DATFOL$
  12. DATFOL$=GetCurrFolder()
  13.  
  14. 'Maximum number of events
  15. #define MAX_EVENTS 100
  16.  
  17. 'Global variables
  18. GLOBAL Days$(7)
  19. GLOBAL Months$(12)
  20. GLOBAL CurrentYear$ AS STRING
  21. GLOBAL CurrentMonth$
  22. GLOBAL SelectedYear%
  23. GLOBAL SelectedMonthIndex%
  24. GLOBAL EventData(MAX_EVENTS, 6) AS VARIANT
  25. GLOBAL ScheduledEvent$(MAX_EVENTS)
  26. GLOBAL NumberOfEvents%
  27. GLOBAL CurrentDay%
  28.  
  29. 'Date formats
  30. GLOBAL CONST DayNumeric$ = "dd"
  31. GLOBAL CONST DayFormat$ = "dddd"
  32. GLOBAL CONST MonthFormat$ = "MMMM"
  33. GLOBAL CONST MonthNumeric$ = "MM"
  34. GLOBAL CONST YearFormat$ = "yyyy"
  35.  
  36. REM ***************************************************************
  37. REM * Main Dialog                                                 *
  38. REM ***************************************************************
  39. BEGIN DIALOG OBJECT MainDialog 447, 142, "Corel SCRIPT Scheduler", SUB MainDialogSub
  40.     LISTBOX  6, 7, 432, 111, .MainList
  41.     PUSHBUTTON  11, 124, 65, 14, .AddEvent, "Add Event"
  42.     PUSHBUTTON  99, 124, 65, 14, .RemoveEvent, "Remove Event"
  43.     PUSHBUTTON  188, 124, 65, 14, .EditEvent, "Edit Event"
  44.     PUSHBUTTON  276, 124, 65, 14, .ExecuteEvent, "Execute Event"
  45.     PUSHBUTTON  365, 124, 65, 14, .ExitButton, "Exit"
  46. END DIALOG
  47.  
  48. REM ***************************************************************
  49. REM * Event scheduling Dialog                                     *
  50. REM ***************************************************************
  51. BEGIN DIALOG OBJECT ScheduleEvent 264, 276, "Schedule Event", SUB ScheduleEventSub
  52.     OPTIONGROUP .ScheduleOption
  53.         OPTIONBUTTON  10, 47, 62, 10, .ScheduleOnce, "Schedule Once"
  54.         OPTIONBUTTON  10, 119, 66, 11, .ScheduleHourly, "Schedule Hourly"
  55.         OPTIONBUTTON  10, 163, 62, 10, .ScheduleDaily, "Schedule Daily"
  56.         OPTIONBUTTON  10, 207, 69, 10, .ScheduleMonthly, "Schedule Monthly"
  57.     GROUPBOX  6, 0, 250, 38, .ProgramGroup, "Program"
  58.     TEXTBOX  20, 13, 180, 13, .ProgramFile
  59.     PUSHBUTTON  203, 13, 46, 14, .BrowseButton, "Browse"
  60.     GROUPBOX  5, 38, 165, 72, .OnceGroup
  61.     TEXT  10, 62, 13, 8, .OnceON, "On"
  62.     DDLISTBOX  25, 61, 47, 77, .OnceMonth
  63.     SPINCONTROL  122, 61, 44, 12, .OnceYear
  64.     TEXT  109, 65, 13, 8, .OnceTH, "th,"
  65.     SPINCONTROL  74, 61, 34, 12, .OnceDay
  66.     TEXT  15, 90, 10, 8, .OnceAT, "At"
  67.     SPINCONTROL  25, 88, 23, 12, .OnceHour
  68.     TEXT  49, 89, 5, 9, .OnceCOLON, ":"
  69.     SPINCONTROL  55, 88, 23, 12, .OnceMinutes
  70.     OPTIONGROUP .OnceOption
  71.         OPTIONBUTTON  89, 82, 28, 10, .OnceAM, "AM"
  72.         OPTIONBUTTON  89, 95, 28, 10, .OncePM, "PM"
  73.     GROUPBOX  5, 110, 165, 42, .HourlyGroup
  74.     TEXT  19, 137, 9, 8, .HourlyAT, "At"
  75.     SPINCONTROL  31, 135, 23, 12, .HourlyMinutes
  76.     TEXT  55, 137, 72, 8, .HourlyAFTER, "Minutes after the Hour"
  77.     GROUPBOX  5, 152, 165, 46, .DailyGroup
  78.     TEXT  14, 177, 10, 8, .DailyAT, "At"
  79.     SPINCONTROL  25, 175, 23, 12, .DailyHour
  80.     TEXT  48, 175, 5, 9, .DailyCOLON, ":"
  81.     SPINCONTROL  54, 175, 23, 12, .DailyMinutes
  82.     OPTIONGROUP .DailyOption
  83.         OPTIONBUTTON  86, 169, 28, 10, .DailyAM, "AM"
  84.         OPTIONBUTTON  86, 181, 28, 10, .DailyPM, "PM"
  85.     GROUPBOX  5, 198, 165, 71, .MonthlyGroup
  86.     TEXT  11, 223, 19, 8, .MonthlyEVERY, "Every"
  87.     SPINCONTROL  32, 221, 31, 12, .MonthlyDay
  88.     TEXT  65, 223, 10, 8, .MonthlyTH, "th"
  89.     TEXT  75, 223, 50, 8, .MonthlyOF, "of the month"
  90.     TEXT  14, 250, 10, 8, .MonthlyAT, "At"
  91.     SPINCONTROL  25, 248, 23, 12, .MonthlyHour
  92.     TEXT  48, 248, 5, 9, .MonthlyCOLON, ":"
  93.     SPINCONTROL  54, 248, 23, 12, .MonthlyMinutes
  94.     OPTIONGROUP .MonthlyOption
  95.         OPTIONBUTTON  86, 242, 28, 10, .MonthlyAM, "AM"
  96.         OPTIONBUTTON  86, 254, 28, 10, .MonthlyPM, "PM"
  97.     GROUPBOX  174, 38, 82, 98, .DaysGroup, "Execute only on days"
  98.     CHECKBOX  182, 51, 64, 9, .MondayBox, "Monday"
  99.     CHECKBOX  182, 62, 64, 9, .TuesdayBox, "Tuesday"
  100.     CHECKBOX  182, 74, 64, 9, .WednesdayBox, "Wednesday"
  101.     CHECKBOX  182, 86, 64, 9, .ThursdayBox, "Thursday"
  102.     CHECKBOX  182, 97, 64, 9, .FridayBox, "Friday"
  103.     CHECKBOX  182, 109, 64, 9, .SaturdayBox, "Saturday"
  104.     CHECKBOX  182, 121, 64, 9, .SundayBox, "Sunday"
  105.     OKBUTTON  176, 232, 77, 14, .OK1
  106.     CANCELBUTTON  176, 253, 77, 14, .Cancel1
  107. END DIALOG
  108.  
  109. REM ***************************************************************
  110. REM * Initialization: determines the names of the months and      *
  111. REM * days.                                                       *
  112. REM ***************************************************************
  113. SUB Initialize()
  114. DIM StartDate AS DATE
  115.     DIM i AS INTEGER
  116.     DIM x AS DOUBLE
  117.     DIM y AS DOUBLE
  118.  
  119.     StartDate = 29221        'Jan 1 1980
  120.  
  121.     'Initialize 12 months
  122.     i% = 0
  123.     FOR x# = 1 TO 365 STEP 31
  124.         i% = i% + 1
  125.         Months$(i%) = FORMATDATE(StartDate + x#, MonthFormat$)
  126.     NEXT x#
  127.  
  128.     'Initialize 7 days
  129.     FOR y# = 1 TO 7
  130.         Days$(y#) = FORMATDATE(StartDate + y# + 5, DayFormat$) 'January 6th was a Monday
  131.     NEXT y#
  132.     
  133.     'Initialize current date
  134.     CurrentYear$ = FORMATDATE(GETCURRDATE(), YearFormat$)
  135.     SelectedYear% = CINT(CurrentYear$)
  136.  
  137.     CurrentMonth$ = FORMATDATE(GETCURRDATE(), MonthFormat$)
  138.     SelectedMonthIndex% = CINT(FORMATDATE(GETCURRDATE(), MonthNumeric$))
  139.  
  140.     CurrentDay% = FORMATDATE(GETCURRDATE(), DayNumeric$)
  141.  
  142.     'Fill in the Schedule Event Dialog "Day boxes".
  143.     WITH ScheduleEvent
  144.         .MondayBox.SetText Days$(1)
  145.         .TuesdayBox.SetText Days$(2)
  146.         .WednesdayBox.SetText Days$(3)
  147.         .ThursdayBox.SetText Days$(4)
  148.         .FridayBox.SetText Days$(5)
  149.         .SaturdayBox.SetText Days$(6)
  150.         .SundayBox.SetText Days$(7)
  151.     END WITH
  152.  
  153. END SUB
  154.  
  155. REM ***************************************************************
  156. REM * NumeralToOrdinal$: Returns the appropriate ordinal          *
  157. REM * abbreviation ("th", "st", "nd", "rd"                        *
  158. REM ***************************************************************
  159. FUNCTION NumeralToOrdinal$ (Number%)
  160.     IF ((INT(Number% / 10) MOD 10) =  1) THEN
  161.         NumeralToOrdinal$ = "th"
  162.     ELSE
  163.         SELECT CASE (Number% MOD 10)
  164.             CASE 1
  165.                 NumeralToOrdinal$ = "st"
  166.             CASE 2
  167.                 NumeralToOrdinal$ = "nd"
  168.             CASE 3
  169.                 NumeralToOrdinal$ = "rd"
  170.             CASE ELSE
  171.                 NumeralToOrdinal$ = "th"
  172.         END SELECT
  173.     ENDIF
  174. END FUNCTION
  175.  
  176. REM ***************************************************************
  177. REM * MakePrettyString: Transforms Event Data into a string to be *
  178. REM * displayed in the Main Dialog List Box                       *
  179. REM ***************************************************************
  180. SUB MakePrettyString (Index%)
  181.     DIM Event AS STRING
  182.     DIM DaysRunned AS STRING
  183.     DIM X AS LONG
  184.     
  185.     SELECT CASE EventData(Index%,1)
  186.         CASE "O"
  187.             'Schedule once
  188.             Event$ = "On "
  189.             'Date
  190.             Event$ = Event$ & CDAT(CDBL(EventData(Index%, 5)))
  191.             Event$ = Event$ & " at "
  192.             'Time
  193.             beep
  194.             Event$ = Event$ & CDAT(CDBL(EventData(Index%, 6)))
  195.             Event$ = Event$ & ", run "
  196.             Event$ = Event$ & EventData(Index%, 2)
  197.         CASE "H"
  198.             'Schedule hourly
  199.             Event$ = "Every hour"
  200.             IF NOT(EventData(Index%, 4) = 0) THEN
  201.                 Event$ = Event$ & " at "
  202.                 'Number of minutes (ommitted if 0).
  203.                 Event$ = Event$ & EventData(Index%, 5)
  204.                 Event$ = Event$ & " minutes after the hour"
  205.             ENDIF
  206.             Event$ = Event$ & ", run "
  207.             Event$ = Event$ & EventData(Index%, 2)
  208.         CASE "D"
  209.             'Schedule daily
  210.             Event$ = "Every day at "
  211.             'Time
  212.             Event$ = Event$ & CDAT(CDBL(EventData(Index%, 5)))
  213.             Event$ = Event$ & ", run "
  214.             Event$ = Event$ & EventData(Index%, 2)
  215.         CASE "M"
  216.             'Schedule monthly
  217.             Event$ = "Every "
  218.             'Day number
  219.             Event$ = Event$ & EventData(Index%, 5)
  220.             Event$ = Event$ & NumeralToOrdinal(CINT(EventData(Index%, 5)))
  221.             Event$ = Event$ & " of the month, at "
  222.             Event$ = Event$ & CDAT(CDBL(EventData(Index%, 6)))
  223.             Event$ = Event$ & ", run "
  224.             Event$ = Event$ & EventData(Index%, 2)
  225.         CASE ELSE
  226.             'Other (error)
  227.             Event$ = "Run " & EventData(Index%, 2) & " manually"
  228.     END SELECT
  229.     'Determine on which days the event is active
  230.     IF NOT((EventData(Index%, 3)) = "XXXXXXX") THEN
  231.         IF EventData(Index%, 3) = "       " THEN
  232.             'None
  233.             Event$ = Event$ & ", disabled (no active days)"
  234.         ELSE
  235.             'Concatenate the days
  236.             DaysRunned$ = ""
  237.             FOR X = 1 TO 7
  238.                 IF MID(EventData(Index%, 3),X,1) = "X" THEN DaysRunned$ = DaysRunned$ & ", " & Days$(X)
  239.             NEXT X
  240.             'Remove the first comma when adding to the string
  241.             Event$ = Event$ & ", run only on" & MID(DaysRunned$,2)
  242.         ENDIF
  243.     ENDIF
  244.     'Indicate last run
  245.     Event$ = Event$ & ", last run on " & CDAT(CDBL(EventData(Index%,4)))
  246.     'Set the string in the list
  247.     ScheduledEvent$(Index%) = Event$
  248. END SUB                
  249.  
  250. REM ***************************************************************
  251. REM * ResetScheduleEvent: Fills the Schedule dialog with starting *
  252. REM * data and takes care of some dialog initialization           *
  253. REM ***************************************************************
  254. SUB ResetScheduleEvent
  255.     WITH ScheduleEvent
  256.         .ScheduleOption.SetValue 0
  257.         .ProgramFile.SetText ""
  258.         .OnceMonth.SetArray Months$
  259.         .OnceMonth.SetSelect SelectedMonthIndex%
  260.         .OnceDay.SetValue CurrentDay%
  261.         .OnceYear.SetValue SelectedYear%
  262.         .OnceHour.SetValue 12
  263.         .OnceMinutes.SetValue 0
  264.         .OnceOption.SetValue 0
  265.         .HourlyMinutes.SetValue 0
  266.         .DailyHour.SetValue 12
  267.         .DailyMinutes.SetValue 0
  268.         .DailyOption.SetValue 0
  269.         .MonthlyDay.SetValue CurrentDay%
  270.         .MonthlyHour.SetValue 12
  271.         .MonthlyMinutes.SetValue 0
  272.         .MonthlyOption.SetValue 0
  273.         
  274.         .OnceTH.SetText NumeralToOrdinal$(CINT(.OnceDay.GetValue()))&","
  275.         .MonthlyTH.SetText NumeralToOrdinal$(CINT(.MonthlyDay.GetValue()))
  276.         
  277.         .MondayBox.SetThreeState FALSE
  278.         .TuesdayBox.SetThreeState FALSE
  279.         .WednesdayBox.SetThreeState FALSE
  280.         .ThursdayBox.SetThreeState FALSE
  281.         .FridayBox.SetThreeState FALSE
  282.         .SaturdayBox.SetThreeState FALSE
  283.         .SundayBox.SetThreeState FALSE
  284.         .MondayBox.SetValue 1
  285.         .TuesdayBox.SetValue 1
  286.         .WednesdayBox.SetValue 1
  287.         .ThursdayBox.SetValue 1
  288.         .FridayBox.SetValue 1
  289.         .SaturdayBox.SetValue 1
  290.         .SundayBox.SetValue 1
  291.         
  292.         .OnceYear.SetMinRange CINT(CurrentYear$)
  293.         .OnceYear.SetMaxRange 3000
  294.         
  295.         .OnceMinutes.SetIncrement 15
  296.         .HourlyMinutes.SetIncrement 15
  297.         .DailyMinutes.SetIncrement 15
  298.         .MonthlyMinutes.SetIncrement 15
  299.     END WITH
  300. END SUB
  301.  
  302. REM ***************************************************************
  303. REM * FillScheduleEvent: Fills the Schedule Dialog with data      *
  304. REM * obtained from the specified event. The routine relies on    *
  305. REM * initialization performed in ResetScheduleEvent and does not *
  306. REM * give new values to those variables where the inital values  *
  307. REM * are appropriate.                                            *
  308. REM ***************************************************************
  309. SUB FillScheduleEvent (Index%)
  310.     DIM Year AS LONG
  311.     DIM Month AS LONG
  312.     DIM Day AS LONG
  313.     DIM DayWeek AS LONG
  314.     DIM Hours AS LONG
  315.     DIM Minutes AS LONG
  316.     DIM Seconds AS LONG
  317.     
  318.     CALL ResetScheduleEvent
  319.     WITH ScheduleEvent
  320.         SELECT CASE EventData(Index%, 1)
  321.             CASE "O"
  322.                 'Scheduled Once
  323.                 .ScheduleOption.SetValue 0
  324.                 'Date
  325.                 GETDATEINFO CDAT(CDBL(EventData(Index%,5))),Year&, Month&, Day&, DayWeek&
  326.                 .OnceMonth.SetSelect Month&
  327.                 .OnceDay.SetValue Day&
  328.                 .OnceYear.SetValue Year&
  329.                 'Time
  330.                 GETTIMEINFO CDAT(CDBL(EventData(Index%,6))),Hours&, Minutes&, Seconds&
  331.                 IF(Hours& >= 13) THEN
  332.                     Hours& = Hours& - 12
  333.                     .OnceOption.SetValue 1
  334.                 ENDIF
  335.                 IF Hours& = 12 THEN
  336.                     .OnceOption.SetValue 1
  337.                 ENDIF
  338.                 IF Hours& = 0 THEN
  339.                     Hours& = 12
  340.                 ENDIF                
  341.                 .OnceHour.SetValue Hours&
  342.                 .OnceMinutes.SetValue Minutes&
  343.             CASE "H"
  344.                 'Scheduled Hourly
  345.                 .ScheduleOption.SetValue 1
  346.                 'Minutes after Hours
  347.                 .HourlyMinutes.SetValue EventData(Index%,5)
  348.             CASE "D"
  349.                 'Scheduled Daily
  350.                 .ScheduleOption.SetValue 2
  351.                 'Time
  352.                 GETTIMEINFO CDAT(CDBL(EventData(Index%,5))),Hours&, Minutes&, Seconds&
  353.                 IF(Hours& >= 13) THEN
  354.                     Hours& = Hours& - 12
  355.                     .DailyOption.SetValue 1
  356.                 ENDIF
  357.                 IF Hours& = 12 THEN
  358.                     .DailyOption.SetValue 1
  359.                 ENDIF
  360.                 IF Hours& = 0 THEN
  361.                     Hours& = 12
  362.                 ENDIF                
  363.                 .DailyHour.SetValue Hours&
  364.                 .DailyMinutes.SetValue Minutes&
  365.             CASE "M"
  366.                 'Scheduled Monthly
  367.                 .ScheduleOption.SetValue 3
  368.                 'Day of the month
  369.                 .MonthlyDay.SetValue EventData(Index%, 5)
  370.                 'Time
  371.                 GETTIMEINFO CDAT(CDBL(EventData(Index%,6))),Hours&, Minutes&, Seconds&
  372.                 IF(Hours& >= 13) THEN
  373.                     Hours& = Hours& - 12
  374.                     .MonthlyOption.SetValue 1
  375.                 ENDIF
  376.                 IF Hours& = 12 THEN
  377.                     .MonthlyOption.SetValue 1
  378.                 ENDIF
  379.                 IF Hours& = 0 THEN
  380.                     Hours& = 12
  381.                 ENDIF                
  382.                 .MonthlyHour.SetValue Hours&
  383.                 .MonthlyMinutes.SetValue Minutes&
  384.             CASE ELSE
  385.                 'Other; error.
  386.         END SELECT
  387.         
  388.         .OnceTH.SetText NumeralToOrdinal$(CINT(.OnceDay.GetValue())) & ","
  389.         .MonthlyTH.SetText NumeralToOrdinal$(CINT(.MonthlyDay.GetValue()))
  390.         
  391.         'Set the program name
  392.         .ProgramFile.SetText EventData(Index%,2)
  393.         
  394.         'Set the active days, one by one.
  395.         IF MID(EventData(Index%,3),1,1) = " " THEN
  396.             .MondayBox.SetValue 0
  397.         ENDIF
  398.         IF MID(EventData(Index%,3),2,1) = " " THEN
  399.             .TuesdayBox.SetValue 0
  400.         ENDIF
  401.         IF MID(EventData(Index%,3),3,1) = " " THEN
  402.             .WednesdayBox.SetValue 0
  403.         ENDIF
  404.         IF MID(EventData(Index%,3),4,1) = " " THEN
  405.             .ThursdayBox.SetValue 0
  406.         ENDIF
  407.         IF MID(EventData(Index%,3),5,1) = " " THEN
  408.             .FridayBox.SetValue 0
  409.         ENDIF
  410.         IF MID(EventData(Index%,3),6,1) = " " THEN
  411.             .SaturdayBox.SetValue 0
  412.         ENDIF
  413.         IF MID(EventData(Index%,3),7,1) = " " THEN
  414.             .SundayBox.SetValue 0
  415.         ENDIF
  416.     END WITH
  417. END SUB
  418.  
  419. REM ***************************************************************
  420. REM * RemoveFromList: Removes an element from the array, sending  *
  421. REM * all other elements upwards. This procedure is recursive: it *
  422. REM * copies the next element in the current position, then calls *
  423. REM * itself on the next element. The last element is simply      *
  424. REM * deleted.                                                    *
  425. REM ***************************************************************
  426. SUB RemoveFromList(Index%)
  427.     IF Index% = NumberOfEvents% THEN
  428.         'Empty the data
  429.         SETEMPTY EventData(Index%, 1)
  430.         SETEMPTY EventData(Index%, 2)
  431.         SETEMPTY EventData(Index%, 3)
  432.         SETEMPTY EventData(Index%, 4)
  433.         SETEMPTY EventData(Index%, 5)
  434.         SETEMPTY ScheduledEvent$(Index%)
  435.         'Remove the event
  436.         NumberOfEvents% = NumberOfEvents% - 1
  437.         'Exit
  438.         EXIT SUB
  439.     ENDIF
  440.     'Copy the data from the next
  441.     EventData(Index%,1) = EventData(Index% + 1, 1)
  442.     EventData(Index%,2) = EventData(Index% + 1, 2)
  443.     EventData(Index%,3) = EventData(Index% + 1, 3)
  444.     EventData(Index%,4) = EventData(Index% + 1, 4)
  445.     EventData(Index%,5) = EventData(Index% + 1, 5)
  446.     ScheduledEvent$(Index%) = ScheduledEvent$(Index% + 1)
  447.     'Now, delete the newly-copied next element
  448.     CALL RemoveFromList CINT(Index% + 1)
  449. END SUB
  450.  
  451. REM ***************************************************************
  452. REM * ExecuteEvent: This executes the program associated with the *
  453. REM * specified event. After calling this SUB, the caller should  *
  454. REM * update the Dialog list.                                     *
  455. REM ***************************************************************
  456. SUB ExecuteEvent(Index%)
  457.     IF UCASE(RIGHT(EventData(Index%,2),4)) = ".EXE" THEN
  458.         'Executable
  459.         STARTPROCESS EventData(Index%,2)
  460.     ELSE
  461.         'Script (assumed); run through Script editor.
  462.         WITHOBJECT "CorelScript.Automation.7"
  463.             IF (.FileOpen(EventData(Index%,2)) = FALSE) THEN
  464.                 MESSAGE "Error loading" + CHR(13) +  EventData(Index%,2) + "."
  465.             ELSE
  466.                 IF (.Execute() = FALSE) THEN
  467.                     MESSAGE "Error executing" + CHR(13) +  EventData(Index%,2) + "."
  468.                 ENDIF
  469.                 .FileClose
  470.             ENDIF
  471.         END WITHOBJECT
  472.     ENDIF
  473.     'Set last run time to now.
  474.     EventData(Index%,4) = GETCURRDATE()
  475.     CALL MakePrettyString(Index%)
  476. END SUB
  477.  
  478. REM ***************************************************************
  479. REM * RunPrograms: Checks if any programs need running, and runs  *
  480. REM * them if appropriate. The caller should update the entire    *
  481. REM * list after running this function.                           *
  482. REM ***************************************************************
  483. SUB RunPrograms()
  484.     DIM Year AS LONG
  485.     DIM Month AS LONG
  486.     DIM Day AS LONG
  487.     DIM DayWeek AS LONG
  488.     DIM Hours AS LONG
  489.     DIM Minutes AS LONG
  490.     DIM Seconds AS LONG
  491.     DIM Index AS INTEGER
  492.     DIM RunDate AS DATE
  493.     DIM RunDay AS INTEGER
  494.  
  495.     GETTIMEINFO GETCURRDATE(), Hours&, Minutes&, Seconds&
  496.     GETDATEINFO GETCURRDATE(), Year&, Month&, Day&, DayWeek&
  497.     IF DayWeek& = 1 THEN
  498.         'Sunday is seven
  499.         DayWeek& = 7
  500.     ELSE
  501.         'Our index begins at monday
  502.         DayWeek& = DayWeek& - 1
  503.     ENDIF
  504.     FOR Index% = 1 TO NumberOfEvents%
  505.         'Check if active today
  506.         IF (MID(EventData(Index%,3),DayWeek&,1) = "X") THEN
  507.             SELECT CASE EventData(Index%,1)
  508.                 CASE "O"
  509.                     'Scheduled once
  510.                     'Create execution time
  511.                     RunDate = CDAT(CDBL(EventData(Index%,5)) + CDBL(EventData(Index%,6)))
  512.                     'Test for run conditions (later than the condition and not run since)
  513.                     IF (GETCURRDATE() >= Rundate) AND (RunDate > CDAT(CDBL(EventData(Index%, 4)))) THEN
  514.                         CALL ExecuteEvent Index%
  515.                     ENDIF
  516.                 CASE "H"
  517.                     'Scheduled hourly
  518.                     'Create execution time
  519.                     RunDate = BUILDDATE(Year&, Month&, Day&) + BUILDTIME(Hours&, EventData(Index%,5), 0)
  520.                     'Test for run conditions (later than the condition and not run since)
  521.                     IF (GETCURRDATE() >= Rundate) AND (RunDate > CDAT(CDBL(EventData(Index%, 4)))) THEN
  522.                         CALL ExecuteEvent Index%
  523.                     ENDIF
  524.                     'Test for run conditions (later than the condition and not run since)
  525.                     IF (GETCURRDATE() >= Rundate) AND (RunDate > CDAT(CDBL(EventData(Index%, 4)))) THEN
  526.                         CALL ExecuteEvent Index%
  527.                     ENDIF
  528.                 CASE "D"
  529.                     'Scheduled daily
  530.                     'Create execution time
  531.                     RunDate = BUILDDATE(Year&, Month&, Day&) + CDAT(CDBL(EventData(Index%,5)))
  532.                     'Test for run conditions (later than the condition and not run since)
  533.                     IF (GETCURRDATE() >= Rundate) AND (RunDate > CDAT(CDBL(EventData(Index%, 4)))) THEN
  534.                         CALL ExecuteEvent Index%
  535.                     ENDIF
  536.                 CASE "M"
  537.                     RunDay% = EventData(Index%,5)
  538.                     'Check if day exists in this month; if not, then do not run
  539.                     IF (Runday% <= 30) OR (Month& = 1 OR Month& = 3 OR Month& = 5 OR Month& = 7 OR Month& = 8 OR Month& = 10 OR Month& = 12) THEN
  540.                         IF (Runday% <= 29) OR (Month& <> 2) THEN
  541.                             IF (Runday% <= 28) OR (Month& <> 2) OR (((Year& MOD 4) = 0) AND (NOT ((Year& MOD 100) = 0) OR ((Year& MOD 400) = 0))) THEN
  542.                                 'The day exists
  543.                                 'Create execution time
  544.                                 RunDate = BUILDDATE(Year&, Month&, Runday%) + CDAT(CDBL(EventData(Index%,6)))
  545.                                 'Test for run conditions (later than the condition and not run since)
  546.                                 IF (GETCURRDATE() >= Rundate) AND (RunDate > CDAT(CDBL(EventData(Index%, 4)))) THEN
  547.                                     CALL ExecuteEvent Index%
  548.                                 ENDIF
  549.                             ENDIF
  550.                         ENDIF
  551.                     ENDIF                                
  552.                 CASE ELSE
  553.                     'Error; must be run manually
  554.             END SELECT
  555.         ENDIF
  556.     NEXT Index%
  557. END SUB
  558.                 
  559. REM ***************************************************************
  560. REM * EnableOption: This enables the Scheduled Event Dialog       *
  561. REM * controls corresponding to the selected scheduling option.   *
  562. REM ***************************************************************
  563. SUB EnableOption (Option%)
  564.     WITH ScheduleEvent
  565.         SELECT CASE Option%
  566.             CASE 0
  567.                 'Scheduled Once
  568.                 .OnceON.Enable TRUE
  569.                 .OnceMonth.Enable TRUE
  570.                 .OnceYear.Enable TRUE
  571.                 .OnceTH.Enable TRUE
  572.                 .OnceDay.Enable TRUE
  573.                 .OnceAT.Enable TRUE
  574.                 .OnceHour.Enable TRUE
  575.                 .OnceCOLON.Enable TRUE
  576.                 .OnceMinutes.Enable TRUE
  577.                 .OnceAM.Enable TRUE
  578.                 .OncePM.Enable TRUE
  579.                 .HourlyAT.Enable FALSE
  580.                 .HourlyMinutes.Enable FALSE
  581.                 .HourlyAFTER.Enable FALSE
  582.                 .DailyAT.Enable FALSE
  583.                 .DailyHour.Enable FALSE
  584.                 .DailyCOLON.Enable FALSE
  585.                 .DailyMinutes.Enable FALSE
  586.                 .DailyAM.Enable FALSE
  587.                 .DailyPM.Enable FALSE
  588.                 .MonthlyEvery.Enable FALSE
  589.                 .MonthlyDay.Enable FALSE
  590.                 .MonthlyTH.Enable FALSE
  591.                 .MonthlyOF.Enable FALSE
  592.                 .MonthlyAT.Enable FALSE
  593.                 .MonthlyHour.Enable FALSE
  594.                 .MonthlyCOLON.Enable FALSE
  595.                 .MonthlyMinutes.Enable FALSE
  596.                 .MonthlyAM.Enable FALSE
  597.                 .MonthlyPM.Enable FALSE
  598.             CASE 1
  599.                 'Scheduled Hourly
  600.                 .OnceON.Enable FALSE
  601.                 .OnceMonth.Enable FALSE
  602.                 .OnceYear.Enable FALSE
  603.                 .OnceTH.Enable FALSE
  604.                 .OnceDay.Enable FALSE
  605.                 .OnceAT.Enable FALSE
  606.                 .OnceHour.Enable FALSE
  607.                 .OnceCOLON.Enable FALSE
  608.                 .OnceMinutes.Enable FALSE
  609.                 .OnceAM.Enable FALSE
  610.                 .OncePM.Enable FALSE
  611.                 .HourlyAT.Enable TRUE
  612.                 .HourlyMinutes.Enable TRUE
  613.                 .HourlyAFTER.Enable TRUE
  614.                 .DailyAT.Enable FALSE
  615.                 .DailyHour.Enable FALSE
  616.                 .DailyCOLON.Enable FALSE
  617.                 .DailyMinutes.Enable FALSE
  618.                 .DailyAM.Enable FALSE
  619.                 .DailyPM.Enable FALSE
  620.                 .MonthlyEvery.Enable FALSE
  621.                 .MonthlyDay.Enable FALSE
  622.                 .MonthlyTH.Enable FALSE
  623.                 .MonthlyOF.Enable FALSE
  624.                 .MonthlyAT.Enable FALSE
  625.                 .MonthlyHour.Enable FALSE
  626.                 .MonthlyCOLON.Enable FALSE
  627.                 .MonthlyMinutes.Enable FALSE
  628.                 .MonthlyAM.Enable FALSE
  629.                 .MonthlyPM.Enable FALSE
  630.             CASE 2
  631.                 'Scheduled Daily
  632.                 .OnceON.Enable FALSE
  633.                 .OnceMonth.Enable FALSE
  634.                 .OnceYear.Enable FALSE
  635.                 .OnceTH.Enable FALSE
  636.                 .OnceDay.Enable FALSE
  637.                 .OnceAT.Enable FALSE
  638.                 .OnceHour.Enable FALSE
  639.                 .OnceCOLON.Enable FALSE
  640.                 .OnceMinutes.Enable FALSE
  641.                 .OnceAM.Enable FALSE
  642.                 .OncePM.Enable FALSE
  643.                 .HourlyAT.Enable FALSE
  644.                 .HourlyMinutes.Enable FALSE
  645.                 .HourlyAFTER.Enable FALSE
  646.                 .DailyAT.Enable TRUE
  647.                 .DailyHour.Enable TRUE
  648.                 .DailyCOLON.Enable TRUE
  649.                 .DailyMinutes.Enable TRUE
  650.                 .DailyAM.Enable TRUE
  651.                 .DailyPM.Enable TRUE
  652.                 .MonthlyEvery.Enable FALSE
  653.                 .MonthlyDay.Enable FALSE
  654.                 .MonthlyTH.Enable FALSE
  655.                 .MonthlyOF.Enable FALSE
  656.                 .MonthlyAT.Enable FALSE
  657.                 .MonthlyHour.Enable FALSE
  658.                 .MonthlyCOLON.Enable FALSE
  659.                 .MonthlyMinutes.Enable FALSE
  660.                 .MonthlyAM.Enable FALSE
  661.                 .MonthlyPM.Enable FALSE
  662.             CASE 3
  663.                 'Scheduled Monthly
  664.                 .OnceON.Enable FALSE
  665.                 .OnceMonth.Enable FALSE
  666.                 .OnceYear.Enable FALSE
  667.                 .OnceTH.Enable FALSE
  668.                 .OnceDay.Enable FALSE
  669.                 .OnceAT.Enable FALSE
  670.                 .OnceHour.Enable FALSE
  671.                 .OnceCOLON.Enable FALSE
  672.                 .OnceMinutes.Enable FALSE
  673.                 .OnceAM.Enable FALSE
  674.                 .OncePM.Enable FALSE
  675.                 .HourlyAT.Enable FALSE
  676.                 .HourlyMinutes.Enable FALSE
  677.                 .HourlyAFTER.Enable FALSE
  678.                 .DailyAT.Enable FALSE
  679.                 .DailyHour.Enable FALSE
  680.                 .DailyCOLON.Enable FALSE
  681.                 .DailyMinutes.Enable FALSE
  682.                 .DailyAM.Enable FALSE
  683.                 .DailyPM.Enable FALSE
  684.                 .MonthlyEvery.Enable TRUE
  685.                 .MonthlyDay.Enable TRUE
  686.                 .MonthlyTH.Enable TRUE
  687.                 .MonthlyOF.Enable TRUE
  688.                 .MonthlyAT.Enable TRUE
  689.                 .MonthlyHour.Enable TRUE
  690.                 .MonthlyCOLON.Enable TRUE
  691.                 .MonthlyMinutes.Enable TRUE
  692.                 .MonthlyAM.Enable TRUE
  693.                 .MonthlyPM.Enable TRUE
  694.             CASE ELSE
  695.                 'Other (Disable all)
  696.                 .OnceON.Enable FALSE
  697.                 .OnceMonth.Enable FALSE
  698.                 .OnceYear.Enable FALSE
  699.                 .OnceTH.Enable FALSE
  700.                 .OnceDay.Enable FALSE
  701.                 .OnceAT.Enable FALSE
  702.                 .OnceHour.Enable FALSE
  703.                 .OnceCOLON.Enable FALSE
  704.                 .OnceMinutes.Enable FALSE
  705.                 .OnceAM.Enable FALSE
  706.                 .OncePM.Enable FALSE
  707.                 .HourlyAT.Enable FALSE
  708.                 .HourlyMinutes.Enable FALSE
  709.                 .HourlyAFTER.Enable FALSE
  710.                 .DailyAT.Enable FALSE
  711.                 .DailyHour.Enable FALSE
  712.                 .DailyCOLON.Enable FALSE
  713.                 .DailyMinutes.Enable FALSE
  714.                 .DailyAM.Enable FALSE
  715.                 .DailyPM.Enable FALSE
  716.                 .MonthlyEvery.Enable FALSE
  717.                 .MonthlyDay.Enable FALSE
  718.                 .MonthlyTH.Enable FALSE
  719.                 .MonthlyOF.Enable FALSE
  720.                 .MonthlyAT.Enable FALSE
  721.                 .MonthlyHour.Enable FALSE
  722.                 .MonthlyCOLON.Enable FALSE
  723.                 .MonthlyMinutes.Enable FALSE
  724.                 .MonthlyAM.Enable FALSE
  725.                 .MonthlyPM.Enable FALSE
  726.         END SELECT
  727.     END WITH
  728. END SUB
  729.  
  730. REM ***************************************************************
  731. REM * GetEventFromDialog: This takes the data from the Schedule   *
  732. REM * Event Dialog and puts it in the specified Event Data        *
  733. REM * record.                                                     *
  734. REM ***************************************************************
  735. SUB GetEventFromDialog(Index%)
  736.     DIM DaysToRun AS STRING
  737.  
  738.     WITH ScheduleEvent
  739.         SELECT CASE .ScheduleOption.GetValue()
  740.             CASE 0
  741.                 'Scheduled Once
  742.                 EventData(Index%,1) = "O"
  743.                 'Get Program
  744.                 EventData(Index%,2) = .ProgramFile.GetText()
  745.                 'Get Date
  746.                 EventData(Index%,5) = BUILDDATE(.OnceYear.GetValue(), .OnceMonth.GetSelect(), .OnceDay.GetValue())
  747.                 'Get Time
  748.                 IF (.OnceHour.GetValue() = 12) THEN
  749.                     IF (.OnceOption.GetValue() = 0) THEN
  750.                         EventData(Index%,6) = BUILDTIME(0, .OnceMinutes.GetValue(), 0)
  751.                     ELSE
  752.                         EventData(Index%,6) = BUILDTIME(12, .OnceMinutes.GetValue(), 0)
  753.                     ENDIF
  754.                 ELSE 
  755.                     IF (.OnceOption.GetValue() = 0) THEN
  756.                         EventData(Index%,6) = BUILDTIME(.OnceHour.GetValue(), .OnceMinutes.GetValue(), 0)
  757.                     ELSE
  758.                         EventData(Index%,6) = BUILDTIME(.OnceHour.GetValue() + 12, .OnceMinutes.GetValue(), 0)
  759.                     ENDIF
  760.                 ENDIF
  761.             CASE 1
  762.                 'Scheduled Hourly
  763.                 EventData(Index%,1) = "H"
  764.                 'Get Program
  765.                 EventData(Index%,2) = .ProgramFile.GetText()
  766.                 'Get Minutes after Hour
  767.                 EventData(Index%,5) = .HourlyMinutes.GetValue()
  768.             CASE 2
  769.                 'Scheduled Daily
  770.                 EventData(Index%,1) = "D"
  771.                 'Get Program
  772.                 EventData(Index%,2) = .ProgramFile.GetText()
  773.                 'Get Time
  774.                 IF (.DailyHour.GetValue() = 12) THEN
  775.                     IF (.DailyOption.GetValue() = 0) THEN
  776.                         EventData(Index%,5) = BUILDTIME(0, .DailyMinutes.GetValue(), 0)
  777.                     ELSE
  778.                         EventData(Index%,5) = BUILDTIME(12, .DailyMinutes.GetValue(), 0)
  779.                     ENDIF
  780.                 ELSE 
  781.                     IF (.DailyOption.GetValue() = 0) THEN
  782.                         EventData(Index%,5) = BUILDTIME(.DailyHour.GetValue(), .DailyMinutes.GetValue(), 0)
  783.                     ELSE
  784.                         EventData(Index%,5) = BUILDTIME(.DailyHour.GetValue() + 12, .DailyMinutes.GetValue(), 0)
  785.                     ENDIF
  786.                 ENDIF
  787.             CASE 3
  788.                 'Scheduled Monthly
  789.                 EventData(Index%,1) = "M"
  790.                 'Get Program
  791.                 EventData(Index%,2) = .ProgramFile.GetText()
  792.                 'Get Day of the Month
  793.                 EventData(Index%,5) = .MonthlyDay.GetValue()
  794.                 'Get Time
  795.                 IF (.MonthlyHour.GetValue() = 12) THEN
  796.                     IF (.MonthlyOption.GetValue() = 0) THEN
  797.                         EventData(Index%,6) = BUILDTIME(0, .MonthlyMinutes.GetValue(), 0)
  798.                     ELSE
  799.                         EventData(Index%,6) = BUILDTIME(12, .MonthlyMinutes.GetValue(), 0)
  800.                     ENDIF
  801.                 ELSE 
  802.                     IF (.MonthlyOption.GetValue() = 0) THEN
  803.                         EventData(Index%,6) = BUILDTIME(.MonthlyHour.GetValue(), .MonthlyMinutes.GetValue(), 0)
  804.                     ELSE
  805.                         EventData(Index%,6) = BUILDTIME(.MonthlyHour.GetValue() + 12, .MonthlyMinutes.GetValue(), 0)
  806.                     ENDIF
  807.                 ENDIF
  808.             CASE ELSE
  809.                 'Other (Error)
  810.                 MESSAGE "Error, unrecognized schedule option"
  811.                 EventData(Index%,1) = "X"
  812.                 'Get program anyway.
  813.                 EventData(Index%,2) = .ProgramFile.GetText()
  814.         END SELECT
  815.         DaysToRun$ = ""
  816.         'Create the Active Days matrix by getting the data
  817.         'from the day boxes, one by one.
  818.         IF NOT (.MondayBox.GetValue() = 0) THEN 
  819.             DaysToRun$ = DaysToRun$ & "X"
  820.         ELSE
  821.             DaysToRun$ = DaysToRun$ & " "
  822.         ENDIF
  823.         IF NOT (.TuesdayBox.GetValue() = 0) THEN
  824.             DaysToRun$ = DaysToRun$ & "X"
  825.         ELSE
  826.             DaysToRun$ = DaysToRun$ & " "
  827.         ENDIF
  828.         IF NOT (.WednesdayBox.GetValue() = 0) THEN
  829.             DaysToRun$ = DaysToRun$ & "X"
  830.         ELSE
  831.             DaysToRun$ = DaysToRun$ & " "
  832.         ENDIF
  833.         IF NOT (.ThursdayBox.GetValue() = 0) THEN
  834.             DaysToRun$ = DaysToRun$ & "X"
  835.         ELSE
  836.             DaysToRun$ = DaysToRun$ & " "
  837.         ENDIF
  838.         IF NOT (.FridayBox.GetValue() = 0) THEN
  839.             DaysToRun$ = DaysToRun$ & "X"
  840.         ELSE
  841.             DaysToRun$ = DaysToRun$ & " "
  842.         ENDIF
  843.         IF NOT (.SaturdayBox.GetValue() = 0) THEN
  844.             DaysToRun$ = DaysToRun$ & "X"
  845.         ELSE
  846.             DaysToRun$ = DaysToRun$ & " "
  847.         ENDIF
  848.         IF NOT (.SundayBox.GetValue() = 0) THEN
  849.             DaysToRun$ = DaysToRun$ & "X"
  850.         ELSE
  851.             DaysToRun$ = DaysToRun$ & " "
  852.         ENDIF
  853.         'Set the Active Days matrix.
  854.         EventData(Index%, 3) = DaysToRun$
  855.         
  856.         'Set the last execution to right now, so that the event will
  857.         'not be executed if the conditions are in the past
  858.         EventData(Index%,4) = GETCURRDATE()
  859.     END WITH
  860. END SUB                
  861.  
  862. REM ***************************************************************
  863. REM * MainDialogSub: Event handler for the Main Dialog. This SUB  *
  864. REM * handles all of the user commands; it is, in effect, the     *
  865. REM * heart of the program.                                       *
  866. REM ***************************************************************
  867. SUB MainDialogSub(BYVAL ControlID%, BYVAL Event%)
  868.     DIM ReturnCode AS INTEGER
  869.     DIM Index AS INTEGER
  870.     DIM Mess AS STRING
  871.     DIM DoRemove AS INTEGER
  872.     DIM DoExec AS INTEGER
  873.     DIM DoExit AS INTEGER
  874.  
  875.     IF Event% = EVENT_INITIALIZATION THEN
  876.         'Initialize
  877.         MainDialog.MainList.SetArray ScheduledEvent$
  878.     ENDIF
  879.     IF Event% = EVENT_MOUSE_CLICK THEN
  880.         SELECT CASE ControlID%
  881.             CASE MainDialog.AddEvent.GetID()
  882.                 'Add an event; check if room left
  883.                 IF NumberOfEvents% < MAX_EVENTS THEN
  884.                     'Give a blank event
  885.                     CALL ResetScheduleEvent
  886.                     'Create the Schedule Event Dialog
  887.                     ReturnCode% = DIALOG(ScheduleEvent)
  888.                     IF ReturnCode% = MSG_OK THEN
  889.                         'Add the new entry to the list
  890.                         NumberOfEvents% = NumberOfEvents% + 1
  891.                         CALL GetEventFromDialog NumberOfEvents%
  892.                         CALL MakePrettyString NumberOfEvents%
  893.                         MainDialog.MainList.AddItem ScheduledEvent$(NumberOfEvents%),NumberOfEvents%
  894.                         MainDialog.MainList.SetSelect NumberOfEvents%
  895.                     ENDIF
  896.                 ENDIF
  897.             CASE MainDialog.EditEvent.GetID()
  898.                 'Edit an event; check for a selection
  899.                 IF MainDialog.MainList.GetSelect() <> 0 THEN
  900.                     'Fill the Schedule Event Dialog
  901.                     Index% = MainDialog.MainList.GetSelect()
  902.                     CALL FillScheduleEvent Index%
  903.                     'Create the Dialog
  904.                     ReturnCode% = DIALOG(ScheduleEvent)
  905.                     IF ReturnCode% = MSG_OK THEN
  906.                         'Get the data
  907.                         CALL GetEventFromDialog Index%
  908.                         'Update the list
  909.                         CALL MakePrettyString Index%
  910.                         MainDialog.MainList.RemoveItem Index%
  911.                         MainDialog.MainList.AddItem ScheduledEvent$(Index%),Index%
  912.                         MainDialog.MainList.SetSelect Index%
  913.                     ENDIF
  914.                 ENDIF
  915.             CASE MainDialog.RemoveEvent.GetID()
  916.                 'Remove an event; check for a selection
  917.                 IF MainDialog.MainList.GetSelect() <> 0 THEN
  918.                     'Ask for confirmation
  919.                     Index% = MainDialog.MainList.GetSelect()
  920.                     Mess$ = "Remove execution of" & CHR(13) & EventData(Index%,2) & "?"
  921.                     DoRemove% = MESSAGEBOX(Mess$,"Confirm Remove", MB_YES_NO + MB_QUESTION_ICON)
  922.                     IF DoRemove% = MSG_YES THEN
  923.                         'Remove from the list
  924.                         MainDialog.MainList.RemoveItem(Index%)
  925.                         CALL RemoveFromList Index%
  926.                     ENDIF
  927.                 ENDIF
  928.             CASE MainDialog.ExecuteEvent.GetID()
  929.                 'Execute an event; check for a selection
  930.                 IF MainDialog.MainList.GetSelect() <> 0 THEN
  931.                     'Ask for a confirmation
  932.                     Index% = MainDialog.MainList.GetSelect()
  933.                     Mess$ = "Execute" & CHR(13) & EventData(Index%,2) & "?"
  934.                     DoExec% = MESSAGEBOX(Mess$,"Confirm Remove", MB_YES_NO + MB_QUESTION_ICON)
  935.                     IF DoExec% = MSG_YES THEN
  936.                         'Execute
  937.                         CALL ExecuteEvent Index%
  938.                         'Update the list
  939.                         MainDialog.MainList.RemoveItem(Index%)
  940.                         MainDialog.MainList.AddItem ScheduledEvent$(Index%), Index%
  941.                         MainDialog.MainList.SetSelect Index%
  942.                     ENDIF
  943.                 ENDIF
  944.             CASE MainDialog.ExitButton.GetID()
  945.                 'Exit
  946.                 DoExit% = MESSAGEBOX("Exit Corel SCRIPT Scheduler?", "Confirm Exit", MB_YES_NO + MB_QUESTION_ICON)
  947.                 IF DoExit% = MSG_YES THEN MainDialog.CloseDialog 1
  948.             CASE ELSE
  949.                 ' Nothing
  950.         END SELECT
  951.     END IF
  952.     IF Event% = EVENT_TIMER_EVENT THEN
  953.         'Run the programs if needed
  954.         CALL RunPrograms
  955.         'Update the screen
  956.         Index% = MainDialog.MainList.GetSelect()
  957.         MainDialog.MainList.SetArray ScheduledEvent$
  958.         MainDialog.MainList.SetSelect Index%
  959.     ENDIF
  960.     'Enable the Edit, Remove and Execute buttons if a selection
  961.     'is made
  962.     IF MainDialog.MainList.GetSelect() = 0 THEN
  963.         MainDialog.RemoveEvent.Enable FALSE
  964.         MainDialog.EditEvent.Enable FALSE
  965.         MainDialog.ExecuteEvent.Enable FALSE
  966.     ELSE
  967.         MainDialog.RemoveEvent.Enable TRUE
  968.         MainDialog.EditEvent.Enable TRUE
  969.         MainDialog.ExecuteEvent.Enable TRUE
  970.     ENDIF
  971. END SUB
  972.  
  973. REM ***************************************************************
  974. REM * ScheduleEventSub: Event handler for the Schedule Event      *
  975. REM * Dialog. This is a fairly complex dialog, but its main       *
  976. REM * purpose is data entry, unlike the main dialog which is      *
  977. REM * mostly a controller.                                        *
  978. REM ***************************************************************
  979. SUB ScheduleEventSub(BYVAL ControlID%, BYVAL Event%)
  980.     DIM Option AS INTEGER
  981.     DIM Day AS INTEGER
  982.     DIM Month AS INTEGER
  983.     DIM Year AS INTEGER
  984.     DIM FileName AS STRING
  985.     
  986.     WITH ScheduleEvent
  987.         IF Event% = EVENT_INITIALIZATION THEN
  988.             ' Enable the appropriate controls
  989.             Option% = .ScheduleOption.GetValue()
  990.             EnableOption(Option%)
  991.                     
  992.         ENDIF
  993.         
  994.         IF Event% = EVENT_CHANGE_IN_CONTENT THEN
  995.             SELECT CASE ControlID%
  996.                 CASE .OnceDay.GetID()
  997.                     'Adjust the day if exceeds the "month limits"
  998.                     Day% = .OnceDay.GetValue()
  999.                     Month% =  .OnceMonth.GetSelect()
  1000.                     Year% = .OnceYear.GetValue()
  1001.                     'Too low
  1002.                     IF Day% < 1 THEN
  1003.                         IF Month% = 1 THEN
  1004.                             'Before january, go back one year
  1005.                             IF Year% = CurrentYear$ THEN
  1006.                                 ' Do not allow change
  1007.                                 .OnceDay.SetValue 1
  1008.                             ELSE
  1009.                                 .OnceYear.SetValue Year% - 1
  1010.                                 .OnceMonth.SetSelect 12
  1011.                                 .OnceDay.SetValue 31
  1012.                             ENDIF
  1013.                         ELSE
  1014.                             'Go back one month
  1015.                             Month% = Month% - 1
  1016.                             .OnceMonth.SetSelect Month%
  1017.                             IF Month% = 2 THEN
  1018.                                 ' Febuary; this tests for a leap year
  1019.                                 IF ((Year% MOD 4) = 0) AND (NOT((Year% MOD 100) = 0) OR ((Year% MOD 400) = 0)) THEN
  1020.                                     .OnceDay.SetValue 29
  1021.                                 ELSE
  1022.                                     .OnceDay.SetValue 28
  1023.                                 ENDIF
  1024.                             ELSEIF (Month% = 1) OR (Month% = 3) OR (Month% = 5) OR (Month% = 7) OR (Month% = 8) OR (Month% = 10) OR (Month% = 12) THEN
  1025.                                 .OnceDay.SetValue 31
  1026.                             ELSE
  1027.                                 .OnceDay.SetValue 30
  1028.                             ENDIF
  1029.                         ENDIF
  1030.                     ELSEIF Day% > 28 THEN
  1031.                         'We may have moved passed the limit
  1032.                         IF Month% = 2 THEN
  1033.                             ' Febuary
  1034.                             ' This tests for a leap year; if it exceeds anyway, then we advance to March
  1035.                             IF NOT((Year% MOD 4) = 0) AND (NOT ((Year% MOD 100) = 0) OR ((Year% MOD 400) = 0)) OR Day% > 29 THEN
  1036.                                 .OnceMonth.SetSelect 3
  1037.                                 .OnceDay.SetValue 1
  1038.                             ENDIF
  1039.                         ELSEIF (Month% = 12) THEN
  1040.                             ' December; we may have to advance a year
  1041.                             IF Day% > 31 THEN
  1042.                                 .OnceYear.SetValue Year + 1
  1043.                                 .OnceMonth.SetSelect 1
  1044.                                 .OnceDay.SetValue 1
  1045.                             END IF
  1046.                         ELSEIF (Day% >31) OR (NOT((Month% = 1) OR (Month% = 3) OR (Month% = 5) OR (Month% = 7) OR (Month% = 8) OR (Month% = 10)) AND Day% > 30) THEN
  1047.                             ' Other month
  1048.                             .OnceMonth.SetSelect Month% + 1
  1049.                             .OnceDay.SetValue 1
  1050.                         ENDIF
  1051.                     ENDIF                
  1052.                     
  1053.                     .OnceTH.SetText NumeralToOrdinal$(CINT(.OnceDay.GetValue())) & ","
  1054.  
  1055.                 CASE .MonthlyDay.GetID()
  1056.                     ' Wraparound if we come out of the limits. As we cannot limit ourselves to
  1057.                     ' the length of the shorter months, we have to accept any value up to 31.
  1058.                     Day% = .MonthlyDay.GetValue()
  1059.                     IF Day% < 1 THEN
  1060.                         .MonthlyDay.SetValue 31
  1061.                     ELSEIF Day% > 31 THEN
  1062.                         .MonthlyDay.SetValue 1
  1063.                     ENDIF
  1064.                                         
  1065.                     .MonthlyTH.SetText NumeralToOrdinal$(CINT(.MonthlyDay.GetValue()))
  1066.  
  1067.                 'Wraparounds for hours
  1068.                 CASE .DailyHour.GetID()
  1069.                     IF .DailyHour.GetValue() > 12 THEN .DailyHour.SetValue 1
  1070.                     IF .DailyHour.GetValue() < 1 THEN .DailyHour.SetValue 12
  1071.                 CASE .OnceHour.GetID()
  1072.                     IF .OnceHour.GetValue() > 12 THEN .OnceHour.SetValue 1
  1073.                     IF .OnceHour.GetValue() < 1 THEN .OnceHour.SetValue 12
  1074.                 CASE .MonthlyHour.GetID()
  1075.                     IF .MonthlyHour.GetValue() > 12 THEN .MonthlyHour.SetValue 1
  1076.                     IF .MonthlyHour.GetValue() < 1 THEN .MonthlyHour.SetValue 12
  1077.                 'Wraparounds for Minutes.
  1078.                 CASE .OnceMinutes.GetID()
  1079.                     WHILE .OnceMinutes.GetValue() > 59
  1080.                         .OnceMinutes.SetValue .OnceMinutes.GetValue() - 60
  1081.                     WEND
  1082.                     WHILE .OnceMinutes.GetValue() < 0
  1083.                         .OnceMinutes.SetValue .DailyMinutes.GetValue() + 60
  1084.                     WEND
  1085.                 CASE .DailyMinutes.GetID()
  1086.                     WHILE .DailyMinutes.GetValue() > 59
  1087.                         .DailyMinutes.SetValue .DailyMinutes.GetValue() - 60
  1088.                     WEND
  1089.                     WHILE .DailyMinutes.GetValue() < 0
  1090.                         .DailyMinutes.SetValue .DailyMinutes.GetValue() + 60
  1091.                     WEND
  1092.                 CASE .HourlyMinutes.GetID()
  1093.                     WHILE .HourlyMinutes.GetValue() > 59
  1094.                         .HourlyMinutes.SetValue .HourlyMinutes.GetValue() - 60
  1095.                     WEND
  1096.                     WHILE .HourlyMinutes.GetValue() < 0
  1097.                         .HourlyMinutes.SetValue .HourlyMinutes.GetValue() + 60
  1098.                     WEND
  1099.                 CASE .MonthlyMinutes.GetID()
  1100.                     WHILE .MonthlyMinutes.GetValue() > 59
  1101.                         .MonthlyMinutes.SetValue .MonthlyMinutes.GetValue() - 60
  1102.                     WEND
  1103.                     WHILE .MonthlyMinutes.GetValue() < 0
  1104.                         .MonthlyMinutes.SetValue .MonthlyMinutes.GetValue() + 60
  1105.                     WEND
  1106.             END SELECT
  1107.         END IF
  1108.         IF Event% = EVENT_MOUSE_CLICK THEN
  1109.             SELECT CASE ControlID%
  1110.                 'Enable appropriate controls for the schedule options
  1111.                 CASE .ScheduleOnce.GetID()
  1112.                     Option% = .ScheduleOption.GetValue()
  1113.                     EnableOption(Option%)
  1114.                 CASE .ScheduleDaily.GetID()
  1115.                     Option% = .ScheduleOption.GetValue()
  1116.                     EnableOption(Option%)
  1117.                 CASE .ScheduleHourly.GetID()
  1118.                     Option% = .ScheduleOption.GetValue()
  1119.                     EnableOption(Option%)
  1120.                 CASE    .ScheduleMonthly.GetID()
  1121.                     Option% = .ScheduleOption.GetValue()
  1122.                     EnableOption(Option%)
  1123.                 'Browse
  1124.                 CASE .BrowseButton.GetID()
  1125.                     Filename$ = GETFILEBOX("Executable Files (*.exe)|*.exe|Corel SCRIPT Files (*.csc)|*.csc|All Files|*.*", "Choose an application or Script to Run", 0)
  1126.                     IF Filename$ <> "" THEN
  1127.                         .ProgramFile.SetText(FileName$)
  1128.                     ENDIF
  1129.                 CASE ELSE
  1130.                     'Nothing
  1131.             END SELECT
  1132.         ENDIF
  1133.     END WITH
  1134. END SUB
  1135.  
  1136.  
  1137. REM ***************************************************************
  1138. REM * Main Program                                                *
  1139. REM ***************************************************************
  1140. 'Initialize data
  1141. DIM dbl AS LONG
  1142. DIM index AS INTEGER
  1143. CALL Initialize
  1144.  
  1145. 'Create the file if it does not exist
  1146. OPEN DATFOL$ & "\Schedule.Dat" FOR APPEND AS 1
  1147. CLOSE
  1148.  
  1149. 'Load the file
  1150. OPEN DATFOL$ & "\Schedule.Dat" FOR INPUT AS 1
  1151.  
  1152. WHILE ((NOT EOF(1)) AND (NumberOfEvents% < MAX_EVENTS))
  1153.     NumberOfEvents% = NumberOfEvents% + 1
  1154.     ' Read schedule
  1155.     INPUT #1, EventData(NumberOfEvents%, 1)
  1156.     ' Read program
  1157.     INPUT #1, EventData(NumberOfEvents%, 2)
  1158.     ' Read active days matrix
  1159.     INPUT #1, EventData(NumberOfEvents%, 3)
  1160.     ' Read last execution
  1161.     INPUT #1, dbl&
  1162.     EventData(NumberOfEvents%, 4)=dbl&
  1163.     SELECT CASE EventData(NumberOfEvents%, 1)
  1164.         CASE "O"
  1165.             'Scheduled Once
  1166.             'Read date
  1167.             INPUT #1, dbl&
  1168.             EventData(NumberOfEvents%, 5)=dbl&
  1169.             'Read time
  1170.             INPUT #1, dbl&
  1171.             EventData(NumberOfEvents%, 6) = dbl
  1172.         CASE "H"
  1173.             'Scheduled Hourly
  1174.             'Read number of minutes
  1175.             INPUT #1, dbl&
  1176.             EventData(NumberOfEvents%, 5)=dbl&
  1177.         CASE "D"
  1178.             'Scheduled Daily
  1179.             'Read time
  1180.             INPUT #1, dbl&
  1181.             EventData(NumberOfEvents%, 5)=dbl&
  1182.         CASE "M"
  1183.             'Scheduled Monthly
  1184.             'Read day of the month
  1185.             INPUT #1, dbl&
  1186.             EventData(NumberOfEvents%, 5)=dbl&
  1187.             'Read time
  1188.             INPUT #1, dbl&
  1189.             EventData(NumberOfEvents%, 6)=dbl&
  1190.         CASE ELSE
  1191.             MESSAGE "File Error!"
  1192.             NumberOfEvents% = NumberOfEvents% - 1
  1193.     END SELECT
  1194.     CALL MakePrettyString NumberOfEvents%
  1195. WEND
  1196.  
  1197. CLOSE 1
  1198.  
  1199. MainDialog.SetStyle STYLE_MINIMIZEBOX
  1200.  
  1201. 'Set Timer at one minute
  1202. MainDialog.SetTimer 10000
  1203.  
  1204. 'Have a go!
  1205. DIALOG MainDialog
  1206.  
  1207. 'Save the file
  1208. OPEN DATFOL$ & "\Schedule.Dat" FOR OUTPUT AS 1
  1209.  
  1210. FOR Index% = 1 TO NumberOfEvents%
  1211.     ' Write event type
  1212.     WRITE #1, EventData(Index%, 1),
  1213.     ' Write program
  1214.     WRITE #1, EventData(Index%, 2),
  1215.     ' Write active days matrix
  1216.     WRITE #1, EventData(Index%, 3),
  1217.     'Write last execution
  1218.     WRITE #1, CDBL(EventData(Index%, 4)),
  1219.     SELECT CASE EventData(Index%, 1)
  1220.         CASE "O"
  1221.             'Scheduled Once
  1222.             'Write date
  1223.             WRITE #1, CDBL(EventData(Index%, 5)),
  1224.             'Write time
  1225.             WRITE #1, CDBL(EventData(Index%, 6))
  1226.         CASE "H"
  1227.             'Scheduled Hourly
  1228.             'Write number of minutes
  1229.             WRITE #1, EventData(Index%, 5)
  1230.         CASE "D"
  1231.             'Scheduled Daily
  1232.             'Write time
  1233.             WRITE #1, CDBL(EventData(Index%, 5))
  1234.         CASE "M"
  1235.             'Scheduled Monthly
  1236.             'Write day
  1237.             WRITE #1, EventData(Index%, 5),
  1238.             'Write time
  1239.             WRITE #1, CDBL(EventData(Index%, 6))
  1240.         CASE ELSE
  1241.     END SELECT
  1242. NEXT Index%
  1243.  
  1244. CLOSE 1
  1245.  
  1246.  
  1247.