Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method UpdateCalendar ( 
 | 
  Boolean onlyWhenChanged_i 
 | 
) 
 | 
{ 
 | 
  Description: 
 | 
  [* 
 | 
    Trigger an update of the calendar. 
 | 
    onlyWhenChanged_i indicates if the calendar should always be updated, or only when the event was changed. 
 | 
    Updating when the event was not changed should typically be done when the calendar window has changed. 
 | 
  *] 
 | 
  TextBody: 
 | 
  [* 
 | 
    //info( ">>> UpdateCalendar:", this.Calendar().CalendarID(), this.Event().Initiator() + "." + this.Event().Subject() ); 
 | 
    //info( "    onlyWhenChanged_i =", onlyWhenChanged_i, "HasChangedRecurrencePeriod =", this.HasChangedRecurrencePeriod() ); 
 | 
    //info( "    IsChanged =", this.IsChanged(), "EventIsChanged =", this.Event().IsChanged() ); 
 | 
     
 | 
    // See if the capacity of the event is changed by comparing it with the capacity of one of the occurrences. 
 | 
    this.Event().CalcCapacity(); 
 | 
    capacityIsChanged := guard( this.Event().Capacity() <> select( this, ExplicitTimeInterval, eti, true, true ).Capacity(), false ); 
 | 
     
 | 
    if( capacityIsChanged ) 
 | 
    { 
 | 
      // Update the capacity of the occurrences. 
 | 
      traverse( this, ExplicitTimeInterval, timeInterval ) 
 | 
      { 
 | 
        timeInterval.Capacity( this.Event().Capacity() ); 
 | 
         
 | 
        // Also for the subscripitons. 
 | 
        traverse( timeInterval, SubscribingETI, subscribingETI ) 
 | 
        { 
 | 
          subscribingETI.Capacity( this.Event().Capacity() ); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
     
 | 
    // Only update the calendar (i.e. re-generate the TimeIntervals) when something is changed, 
 | 
    // or when onlyWhenChanged_i = FALSE, which indicates that the calendar should always be updated. 
 | 
    // This is typically the case when the window of the calendar has been updated. 
 | 
    // In that caae the event itself has not been changed, but TimeIntervals should be generated based on the changed window. 
 | 
    if(    this.IsChanged() 
 | 
        or this.HasChangedRecurrencePeriod() 
 | 
        or this.Event().IsChanged() 
 | 
        or not onlyWhenChanged_i ) 
 | 
    { 
 | 
      // Make sure that the revelant attributes are calculated. 
 | 
      Transaction::Transaction().Propagate( attribute( LibCal_Participation, IsRecurring ) ); 
 | 
      this.CalcStartTime(); 
 | 
      this.CalcEndTime(); 
 | 
       
 | 
      //info( ">>> UpdateCalendar: ", this.Calendar().CalendarID(), this.Event().Initiator() + "." + this.Event().Subject(), [String]this.StartTime() + " - " + [String]this.EndTime(), 
 | 
      //      "IsRecurring =", this.IsRecurring() ); 
 | 
       
 | 
      if( this.IsRecurring() ) 
 | 
      { 
 | 
        // Generate occurrences (i.e. ExplicitTimeIntervals) according to the specified RecurrencePattern and RecurrencePeriod. 
 | 
        this.GenerateOccurrences(); 
 | 
      } 
 | 
      else 
 | 
      { 
 | 
        // Non-recurring, just one occurrence required. 
 | 
        this.GenerateOccurrence(); 
 | 
      } 
 | 
     
 | 
      // Register that the changes have been processed. 
 | 
      this.Event().IsChanged( false ); 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |