コード例 #1
0
ファイル: Helper.cs プロジェクト: alex765022/IBN
        /*
         * /// <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);
        }
コード例 #2
0
ファイル: Calendar.cs プロジェクト: 0anion0/IBN
        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++;
        }
コード例 #3
0
ファイル: Calendar.cs プロジェクト: 0anion0/IBN
        /// <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;
        }
コード例 #4
0
ファイル: Helper.cs プロジェクト: 0anion0/IBN
        /*
        /// <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;
        }
コード例 #5
0
ファイル: CalendarItem.cs プロジェクト: 0anion0/IBN
 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;
 }
コード例 #6
0
ファイル: CalendarItem.cs プロジェクト: 0anion0/IBN
 /// <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);
 }
コード例 #7
0
ファイル: CalendarItem.cs プロジェクト: 0anion0/IBN
        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;
        }