#if FRAMEWORK20
using System;
using System.Windows.Forms;
namespace DevComponents.DotNetBar.Schedule
{
    public class WeekView : WeekDayView
    {
        public WeekView(CalendarView calendarView)
            : base(calendarView, eCalendarView.Week)
        {
        }
        #region RecalcSize support
        /// 
        /// Normalizes the user specified start and end dates
        /// 
        /// [out] Normalized start date
        /// [out] Normalized end date
        protected override void NormalizeDates(out DateTime startDate, out DateTime endDate)
        {
            startDate = this.StartDate;
            endDate = this.EndDate;
            DaysOfTheWeek = new DaysOfTheWeek(startDate.DayOfWeek, DaysInWeek);
        }
        #endregion
        #region ProcessUpDownKey
        /// 
        /// Processes Up and Down key events
        /// 
        /// 
        /// 
        protected override void ProcessUpDownKey(KeyEventArgs objArg, int dy)
        {
            if (ValidDateSelection())
            {
                DateTime startDate = CalendarView.DateSelectionStart.Value;
                DateTime endDate = CalendarView.DateSelectionEnd.Value;
                if (startDate.Equals(DateSelectionAnchor.Value) == true)
                    startDate = endDate.AddMinutes(-CalendarView.TimeSlotDuration);
                int col = GetColumnFromDate(startDate);
                startDate = startDate.AddMinutes(dy);
                if (GetColumnFromDate(startDate) == col)
                {
                    if (col < 0)
                    {
                        startDate = CalendarView.DateSelectionStart.Value;
                        col = GetColumnFromDate(startDate);
                    }
                    if (col < 0)
                    {
                        startDate = CalendarView.DateSelectionEnd.Value;
                        col = GetColumnFromDate(startDate);
                    }
                    if (col >= 0)
                    {
                        endDate = startDate.AddMinutes(CalendarView.TimeSlotDuration);
                        DateTime sd = DayColumns[col].Date.AddMinutes(CalendarView.StartSlice * CalendarView.TimeSlotDuration);
                        DateTime ed = sd.AddMinutes(CalendarView.NumberOfActiveSlices * CalendarView.TimeSlotDuration);
                        if (startDate >= sd && endDate <= ed)
                        {
                            ExtendSelection(ref startDate, ref endDate);
                            CalendarView.DateSelectionStart = startDate;
                            CalendarView.DateSelectionEnd = endDate;
                            EnsureSelectionVisible();
                        }
                    }
                }
            }
            objArg.Handled = true;
        }
        #endregion
        #region ProcessLeftRightKey
        /// 
        /// Processes Left and Right Key events
        /// 
        /// 
        /// 
        protected override void ProcessLeftRightKey(KeyEventArgs objArg, int dx)
        {
            objArg.Handled = true;
            if (ValidDateSelection())
            {
                DateTime startDate = CalendarView.DateSelectionStart.Value;
                DateTime endDate = CalendarView.DateSelectionEnd.Value;
                bool newRange = (startDate < DayColumns[0].Date ||
                                 endDate > DayColumns[NumberOfColumns - 1].Date.AddDays(1));
                if (CalendarView.WeekDayCanExtendRange == true || newRange == false)
                {
                    bool cancelled = false;
                    if ((objArg.Modifiers & Keys.Shift) == Keys.Shift)
                    {
                        if (startDate.Equals(DateSelectionAnchor.Value) == true)
                            startDate = endDate.AddMinutes(-CalendarView.TimeSlotDuration);
                        startDate = startDate.AddDays(dx);
                        endDate = startDate.AddMinutes(CalendarView.TimeSlotDuration);
                        if (IsNewRange(startDate, endDate) == true)
                        {
                            if (CalendarView.WeekDayCanExtendRange == false)
                                return;
                            cancelled = CalendarView.DoViewDateChanging(this,
                                StartDate, EndDate, ref startDate, ref endDate);
                            if (cancelled == false)
                                CalendarView.EnsureVisible(startDate, startDate.AddDays(1));
                        }
                        ExtendSelection(ref startDate, ref endDate);
                    }
                    else
                    {
                        startDate = startDate.AddDays(dx);
                        endDate = endDate.AddDays(dx);
                        if (IsNewRange(startDate, endDate) == true)
                        {
                            if (CalendarView.WeekDayCanExtendRange == false)
                                return;
                            cancelled = CalendarView.DoViewDateChanging(this,
                               StartDate, EndDate, ref startDate, ref endDate);
                            if (cancelled == false)
                                CalendarView.EnsureVisible(startDate, startDate.AddDays(1));
                        }
                        DateSelectionAnchor = startDate;
                    }
                    if (cancelled == false)
                    {
                        CalendarView.DateSelectionStart = startDate;
                        CalendarView.DateSelectionEnd = endDate;
                    }
                    EnsureSelectionVisible();
                }
            }
        }
        private bool IsNewRange(DateTime startDate, DateTime endDate)
        {
            return (startDate < DayColumns[0].Date ||
                    endDate > DayColumns[NumberOfColumns - 1].Date.AddDays(1));
        }
        #endregion
    }
}
#endif