/* * /// <summary> * /// Will determine if current event is all day event. * /// </summary> * /// <param name="item"></param> * /// <param name="now"></param> * /// <returns></returns> * internal static bool IsAllDayEvent(CalendarItem item, DateTime now) * { * //if((now.Date > item.StartDate || (now.Date >= item.StartDate && item.StartDate.Hour == 0)) && now.Date <= item.EndDate) * if(now.Date > item.StartDate.Date && now.Date < item.EndDate.Date) * return true; * else * return false; * } * * /// <summary> * /// Determines if event is withing current span * /// </summary> * /// <param name="span"></param> * /// <param name="item"></param> * /// <param name="now"></param> * /// <returns></returns> * internal static bool IsWithinSpanEvent(MatrixSpan span, CalendarItem item, DateTime now) * { * switch(span) * { * case MatrixSpan.WeekHourSpan: * if(!IsAllDayEvent(item, now) && (item.StartDate.Date == item.EndDate.Date && GetHourStartDate(item.StartDate) <= now && GetHourDate(item.EndDate) >= now)) * return true; * break; * case MatrixSpan.HourSpan: * // Don't add up all day events * if(!IsAllDayEvent(item, now) && (GetHourStartDate(item.StartDate) <= now && GetHourDate(item.EndDate) >= now)) * return true; * break; * case MatrixSpan.WeekDaySpan: * if(item.EndDate.Date >= now.Date && item.StartDate.Date <= now.Date && item.StartDate.Date != item.EndDate.Date) * return true; * break; * case MatrixSpan.DaySpan: * if(item.EndDate.Date >= now.Date && item.StartDate.Date <= now.Date) * return true; * break; * case MatrixSpan.MonthSpan: * if(item.EndDate >= now && item.StartDate <= now) * return true; * break; * } * return false; * } * * /// <summary> * /// Determines if current event belongs to the span * /// </summary> * /// <param name="index"></param> * /// <param name="span"></param> * /// <param name="item"></param> * /// <param name="now"></param> * /// <returns></returns> * internal static bool IsCurrentSpanEvent(int index, MatrixSpan span, CalendarItem item, DateTime now) * { * switch(span) * { * case MatrixSpan.WeekHourSpan: * if(!IsAllDayEvent(item, now) && item.EndDate.Date == item.StartDate.Date && ((index==0 && item.EndDate >= now && item.StartDate <= now) || GetHourCycleDate(item.StartDate) == now)) * return true; * break; * case MatrixSpan.HourSpan: * // Don't render items spanning from previous days, we use all day section for that * //if(!IsAllDayEvent(item, now) && (GetHourCycleDate(item.StartDate) == now || (item.StartDate now == item.EndDate.Date)) * //if(!IsAllDayEvent(item, now) && (GetHourStartDate(item.StartDate) <= now && GetHourDate(item.EndDate) >= now)) * if(!IsAllDayEvent(item, now) && (index==0 && item.EndDate >= now && item.StartDate <= now) || GetHourCycleDate(item.StartDate) == now) * return true; * break; * case MatrixSpan.WeekDaySpan: // only events spanning multiple days * if(((item.StartDate.Date == now) || (index==0 && item.EndDate.Date >= now && item.StartDate.Date <= now)) && item.StartDate.Date != item.EndDate.Date) * return true; * break; * case MatrixSpan.DaySpan: * if((item.StartDate.Date == now) || (index==0 && item.EndDate.Date >= now && item.StartDate.Date <= now)) * return true; * break; * case MatrixSpan.MonthSpan: * if((item.StartDate == now) || (index==0 && item.EndDate >= now && item.StartDate <= now)) * return true; * break; * } * * return false; * } */ /// <summary> /// Increments Date /// </summary> /// <param name="span"></param> /// <param name="now"></param> /// <returns></returns> public static DateTime IncrementDate(MatrixSpan span, DateTime now) { switch (span) { case MatrixSpan.WeekHourSpan: case MatrixSpan.HourSpan: return(now.AddMinutes(30)); //return now.AddHours(1); case MatrixSpan.WeekDaySpan: case MatrixSpan.DaySpan: return(now.AddDays(1)); case MatrixSpan.MonthSpan: return(now.AddMonths(1)); } return(now); }
private void PopulateMatrix(CalendarItem item, DateTime cycleDate, ref IMatrix matrix, ref int rowIndex, int columnIndex, MatrixSpan period) { // Don't overwright spanning items, write into next row(column?) instead while(matrix[rowIndex, columnIndex] == (int)MatrixConstants.SpanField) rowIndex++; // Check if Maximum number of rows is reached /* if(this.ViewType!=CalendarViewType.DayView || this.ViewType!=CalendarViewType.TaskView) if(this.MaxDisplayedItems < rowIndex) { // reached maximum number of items we can display in current view matrix[rowIndex, columnIndex] = (int)MatrixConstants.MoreElementsField; // -3 = more items available break; } */ matrix[rowIndex, columnIndex] = Items.IndexOf(item); // Repopulate item till the end int span = 0; // Init variables DateTime startSpanDate = item.StartDate; DateTime endSpanDate = item.AdjustedEndDate; // detect if events spans from previous element if(item.StartDate<cycleDate) { // Calculate span from current date startSpanDate = cycleDate; } switch(period) { case MatrixSpan.WeekHourSpan: case MatrixSpan.HourSpan: //span = (int)System.Math.Ceiling((Helper.GetHourDate(item.EndDate) // - Helper.GetHourStartDate(item.StartDate)).TotalMinutes/60*2) - 1; span = Helper.GetHourSpan(cycleDate, item) - 1; // -1 cause matrix starts with 0 break; case MatrixSpan.WeekDaySpan: case MatrixSpan.DaySpan: span = Helper.GetDaySpan(startSpanDate, endSpanDate); break; case MatrixSpan.MonthSpan: span = endSpanDate.Month - startSpanDate.Month; break; } for(int index=1;index<=span;index++) if(columnIndex+index<matrix.Columns) matrix[rowIndex, columnIndex+index] = (int)MatrixConstants.SpanField; rowIndex++; }
/// <summary> /// Generic function for creating matrix populated with events /// on appropriate positions. /// </summary> /// <param name="startDate"></param> /// <param name="endDate"></param> /// <param name="period"></param> /// <returns></returns> public IMatrix CreateMatrix(DateTime startDate, DateTime endDate, MatrixSpan period) { // Cycle date DateTime cycleDate = new DateTime(startDate.Ticks); // Maximum Rows per Element int rowsMax = 0; // initialize constants here int columns = 0; // Array list with index'es of columns ArrayList usedColsArray = new ArrayList(); // remove unused items ItemLinkedList items = new ItemLinkedList(); foreach (CalendarItem item in Items) { if(item.EndDate >= startDate && endDate >= item.StartDate) { items.Add(item); } } // Initialized number of columns based on span length switch(period) { case MatrixSpan.WeekHourSpan: case MatrixSpan.HourSpan: // calculates number of hours //columns = (int)((TimeSpan)(endDate - startDate)).TotalHours * 2; //1.2.0: columns = (int)System.Math.Ceiling(((TimeSpan)(Helper.GetHourDate(endDate) // - Helper.GetHourStartDate(startDate))).TotalHours * 2); // changed cause hour span resolution is actually 30 minutes // 1.3.0 columns = (int)System.Math.Ceiling(((TimeSpan)(endDate - startDate)).TotalHours * 2); // changed cause hour span resolution is actually 30 minutes break; case MatrixSpan.WeekDaySpan: case MatrixSpan.DaySpan: columns = Helper.GetDaySpan(startDate, endDate); break; case MatrixSpan.MonthSpan: columns = endDate.Month - startDate.Month; break; } // Create Array consisting of Linked List's for each cell to improve performance object[] llEventsArray = new object[columns]; // Initialize ll array for(int index=0;index<columns;index++) { llEventsArray[index] = new ItemLinkedList(); /* foreach (CalendarItem item in Items) { if(item.IsWithinSpanEvent(period, cycleDate)) { RowsCurrent++; ((ItemLinkedList)llEventsArray[columnIndex]).Add(item); } } // Initialized number of columns based on span length cycleDate = Helper.IncrementDate(period, cycleDate); */ } //TODO: add optimization code here // Add hash table with linked list for each data cell // data cell is a row in day view, month day cell in month view // Calculate maximum number of rows for element #region Optimized CODE /* foreach(CalendarItem item in items) { int startIndex = 0; int endIndex = 0; switch(period) { case MatrixSpan.WeekHourSpan: case MatrixSpan.HourSpan: if(item.StartDate<startDate) { item.EndDate } break; case MatrixSpan.WeekDaySpan: case MatrixSpan.DaySpan: break; case MatrixSpan.MonthSpan: columns = endDate.Month - startDate.Month; break; } ((ItemLinkedList)llEventsArray[columnIndex]).Add(item); } */ /* foreach (CalendarItem item in Items) { int columnIndex = 0; columnIndex = 1; if(this.ViewType == CalendarViewType.DayView && this.MultiOwner && item.Owner != this.CurrentOwner) continue; if(item.IsWithinSpanEvent(MatrixSpan.MonthSpan, cycleDate.Date)) { if(item.StartDate < cycleDate.Date) // first item { ((ItemLinkedList)llEventsArray[columnIndex]).Add(item); } RowsCurrent++; ((ItemLinkedList)llEventsArray[columnIndex]).Add(item); } } */ #endregion #region OLD CODE that was optimized for(int columnIndex=0;columnIndex<columns;columnIndex++) { int RowsCurrent = 0; int itemsPerIncrement = 0; // determines how many items are rendered/started in current increment // Check for workweek foreach (CalendarItem item in items) { if(this.ViewType == CalendarViewType.DayView && this.MultiOwner && item.Owner != this.CurrentOwner) continue; // Skip max number for day view if(this.ViewType != CalendarViewType.DayView && period != MatrixSpan.WeekHourSpan) { if(item.IsCurrentSpanEvent(columnIndex, period, cycleDate)) itemsPerIncrement++; // dont render more than specified if(itemsPerIncrement > this.MaxDisplayedItems && this.MaxDisplayedItems != 0) { // Increment for dummy node RowsCurrent++; ((ItemLinkedList)llEventsArray[columnIndex]).Add(item); break; } } if(item.IsWithinSpanEvent(period, cycleDate)) { RowsCurrent++; ((ItemLinkedList)llEventsArray[columnIndex]).Add(item); } } if(RowsCurrent > rowsMax) rowsMax = RowsCurrent; // Initialized number of columns based on span length cycleDate = Helper.IncrementDate(period, cycleDate); } #endregion // Check if Maximum number of rows is reached and adjust maximum // add 1 extra space for more element index //if(this.ViewType!=CalendarViewType.DayView || this.ViewType!=CalendarViewType.TaskView) //if(this.MaxDisplayedItems < rowsMax) // rowsMax = MaxDisplayedItems + 1; // Item MATRIX, rank = 7 IMatrix matrix = new Matrix(rowsMax, columns); // Initialize matrix with -1 values for (int i = 0; i < rowsMax; i++) for (int j = 0; j < columns; j++) matrix[i,j] = (int)MatrixConstants.EmptyField; // Return cycle back switch(period) { case MatrixSpan.WeekHourSpan: case MatrixSpan.HourSpan: // return cycle back one day cycleDate = cycleDate.AddHours(-24); break; case MatrixSpan.WeekDaySpan: case MatrixSpan.DaySpan: // return cycle back one week cycleDate = cycleDate.AddDays(-7); break; case MatrixSpan.MonthSpan: // return cycle back one week cycleDate = cycleDate.AddMonths(-12); break; } // populate matrix for(int columnIndex=0;columnIndex<columns&&rowsMax>0;columnIndex++) { // Render items within that date int rowIndex = 0; int itemsPerIncrement = 0; // determines how many items are rendered/started in current increment ItemLinkedList llItems = (ItemLinkedList)llEventsArray[columnIndex]; if(llItems.Count > 0) foreach(CalendarItem item in llItems) { /* foreach (CalendarItem item in Items) { */ if(this.ViewType == CalendarViewType.DayView && this.MultiOwner && item.Owner != this.CurrentOwner) continue; // show if current item falls into date span bool foundValue = false; foundValue = item.IsCurrentSpanEvent(columnIndex, period, cycleDate); if(foundValue) itemsPerIncrement++; // Skip max number for day view if(this.ViewType != CalendarViewType.DayView && period != MatrixSpan.WeekHourSpan) { // dont render more than specified if(itemsPerIncrement > this.MaxDisplayedItems && this.MaxDisplayedItems != 0 && rowIndex < rowsMax) { matrix[rowIndex, columnIndex] = (int)MatrixConstants.MoreElementsField; break; } } if(foundValue && rowIndex < rowsMax) PopulateMatrix(item, cycleDate, ref matrix, ref rowIndex, columnIndex, period); } // Initialized number of columns based on span length cycleDate = Helper.IncrementDate(period, cycleDate); } return matrix; }
/* /// <summary> /// Will determine if current event is all day event. /// </summary> /// <param name="item"></param> /// <param name="now"></param> /// <returns></returns> internal static bool IsAllDayEvent(CalendarItem item, DateTime now) { //if((now.Date > item.StartDate || (now.Date >= item.StartDate && item.StartDate.Hour == 0)) && now.Date <= item.EndDate) if(now.Date > item.StartDate.Date && now.Date < item.EndDate.Date) return true; else return false; } /// <summary> /// Determines if event is withing current span /// </summary> /// <param name="span"></param> /// <param name="item"></param> /// <param name="now"></param> /// <returns></returns> internal static bool IsWithinSpanEvent(MatrixSpan span, CalendarItem item, DateTime now) { switch(span) { case MatrixSpan.WeekHourSpan: if(!IsAllDayEvent(item, now) && (item.StartDate.Date == item.EndDate.Date && GetHourStartDate(item.StartDate) <= now && GetHourDate(item.EndDate) >= now)) return true; break; case MatrixSpan.HourSpan: // Don't add up all day events if(!IsAllDayEvent(item, now) && (GetHourStartDate(item.StartDate) <= now && GetHourDate(item.EndDate) >= now)) return true; break; case MatrixSpan.WeekDaySpan: if(item.EndDate.Date >= now.Date && item.StartDate.Date <= now.Date && item.StartDate.Date != item.EndDate.Date) return true; break; case MatrixSpan.DaySpan: if(item.EndDate.Date >= now.Date && item.StartDate.Date <= now.Date) return true; break; case MatrixSpan.MonthSpan: if(item.EndDate >= now && item.StartDate <= now) return true; break; } return false; } /// <summary> /// Determines if current event belongs to the span /// </summary> /// <param name="index"></param> /// <param name="span"></param> /// <param name="item"></param> /// <param name="now"></param> /// <returns></returns> internal static bool IsCurrentSpanEvent(int index, MatrixSpan span, CalendarItem item, DateTime now) { switch(span) { case MatrixSpan.WeekHourSpan: if(!IsAllDayEvent(item, now) && item.EndDate.Date == item.StartDate.Date && ((index==0 && item.EndDate >= now && item.StartDate <= now) || GetHourCycleDate(item.StartDate) == now)) return true; break; case MatrixSpan.HourSpan: // Don't render items spanning from previous days, we use all day section for that //if(!IsAllDayEvent(item, now) && (GetHourCycleDate(item.StartDate) == now || (item.StartDate now == item.EndDate.Date)) //if(!IsAllDayEvent(item, now) && (GetHourStartDate(item.StartDate) <= now && GetHourDate(item.EndDate) >= now)) if(!IsAllDayEvent(item, now) && (index==0 && item.EndDate >= now && item.StartDate <= now) || GetHourCycleDate(item.StartDate) == now) return true; break; case MatrixSpan.WeekDaySpan: // only events spanning multiple days if(((item.StartDate.Date == now) || (index==0 && item.EndDate.Date >= now && item.StartDate.Date <= now)) && item.StartDate.Date != item.EndDate.Date) return true; break; case MatrixSpan.DaySpan: if((item.StartDate.Date == now) || (index==0 && item.EndDate.Date >= now && item.StartDate.Date <= now)) return true; break; case MatrixSpan.MonthSpan: if((item.StartDate == now) || (index==0 && item.EndDate >= now && item.StartDate <= now)) return true; break; } return false; } */ /// <summary> /// Increments Date /// </summary> /// <param name="span"></param> /// <param name="now"></param> /// <returns></returns> public static DateTime IncrementDate(MatrixSpan span, DateTime now) { switch(span) { case MatrixSpan.WeekHourSpan: case MatrixSpan.HourSpan: return now.AddMinutes(30); //return now.AddHours(1); case MatrixSpan.WeekDaySpan: case MatrixSpan.DaySpan: return now.AddDays(1); case MatrixSpan.MonthSpan: return now.AddMonths(1); } return now; }
public bool IsWithinSpanEvent(DateTime startDate, DateTime endDate, MatrixSpan span, DateTime now) { switch(span) { case MatrixSpan.WeekHourSpan: if(!IsAllDayEvent(now) && (startDate.Date == endDate.Date && Helper.GetHourStartDate(startDate) <= now && ((Helper.GetHourDate(endDate) == now && now.Minute!=30) || Helper.GetHourDate(endDate) > now))) return true; break; case MatrixSpan.HourSpan: // Don't add up all day events if(!IsAllDayEvent(now) && (Helper.GetHourStartDate(startDate) <= now && Helper.GetHourDate(endDate) /*>= end date should be greater than now to be included in the span */>= now)) return true; break; case MatrixSpan.WeekDaySpan: // June 16 2004: Added IsAllDayEvent(now) if((endDate.Date >= now.Date && startDate.Date <= now.Date && IsAllDayEvent(now) /*startDate.Date != endDate.Date*/)) return true; break; case MatrixSpan.DaySpan: if(endDate.Date >= now.Date && startDate.Date <= now.Date) return true; break; case MatrixSpan.MonthSpan: if(endDate >= now && startDate <= now) return true; break; } return false; }
/// <summary> /// Determines if event is withing current span /// </summary> /// <param name="span"></param> /// <param name="now"></param> /// <returns></returns> public bool IsWithinSpanEvent(MatrixSpan span, DateTime now) { // June 16 04: added .AddTicks(-1) method call to endDate to allow filter events that end at 0:00 return IsWithinSpanEvent(StartDate, AdjustedEndDate, span, now); }
public bool IsCurrentSpanEvent(DateTime startDate, DateTime endDate, int index, MatrixSpan span, DateTime now) { switch(span) { case MatrixSpan.WeekHourSpan: if(!IsAllDayEvent(now) && endDate.Date == startDate.Date && ((index==0 && endDate >= now && startDate <= now) || Helper.GetHourStartDate(startDate) == now)) return true; break; case MatrixSpan.HourSpan: // Don't render items spanning from previous days, we use all day section for that //if(!IsAllDayEvent(item, now) && (GetHourCycleDate(item.StartDate) == now || (item.StartDate now == item.EndDate.Date)) //if(!IsAllDayEvent(item, now) && (GetHourStartDate(item.StartDate) <= now && GetHourDate(item.EndDate) >= now)) if(!IsAllDayEvent(now) && (index==0 && endDate >= now && startDate <= now) || Helper.GetHourStartDate(startDate) == now && !IsAllDayEvent(now)) return true; break; case MatrixSpan.WeekDaySpan: // only events spanning multiple days // June 16 2004: Added IsAllDayEvent(now) // June 28 2004: Move IsAllDayEvent to new place next to && if(((startDate.Date == now) || (index==0 && endDate.Date >= now && startDate.Date <= now)) && IsAllDayEvent(now)/*startDate.Date != endDate.Date*/) return true; break; case MatrixSpan.DaySpan: if((startDate.Date == now) || (index==0 && endDate.Date >= now && startDate.Date <= now)) return true; break; case MatrixSpan.MonthSpan: if((startDate == now) || (index==0 && endDate >= now && startDate <= now)) return true; break; } return false; }