#if FRAMEWORK20
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using DevComponents.Schedule.Model;
namespace DevComponents.DotNetBar.Schedule
{
    public class AppointmentWeekDayView : AppointmentView
    {
        #region Private variables
        private DayColumn _DayColumn;
        private AllDayPanel _AllDayPanel;
        private eViewEnds _ViewEnds = eViewEnds.Complete;
        #endregion
        /// 
        /// Constructor
        /// 
        /// 
        /// 
        public AppointmentWeekDayView(BaseView baseView, Appointment appointment)
            : base(baseView, appointment)
        {
            SetViewEnds();
        }
        #region Public properties
        /// 
        /// Gets and sets View DayColumn
        /// 
        public DayColumn DayColumn
        {
            get { return (_DayColumn); }
            set { _DayColumn = value; }
        }
        /// 
        /// Gets and sets View AllDayPanel
        /// 
        public AllDayPanel AllDayPanel
        {
            get { return (_AllDayPanel); }
            set
            {
                if (_AllDayPanel != value)
                {
                    _AllDayPanel = value;
                    SetViewEnds();
                }
            }
        }
        #endregion
        #region Private properties
        /// 
        /// Gets the default horizontal padding
        /// 
        private int HorizontalPadding
        {
            get { return (6); }
        }
        /// 
        /// Gets whether the appointment is mutable
        ///  
        private bool IsMutable
        {
            get
            {
                WeekDayView wv = (WeekDayView)BaseView;
                return (IsSelected == true &&
                    wv.IsAllDayItem(this) == false &&
                    Appointment.Locked == false &&
                    Appointment.IsRecurringInstance == false);
            }
        }
        #endregion
        #region Start/End TimeChanged event handling
        /// 
        /// Handles StartTime value changes
        /// 
        /// CalendarItem
        /// EventArgs
        protected override void AppointmentView_StartTimeChanged(object sender, EventArgs e)
        {
            base.AppointmentView_StartTimeChanged(sender, e);
            SetViewEnds();
        }
        /// 
        /// Handles EndTime value changes
        /// 
        /// CalendarItem
        /// EventArgs
        protected override void AppointmentView_EndTimeChanged(object sender, EventArgs e)
        {
            base.AppointmentView_EndTimeChanged(sender, e);
            SetViewEnds();
        }
        #endregion
        #region SetViewEnds
        /// 
        /// Sets the view display end types
        /// 
        private void SetViewEnds()
        {
            if (_AllDayPanel != null)
            {
                _ViewEnds = eViewEnds.Complete;
                int col, n;
                DateTime start = GetDateCol(StartTime, out col, out n);
                DateTime end = start.AddDays(n);
                // Check to see if we can only display
                // a partial representation for the view
                if (col > 0 || start > StartTime)
                    _ViewEnds |= eViewEnds.PartialLeft;
                TimeSpan ts = new TimeSpan(24, 0, 0);
                if (end > EndTime || EndTime - end > ts)
                    _ViewEnds |= eViewEnds.PartialRight;
            }
            else
            {
                _ViewEnds = eViewEnds.PartialLeft | eViewEnds.PartialRight;
            }
        }
        /// 
        /// Gets the initial starting DayColumn col and max col
        /// for the given date
        /// 
        /// Selection date
        /// Column
        /// Max col
        /// 
        private DateTime GetDateCol(DateTime selDate, out int col, out int n)
        {
            DayColumn[] dayColumns = _AllDayPanel.WeekDayView.DayColumns;
            // Loop through each column
            col = 0;
            n = 0;
            for (int i = 0; i < dayColumns.Length; i++)
            {
                DateTime date = dayColumns[i].Date;
                // If we have found our containing column, then
                // calculate the absolute slice value and return it
                if (date.Year >= selDate.Year ||
                    date.Month >= selDate.Month || date.Day >= selDate.Day)
                {
                    col = i;
                    n = dayColumns.Length - col - 1;
                    return (date);
                }
            }
            return (selDate);
        }
        #endregion
        #region Appointment rendering
        /// 
        /// Paint processing
        /// 
        /// ItemPaintArgs
        public override void Paint(ItemPaintArgs e)
        {
            AppointmentColor.SetColorTable();
            Rectangle r = GetViewRect();
            if (r.Width > 1 && r.Height > 0)
            {
                if (EffectiveStyle == eDotNetBarStyle.Office2010 || StyleManager.IsMetro(EffectiveStyle))
                    DrawMetroAppointment(e, r);
                else
                    DrawDefaultAppointment(e, r);
                if (IsMutable == true)
                    DrawResizeHandles(e, r);
            }
        }
        #region DrawDefaultAppointment
        private void DrawDefaultAppointment(ItemPaintArgs e, Rectangle r)
        {
            Graphics g = e.Graphics;
            int top = Math.Min(Math.Min(r.Width / 2, r.Height / 2), 5);
            int bot = top;
            if (DayColumn != null)
            {
                if (StartTime.Date < DayColumn.Date.Date)
                    top = 0;
                if (EndTime.Date > DayColumn.Date.Date.AddDays(1))
                    bot = 0;
            }
            using (GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(r, top, top, bot, bot))
            {
                using (Brush br = BackBrush(r))
                    g.FillPath(br, path);
                if (BaseView.CalendarView.DoAppointmentViewPreRender(this, g, r, path) == false)
                {
                    DrawContent(e, r);
                    BaseView.CalendarView.DoAppointmentViewPostRender(this, g, r, path);
                }
                DrawDefaultBorder(g, top, bot, r, path);
            }
        }
        #region DrawDefaultBorder
        private void DrawDefaultBorder(Graphics g,
            int top, int bot, Rectangle r, GraphicsPath path)
        {
            DrawTimeMarker(g, r, top);
            if (IsSelected == true)
            {
                using (Pen pen = SelectedBorderPen)
                    g.DrawPath(pen, path);
            }
            else
            {
                using (Pen pen = BorderPen)
                    g.DrawPath(pen, path);
            }
        }
        #endregion
        #endregion
        #region DrawMetroAppointment
        private void DrawMetroAppointment(ItemPaintArgs e, Rectangle r)
        {
            Graphics g = e.Graphics;
            using (Brush br = BackBrush(r))
                g.FillRectangle(br, r);
            if (BaseView.CalendarView.DoAppointmentViewPreRender(this, g, r, null) == false)
            {
                DrawContent(e, r);
                BaseView.CalendarView.DoAppointmentViewPostRender(this, g, r, null);
            }
            DrawMetroBorder(g, r);
        }
        #region DrawMetroBorder
        private void DrawMetroBorder(Graphics g, Rectangle r)
        {
            DrawTimeMarker(g, r, 0);
            if (IsSelected == true)
            {
                using (Pen pen = new Pen(Color.Black, 2))
                    g.DrawRectangle(pen, r);
            }
            else
            {
                using (Pen pen = BorderPen)
                    g.DrawRectangle(pen, r);
            }
        }
        #endregion
        #endregion
        #region GetViewRect
        /// 
        /// Gets the view rect for the appointment
        /// 
        /// View rect
        private Rectangle GetViewRect()
        {
            Rectangle r = DisplayRectangle;
            if ((_ViewEnds & eViewEnds.PartialLeft) != eViewEnds.PartialLeft)
            {
                r.X += HorizontalPadding;
                r.Width -= HorizontalPadding;
            }
            if ((_ViewEnds & eViewEnds.PartialRight) != eViewEnds.PartialRight)
                r.Width -= HorizontalPadding;
            // If the view is selected, then allow
            // for a thicker selection rect
            if (IsSelected == true && Appointment.IsMultiDayOrAllDayEvent == false)
                r.Height -= 1;
            return (r);
        }
        #endregion
        #region DrawContent
        /// 
        /// DrawContent
        /// 
        /// 
        /// 
        private void DrawContent(ItemPaintArgs e, Rectangle r)
        {
            Image image = Image;
            Rectangle rText = r;
            rText.X += 4;
            rText.Width -= 6;
            if (Appointment.TimeMarkedAs != null)
            {
                rText.X += 4;
                rText.Width -= 4;
            }
            Rectangle rImage = GetItemBounds(rText, ref rText, image);
            DrawContentImage(e, r, rImage, image);
            DrawContentText(e, rText);
        }
        #region DrawContentText
        /// 
        /// Draws the content text
        /// 
        /// 
        /// 
        private void DrawContentText(ItemPaintArgs e, Rectangle r)
        {
            Graphics g = e.Graphics;
            if (DisplayTemplateText(e, r) == false)
            {
                string s = Appointment.Subject;
                eTextFormat tf = eTextFormat.NoPadding | eTextFormat.NoPrefix;
                WeekDayView wv = BaseView as WeekDayView;
                if (wv != null && wv.IsAllDayItem(Appointment) == false)
                {
                    s += "\n" + Appointment.Description;
                    r.Y += 3;
                    r.Height -= 3;
                    tf |= eTextFormat.WordBreak;
                }
                else
                {
                    tf |= eTextFormat.VerticalCenter;
                }
                Font font = Font ?? e.Font;
                if (r.Width > 4)
                    TextDrawing.DrawString(g, s, font, TextColor, r, tf);
                Size size = TextDrawing.MeasureString(g, s, font, r.Width, tf);
                IsTextClipped = (r.Width < size.Width || r.Height < size.Height);
            }
        }
        #endregion
        #endregion
        #region DrawResizeHandles
        /// 
        /// Draws the resize handles for the view
        /// 
        /// 
        /// View rectangle
        private void DrawResizeHandles(ItemPaintArgs e, Rectangle r)
        {
            if (r.Width > 6)
            {
                Graphics g = e.Graphics;
                Rectangle r2 =
                    new Rectangle(r.X + (r.Width / 2) - 2, r.Y - 3, 5, 5);
                if (DayColumn != null)
                {
                    // Top handle
                    if (StartTime >= DayColumn.Date)
                    {
                        g.FillRectangle(Brushes.White, r2);
                        g.DrawRectangle(Pens.Black, r2);
                    }
                    // Bottom handle
                    if (EndTime <= DayColumn.Date.AddDays(1))
                    {
                        r2.Y = r.Bottom - 2;
                        g.FillRectangle(Brushes.White, r2);
                        g.DrawRectangle(Pens.Black, r2);
                    }
                }
            }
        }
        #endregion
        #endregion
        #region Mouse processing
        #region MouseMove processing
        /// 
        /// Handles mouseDown processing
        /// 
        /// MouseEventArgs
        public override void InternalMouseMove(MouseEventArgs objArg)
        {
            HitArea = GetHitArea(objArg);
            base.InternalMouseMove(objArg);
        }
        /// 
        /// Gets the HitArea from the current
        /// mouse position
        /// 
        /// 
        /// eHitArea
        private eHitArea GetHitArea(MouseEventArgs objArg)
        {
            if (IsMutable == true)
            {
                Rectangle r = GetViewRect();
                Rectangle r2 =
                    new Rectangle(r.X + (r.Width / 2) - 7, r.Y - 7, 14, 14);
                if (DayColumn != null)
                {
                    // See if we are in the top resize area
                    if (StartTime >= DayColumn.Date)
                    {
                        if (r2.Contains(objArg.Location))
                            return (eHitArea.TopResize);
                    }
                    // See if we are in the bottom resize area
                    if (EndTime <= DayColumn.Date.AddDays(1))
                    {
                        r2.Y = r.Bottom - 10;
                        if (r2.Contains(objArg.Location))
                            return (eHitArea.BottomResize);
                    }
                }
                // By default we are in the move area
                return (eHitArea.Move);
            }
            // No valid area to report
            return (eHitArea.None);
        }
        #endregion
        #endregion
    }
}
#endif