1084 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1084 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if FRAMEWORK20
 | 
						|
using System;
 | 
						|
using System.Drawing;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.Globalization;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Schedule
 | 
						|
{
 | 
						|
    public class TimeLineHeaderPanel : BaseItem
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
 | 
						|
        private CalendarView _CalendarView;         // Assoc CalendarView
 | 
						|
 | 
						|
        private int _HScrollPos;                    // Horizontal scroll position
 | 
						|
 | 
						|
        private CalendarWeekDayColor _ViewColor =   // View display color table
 | 
						|
            new CalendarWeekDayColor(eCalendarColor.Automatic);
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Constructor
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="calendarView"></param>
 | 
						|
        public TimeLineHeaderPanel(CalendarView calendarView)
 | 
						|
        {
 | 
						|
            _CalendarView = calendarView;
 | 
						|
 | 
						|
            MouseUpNotification = true;
 | 
						|
            Name = "TimeLineHeaderPanel";
 | 
						|
 | 
						|
            HookEvents(true);
 | 
						|
        }
 | 
						|
 | 
						|
        #region Private properties
 | 
						|
 | 
						|
        #region Column properties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the ColumnWidth
 | 
						|
        /// </summary>
 | 
						|
        private int ColumnWidth
 | 
						|
        {
 | 
						|
            get { return (_CalendarView.TimeLineColumnWidth); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TimeLineColumnCount
 | 
						|
        /// </summary>
 | 
						|
        private int ColumnCount
 | 
						|
        {
 | 
						|
            get { return (_CalendarView.TimeLineColumnCount); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Header properties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the ShowPeriodHeader property
 | 
						|
        /// </summary>
 | 
						|
        private bool ShowPeriodHeader
 | 
						|
        {
 | 
						|
            get { return (_CalendarView.TimeLineShowPeriodHeader); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the ShowIntervalHeader property
 | 
						|
        /// </summary>
 | 
						|
        private bool ShowIntervalHeader
 | 
						|
        {
 | 
						|
            get { return (_CalendarView.TimeLineShowIntervalHeader); }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Interval header height
 | 
						|
        /// </summary>
 | 
						|
        private int IntervalHeaderHeight
 | 
						|
        {
 | 
						|
            get { return (_CalendarView.TimeLineIntervalHeaderHeight); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Period header height
 | 
						|
        /// </summary>
 | 
						|
        private int PeriodHeaderHeight
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return (ShowPeriodHeader && _CalendarView.TimeLinePeriodHeaderHeight > 0 ?
 | 
						|
                    _CalendarView.TimeLinePeriodHeaderHeight - 1 : 0);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Header font
 | 
						|
        /// </summary>
 | 
						|
        private Font HeaderFont
 | 
						|
        {
 | 
						|
            get { return (_CalendarView.Font); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region StartDate
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// TimeLine start date
 | 
						|
        /// </summary>
 | 
						|
        private DateTime StartDate
 | 
						|
        {
 | 
						|
            get { return (_CalendarView.TimeLineViewStartDate); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets and sets the view color
 | 
						|
        /// </summary>
 | 
						|
        public eCalendarColor CalendarColor
 | 
						|
        {
 | 
						|
            get { return (_ViewColor.ColorSch); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _ViewColor.ColorSch = value;
 | 
						|
                Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region HookEvents
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Routine hooks all necessary events for this control
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="hook">True to hook, false to unhook</param>
 | 
						|
        private void HookEvents(bool hook)
 | 
						|
        {
 | 
						|
            if (hook == true)
 | 
						|
            {
 | 
						|
                _CalendarView.TimeLineIntervalChanged += TimeLineIntervalChanged;
 | 
						|
                _CalendarView.TimeLineIntervalPeriodChanged += TimeLineIntervalPeriodChanged;
 | 
						|
                _CalendarView.TimeIndicatorsChanged += TimeIndicatorCollectionChanged;
 | 
						|
                _CalendarView.TimeIndicatorTimeChanged += TimeIndicatorTimeChanged;
 | 
						|
 | 
						|
                _CalendarView.TimeLineHScrollPanel.ScrollPanelChanged += ScrollPanelChanged;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                _CalendarView.TimeLineIntervalChanged -= TimeLineIntervalChanged;
 | 
						|
                _CalendarView.TimeLineIntervalPeriodChanged -= TimeLineIntervalPeriodChanged;
 | 
						|
                _CalendarView.TimeIndicatorsChanged -= TimeIndicatorCollectionChanged;
 | 
						|
                _CalendarView.TimeIndicatorTimeChanged -= TimeIndicatorTimeChanged;
 | 
						|
 | 
						|
                _CalendarView.TimeLineHScrollPanel.ScrollPanelChanged -= ScrollPanelChanged;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Event processing
 | 
						|
 | 
						|
        #region TimeLineIntervalPeriodChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// TimeLineIntervalPeriod Change notification
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        void TimeLineIntervalPeriodChanged(object sender, TimeLineIntervalPeriodChangedEventArgs e)
 | 
						|
        {
 | 
						|
            Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TimeLineIntervalChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// TimeLineInterval Change notification
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        void TimeLineIntervalChanged(object sender, TimeLineIntervalChangedEventArgs e)
 | 
						|
        {
 | 
						|
            Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TimeIndicatorCollectionChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles TimeIndicatorCollectionChanged events
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        void TimeIndicatorCollectionChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TimeIndicatorTimeChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles TimeIndicatorTimeChanged events
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        void TimeIndicatorTimeChanged(object sender, TimeIndicatorTimeChangedEventArgs e)
 | 
						|
        {
 | 
						|
            Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ScrollPanelChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Horizontal Scroll Panel change notification
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        void ScrollPanelChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            _HScrollPos = -_CalendarView.TimeLineHScrollPanel.ScrollBar.Value *
 | 
						|
                _CalendarView.TimeLineColumnWidth;
 | 
						|
 | 
						|
            // Redraw our view
 | 
						|
 | 
						|
            Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IsMarkupSupported
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// IsMarkupSupported
 | 
						|
        /// </summary>
 | 
						|
        protected override bool IsMarkupSupported
 | 
						|
        {
 | 
						|
            get { return (_CalendarView != null ?
 | 
						|
                _CalendarView.TimeLinePeriodHeaderEnableMarkup : true); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetViewAreaFromPoint
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the view area under the given mouse point
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="pt">Point</param>
 | 
						|
        /// <returns>eViewArea</returns>
 | 
						|
        public eViewArea GetViewAreaFromPoint(Point pt)
 | 
						|
        {
 | 
						|
            if (Bounds.Contains(pt) == true)
 | 
						|
            {
 | 
						|
                if (ShowPeriodHeader == true)
 | 
						|
                {
 | 
						|
                    if (pt.Y < PeriodHeaderHeight)
 | 
						|
                        return (eViewArea.InPeriodHeader);
 | 
						|
                }
 | 
						|
 | 
						|
                return (eViewArea.InIntervalHeader);
 | 
						|
            }
 | 
						|
 | 
						|
            return (eViewArea.NotInView);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetIntervalDateFromPoint
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the IntervalHeader Start Date under the given mouse point
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="pt">Point</param>
 | 
						|
        /// <param name="startDate">ref to interval start date.</param>
 | 
						|
        /// <returns>'true' if valid date is returned.</returns>
 | 
						|
        public bool GetIntervalDateFromPoint(Point pt, ref DateTime startDate)
 | 
						|
        {
 | 
						|
            if (GetViewAreaFromPoint(pt) == eViewArea.InIntervalHeader)
 | 
						|
            {
 | 
						|
                int scol = -_HScrollPos / ColumnWidth;
 | 
						|
                int ecol = (-_HScrollPos + Bounds.Width + ColumnWidth - 2) / ColumnWidth;
 | 
						|
 | 
						|
                DateTime date = _CalendarView.TimeLineAddInterval(StartDate, scol);
 | 
						|
 | 
						|
                for (int i = scol; i <= ecol; i++)
 | 
						|
                {
 | 
						|
                    Rectangle r = GetColumnRect(i);
 | 
						|
 | 
						|
                    if (r.Contains(pt) == true)
 | 
						|
                    {
 | 
						|
                        startDate = date;
 | 
						|
 | 
						|
                        return (true);
 | 
						|
                    }
 | 
						|
 | 
						|
                    date = _CalendarView.TimeLineAddInterval(date, 1);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return (false);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Paint processing
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Paint processing routine
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        public override void Paint(ItemPaintArgs e)
 | 
						|
        {
 | 
						|
            if (ShowPeriodHeader == true || ShowIntervalHeader == true)
 | 
						|
            {
 | 
						|
                // Set our current color table
 | 
						|
 | 
						|
                _ViewColor.SetColorTable();
 | 
						|
 | 
						|
                // Only draw something if we have something to draw
 | 
						|
 | 
						|
                if (_CalendarView.TimeLineColumnCount > 0)
 | 
						|
                {
 | 
						|
                    // Draw our calendar parts
 | 
						|
 | 
						|
                    int colStart, colEnd;
 | 
						|
 | 
						|
                    if (GetColRange(e.ClipRectangle, out colStart, out colEnd) > 0)
 | 
						|
                    {
 | 
						|
                        Region rgnSave = e.Graphics.Clip;
 | 
						|
 | 
						|
                        using (Region rgn = new Region(Bounds))
 | 
						|
                        {
 | 
						|
                            e.Graphics.Clip = rgn;
 | 
						|
 | 
						|
                            if (ShowPeriodHeader == true)
 | 
						|
                                DrawDateHeader(e);
 | 
						|
 | 
						|
                            if (ShowIntervalHeader == true)
 | 
						|
                                DrawIntervalHeader(e, colStart, colEnd);
 | 
						|
                        }
 | 
						|
 | 
						|
                        e.Graphics.Clip = rgnSave;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region DrawDateHeader
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the encompassing Date header
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">ItemPaintArgs</param>
 | 
						|
        private void DrawDateHeader(ItemPaintArgs e)
 | 
						|
        {
 | 
						|
            int scol = -_HScrollPos / ColumnWidth;
 | 
						|
            int ecol = (-_HScrollPos + Bounds.Width + ColumnWidth - 2) / ColumnWidth;
 | 
						|
 | 
						|
            DateTime date1 = _CalendarView.TimeLineAddInterval(StartDate, scol);
 | 
						|
            DateTime date2 = date1;
 | 
						|
 | 
						|
            for (int i = scol + 1; i < ecol; i++)
 | 
						|
            {
 | 
						|
                date2 = _CalendarView.TimeLineAddInterval(StartDate, i);
 | 
						|
 | 
						|
                if (PeriodChange(date1, date2, i) == true)
 | 
						|
                {
 | 
						|
                    DrawDatePeriod(e, scol, i - 1, date1, date2.AddMinutes(-1));
 | 
						|
 | 
						|
                    scol = i;
 | 
						|
                    date1 = date2;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            DrawDatePeriod(e, scol, ecol, date1, date2);
 | 
						|
        }
 | 
						|
 | 
						|
        #region PeriodChange
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Determines if a date period change has occurred
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date1">Initial date</param>
 | 
						|
        /// <param name="date2">Current date</param>
 | 
						|
        /// <param name="col">Current column</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private bool PeriodChange(DateTime date1, DateTime date2, int col)
 | 
						|
        {
 | 
						|
            switch (_CalendarView.TimeLinePeriod)
 | 
						|
            {
 | 
						|
                case eTimeLinePeriod.Days:
 | 
						|
                    if (_CalendarView.TimeLineInterval == 1)
 | 
						|
                        return (date1.Month != date2.Month);
 | 
						|
 | 
						|
                    return (date1.Year != date2.Year);
 | 
						|
 | 
						|
                case eTimeLinePeriod.Years:
 | 
						|
                    return ((col > 0) && (col % 10 == 0));
 | 
						|
 | 
						|
                default:
 | 
						|
                    return (date1.Day != date2.Day);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawDatePeriod
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws a given date period or range
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        /// <param name="scol">Starting column</param>
 | 
						|
        /// <param name="ecol">Ending column</param>
 | 
						|
        /// <param name="startDate"></param>
 | 
						|
        /// <param name="endDate"></param>
 | 
						|
        private void DrawDatePeriod(ItemPaintArgs e,
 | 
						|
            int scol, int ecol, DateTime startDate, DateTime endDate)
 | 
						|
        {
 | 
						|
            Graphics g = e.Graphics;
 | 
						|
 | 
						|
            Rectangle rs = GetColumnRect(scol);
 | 
						|
            Rectangle re = GetColumnRect(ecol);
 | 
						|
 | 
						|
            Rectangle r = new Rectangle(rs.X, rs.Y, re.Right - rs.X, PeriodHeaderHeight);
 | 
						|
 | 
						|
            // Keep us in bounds
 | 
						|
 | 
						|
            if (r.X < Bounds.X)
 | 
						|
            {
 | 
						|
                r.Width -= (Bounds.X - r.X);
 | 
						|
                r.X = Bounds.X;
 | 
						|
            }
 | 
						|
 | 
						|
            if (r.Right > Bounds.Right)
 | 
						|
                r.Width -= (r.Right - Bounds.Right) + 1;
 | 
						|
 | 
						|
            if (r.Width > 0 && r.Height > 0)
 | 
						|
            {
 | 
						|
                // Fill the area
 | 
						|
 | 
						|
                using (Brush lbr =
 | 
						|
                    _ViewColor.BrushPart((int)eCalendarWeekDayPart.DayHeaderBackground, r))
 | 
						|
                {
 | 
						|
                    g.FillRectangle(lbr, r);
 | 
						|
                }
 | 
						|
 | 
						|
                // Format the period text and output it both
 | 
						|
                // vertically and horizontally centered
 | 
						|
 | 
						|
                string text = GetDatePeriodText(ref startDate, ref endDate);
 | 
						|
 | 
						|
                if (_CalendarView.DoTimeLineViewRenderPeriodHeader(g, startDate, endDate, r, ref text) == false)
 | 
						|
                {
 | 
						|
                    if (String.IsNullOrEmpty(text) == false)
 | 
						|
                    {
 | 
						|
                        Text = text;
 | 
						|
 | 
						|
                        if (IsUsingTextMarkup)
 | 
						|
                        {
 | 
						|
                            TextMarkup.MarkupDrawContext d =
 | 
						|
                                new TextMarkup.MarkupDrawContext(g, HeaderFont, _ViewColor.GetColor(
 | 
						|
                                    (int) eCalendarWeekDayPart.DayHeaderForeground), IsRightToLeft);
 | 
						|
 | 
						|
                            TextMarkupBodyMeasure(new Size(5000, 5000), d);
 | 
						|
                            
 | 
						|
                            TextMarkupBodyArrange(new Rectangle(Point.Empty, TextMarkupBodyBounds.Size), d);
 | 
						|
 | 
						|
                            TextMarkupBodyBounds = AlignMarkUpText(r);
 | 
						|
 | 
						|
                            RenderMarkup(g, d);
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                        {
 | 
						|
                            Size sz = TextDrawing.MeasureString(g, Text, HeaderFont);
 | 
						|
 | 
						|
                            eTextFormat tf = eTextFormat.VerticalCenter;
 | 
						|
 | 
						|
                            switch (_CalendarView.TimeLinePeriodHeaderAlignment)
 | 
						|
                            {
 | 
						|
                                case eItemAlignment.Center:
 | 
						|
                                    if (sz.Width < r.Width)
 | 
						|
                                        tf |= eTextFormat.HorizontalCenter;
 | 
						|
                                    break;
 | 
						|
 | 
						|
                                case eItemAlignment.Far:
 | 
						|
                                    if (sz.Width < r.Width)
 | 
						|
                                        tf |= eTextFormat.Right;
 | 
						|
                                    break;
 | 
						|
                            }
 | 
						|
 | 
						|
                            // Draw the text
 | 
						|
 | 
						|
                            TextDrawing.DrawString(g, Text, HeaderFont, _ViewColor.GetColor(
 | 
						|
                                (int) eCalendarWeekDayPart.DayHeaderForeground), r, tf);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                // Draw the border
 | 
						|
 | 
						|
                using (Pen pen = new Pen(
 | 
						|
                    _ViewColor.GetColor((int)eCalendarWeekDayPart.DayHeaderBorder)))
 | 
						|
                {
 | 
						|
                    g.DrawRectangle(pen, r);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region AlignMarkUpText
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Aligns the MarkUp text
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="r"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private Rectangle AlignMarkUpText(Rectangle r)
 | 
						|
        {
 | 
						|
            if (r.Height > TextMarkupBodyBounds.Height)
 | 
						|
                r.Y += (r.Height - TextMarkupBodyBounds.Height) / 2;
 | 
						|
 | 
						|
            if (r.Width > TextMarkupBodyBounds.Width)
 | 
						|
            {
 | 
						|
                switch (_CalendarView.TimeLinePeriodHeaderAlignment)
 | 
						|
                {
 | 
						|
                    case eItemAlignment.Center:
 | 
						|
                        r.X += (r.Width - TextMarkupBodyBounds.Width) / 2;
 | 
						|
                        break;
 | 
						|
 | 
						|
                    case eItemAlignment.Far:
 | 
						|
                        r.X += (r.Width - TextMarkupBodyBounds.Width);
 | 
						|
                        break;
 | 
						|
 | 
						|
                    default:
 | 
						|
                        r.X += 3;
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return (r);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderMarkup
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Renders the current MarkUp
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="d"></param>
 | 
						|
        private void RenderMarkup(Graphics g, TextMarkup.MarkupDrawContext d)
 | 
						|
        {
 | 
						|
            Region oldClip = g.Clip;
 | 
						|
            Rectangle clipRect = TextMarkupBodyBounds;
 | 
						|
 | 
						|
            g.SetClip(clipRect, CombineMode.Intersect);
 | 
						|
 | 
						|
            TextMarkupBodyRender(d);
 | 
						|
 | 
						|
            g.Clip = oldClip;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetDatePeriodText
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the default Period text
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="startDate"></param>
 | 
						|
        /// <param name="endDate"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private string GetDatePeriodText(ref DateTime startDate, ref DateTime endDate)
 | 
						|
        {
 | 
						|
            // Days text
 | 
						|
 | 
						|
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Days)
 | 
						|
            {
 | 
						|
                if (_CalendarView.TimeLineInterval == 1)
 | 
						|
                    return (startDate.ToString("y"));
 | 
						|
 | 
						|
                return (startDate.Year.ToString());
 | 
						|
            }
 | 
						|
 | 
						|
            // Years text
 | 
						|
 | 
						|
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Years)
 | 
						|
            {
 | 
						|
                int n = _CalendarView.TimeLineInterval * 10;
 | 
						|
                int m = startDate.Year - _CalendarView.TimeLineViewStartDate.Year;
 | 
						|
 | 
						|
                m = (m / n) * n;
 | 
						|
 | 
						|
                startDate = _CalendarView.TimeLineViewStartDate.AddYears(m);
 | 
						|
                endDate = startDate.AddYears(n - 1);
 | 
						|
 | 
						|
                return (startDate.Year + " - " + endDate.Year);
 | 
						|
            }
 | 
						|
 | 
						|
            // Everything else
 | 
						|
 | 
						|
            return (startDate.Date.ToShortDateString());
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawIntervalHeader
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the time interval header
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">ItemPaintArgs</param>
 | 
						|
        /// <param name="colStart">Starting column</param>
 | 
						|
        /// <param name="colEnd">Ending column</param>
 | 
						|
        private void DrawIntervalHeader(ItemPaintArgs e, int colStart, int colEnd)
 | 
						|
        {
 | 
						|
            Graphics g = e.Graphics;
 | 
						|
 | 
						|
            Rectangle rs = GetColumnRect(colStart);
 | 
						|
            Rectangle re = GetColumnRect(colEnd);
 | 
						|
 | 
						|
            Rectangle r = new Rectangle(rs.X, rs.Y + PeriodHeaderHeight,
 | 
						|
                re.Right - rs.X, IntervalHeaderHeight);
 | 
						|
 | 
						|
            if (r.Width > 0 && r.Height > 0)
 | 
						|
            {
 | 
						|
                DrawBackground(g, r);
 | 
						|
                DrawTimeIndicators(g, colStart, colEnd, r);
 | 
						|
                DrawContent(g, colStart, colEnd, r);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region DrawBackground
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// DrawBackground
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="r"></param>
 | 
						|
        private void DrawBackground(Graphics g, Rectangle r)
 | 
						|
        {
 | 
						|
            using (Brush lbr = _ViewColor.BrushPart((int)eCalendarWeekDayPart.DayHeaderBackground, r))
 | 
						|
                g.FillRectangle(lbr, r);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawTimeIndicators
 | 
						|
 | 
						|
        #region DrawTimeIndicators
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws view TimeIndicators
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="colStart"></param>
 | 
						|
        /// <param name="colEnd"></param>
 | 
						|
        /// <param name="r"></param>
 | 
						|
        private void DrawTimeIndicators(Graphics g,
 | 
						|
            int colStart, int colEnd, Rectangle r)
 | 
						|
        {
 | 
						|
            DateTime start = _CalendarView.TimeLineAddInterval(StartDate, colStart);
 | 
						|
            DateTime end = _CalendarView.TimeLineAddInterval(StartDate, colEnd);
 | 
						|
 | 
						|
            for (int i = 0; i < _CalendarView.TimeIndicators.Count; i++)
 | 
						|
            {
 | 
						|
                TimeIndicator ti = _CalendarView.TimeIndicators[i];
 | 
						|
 | 
						|
                if (ti.IndicatorArea == eTimeIndicatorArea.All ||
 | 
						|
                    ti.IndicatorArea == eTimeIndicatorArea.Header)
 | 
						|
                {
 | 
						|
                    if (ti.IsVisible())
 | 
						|
                    {
 | 
						|
                        DateTime time = ti.IndicatorDisplayTime;
 | 
						|
 | 
						|
                        if (time >= start && time < end)
 | 
						|
                            DrawTimeIndicator(g, start, r, ti);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawTimeIndicator
 | 
						|
 | 
						|
        #region DrawTimeIndicator
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws individual view TimeIndicator
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="startDate"></param>
 | 
						|
        /// <param name="sRect"></param>
 | 
						|
        /// <param name="ti"></param>
 | 
						|
        private void DrawTimeIndicator(Graphics g,
 | 
						|
            DateTime startDate, Rectangle sRect, TimeIndicator ti)
 | 
						|
        {
 | 
						|
            Rectangle r = GetIndicatorRect(ti, startDate, sRect);
 | 
						|
 | 
						|
            if (r.IntersectsWith(sRect) == true)
 | 
						|
            {
 | 
						|
                if (r.Width > 0)
 | 
						|
                {
 | 
						|
                    ColorDef cdef = GetIndicatorColor(ti);
 | 
						|
 | 
						|
                    if (cdef != null)
 | 
						|
                    {
 | 
						|
                        float angle = cdef.Angle - 90;
 | 
						|
 | 
						|
                        using (Brush br = _ViewColor.BrushPart(cdef, r, angle))
 | 
						|
                        {
 | 
						|
                            if (br is LinearGradientBrush)
 | 
						|
                                ((LinearGradientBrush) br).WrapMode = WrapMode.TileFlipX;
 | 
						|
 | 
						|
                            g.FillRectangle(br, r);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                Color color = GetIndicatorBorder(ti);
 | 
						|
 | 
						|
                if (color.IsEmpty == false)
 | 
						|
                {
 | 
						|
                    using (Pen pen = new Pen(color))
 | 
						|
                        g.DrawLine(pen, r.Right, r.Top, r.Right, r.Bottom - 1);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetIndicatorColor
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Indicator Back color
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="ti"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private ColorDef GetIndicatorColor(TimeIndicator ti)
 | 
						|
        {
 | 
						|
            ColorDef cdef = ti.IndicatorColor;
 | 
						|
            
 | 
						|
            if (cdef == null || cdef.IsEmpty == true)
 | 
						|
                cdef = _ViewColor.GetColorDef((int)eCalendarWeekDayPart.TimeIndicator);
 | 
						|
 | 
						|
            return (cdef);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetIndicatorBorder
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Indicator Border color
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="ti"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private Color GetIndicatorBorder(TimeIndicator ti)
 | 
						|
        {
 | 
						|
            return (ti.BorderColor.IsEmpty == false ? ti.BorderColor :
 | 
						|
                _ViewColor.GetColor((int)eCalendarWeekDayPart.TimeIndicatorBorder));
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetIndicatorRect
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// CalcIndicatorRect
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="ti"></param>
 | 
						|
        /// <param name="startDate"></param>
 | 
						|
        /// <param name="sRect"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private Rectangle GetIndicatorRect(
 | 
						|
            TimeIndicator ti, DateTime startDate, Rectangle sRect)
 | 
						|
        {
 | 
						|
            double x = ColumnWidth / _CalendarView.BaseInterval;
 | 
						|
 | 
						|
            int offset = (int)((ti.IndicatorDisplayTime - startDate).TotalMinutes * x);
 | 
						|
 | 
						|
            sRect.X += (offset - ti.Thickness - 1);
 | 
						|
            sRect.Width = ti.Thickness;
 | 
						|
 | 
						|
            return (sRect);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DrawContent
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// DrawContent
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="colStart"></param>
 | 
						|
        /// <param name="colEnd"></param>
 | 
						|
        /// <param name="r"></param>
 | 
						|
        private void DrawContent(Graphics g,
 | 
						|
            int colStart, int colEnd, Rectangle r)
 | 
						|
        {
 | 
						|
            bool dcDay = _CalendarView.HighlightCurrentDay == true &&
 | 
						|
                _CalendarView.TimeLinePeriod == eTimeLinePeriod.Days && _CalendarView.TimeLineInterval == 1;
 | 
						|
 | 
						|
            DateTime now = DateTime.Now.Date;
 | 
						|
            DateTime date = _CalendarView.TimeLineAddInterval(StartDate, colStart);
 | 
						|
 | 
						|
            r.Width = ColumnWidth;
 | 
						|
 | 
						|
            int x = -1;
 | 
						|
 | 
						|
            using (Pen pen = new Pen(
 | 
						|
                _ViewColor.GetColor((int)eCalendarWeekDayPart.DayHeaderBorder)))
 | 
						|
            {
 | 
						|
                // Loop through each column, drawing the
 | 
						|
                // time text in the header area
 | 
						|
 | 
						|
                for (int i = colStart; i <= colEnd; i++)
 | 
						|
                {
 | 
						|
                    if (dcDay == false || date.Date.Equals(now) == false)
 | 
						|
                    {
 | 
						|
                        // Draw the text and header border
 | 
						|
 | 
						|
                        TextDrawing.DrawString(g, GetIntervalText(date), HeaderFont,
 | 
						|
                                               _ViewColor.GetColor((int) eCalendarWeekDayPart.DayHeaderForeground),
 | 
						|
                                               r, eTextFormat.VerticalCenter | eTextFormat.HorizontalCenter);
 | 
						|
 | 
						|
                        g.DrawRectangle(pen, r);
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        x = r.X;
 | 
						|
                    }
 | 
						|
 | 
						|
                    date = _CalendarView.TimeLineAddInterval(date, 1);
 | 
						|
 | 
						|
                    r.X += ColumnWidth;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (x >= 0)
 | 
						|
            {
 | 
						|
                r.X = x;
 | 
						|
 | 
						|
                using (Brush br = _ViewColor.BrushPart((int)eCalendarWeekDayPart.NowDayHeaderBackground, r))
 | 
						|
                    g.FillRectangle(br, r);
 | 
						|
 | 
						|
                TextDrawing.DrawString(g, GetIntervalText(now), HeaderFont,
 | 
						|
                                       _ViewColor.GetColor((int)eCalendarWeekDayPart.NowDayHeaderForeground),
 | 
						|
                                       r, eTextFormat.VerticalCenter | eTextFormat.HorizontalCenter);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(_ViewColor.GetColor((int)eCalendarWeekDayPart.NowDayHeaderBorder)))
 | 
						|
                    g.DrawRectangle(pen, r);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region GetIntervalText
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the interval text
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date">DateTime</param>
 | 
						|
        /// <returns>Interval text</returns>
 | 
						|
        public string GetIntervalText(DateTime date)
 | 
						|
        {
 | 
						|
            string s;
 | 
						|
 | 
						|
            switch (_CalendarView.TimeLinePeriod)
 | 
						|
            {
 | 
						|
                case eTimeLinePeriod.Days:
 | 
						|
                    s = GetDayIntervalText(date);
 | 
						|
                    break;
 | 
						|
 | 
						|
                case eTimeLinePeriod.Years:
 | 
						|
                    s = GetYearIntervalText(date);
 | 
						|
                    break;
 | 
						|
 | 
						|
                default:
 | 
						|
                    s = GetMinuteIntervalText(date);
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
 | 
						|
            _CalendarView.DoTimeLineGetHeaderText(this, date, ref s);
 | 
						|
 | 
						|
            return (s);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets minute interval text
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date">DateTime</param>
 | 
						|
        /// <returns>Interval text</returns>
 | 
						|
        private string GetMinuteIntervalText(DateTime date)
 | 
						|
        {
 | 
						|
            if (_CalendarView.Is24HourFormat == true)
 | 
						|
                return (date.ToString("t", DateTimeFormatInfo.InvariantInfo));
 | 
						|
            
 | 
						|
            return (date.ToString("t", null));
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets Day interval text
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date"></param>
 | 
						|
        /// <returns>Interval text</returns>
 | 
						|
        private string GetDayIntervalText(DateTime date)
 | 
						|
        {
 | 
						|
            DateTimeFormatInfo dtfi =
 | 
						|
                ScheduleSettings.GetActiveCulture().DateTimeFormat;
 | 
						|
 | 
						|
            string s = dtfi.MonthDayPattern;
 | 
						|
 | 
						|
            s = s.Replace("MMMM", "M");
 | 
						|
            s = s.Replace(" ", dtfi.DateSeparator);
 | 
						|
 | 
						|
            return (date.ToString(s));
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets year interval text
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date"></param>
 | 
						|
        /// <returns>Interval text</returns>
 | 
						|
        private string GetYearIntervalText(DateTime date)
 | 
						|
        {
 | 
						|
            return (date.Year.ToString());
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetColumnRect
 | 
						|
 | 
						|
        private Rectangle GetColumnRect(int col)
 | 
						|
        {
 | 
						|
            int x = Bounds.X + (col * ColumnWidth) + _HScrollPos;
 | 
						|
 | 
						|
            return (new Rectangle(x, Bounds.Y,
 | 
						|
                ColumnWidth, Bounds.Height));
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetColRange
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Calculates the range of days needed to be drawn
 | 
						|
        /// to satisfy the specified paint request
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="clip">Clip rectangle</param>
 | 
						|
        /// <param name="colStart">[out] Column start index</param>
 | 
						|
        /// <param name="colEnd">[out] Column end index</param>
 | 
						|
        /// <returns>Day range count (end - start)</returns>
 | 
						|
        private int GetColRange(Rectangle clip, out int colStart, out int colEnd)
 | 
						|
        {
 | 
						|
            // Calc our starting index
 | 
						|
 | 
						|
            int start = -_HScrollPos / ColumnWidth;
 | 
						|
            int x = Bounds.X + start * ColumnWidth + _HScrollPos;
 | 
						|
 | 
						|
            while (start < ColumnCount)
 | 
						|
            {
 | 
						|
                if (x + ColumnWidth > clip.X)
 | 
						|
                    break;
 | 
						|
 | 
						|
                x += ColumnWidth;
 | 
						|
 | 
						|
                start++;
 | 
						|
            }
 | 
						|
 | 
						|
            // Calc our ending index
 | 
						|
 | 
						|
            int end = start;
 | 
						|
 | 
						|
            while (end < ColumnCount)
 | 
						|
            {
 | 
						|
                if (x >= clip.Right)
 | 
						|
                    break;
 | 
						|
 | 
						|
                x += ColumnWidth;
 | 
						|
 | 
						|
                end++;
 | 
						|
            }
 | 
						|
 | 
						|
            end++;
 | 
						|
 | 
						|
            // Set the user supplied 'out' values, and
 | 
						|
            // return the range count to the caller
 | 
						|
 | 
						|
            if (end - start == 0)
 | 
						|
            {
 | 
						|
                colStart = 0;
 | 
						|
                colEnd = 0;
 | 
						|
 | 
						|
                return (0);
 | 
						|
            }
 | 
						|
 | 
						|
            colStart = start;
 | 
						|
            colEnd = end;
 | 
						|
 | 
						|
            return (end - start);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IDisposable Members
 | 
						|
 | 
						|
        protected override void Dispose(bool disposing)
 | 
						|
        {
 | 
						|
            if (disposing == true && IsDisposed == false)
 | 
						|
                HookEvents(false);
 | 
						|
 | 
						|
            base.Dispose(disposing);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Copy
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns copy of the item.
 | 
						|
        /// </summary>
 | 
						|
        public override BaseItem Copy()
 | 
						|
        {
 | 
						|
            TimeLineHeaderPanel objCopy = new TimeLineHeaderPanel(_CalendarView);
 | 
						|
            CopyToItem(objCopy);
 | 
						|
 | 
						|
            return (objCopy);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Copies the TimeLineHeaderPanel specific properties to new instance of the item.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="copy">New TimeLineHeaderPanel instance</param>
 | 
						|
        protected override void CopyToItem(BaseItem copy)
 | 
						|
        {
 | 
						|
            TimeLineHeaderPanel objCopy = copy as TimeLineHeaderPanel;
 | 
						|
 | 
						|
            if (objCopy != null)
 | 
						|
            {
 | 
						|
                base.CopyToItem(objCopy);
 | 
						|
 | 
						|
                objCopy.CalendarColor = this.CalendarColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif
 | 
						|
 |