public static DatesInterval ConvertBack(GroupHeaderTypes groupHeaderType)
        {
            var endOfToday = DateTime.MaxValue;
            var today      = DateTime.Today;

            var endOfYesterday = today.AddMilliseconds(-1);
            var yesterday      = today.AddDays(-1);

            var endOfThisWeek = yesterday.AddMilliseconds(-1);
            var thisWeek      = today.AddDays(-1 * (int)today.DayOfWeek);

            var endOfThisMonth = thisWeek.AddMilliseconds(-1);
            var thisMonth      = new DateTime(today.Year, today.Month, 1);

            var endOfLastMonth = thisMonth.AddMilliseconds(-1);
            var lastMonth      = thisMonth.AddMonths(-1);

            var endOfThisYear = lastMonth.AddMilliseconds(-1);
            var thisYear      = new DateTime(today.Year, 1, 1);

            var endOfLastYear = thisYear.AddMilliseconds(-1);
            var lastYear      = new DateTime(today.Year - 1, 1, 1);

            var endOfLongAgo = lastYear.AddMilliseconds(-1);
            var longAgo      = DateTime.MinValue;

            switch (groupHeaderType)
            {
            case GroupHeaderTypes.All:
            {
                return(new DatesInterval(DateTime.MinValue, DateTime.MaxValue));
            }

            case GroupHeaderTypes.Today:
            {
                return(new DatesInterval(today, endOfToday));
            }

            case GroupHeaderTypes.Yesterday:
            {
                return(new DatesInterval(yesterday, endOfYesterday));
            }

            case GroupHeaderTypes.ThisWeek:
            {
                return(new DatesInterval(thisWeek, endOfThisWeek));
            }

            case GroupHeaderTypes.ThisMonth:
            {
                return(new DatesInterval(thisMonth, endOfThisMonth));
            }

            case GroupHeaderTypes.LastMonth:
            {
                return(new DatesInterval(lastMonth, endOfLastMonth));
            }

            case GroupHeaderTypes.ThisYear:
            {
                return(new DatesInterval(thisYear, endOfThisYear));
            }

            case GroupHeaderTypes.LastYear:
            {
                return(new DatesInterval(lastYear, endOfLastYear));
            }

            case GroupHeaderTypes.LongAgo:
            {
                return(new DatesInterval(longAgo, endOfLongAgo));
            }

            default:
            {
                throw new NotSupportedException("Not supported group header.");
            }
            }
        }
 public ElementWithGroupHeader(GroupHeaderTypes groupHeaderType, IElementWithDate element)
 {
     this.GroupHeaderType = groupHeaderType;
     this.Element         = element;
 }