2687 lines
		
	
	
		
			103 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			2687 lines
		
	
	
		
			103 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if FRAMEWORK20
 | 
						|
using System;
 | 
						|
using System.Text;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.Globalization;
 | 
						|
using System.Data;
 | 
						|
using System.Windows.Forms;
 | 
						|
using DevComponents.DotNetBar;
 | 
						|
using DevComponents.DotNetBar.Animation;
 | 
						|
using DevComponents.DotNetBar.Rendering;
 | 
						|
 | 
						|
namespace DevComponents.Editors.DateTimeAdv
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Represents the container that presents single calendar month.
 | 
						|
    /// </summary>
 | 
						|
    [ToolboxItem(false), DesignTimeVisible(false), Designer("DevComponents.DotNetBar.Design.ItemContainerDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
 | 
						|
    public class SingleMonthCalendar : CalendarBase
 | 
						|
    {
 | 
						|
        private const string NavigationContainerName = "navigationContainer";
 | 
						|
        #region Private Variables
 | 
						|
        internal static readonly Size _DefaultDaySize = new Size(24, 15);
 | 
						|
        internal static readonly Size _DefaultNavigationButtonSize = new Size(13, 18);
 | 
						|
        private const string NavMonthLabel = "monthLabel";
 | 
						|
        private const string NavYearLabel = "yearLabel";
 | 
						|
        private const string NavDecreaseMonth = "decreaseMonth";
 | 
						|
        private const string NavIncreaseMonth = "increaseMonth";
 | 
						|
        private const string NavDecreaseYear = "decreaseYear";
 | 
						|
        private const string NavIncreaseYear = "increaseYear";
 | 
						|
        //private const string MonthsPopupMenu = "monthsPopupMenu";
 | 
						|
        //private ButtonItem _MonthsPopupMenu = null;
 | 
						|
        private YearSelectorControl _YearSelector = null;
 | 
						|
        private MonthSelectorControl _MonthSelector = null;
 | 
						|
        private YearSelectorContainer _YearSelectionItem = null;
 | 
						|
        private MonthSelectorContainer _MonthSelectionItem = null;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Events
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when month displayed by the item has changed.
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler MonthChanged;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs before the month that is displayed is changed.
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler MonthChanging;
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when child label representing days is rendered and it allows you to override default rendering.
 | 
						|
        /// </summary>
 | 
						|
        public event DayPaintEventHandler PaintLabel;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when mouse button is pressed over the day/week label inside of the calendar.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Description("Occurs when mouse button is pressed over the day/week label inside of the calendar.")]
 | 
						|
        public event System.Windows.Forms.MouseEventHandler LabelMouseDown;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when mouse button is released over day/week label inside of the calendar.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Description("Occurs when mouse button is released over day/week label inside of the calendar.")]
 | 
						|
        public event System.Windows.Forms.MouseEventHandler LabelMouseUp;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when mouse enters the day/week label inside of the calendar.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Description("Occurs when mouse enters the day/week label inside of the calendar.")]
 | 
						|
        public event EventHandler LabelMouseEnter;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when mouse leaves the day/week label inside of the calendar.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Description("Occurs when mouse leaves the day/week label inside of the calendar.")]
 | 
						|
        public event EventHandler LabelMouseLeave;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when mouse moves over the day/week label inside of the calendar.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Description("Occurs when mouse moves over the day/week label inside of the calendar.")]
 | 
						|
        public event System.Windows.Forms.MouseEventHandler LabelMouseMove;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when mouse remains still inside an day/week label of the calendar for an amount of time.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Description("Occurs when mouse remains still inside an day/week label of the calendar for an amount of time.")]
 | 
						|
        public event EventHandler LabelMouseHover;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when SelectedDate property has changed.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Description("Occurs when SelectedDate property has changed.")]
 | 
						|
        public event EventHandler DateChanged;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Constructor
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the CalendarMonth class.
 | 
						|
        /// </summary>
 | 
						|
        public SingleMonthCalendar()
 | 
						|
        {
 | 
						|
            _FirstDayOfWeek = DateTimeInput.GetActiveCulture().DateTimeFormat.FirstDayOfWeek;
 | 
						|
            m_IsContainer = true;
 | 
						|
            this.AutoCollapseOnClick = true;
 | 
						|
            this.MouseUpNotification = true;
 | 
						|
            this.AccessibleRole = System.Windows.Forms.AccessibleRole.Grouping;
 | 
						|
            _Colors.Parent = this;
 | 
						|
            for (int i = 0; i < 49; i++)
 | 
						|
            {
 | 
						|
                DayLabel day = new DayLabel();
 | 
						|
                day.Visible = false;
 | 
						|
                this.SubItems.Add(day);
 | 
						|
            }
 | 
						|
 | 
						|
            // Add navigation container
 | 
						|
            Size fixedButtonSize = _DefaultNavigationButtonSize;
 | 
						|
            ItemContainer cont = new ItemContainer();
 | 
						|
            cont.Name = NavigationContainerName;
 | 
						|
            cont.AutoCollapseOnClick = false;
 | 
						|
            cont.MinimumSize = new Size(0, fixedButtonSize.Height + 3);
 | 
						|
            cont.LayoutOrientation = eOrientation.Horizontal;
 | 
						|
            cont.HorizontalItemAlignment = eHorizontalItemsAlignment.Center;
 | 
						|
            cont.VerticalItemAlignment = eVerticalItemsAlignment.Middle;
 | 
						|
            cont.ItemSpacing = 2;
 | 
						|
            ButtonItem nav = new ButtonItem(NavDecreaseMonth);
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"left\"/>";
 | 
						|
            nav.Click += new EventHandler(MonthNavigationDecreaseClick);
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
            LabelItem label = new LabelItem(NavMonthLabel);
 | 
						|
            label.AutoCollapseOnClick = false;
 | 
						|
            label.GlobalItem = false;
 | 
						|
            label.TextAlignment = StringAlignment.Center;
 | 
						|
            label.TextLineAlignment = StringAlignment.Center;
 | 
						|
            label.PaddingBottom = 2;
 | 
						|
            label.Click += new EventHandler(ShowMonthSelection);
 | 
						|
            label.Cursor = Cursors.Hand;
 | 
						|
            cont.SubItems.Add(label);
 | 
						|
            nav = new ButtonItem(NavIncreaseMonth);
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"right\"/>";
 | 
						|
            nav.Click += new EventHandler(MonthNavigationIncreaseClick);
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
 | 
						|
            // Year Navigation
 | 
						|
            nav = new ButtonItem(NavDecreaseYear);
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"left\"/>";
 | 
						|
            nav.Click += new EventHandler(YearNavigationDecreaseClick);
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
            label = new LabelItem(NavYearLabel);
 | 
						|
            label.AutoCollapseOnClick = false;
 | 
						|
            label.GlobalItem = false;
 | 
						|
            label.TextAlignment = StringAlignment.Center;
 | 
						|
            label.TextLineAlignment = StringAlignment.Center;
 | 
						|
            label.PaddingBottom = 2;
 | 
						|
            label.Click += ShowYearSelection;
 | 
						|
            label.Cursor = Cursors.Hand;
 | 
						|
            cont.SubItems.Add(label);
 | 
						|
            nav = new ButtonItem(NavIncreaseYear);
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"right\"/>";
 | 
						|
            nav.Click += new EventHandler(YearNavigationIncreaseClick);
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
 | 
						|
            //_MonthsPopupMenu = new ButtonItem(MonthsPopupMenu);
 | 
						|
            //_MonthsPopupMenu.Visible = false;
 | 
						|
            //cont.SubItems.Add(_MonthsPopupMenu);
 | 
						|
 | 
						|
            this.SubItems.Add(cont);
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        private bool _MonthSelectionMode = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates whether calendar is used in month selection mode which shows only month and year.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Category("Behavior"), Description("Indicates whether calendar is used in month selection mode which shows only month and year.")]
 | 
						|
        public bool MonthSelectionMode
 | 
						|
        {
 | 
						|
            get { return _MonthSelectionMode; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _MonthSelectionMode)
 | 
						|
                {
 | 
						|
                    bool oldValue = _MonthSelectionMode;
 | 
						|
                    _MonthSelectionMode = value;
 | 
						|
                    OnMonthSelectionModeChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Called when MonthSelectionMode property has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="oldValue">Old property value</param>
 | 
						|
        /// <param name="newValue">New property value</param>
 | 
						|
        protected virtual void OnMonthSelectionModeChanged(bool oldValue, bool newValue)
 | 
						|
        {
 | 
						|
            if (newValue)
 | 
						|
            {
 | 
						|
                _MonthSelectionItem = new MonthSelectorContainer();
 | 
						|
                _MonthSelectionItem.FixedSize = new Size(162, 140);
 | 
						|
                if (_SelectedDate != DateTime.MinValue)
 | 
						|
                    _MonthSelectionItem.SelectedMonth = this.SelectedDate.Month;
 | 
						|
                _MonthSelectionItem.SelectedMonthChanged += new EventHandler(MonthSelectionItemSelectedMonthChanged);
 | 
						|
                _MonthSelectionItem.UseMonthNames = _MonthSelectorShortMonthNames;
 | 
						|
                this.SubItems.Add(_MonthSelectionItem);
 | 
						|
                _YearSelectionItem = new YearSelectorContainer();
 | 
						|
                _YearSelectionItem.FixedSize = new Size(162, 140);
 | 
						|
                if (_SelectedDate != DateTime.MinValue)
 | 
						|
                    _YearSelectionItem.SelectedYear = this.SelectedDate.Year;
 | 
						|
                _YearSelectionItem.SelectedYearChanged += new EventHandler(YearSelectionItemSelectedYearChanged);
 | 
						|
                this.SubItems.Add(_YearSelectionItem);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                this.SubItems.Remove(_MonthSelectionItem);
 | 
						|
                this.SubItems.Remove(_YearSelectionItem);
 | 
						|
                _MonthSelectionItem.Dispose();
 | 
						|
                _MonthSelectionItem = null;
 | 
						|
                _YearSelectionItem.Dispose();
 | 
						|
                _YearSelectionItem = null;
 | 
						|
                this.DisplayMonth = _DisplayMonth;
 | 
						|
            }
 | 
						|
            NeedRecalcSize = true;
 | 
						|
            OnAppearanceChanged();
 | 
						|
            //OnPropertyChanged(new PropertyChangedEventArgs("MonthSelectionMode"));
 | 
						|
        }
 | 
						|
        internal void DropDownClosed()
 | 
						|
        {
 | 
						|
            if (_YearSelectionItem != null)
 | 
						|
                _YearSelectionItem.RemoveCenturySelector();
 | 
						|
        }
 | 
						|
        void YearSelectionItemSelectedYearChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_SelectedDate != DateTime.MinValue)
 | 
						|
            {
 | 
						|
                DateTime dt=new DateTime(_YearSelectionItem.SelectedYear, _SelectedDate.Month, _SelectedDate.Day, _SelectedDate.Hour, _SelectedDate.Minute, _SelectedDate.Second, _SelectedDate.Kind);
 | 
						|
                DisplayMonth = dt;
 | 
						|
                this.SelectedDate = dt;
 | 
						|
            }
 | 
						|
            else if (!_MonthSelectionItem.IsEmpty)
 | 
						|
            {
 | 
						|
                DateTime dt = new DateTime(_YearSelectionItem.SelectedYear, _MonthSelectionItem.SelectedMonth, 1);
 | 
						|
                DisplayMonth = dt;
 | 
						|
                this.SelectedDate = dt;
 | 
						|
            }
 | 
						|
            //else 
 | 
						|
            //    this.SelectedDate = new DateTime(_YearSelectionItem.SelectedYear, DateTime.Now.Month, 1);
 | 
						|
        }
 | 
						|
 | 
						|
        void MonthSelectionItemSelectedMonthChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_SelectedDate != DateTime.MinValue)
 | 
						|
            {
 | 
						|
                int selectedDay = Math.Min(_SelectedDate.Day,
 | 
						|
                    DateTimeInput.GetActiveCulture()
 | 
						|
                        .Calendar.GetDaysInMonth(_SelectedDate.Year, _MonthSelectionItem.SelectedMonth));
 | 
						|
                DateTime dt = new DateTime(_SelectedDate.Year, _MonthSelectionItem.SelectedMonth, selectedDay, _SelectedDate.Hour, _SelectedDate.Minute, _SelectedDate.Second, _SelectedDate.Kind);
 | 
						|
                DisplayMonth = dt;
 | 
						|
                this.SelectedDate = dt;
 | 
						|
            }
 | 
						|
            else if (_YearSelectionItem.SelectedYear > 0)
 | 
						|
            {
 | 
						|
                DateTime dt = new DateTime(_YearSelectionItem.SelectedYear, _MonthSelectionItem.SelectedMonth, 1);
 | 
						|
                DisplayMonth = dt;
 | 
						|
                this.SelectedDate = dt;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private bool _YearSelectionEnabled = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether Year/Century selection is enabled.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Behavior"), Description("Indicates whether Year/Century selection is enabled.")]
 | 
						|
        public bool YearSelectionEnabled
 | 
						|
        {
 | 
						|
            get { return _YearSelectionEnabled; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_YearSelectionEnabled != value)
 | 
						|
                {
 | 
						|
                    _YearSelectionEnabled = value;
 | 
						|
                    ItemContainer nav = GetNavigationContainer();
 | 
						|
                    if (nav != null)
 | 
						|
                    {
 | 
						|
                        LabelItem label = nav.SubItems[NavYearLabel] as LabelItem;
 | 
						|
                        if (label != null)
 | 
						|
                        {
 | 
						|
                            label.Cursor = _YearSelectionEnabled ? Cursors.Hand : null;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _MonthSelectorShortMonthNames = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates whether month selector which is displayed when month label is clicked is using abbreviated month names instead of month number.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Behavior"), Description("Indicates whether month selector which is displayed when month label is clicked is using abbreviated month names instead of month number.")]
 | 
						|
        public bool MonthSelectorShortMonthNames
 | 
						|
        {
 | 
						|
            get { return _MonthSelectorShortMonthNames; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _MonthSelectorShortMonthNames = value;
 | 
						|
                if (_MonthSelectionItem != null)
 | 
						|
                    _MonthSelectionItem.UseMonthNames = _MonthSelectorShortMonthNames;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private eCurrentSingleMonthCalendarOperation _CurrentOperation = eCurrentSingleMonthCalendarOperation.None;
 | 
						|
        private void ShowYearSelection(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_YearSelector != null || !_YearSelectionEnabled || _CurrentOperation != eCurrentSingleMonthCalendarOperation.None || this.Parent is MonthCalendarItem && (((MonthCalendarItem)this.Parent).CalendarDimensions.Width > 1 || ((MonthCalendarItem)this.Parent).CalendarDimensions.Height > 1))
 | 
						|
                return;
 | 
						|
            _CurrentOperation = eCurrentSingleMonthCalendarOperation.AnimatingShowYearSelector;
 | 
						|
            _YearSelector = new YearSelectorControl();
 | 
						|
            _YearSelector.Size = new Size(8, 8);
 | 
						|
            _YearSelector.Location = new Point(this.LeftInternal + (this.WidthInternal - 8) / 2, this.TopInternal + (this.HeightInternal - 8) / 2);
 | 
						|
            _YearSelector.Visible = true;
 | 
						|
            _YearSelector.Style = eDotNetBarStyle.StyleManagerControlled;
 | 
						|
 | 
						|
            if (BarFunctions.IsOffice2007Style(this.Style))
 | 
						|
            {
 | 
						|
                Office2007ColorTable table = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
 | 
						|
                ElementStyle es = (ElementStyle)table.StyleClasses[ElementStyleClassKeys.ItemPanelKey];
 | 
						|
                _YearSelector.BackgroundStyle.BackColor = es.BackColor;
 | 
						|
                _YearSelector.BackgroundStyle.BackColor2 = es.BackColor2;
 | 
						|
            }
 | 
						|
            else
 | 
						|
                _YearSelector.BackgroundStyle.BackColor = SystemColors.Window;
 | 
						|
            ItemContainer nav = GetNavigationContainer();
 | 
						|
            LabelItem label = nav.SubItems[NavMonthLabel] as LabelItem;
 | 
						|
 | 
						|
            if (!StyleManager.IsMetro(this.EffectiveStyle))
 | 
						|
                _YearSelector.YearSelector.TextColor = label.ForeColor;
 | 
						|
 | 
						|
            Control cc = (Control)this.ContainerControl;
 | 
						|
            cc.Controls.Add(_YearSelector);
 | 
						|
            _YearSelector.YearSelector.CenturyYearStart = (this.DisplayMonth.Year / 10) * 10;
 | 
						|
            _YearSelector.YearSelector.SelectedYear = this.DisplayMonth.Year;
 | 
						|
            Rectangle targetBounds = this.Bounds;
 | 
						|
 | 
						|
            _YearSelector.YearSelector.SelectedYearChanged += YearSelectorSelectedYearChanged;
 | 
						|
 | 
						|
            DevComponents.DotNetBar.Animation.AnimationRectangle anim = new DevComponents.DotNetBar.Animation.AnimationRectangle(
 | 
						|
                new AnimationRequest(_YearSelector, "Bounds", targetBounds),
 | 
						|
                DevComponents.DotNetBar.Animation.AnimationEasing.EaseInOutQuad, 200);
 | 
						|
            anim.AutoDispose = true;
 | 
						|
            anim.AnimationCompleted += ShowAnimationCompleted;
 | 
						|
            anim.Start();
 | 
						|
 | 
						|
        }
 | 
						|
        private void ShowAnimationCompleted(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            _CurrentOperation = eCurrentSingleMonthCalendarOperation.None;
 | 
						|
        }
 | 
						|
        private void YearSelectorSelectedYearChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_CurrentOperation != eCurrentSingleMonthCalendarOperation.None)
 | 
						|
                return;
 | 
						|
            RemoveYearSelector(true);
 | 
						|
 | 
						|
            DateTime newDisplayMonth = new DateTime(_YearSelector.YearSelector.SelectedYear, this.DisplayMonth.Month, this.DisplayMonth.Day);
 | 
						|
            if (newDisplayMonth < MinDate)
 | 
						|
                newDisplayMonth = MinDate;
 | 
						|
            else if (newDisplayMonth > MaxDate)
 | 
						|
                newDisplayMonth = MaxDate;
 | 
						|
            SetDisplayMonth(newDisplayMonth.Month, newDisplayMonth.Year, eEventSource.Mouse);
 | 
						|
        }
 | 
						|
        private void RemoveYearSelector(bool animate)
 | 
						|
        {
 | 
						|
            if (_CurrentOperation == eCurrentSingleMonthCalendarOperation.AnimatingHideYearSelector) return;
 | 
						|
            if (animate)
 | 
						|
            {
 | 
						|
                _CurrentOperation = eCurrentSingleMonthCalendarOperation.AnimatingHideYearSelector;
 | 
						|
                Rectangle targetBounds = new Rectangle(this.LeftInternal + (this.WidthInternal - 8) / 2, this.TopInternal + (this.HeightInternal - 8) / 2, 8, 8);
 | 
						|
                DevComponents.DotNetBar.Animation.AnimationRectangle anim = new DevComponents.DotNetBar.Animation.AnimationRectangle(
 | 
						|
                    new AnimationRequest(_YearSelector, "Bounds", targetBounds),
 | 
						|
                    DevComponents.DotNetBar.Animation.AnimationEasing.EaseInOutQuad, 200);
 | 
						|
                anim.AnimationCompleted += AnimationCompleted;
 | 
						|
                anim.Start();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (_YearSelector.Parent != null)
 | 
						|
                    _YearSelector.Parent.Controls.Remove(_YearSelector);
 | 
						|
                _YearSelector.YearSelector.SelectedYearChanged -= YearSelectorSelectedYearChanged;
 | 
						|
                _YearSelector.Dispose();
 | 
						|
                _YearSelector = null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        void AnimationCompleted(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            DevComponents.DotNetBar.Animation.AnimationRectangle anim = (DevComponents.DotNetBar.Animation.AnimationRectangle)sender;
 | 
						|
            anim.Dispose();
 | 
						|
            if (_YearSelector.Parent != null)
 | 
						|
                _YearSelector.Parent.Controls.Remove(_YearSelector);
 | 
						|
            _YearSelector.YearSelector.SelectedYearChanged -= YearSelectorSelectedYearChanged;
 | 
						|
            _YearSelector.Dispose();
 | 
						|
            _YearSelector = null;
 | 
						|
            _CurrentOperation = eCurrentSingleMonthCalendarOperation.None;
 | 
						|
        }
 | 
						|
        private void ShowMonthSelection(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_MonthSelector != null || _CurrentOperation != eCurrentSingleMonthCalendarOperation.None || this.Parent is MonthCalendarItem && (((MonthCalendarItem)this.Parent).CalendarDimensions.Width > 1 || ((MonthCalendarItem)this.Parent).CalendarDimensions.Height > 1))
 | 
						|
                return;
 | 
						|
            if (!HeaderNavigationEnabled) return;
 | 
						|
 | 
						|
            _CurrentOperation = eCurrentSingleMonthCalendarOperation.AnimatingShowMonthSelector;
 | 
						|
            _MonthSelector = new MonthSelectorControl();
 | 
						|
            _MonthSelector.Size = new Size(8, 8);
 | 
						|
            _MonthSelector.Location = new Point(this.LeftInternal + (this.WidthInternal - 8) / 2, this.TopInternal + (this.HeightInternal - 8) / 2);
 | 
						|
            _MonthSelector.MonthSelector.UseMonthNames = _MonthSelectorShortMonthNames;
 | 
						|
            _MonthSelector.Visible = true;
 | 
						|
            _MonthSelector.Style = eDotNetBarStyle.StyleManagerControlled;
 | 
						|
 | 
						|
            if (BarFunctions.IsOffice2007Style(this.Style))
 | 
						|
            {
 | 
						|
                Office2007ColorTable table = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
 | 
						|
                ElementStyle es = (ElementStyle)table.StyleClasses[ElementStyleClassKeys.ItemPanelKey];
 | 
						|
                _MonthSelector.BackgroundStyle.BackColor = es.BackColor;
 | 
						|
                _MonthSelector.BackgroundStyle.BackColor2 = es.BackColor2;
 | 
						|
            }
 | 
						|
            else
 | 
						|
                _MonthSelector.BackgroundStyle.BackColor = SystemColors.Window;
 | 
						|
            ItemContainer nav = GetNavigationContainer();
 | 
						|
            LabelItem label = nav.SubItems[NavMonthLabel] as LabelItem;
 | 
						|
 | 
						|
            if (!StyleManager.IsMetro(this.EffectiveStyle))
 | 
						|
                _MonthSelector.MonthSelector.TextColor = label.ForeColor;
 | 
						|
 | 
						|
            Control cc = (Control)this.ContainerControl;
 | 
						|
            cc.Controls.Add(_MonthSelector);
 | 
						|
            _MonthSelector.MonthSelector.SelectedMonth = this.DisplayMonth.Month;
 | 
						|
            Rectangle targetBounds = this.Bounds;
 | 
						|
 | 
						|
            _MonthSelector.MonthSelector.SelectedMonthChanged += MonthSelectorSelectedMonthChanged;
 | 
						|
 | 
						|
            DevComponents.DotNetBar.Animation.AnimationRectangle anim = new DevComponents.DotNetBar.Animation.AnimationRectangle(
 | 
						|
                new AnimationRequest(_MonthSelector, "Bounds", targetBounds),
 | 
						|
                DevComponents.DotNetBar.Animation.AnimationEasing.EaseInOutQuad, 200);
 | 
						|
            anim.AutoDispose = true;
 | 
						|
            anim.AnimationCompleted += ShowAnimationCompleted;
 | 
						|
            anim.Start();
 | 
						|
 | 
						|
        }
 | 
						|
        private void MonthSelectorSelectedMonthChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_CurrentOperation != eCurrentSingleMonthCalendarOperation.None)
 | 
						|
                return;
 | 
						|
            RemoveMonthSelector(true);
 | 
						|
 | 
						|
            DateTime newDisplayMonth = new DateTime(this.DisplayMonth.Year, _MonthSelector.MonthSelector.SelectedMonth, this.DisplayMonth.Day);
 | 
						|
            if (newDisplayMonth < MinDate)
 | 
						|
                newDisplayMonth = MinDate;
 | 
						|
            else if (newDisplayMonth > MaxDate)
 | 
						|
                newDisplayMonth = MaxDate;
 | 
						|
            SetDisplayMonth(newDisplayMonth.Month, newDisplayMonth.Year, eEventSource.Mouse);
 | 
						|
        }
 | 
						|
        private void RemoveMonthSelector(bool animate)
 | 
						|
        {
 | 
						|
            if (_CurrentOperation == eCurrentSingleMonthCalendarOperation.AnimatingHideMonthSelector) return;
 | 
						|
            if (animate)
 | 
						|
            {
 | 
						|
                _CurrentOperation = eCurrentSingleMonthCalendarOperation.AnimatingHideMonthSelector;
 | 
						|
                Rectangle targetBounds = new Rectangle(this.LeftInternal + (this.WidthInternal - 8) / 2, this.TopInternal + (this.HeightInternal - 8) / 2, 8, 8);
 | 
						|
                DevComponents.DotNetBar.Animation.AnimationRectangle anim = new DevComponents.DotNetBar.Animation.AnimationRectangle(
 | 
						|
                    new AnimationRequest(_MonthSelector, "Bounds", targetBounds),
 | 
						|
                    DevComponents.DotNetBar.Animation.AnimationEasing.EaseInOutQuad, 200);
 | 
						|
                anim.AnimationCompleted += MonthSelectorAnimationCompleted;
 | 
						|
                anim.Start();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (_MonthSelector.Parent != null)
 | 
						|
                    _MonthSelector.Parent.Controls.Remove(_MonthSelector);
 | 
						|
                _MonthSelector.MonthSelector.SelectedMonthChanged -= MonthSelectorSelectedMonthChanged;
 | 
						|
                _MonthSelector.Dispose();
 | 
						|
                _MonthSelector = null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        void MonthSelectorAnimationCompleted(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            DevComponents.DotNetBar.Animation.AnimationRectangle anim = (DevComponents.DotNetBar.Animation.AnimationRectangle)sender;
 | 
						|
            anim.Dispose();
 | 
						|
            if (_MonthSelector.Parent != null)
 | 
						|
                _MonthSelector.Parent.Controls.Remove(_MonthSelector);
 | 
						|
            _MonthSelector.MonthSelector.SelectedMonthChanged -= MonthSelectorSelectedMonthChanged;
 | 
						|
            _MonthSelector.Dispose();
 | 
						|
            _MonthSelector = null;
 | 
						|
            _CurrentOperation = eCurrentSingleMonthCalendarOperation.None;
 | 
						|
        }
 | 
						|
 | 
						|
        //private void ShowMonthSelectionPopupMenu(object sender, EventArgs e)
 | 
						|
        //{
 | 
						|
        //    if (!HeaderNavigationEnabled) return;
 | 
						|
 | 
						|
        //    ButtonItem parent = _MonthsPopupMenu;
 | 
						|
        //    foreach (BaseItem item in parent.SubItems)
 | 
						|
        //    {
 | 
						|
        //        item.Click -= new EventHandler(PopupMonthSelectionClick);
 | 
						|
        //    }
 | 
						|
        //    parent.SubItems.Clear();
 | 
						|
 | 
						|
        //    string[] months = DateTimeInput.GetActiveCulture().DateTimeFormat.MonthNames;
 | 
						|
        //    for (int i = 0; i < months.Length; i++)
 | 
						|
        //    {
 | 
						|
        //        if (months[i] == null || months[i].Length == 0) continue;
 | 
						|
 | 
						|
        //        ButtonItem m = new ButtonItem((i + 1).ToString(), months[i]);
 | 
						|
        //        m.AutoCollapseOnClick = false;
 | 
						|
        //        parent.SubItems.Add(m);
 | 
						|
        //        m.Click += new EventHandler(PopupMonthSelectionClick);
 | 
						|
        //    }
 | 
						|
 | 
						|
        //    parent.Popup(Control.MousePosition);
 | 
						|
        //}
 | 
						|
 | 
						|
        private void PopupMonthSelectionClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            ButtonItem b = sender as ButtonItem;
 | 
						|
            if (b == null) return;
 | 
						|
            int month = int.Parse(b.Name);
 | 
						|
            ((PopupItem)b.Parent).Expanded = false;
 | 
						|
            SetDisplayMonth(month, this.DisplayMonth.Year, eEventSource.Mouse);
 | 
						|
        }
 | 
						|
 | 
						|
        public override void RecalcSize()
 | 
						|
        {
 | 
						|
            Point innerLocation = m_Rect.Location;
 | 
						|
            bool disposeStyle = false;
 | 
						|
            ElementStyle style = ElementStyleDisplay.GetElementStyle(this.BackgroundStyle, out disposeStyle);
 | 
						|
            innerLocation.X += ElementStyleLayout.LeftWhiteSpace(style); // m_BackgroundStyle.PaddingLeft + m_BackgroundStyle.MarginLeft;
 | 
						|
            innerLocation.Y += ElementStyleLayout.TopWhiteSpace(style);
 | 
						|
 | 
						|
            if (_MonthSelectionMode)
 | 
						|
            {
 | 
						|
                foreach (BaseItem item in this.SubItems)
 | 
						|
                {
 | 
						|
                    item.Displayed = false;
 | 
						|
                }
 | 
						|
 | 
						|
                _MonthSelectionItem.LeftInternal = innerLocation.X;
 | 
						|
                _MonthSelectionItem.TopInternal = innerLocation.Y + 22;
 | 
						|
                _MonthSelectionItem.RecalcSize();
 | 
						|
                _MonthSelectionItem.Displayed = true;
 | 
						|
                _YearSelectionItem.LeftInternal = innerLocation.X + _MonthSelectionItem.WidthInternal;
 | 
						|
                _YearSelectionItem.TopInternal = innerLocation.Y;
 | 
						|
                _YearSelectionItem.RecalcSize();
 | 
						|
                _YearSelectionItem.Displayed = true;
 | 
						|
                m_Rect.Width = _MonthSelectionItem.WidthInternal + _YearSelectionItem.WidthInternal;
 | 
						|
                m_Rect.Height = Math.Max(_MonthSelectionItem.HeightInternal, _YearSelectionItem.HeightInternal);
 | 
						|
                m_Rect.Width += ElementStyleLayout.HorizontalStyleWhiteSpace(style);
 | 
						|
                m_Rect.Height += ElementStyleLayout.VerticalStyleWhiteSpace(style);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                int c = 49;
 | 
						|
                int itemsInLine = 0;
 | 
						|
                int lineHeight = 0;
 | 
						|
                int daysSpacing = 2;
 | 
						|
 | 
						|
                Point weekStartPoint = innerLocation;
 | 
						|
                Point daysStartPoint = innerLocation;
 | 
						|
 | 
						|
                Size daySize = Dpi.Size(_DaySize);
 | 
						|
                if (_ShowWeekNumbers)
 | 
						|
                {
 | 
						|
                    daysStartPoint.X += daySize.Width;
 | 
						|
                }
 | 
						|
 | 
						|
                ItemContainer nav = GetNavigationContainer();
 | 
						|
                nav.LeftInternal = innerLocation.X;
 | 
						|
                nav.TopInternal = innerLocation.Y;
 | 
						|
                nav.WidthInternal = daySize.Width * (_ShowWeekNumbers ? 8 : 7);
 | 
						|
                nav.RecalcSize();
 | 
						|
                nav.WidthInternal = daySize.Width * (_ShowWeekNumbers ? 8 : 7);
 | 
						|
                weekStartPoint.Y += nav.HeightInternal + 1;
 | 
						|
                daysStartPoint.Y += nav.HeightInternal + 1;
 | 
						|
 | 
						|
                Point p = daysStartPoint;
 | 
						|
                int line = 0;
 | 
						|
                for (int i = 0; i < c; i++)
 | 
						|
                {
 | 
						|
                    BaseItem item = this.SubItems[i];
 | 
						|
                    if (item is YearSelectorContainer) continue;
 | 
						|
                    DayLabel day = item as DayLabel;
 | 
						|
                    if (day != null)
 | 
						|
                    {
 | 
						|
                        day.RecalcSize();
 | 
						|
                        day.Bounds = new Rectangle(p, daySize);
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        item.RecalcSize();
 | 
						|
                    }
 | 
						|
 | 
						|
                    if (item.Visible)
 | 
						|
                    {
 | 
						|
                        if (item.HeightInternal > lineHeight)
 | 
						|
                            lineHeight = item.HeightInternal;
 | 
						|
                        p.X += item.WidthInternal;
 | 
						|
                    }
 | 
						|
                    itemsInLine++;
 | 
						|
                    if (itemsInLine == 7)
 | 
						|
                    {
 | 
						|
                        if (_ShowWeekNumbers)
 | 
						|
                        {
 | 
						|
                            if (line > 0)
 | 
						|
                            {
 | 
						|
                                DayLabel weekLabel = this.SubItems[c + line - 1] as DayLabel;
 | 
						|
                                weekLabel.RecalcSize();
 | 
						|
                                weekLabel.Bounds = new Rectangle(weekStartPoint, daySize);
 | 
						|
                                weekStartPoint.Y += lineHeight;
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                                weekStartPoint.Y += lineHeight + daysSpacing;
 | 
						|
                        }
 | 
						|
 | 
						|
                        itemsInLine = 0;
 | 
						|
                        p.Y += lineHeight;
 | 
						|
                        if (line == 0) p.Y += daysSpacing;
 | 
						|
                        p.X = daysStartPoint.X;
 | 
						|
                        lineHeight = 0;
 | 
						|
                        line++;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                m_Rect.Width = daySize.Width * 7;
 | 
						|
                m_Rect.Height = daySize.Height * 7 + daysSpacing;
 | 
						|
                if (_ShowWeekNumbers)
 | 
						|
                    m_Rect.Width += daySize.Width;
 | 
						|
 | 
						|
                m_Rect.Width += ElementStyleLayout.HorizontalStyleWhiteSpace(style);
 | 
						|
                m_Rect.Height += ElementStyleLayout.VerticalStyleWhiteSpace(style) + nav.HeightInternal + 1;
 | 
						|
            }
 | 
						|
 | 
						|
            if (disposeStyle) style.Dispose();
 | 
						|
 | 
						|
            base.RecalcSize();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Must be overridden by class that is inheriting to provide the painting for the item.
 | 
						|
        /// </summary>
 | 
						|
        public override void Paint(ItemPaintArgs p)
 | 
						|
        {
 | 
						|
            ItemContainer nav = GetNavigationContainer();
 | 
						|
            LabelItem label = nav.SubItems[NavMonthLabel] as LabelItem;
 | 
						|
            label.ForeColor = p.Colors.ItemText;
 | 
						|
            label = nav.SubItems[NavYearLabel] as LabelItem;
 | 
						|
            label.ForeColor = p.Colors.ItemText;
 | 
						|
 | 
						|
            base.Paint(p);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns copy of the item.
 | 
						|
        /// </summary>
 | 
						|
        public override BaseItem Copy()
 | 
						|
        {
 | 
						|
            SingleMonthCalendar objCopy = new SingleMonthCalendar();
 | 
						|
            this.CopyToItem(objCopy);
 | 
						|
            return objCopy;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Copies the CalendarMonth specific properties to new instance of the item.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="c">New ButtonItem instance.</param>
 | 
						|
        protected override void CopyToItem(BaseItem c)
 | 
						|
        {
 | 
						|
            SingleMonthCalendar copy = c as SingleMonthCalendar;
 | 
						|
            base.CopyToItem(copy);
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetDisplayMonth(DateTime date, eEventSource source)
 | 
						|
        {
 | 
						|
            SetDisplayMonth(date.Month, date.Year, source);
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetDisplayMonth(int month, int year, eEventSource source)
 | 
						|
        {
 | 
						|
            DateTime d = new DateTime(year, month, 1);
 | 
						|
            bool monthChanged = d != _DisplayMonth;
 | 
						|
 | 
						|
            if (_MonthSelectionMode)
 | 
						|
            {
 | 
						|
                _DisplayMonth = d;
 | 
						|
                if (monthChanged)
 | 
						|
                    OnMonthChanged(new DevComponents.DotNetBar.Events.EventSourceArgs(source));
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            if (monthChanged)
 | 
						|
                OnMonthChanging(new DevComponents.DotNetBar.Events.EventSourceArgs(source));
 | 
						|
 | 
						|
            _DisplayMonth = d;
 | 
						|
            // Initialize days
 | 
						|
            string[] dayNames = DateTimeInput.GetActiveCulture().DateTimeFormat.AbbreviatedDayNames;
 | 
						|
            string[] shortestDayNames = DateTimeInput.GetActiveCulture().DateTimeFormat.ShortestDayNames;
 | 
						|
            if (_DayNames != null)
 | 
						|
                dayNames = _DayNames;
 | 
						|
            int firstDay = (int)_FirstDayOfWeek, currentDay = firstDay;
 | 
						|
            for (int i = 0; i < 7; i++)
 | 
						|
            {
 | 
						|
                DayLabel day = this.SubItems[i] as DayLabel;
 | 
						|
                day.Text = _TwoLetterDayName ? GetTwoLetterDayName(shortestDayNames[currentDay]) : dayNames[currentDay];
 | 
						|
                day.Visible = true;
 | 
						|
                day.Displayed = true;
 | 
						|
                day.TrackMouse = false;
 | 
						|
                day.Selectable = false;
 | 
						|
                day.IsDayLabel = true;
 | 
						|
                ApplyDayOfWeekMarker(day);
 | 
						|
                currentDay++;
 | 
						|
                if (currentDay > 6)
 | 
						|
                    currentDay = 0;
 | 
						|
            }
 | 
						|
 | 
						|
            // Recurring monthly markers
 | 
						|
            bool[] monthlyMarkers = GetMonthlyMarkers();
 | 
						|
            bool[] weeklyMarkers = GetWeeklyMarkers();
 | 
						|
            bool[] annualMarkers = GetAnnualMarkers(month);
 | 
						|
            bool[] markedDays = GetMarkedDays(month, year);
 | 
						|
 | 
						|
            DateTime today = _ShowTodayMarker ? (_TodayDate == DateTime.MinValue ? DateTime.Today : _TodayDate) : DateTime.MinValue;
 | 
						|
            bool markToday = today != DateTime.MinValue;
 | 
						|
 | 
						|
            // Initialize days, If Visible=true, but Displayed=False item not displayed but takes space in layout. 
 | 
						|
            // If Visible=false item not visible and does not take space in layout.
 | 
						|
            int firstDayOfMonth = (int)d.DayOfWeek - firstDay;
 | 
						|
            if (firstDayOfMonth < 0) firstDayOfMonth = 7 + firstDayOfMonth;
 | 
						|
            int startIndex = 7;
 | 
						|
            if (firstDayOfMonth > 0)
 | 
						|
            {
 | 
						|
                DateTime dt = d;
 | 
						|
                dt = dt.AddDays(-firstDayOfMonth);
 | 
						|
 | 
						|
                annualMarkers = GetAnnualMarkers(dt.Month);
 | 
						|
                markedDays = GetMarkedDays(dt.Month, dt.Year);
 | 
						|
 | 
						|
                for (int i = startIndex; i < startIndex + firstDayOfMonth; i++)
 | 
						|
                {
 | 
						|
                    DayLabel day = this.SubItems[i] as DayLabel;
 | 
						|
                    day.Date = dt;
 | 
						|
                    day.Visible = true;
 | 
						|
                    ResetDayLabel(day);
 | 
						|
 | 
						|
                    if (weeklyMarkers[(int)dt.DayOfWeek])
 | 
						|
                        ApplyWeeklyMarker(day);
 | 
						|
                    if (monthlyMarkers[dt.Day - 1])
 | 
						|
                        ApplyMonthlyMarker(day);
 | 
						|
                    if (annualMarkers[dt.Day - 1])
 | 
						|
                        ApplyAnnualMarker(day);
 | 
						|
                    if (markedDays[dt.Day - 1])
 | 
						|
                        ApplyDayMarker(day);
 | 
						|
 | 
						|
                    if (markToday && today == dt) day.IsToday = true;
 | 
						|
 | 
						|
                    if (!_WeekendDaysSelectable && DayLabel.IsWeekend(dt))
 | 
						|
                    {
 | 
						|
                        day.Selectable = false;
 | 
						|
                        day.TrackMouse = false;
 | 
						|
                    }
 | 
						|
                    day.Enabled = CanSelect(dt);
 | 
						|
                    day.Displayed = _TrailingDaysVisible && _TrailingDaysBeforeVisible;
 | 
						|
                    day.IsTrailing = true;
 | 
						|
                    dt = dt.AddDays(1);
 | 
						|
                }
 | 
						|
                startIndex += firstDayOfMonth;
 | 
						|
            }
 | 
						|
 | 
						|
            annualMarkers = GetAnnualMarkers(month);
 | 
						|
            markedDays = GetMarkedDays(month, year);
 | 
						|
            bool newMonthFirstSwitch = true;
 | 
						|
 | 
						|
            int runningWeek = 0, dayCount = startIndex % 7;
 | 
						|
            for (int i = startIndex; i < 49; i++)
 | 
						|
            {
 | 
						|
                DayLabel day = this.SubItems[i] as DayLabel;
 | 
						|
                day.Date = d;
 | 
						|
                ResetDayLabel(day);
 | 
						|
 | 
						|
                if (d.Month != month && newMonthFirstSwitch)
 | 
						|
                {
 | 
						|
                    annualMarkers = GetAnnualMarkers(d.Month);
 | 
						|
                    markedDays = GetMarkedDays(d.Month, d.Year);
 | 
						|
                    newMonthFirstSwitch = false;
 | 
						|
                }
 | 
						|
 | 
						|
                if (weeklyMarkers[(int)d.DayOfWeek])
 | 
						|
                    ApplyWeeklyMarker(day);
 | 
						|
                if (monthlyMarkers[d.Day - 1])
 | 
						|
                    ApplyMonthlyMarker(day);
 | 
						|
                if (annualMarkers[d.Day - 1])
 | 
						|
                    ApplyAnnualMarker(day);
 | 
						|
                if (markedDays[d.Day - 1])
 | 
						|
                    ApplyDayMarker(day);
 | 
						|
 | 
						|
                if (markToday && today == d) day.IsToday = true;
 | 
						|
 | 
						|
                if (!_WeekendDaysSelectable && DayLabel.IsWeekend(d))
 | 
						|
                {
 | 
						|
                    day.Selectable = false;
 | 
						|
                    day.TrackMouse = false;
 | 
						|
                }
 | 
						|
                day.Enabled = CanSelect(d);
 | 
						|
 | 
						|
                day.Visible = true;
 | 
						|
                if (d.Month != month)
 | 
						|
                {
 | 
						|
                    day.IsTrailing = true;
 | 
						|
                    day.Displayed = _TrailingDaysVisible && _TrailingDaysAfterVisible;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    day.Displayed = true;
 | 
						|
                    day.IsTrailing = false;
 | 
						|
                    if (day.Date == _SelectedDate) day.IsSelected = true;
 | 
						|
                }
 | 
						|
 | 
						|
                if (dayCount == 6)
 | 
						|
                {
 | 
						|
                    if (_ShowWeekNumbers)
 | 
						|
                    {
 | 
						|
                        DayLabel week = this.SubItems[49 + runningWeek] as DayLabel;
 | 
						|
                        week.Text = DateTimeInput.GetActiveCulture().Calendar.GetWeekOfYear(d, _WeekOfYearRule, _FirstDayOfWeek).ToString();
 | 
						|
                        week.Visible = true;
 | 
						|
                        week.TrackMouse = false;
 | 
						|
                        week.Selectable = false;
 | 
						|
                        if (d.Month != month && d.AddDays(-dayCount).Month != month)
 | 
						|
                            week.Displayed = _TrailingDaysVisible;
 | 
						|
                        else
 | 
						|
                            week.Displayed = true;
 | 
						|
                        ApplyWeekOfYearMarker(week);
 | 
						|
                    }
 | 
						|
                    runningWeek++;
 | 
						|
                    dayCount = -1;
 | 
						|
                }
 | 
						|
 | 
						|
                d = d.AddDays(1);
 | 
						|
                dayCount++;
 | 
						|
            }
 | 
						|
 | 
						|
            // Update Navigation Container
 | 
						|
            ItemContainer nav = GetNavigationContainer();
 | 
						|
            nav.Visible = true;
 | 
						|
            nav.Displayed = true;
 | 
						|
            LabelItem label = nav.SubItems[NavMonthLabel] as LabelItem;
 | 
						|
            //Size daySize = Dpi.Size(_DaySize);
 | 
						|
            label.Width = _DaySize.Width * 3;
 | 
						|
            label.Text = DateTimeInput.GetActiveCulture().DateTimeFormat.MonthNames[month - 1];
 | 
						|
            label = nav.SubItems[NavYearLabel] as LabelItem;
 | 
						|
            label.Text = year.ToString();
 | 
						|
            label.Width = (int)(_DaySize.Width * 1.4);
 | 
						|
 | 
						|
            // Enable/disable navigation buttons
 | 
						|
            UpdateNavigationButtonsEnabled();
 | 
						|
 | 
						|
            this.OnAppearanceChanged();
 | 
						|
            this.Refresh();
 | 
						|
 | 
						|
            if (monthChanged)
 | 
						|
            {
 | 
						|
                OnMonthChanged(new DevComponents.DotNetBar.Events.EventSourceArgs(source));
 | 
						|
                if (_YearSelector != null)
 | 
						|
                    RemoveYearSelector(false);
 | 
						|
                if (_MonthSelector != null)
 | 
						|
                    RemoveMonthSelector(false);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpdateNavigationButtonsEnabled()
 | 
						|
        {
 | 
						|
            // Enable/disable navigation buttons
 | 
						|
            ItemContainer nav = GetNavigationContainer();
 | 
						|
            DateTime d = _DisplayMonth.AddMonths(_NavigationMonthsAheadVisibility);
 | 
						|
            if (d > this.MaxDate)
 | 
						|
            {
 | 
						|
                nav.SubItems[NavIncreaseMonth].Enabled = false;
 | 
						|
                nav.SubItems[NavIncreaseYear].Enabled = false;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                nav.SubItems[NavIncreaseMonth].Enabled = true;
 | 
						|
                d = _DisplayMonth.AddYears(1);
 | 
						|
                nav.SubItems[NavIncreaseYear].Enabled = (MaxDate > d);
 | 
						|
            }
 | 
						|
            d = _DisplayMonth.AddMonths(-1);
 | 
						|
            if (d < GetBeginningOfTheMonth(this.MinDate))
 | 
						|
            {
 | 
						|
                nav.SubItems[NavDecreaseMonth].Enabled = false;
 | 
						|
                nav.SubItems[NavDecreaseYear].Enabled = false;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                nav.SubItems[NavDecreaseMonth].Enabled = true;
 | 
						|
                d = _DisplayMonth.AddYears(-1);
 | 
						|
                nav.SubItems[NavDecreaseYear].Enabled = (d > MinDate);
 | 
						|
            }
 | 
						|
            d = _DisplayMonth;
 | 
						|
            if (this.MinDate != DateTimeGroup.MinDateTime && d.Year > this.MinDate.Year && d.Month>=this.MinDate.Month)
 | 
						|
                nav.SubItems[NavDecreaseYear].Enabled = true;
 | 
						|
        }
 | 
						|
 | 
						|
        private DateTime GetBeginningOfTheMonth(DateTime date)
 | 
						|
        {
 | 
						|
            if (date.Day > 1)
 | 
						|
                date = date.AddDays(-date.Day);
 | 
						|
            return date;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool CanSelect(DateTime d)
 | 
						|
        {
 | 
						|
            if (d > MaxDate || d < MinDate)
 | 
						|
                return false;
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        private void ApplyWeekOfYearMarker(DayLabel day)
 | 
						|
        {
 | 
						|
            MonthCalendarColors c = GetColors();
 | 
						|
            if (c == null || !c.WeekOfYear.IsCustomized) return;
 | 
						|
 | 
						|
            ApplyMarker(day, c.WeekOfYear);
 | 
						|
        }
 | 
						|
 | 
						|
        private void ApplyDayOfWeekMarker(DayLabel day)
 | 
						|
        {
 | 
						|
            MonthCalendarColors c = GetColors();
 | 
						|
            if (c == null || !c.DayLabel.IsCustomized) return;
 | 
						|
 | 
						|
            ApplyMarker(day, c.DayLabel);
 | 
						|
        }
 | 
						|
 | 
						|
        private void ApplyDayMarker(DayLabel day)
 | 
						|
        {
 | 
						|
            MonthCalendarColors c = GetColors();
 | 
						|
            if (c == null || !c.DayMarker.IsCustomized) return;
 | 
						|
 | 
						|
            ApplyMarker(day, c.DayMarker);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool[] GetMarkedDays(int month, int year)
 | 
						|
        {
 | 
						|
            bool[] markers = new bool[31];
 | 
						|
            if (this.Parent is MonthCalendarItem)
 | 
						|
            {
 | 
						|
                MonthCalendarItem mc = this.Parent as MonthCalendarItem;
 | 
						|
                DateTime[] dates = mc.MarkedDates;
 | 
						|
                foreach (DateTime d in dates)
 | 
						|
                {
 | 
						|
                    if (d.Month == month && d.Year == year)
 | 
						|
                    {
 | 
						|
                        markers[d.Day - 1] = true;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return markers;
 | 
						|
        }
 | 
						|
 | 
						|
        private void ApplyAnnualMarker(DayLabel day)
 | 
						|
        {
 | 
						|
            MonthCalendarColors c = GetColors();
 | 
						|
            if (c == null || !c.AnnualMarker.IsCustomized) return;
 | 
						|
 | 
						|
            ApplyMarker(day, c.AnnualMarker);
 | 
						|
        }
 | 
						|
 | 
						|
        internal MonthCalendarColors GetColors()
 | 
						|
        {
 | 
						|
            MonthCalendarItem mc = this.Parent as MonthCalendarItem;
 | 
						|
            MonthCalendarColors c = null;
 | 
						|
            if (mc != null)
 | 
						|
                c = mc.Colors;
 | 
						|
            else
 | 
						|
                c = _Colors;
 | 
						|
 | 
						|
            return c;
 | 
						|
        }
 | 
						|
 | 
						|
        private void ApplyWeeklyMarker(DayLabel day)
 | 
						|
        {
 | 
						|
            MonthCalendarColors c = GetColors();
 | 
						|
            if (c == null || !c.WeeklyMarker.IsCustomized) return;
 | 
						|
 | 
						|
            ApplyMarker(day, c.WeeklyMarker);
 | 
						|
        }
 | 
						|
 | 
						|
        private void ApplyMonthlyMarker(DayLabel day)
 | 
						|
        {
 | 
						|
            MonthCalendarColors c = GetColors();
 | 
						|
            if (c == null || !c.MonthlyMarker.IsCustomized) return;
 | 
						|
 | 
						|
            ApplyMarker(day, c.MonthlyMarker);
 | 
						|
        }
 | 
						|
 | 
						|
        private void ApplyMarker(DayLabel day, DateAppearanceDescription c)
 | 
						|
        {
 | 
						|
            day.BackgroundStyle.BackColor = c.BackColor;
 | 
						|
            day.BackgroundStyle.BackColor2 = c.BackColor2;
 | 
						|
            day.BackgroundStyle.BackColorGradientAngle = c.BackColorGradientAngle;
 | 
						|
            if (!c.BorderColor.IsEmpty)
 | 
						|
            {
 | 
						|
                day.BackgroundStyle.Border = eStyleBorderType.Solid;
 | 
						|
                day.BackgroundStyle.BorderColor = c.BorderColor;
 | 
						|
                day.BackgroundStyle.BorderWidth = 1;
 | 
						|
            }
 | 
						|
            day.IsBold = c.IsBold;
 | 
						|
            if (!c.TextColor.IsEmpty)
 | 
						|
                day.TextColor = c.TextColor;
 | 
						|
            day.Selectable = c.Selectable;
 | 
						|
            if (!c.Selectable)
 | 
						|
                day.TrackMouse = false;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool[] GetMonthlyMarkers()
 | 
						|
        {
 | 
						|
            bool[] markers = new bool[31];
 | 
						|
            if (this.Parent is MonthCalendarItem)
 | 
						|
            {
 | 
						|
                MonthCalendarItem mc = this.Parent as MonthCalendarItem;
 | 
						|
                DateTime[] dates = mc.MonthlyMarkedDates;
 | 
						|
                foreach (DateTime d in dates)
 | 
						|
                {
 | 
						|
                    markers[d.Day - 1] = true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return markers;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool[] GetAnnualMarkers(int month)
 | 
						|
        {
 | 
						|
            bool[] markers = new bool[31];
 | 
						|
            if (this.Parent is MonthCalendarItem)
 | 
						|
            {
 | 
						|
                MonthCalendarItem mc = this.Parent as MonthCalendarItem;
 | 
						|
                DateTime[] dates = mc.AnnuallyMarkedDates;
 | 
						|
                foreach (DateTime d in dates)
 | 
						|
                {
 | 
						|
                    if (d.Month == month)
 | 
						|
                    {
 | 
						|
                        markers[d.Day - 1] = true;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return markers;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool[] GetWeeklyMarkers()
 | 
						|
        {
 | 
						|
            bool[] markers = new bool[7];
 | 
						|
            if (this.Parent is MonthCalendarItem)
 | 
						|
            {
 | 
						|
                MonthCalendarItem mc = this.Parent as MonthCalendarItem;
 | 
						|
                DayOfWeek[] days = mc.WeeklyMarkedDays;
 | 
						|
                foreach (DayOfWeek d in days)
 | 
						|
                {
 | 
						|
                    markers[(int)d] = true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return markers;
 | 
						|
        }
 | 
						|
 | 
						|
        private ItemContainer GetNavigationContainer()
 | 
						|
        {
 | 
						|
            return this.SubItems[NavigationContainerName] as ItemContainer;
 | 
						|
        }
 | 
						|
 | 
						|
        private void ResetDayLabel(DayLabel day)
 | 
						|
        {
 | 
						|
            day.IsSelected = false;
 | 
						|
            day.Selectable = true;
 | 
						|
            day.TrackMouse = true;
 | 
						|
            day.IsToday = false;
 | 
						|
            day.IsBold = false;
 | 
						|
            day.Image = null;
 | 
						|
            day.ImageAlign = eLabelPartAlignment.MiddleRight;
 | 
						|
            day.TextAlign = _DefaultDayLabelTextAlign;
 | 
						|
            day.TextColor = Color.Empty;
 | 
						|
            day.Tooltip = "";
 | 
						|
            day.ExpandOnMouseDown = false;
 | 
						|
            day.SubItems.Clear();
 | 
						|
            day.BackgroundStyle. Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the MonthChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides additional event data.</param>
 | 
						|
        protected virtual void OnMonthChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            if (MonthChanged != null)
 | 
						|
                MonthChanged(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the MonthChanging event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides additional event data.</param>
 | 
						|
        protected virtual void OnMonthChanging(EventArgs e)
 | 
						|
        {
 | 
						|
            if (MonthChanging != null)
 | 
						|
                MonthChanging(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private DateTime _DisplayMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
 | 
						|
        [Description("")]
 | 
						|
        public DateTime DisplayMonth
 | 
						|
        {
 | 
						|
            get { return _DisplayMonth; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value < MinDate)
 | 
						|
                    value = MinDate;
 | 
						|
                else if (value > MaxDate)
 | 
						|
                    value = MaxDate;
 | 
						|
                //if (value > MaxDate || value < MinDate)
 | 
						|
                //{
 | 
						|
                //    throw new ArgumentException("DisplayMonth must be less than MaxDate and greater than MinDate");
 | 
						|
                //}
 | 
						|
 | 
						|
                SetDisplayMonth(value.Month, value.Year, eEventSource.Code);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private string GetTwoLetterDayName(string s)
 | 
						|
        {
 | 
						|
            if (s.Length > 2)
 | 
						|
                return s.Substring(0, 2);
 | 
						|
            return s;
 | 
						|
        }
 | 
						|
 | 
						|
        private DayOfWeek _FirstDayOfWeek = DayOfWeek.Sunday;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the first day of week displayed on the calendar. Default value is Sunday.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(DayOfWeek.Sunday), Description("Indicates first day of week displayed on the calendar.")]
 | 
						|
        public DayOfWeek FirstDayOfWeek
 | 
						|
        {
 | 
						|
            get { return _FirstDayOfWeek; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_FirstDayOfWeek != value)
 | 
						|
                {
 | 
						|
                    _FirstDayOfWeek = value;
 | 
						|
                    SetDisplayMonth(_DisplayMonth.Month, _DisplayMonth.Year, eEventSource.Code);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal bool _TrailingDaysVisible = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether trailing days outside of the current displayed month are visible on calendar.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true)]
 | 
						|
        public bool TrailingDaysVisible
 | 
						|
        {
 | 
						|
            get { return _TrailingDaysVisible; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_TrailingDaysVisible != value)
 | 
						|
                {
 | 
						|
                    _TrailingDaysVisible = value;
 | 
						|
                    OnTrailingDaysVisibleChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal bool _TrailingDaysBeforeVisible = true;
 | 
						|
        internal bool TrailingDaysBeforeVisible
 | 
						|
        {
 | 
						|
            get { return _TrailingDaysBeforeVisible; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_TrailingDaysBeforeVisible != value)
 | 
						|
                {
 | 
						|
                    _TrailingDaysBeforeVisible = value;
 | 
						|
                    OnTrailingDaysVisibleChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal bool _TrailingDaysAfterVisible = true;
 | 
						|
        internal bool TrailingDaysAfterVisible
 | 
						|
        {
 | 
						|
            get { return _TrailingDaysAfterVisible; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_TrailingDaysAfterVisible != value)
 | 
						|
                {
 | 
						|
                    _TrailingDaysAfterVisible = value;
 | 
						|
                    OnTrailingDaysVisibleChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void OnTrailingDaysVisibleChanged()
 | 
						|
        {
 | 
						|
            if (_MonthSelectionMode) return;
 | 
						|
            foreach (BaseItem item in this.SubItems)
 | 
						|
            {
 | 
						|
                DayLabel day = item as DayLabel;
 | 
						|
                if (day != null && day.IsTrailing)
 | 
						|
                {
 | 
						|
                    bool visible = _TrailingDaysVisible;
 | 
						|
                    if (day.Date < this.DisplayMonth)
 | 
						|
                        visible &= _TrailingDaysBeforeVisible;
 | 
						|
                    else
 | 
						|
                        visible &= _TrailingDaysAfterVisible;
 | 
						|
                    day.Displayed = visible;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            this.Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _ShowWeekNumbers = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether week of year is visible. Default value is false.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Description("Indicates whether week of year is visible.")]
 | 
						|
        public bool ShowWeekNumbers
 | 
						|
        {
 | 
						|
            get { return _ShowWeekNumbers; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_ShowWeekNumbers != value)
 | 
						|
                {
 | 
						|
                    _ShowWeekNumbers = value;
 | 
						|
                    OnShowWeekNumbersChanged();
 | 
						|
                    NeedRecalcSize = true;
 | 
						|
                    OnAppearanceChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnShowWeekNumbersChanged()
 | 
						|
        {
 | 
						|
            if (_ShowWeekNumbers)
 | 
						|
            {
 | 
						|
                // Add week of year labels, always after the days 
 | 
						|
                for (int i = 0; i < 6; i++)
 | 
						|
                {
 | 
						|
                    DayLabel week = new DayLabel();
 | 
						|
                    week.IsWeekOfYear = true;
 | 
						|
                    this.SubItems.Insert(49 + i, week);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                // Remove week of year labels
 | 
						|
                for (int i = 0; i < 7; i++)
 | 
						|
                {
 | 
						|
                    DayLabel week = this.SubItems[49] as DayLabel;
 | 
						|
                    if (week != null && week.IsWeekOfYear)
 | 
						|
                        this.SubItems.Remove(49);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private CalendarWeekRule _WeekOfYearRule = CalendarWeekRule.FirstDay;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the rule used to determine first week of the year for week of year display on calendar. Default value is first-day.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(CalendarWeekRule.FirstDay), Description("Indicates rule used to determine first week of the year for week of year display on calendar.")]
 | 
						|
        public CalendarWeekRule WeekOfYearRule
 | 
						|
        {
 | 
						|
            get { return _WeekOfYearRule; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _WeekOfYearRule = value;
 | 
						|
                if (_ShowWeekNumbers)
 | 
						|
                    this.OnAppearanceChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the collection of sub items.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public override SubItemsCollection SubItems
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return base.SubItems;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private Size _DaySize = _DefaultDaySize;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the size of each day item on the calendar. Default value is 24, 15.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Indicate size of each day item on the calendar.")]
 | 
						|
        public Size DaySize
 | 
						|
        {
 | 
						|
            get { return _DaySize; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _DaySize = value;
 | 
						|
                OnDaySizeChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnDaySizeChanged()
 | 
						|
        {
 | 
						|
            ItemContainer ic = GetNavigationContainer();
 | 
						|
            Size daySize = _DaySize;
 | 
						|
            if (ic.MinimumSize.Height < daySize.Height)
 | 
						|
                ic.MinimumSize = new Size(ic.MinimumSize.Width, daySize.Height);
 | 
						|
            OnAppearanceChanged();
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether property should be serialized. Provided for designer support.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeDaySize()
 | 
						|
        {
 | 
						|
            return _DaySize.Width != _DefaultDaySize.Width || _DaySize.Height != _DefaultDaySize.Height;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Reset property to default value. Provided for designer support.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetDaySize()
 | 
						|
        {
 | 
						|
            this.DaySize = _DefaultDaySize;
 | 
						|
        }
 | 
						|
 | 
						|
        private Size _NavigationButtonSize = _DefaultNavigationButtonSize;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the size of date navigation buttons on the calendar. Default value is 13, 18. If you increase size of the navigation
 | 
						|
        /// buttons change DaySize as well so everything fits.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Indicate size of date navigation buttons on the calendar. If you increase size of the navigation buttons change DaySize as well so everything fits.")]
 | 
						|
        public Size NavigationButtonSize
 | 
						|
        {
 | 
						|
            get { return _NavigationButtonSize; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _NavigationButtonSize = value;
 | 
						|
                OnNavigationButtonSizeChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void ScaleItem(SizeF factor)
 | 
						|
        {
 | 
						|
            base.ScaleItem(factor);
 | 
						|
            OnNavigationButtonSizeChanged();
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnNavigationButtonSizeChanged()
 | 
						|
        {
 | 
						|
            Size fixedButtonSize = _NavigationButtonSize;
 | 
						|
            ItemContainer cont = GetNavigationContainer();
 | 
						|
            cont.MinimumSize = new Size(0, fixedButtonSize.Height + 3);
 | 
						|
 | 
						|
            ButtonItem nav = (ButtonItem)cont.SubItems[NavDecreaseMonth];
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
 | 
						|
            nav = (ButtonItem)cont.SubItems[NavIncreaseMonth];
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
 | 
						|
            nav = (ButtonItem)cont.SubItems[NavDecreaseYear];
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
 | 
						|
            nav = (ButtonItem)cont.SubItems[NavIncreaseYear];
 | 
						|
            nav.FixedSize = fixedButtonSize;
 | 
						|
 | 
						|
            OnAppearanceChanged();
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether property should be serialized. Provided for designer support.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeNavigationButtonSize()
 | 
						|
        {
 | 
						|
            return _NavigationButtonSize.Width != _DefaultNavigationButtonSize.Width || _NavigationButtonSize.Height != _DefaultNavigationButtonSize.Height;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Reset property to default value. Provided for designer support.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetNavigationButtonSize()
 | 
						|
        {
 | 
						|
            this.NavigationButtonSize = _DefaultNavigationButtonSize;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the PaintLabel event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event data.</param>
 | 
						|
        internal void OnPaintLabel(DayLabel label, DayPaintEventArgs e)
 | 
						|
        {
 | 
						|
            if (PaintLabel != null)
 | 
						|
                PaintLabel(label, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private MonthCalendarColors _Colors = new MonthCalendarColors();
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the calendar colors used by the control.
 | 
						|
        /// </summary>
 | 
						|
        [NotifyParentPropertyAttribute(true), Category("Appearance"), Description("Gets colors used by control."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public MonthCalendarColors Colors
 | 
						|
        {
 | 
						|
            get { return _Colors; }
 | 
						|
        }
 | 
						|
 | 
						|
        internal void DayLabelClick(DayLabel day)
 | 
						|
        {
 | 
						|
            if (!_MouseSelectionEnabled) return;
 | 
						|
 | 
						|
            if (day.Selectable && day.Date != DateTime.MinValue)
 | 
						|
            {
 | 
						|
                if (!_WeekendDaysSelectable && DayLabel.IsWeekend(day.Date))
 | 
						|
                    return;
 | 
						|
 | 
						|
                if (MultiSelect)
 | 
						|
                {
 | 
						|
                    if (_SelectedDate == DateTime.MinValue)
 | 
						|
                        _SelectedDate = day.Date;
 | 
						|
                    day.IsSelected = !day.IsSelected;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    SelectedDate = day.Date;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _MultiSelect = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether multiple days can be selected by clicking each day. Default value is false.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Description("Indicates whether multiple days can be selected by clicking each day.")]
 | 
						|
        public bool MultiSelect
 | 
						|
        {
 | 
						|
            get { return _MultiSelect; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MultiSelect != value)
 | 
						|
                {
 | 
						|
                    _MultiSelect = value;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _MouseSelectionEnabled = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether selection of dates using mouse is enabled. Default value is true.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether selection of dates using mouse is enabled.")]
 | 
						|
        public bool MouseSelectionEnabled
 | 
						|
        {
 | 
						|
            get { return _MouseSelectionEnabled; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MouseSelectionEnabled != value)
 | 
						|
                {
 | 
						|
                    _MouseSelectionEnabled = value;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private DateTime _SelectedDate = DateTime.MinValue;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the calendar selected date.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public DateTime SelectedDate
 | 
						|
        {
 | 
						|
            get { return _SelectedDate; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _SelectedDate = value;
 | 
						|
                foreach (BaseItem item in this.SubItems)
 | 
						|
                {
 | 
						|
                    DayLabel day = item as DayLabel;
 | 
						|
                    if (day == null || day.Date == DateTime.MinValue) continue;
 | 
						|
                    if (day.Date == _SelectedDate.Date)
 | 
						|
                    {
 | 
						|
                        day.IsSelected = true;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        day.IsSelected = false;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                if (_MonthSelectionMode)
 | 
						|
                {
 | 
						|
                    if (value != DateTime.MinValue && value != DateTime.MaxValue)
 | 
						|
                    {
 | 
						|
                        _MonthSelectionItem.SelectedMonth = _SelectedDate.Month;
 | 
						|
                        _YearSelectionItem.SelectedYear = _SelectedDate.Year;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        _MonthSelectionItem.IsEmpty = true;
 | 
						|
                        _YearSelectionItem.SelectedYear = 0;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                OnSelectedDateChanged(new EventArgs());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the DateChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event data.</param>
 | 
						|
        protected virtual void OnSelectedDateChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            if (DateChanged != null)
 | 
						|
                DateChanged(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _WeekendDaysSelectable = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether weekend days can be selected. Default value is true.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether weekend days can be selected.")]
 | 
						|
        public bool WeekendDaysSelectable
 | 
						|
        {
 | 
						|
            get { return _WeekendDaysSelectable; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_WeekendDaysSelectable != value)
 | 
						|
                {
 | 
						|
                    _WeekendDaysSelectable = value;
 | 
						|
                    SetDisplayMonth(_DisplayMonth.Month, _DisplayMonth.Year, eEventSource.Code);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the DayLabel item assigned to the given date. Returns null if there is no label displayed for the date.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date">Date to return label for.</param>
 | 
						|
        /// <returns>DayLabel instance or null if date is not displayed on this calendar.</returns>
 | 
						|
        public DayLabel GetDayLabel(DateTime date)
 | 
						|
        {
 | 
						|
            foreach (BaseItem item in this.SubItems)
 | 
						|
            {
 | 
						|
                DayLabel day = item as DayLabel;
 | 
						|
                if (day != null && day.Date.Date == date.Date && day.Visible && day.Displayed)
 | 
						|
                    return day;
 | 
						|
            }
 | 
						|
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value indicating whether the item is expanded or not. For Popup items this would indicate whether the item is popped up or not.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Browsable(false), System.ComponentModel.DefaultValue(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
 | 
						|
        public override bool Expanded
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_Expanded;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                base.Expanded = value;
 | 
						|
                if (!value)
 | 
						|
                    BaseItem.CollapseSubItems(this);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when sub item expanded state has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="item">Sub item affected.</param>
 | 
						|
        protected internal override void OnSubItemExpandChange(BaseItem item)
 | 
						|
        {
 | 
						|
            base.OnSubItemExpandChange(item);
 | 
						|
            if (item.Expanded)
 | 
						|
                this.Expanded = true;
 | 
						|
        }
 | 
						|
 | 
						|
        private eLabelPartAlignment _DefaultDayLabelTextAlign = eLabelPartAlignment.MiddleCenter;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets default text alignment for the DayLabel items representing calendar days.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eLabelPartAlignment.MiddleCenter), Description("Indicates default text alignment for the DayLabel items representing calendar days.")]
 | 
						|
        public eLabelPartAlignment DefaultDayLabelTextAlign
 | 
						|
        {
 | 
						|
            get { return _DefaultDayLabelTextAlign; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_DefaultDayLabelTextAlign != value)
 | 
						|
                {
 | 
						|
                    _DefaultDayLabelTextAlign = value;
 | 
						|
                    SetDisplayMonth(_DisplayMonth.Month, _DisplayMonth.Year, eEventSource.Code);
 | 
						|
                    this.Refresh();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnLabelMouseDown(DayLabel sender, MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (LabelMouseDown != null)
 | 
						|
                LabelMouseDown(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnLabelMouseUp(DayLabel sender, MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (LabelMouseUp != null)
 | 
						|
                LabelMouseUp(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnLabelMouseEnter(DayLabel sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (LabelMouseEnter != null)
 | 
						|
                LabelMouseEnter(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnLabelMouseLeave(DayLabel sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (LabelMouseLeave != null)
 | 
						|
                LabelMouseLeave(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnLabelMouseMove(DayLabel sender, MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (LabelMouseMove != null)
 | 
						|
                LabelMouseMove(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnLabelMouseHover(DayLabel sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (LabelMouseHover != null)
 | 
						|
                LabelMouseHover(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _TwoLetterDayName = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether control uses the two letter day names. Default value is true.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether control uses the two letter day names.")]
 | 
						|
        public bool TwoLetterDayName
 | 
						|
        {
 | 
						|
            get { return _TwoLetterDayName; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_TwoLetterDayName != value)
 | 
						|
                {
 | 
						|
                    _TwoLetterDayName = value;
 | 
						|
                    SetDisplayMonth(_DisplayMonth.Month, _DisplayMonth.Year, eEventSource.Code);
 | 
						|
                    this.Refresh();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private string[] _DayNames = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the array of custom names for days displayed on calendar header. The array must have exactly 7 elements representing day names from 0 to 6.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null), Description("Indicates array of custom names for days displayed on calendar header."), Localizable(true)]
 | 
						|
        public string[] DayNames
 | 
						|
        {
 | 
						|
            get { return _DayNames; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != null && value.Length != 7)
 | 
						|
                    throw new ArgumentException("DayNames must have exactly 7 items in collection.");
 | 
						|
                _DayNames = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void MonthNavigationDecreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SetDisplayMonth(_DisplayMonth.AddMonths(-1), eEventSource.Mouse);
 | 
						|
            if (AutoSelectDate())
 | 
						|
                this.SelectedDate = this.DisplayMonth;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool AutoSelectDate()
 | 
						|
        {
 | 
						|
            BaseItem parent = this.Parent;
 | 
						|
            while (parent != null)
 | 
						|
            {
 | 
						|
                parent = parent.Parent;
 | 
						|
                if (parent != null && parent.Name == "sysPopupProvider")
 | 
						|
                {
 | 
						|
                    DateTimeInput dt = parent.ContainerControl as DateTimeInput;
 | 
						|
                    if (dt != null)
 | 
						|
                        return dt.AutoSelectDate;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        private void MonthNavigationIncreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SetDisplayMonth(_DisplayMonth.AddMonths(1), eEventSource.Mouse);
 | 
						|
            if (AutoSelectDate())
 | 
						|
                this.SelectedDate = this.DisplayMonth;
 | 
						|
        }
 | 
						|
 | 
						|
        private void YearNavigationDecreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SetDisplayMonth(_DisplayMonth.AddMonths(-12), eEventSource.Mouse);
 | 
						|
            if (AutoSelectDate())
 | 
						|
                this.SelectedDate = this.DisplayMonth;
 | 
						|
        }
 | 
						|
 | 
						|
        private void YearNavigationIncreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SetDisplayMonth(_DisplayMonth.AddMonths(12), eEventSource.Mouse);
 | 
						|
            if (AutoSelectDate())
 | 
						|
                this.SelectedDate = this.DisplayMonth;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _HeaderNavigationEnabled = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether header navigation buttons for month and year are visible. Default value is true.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether header navigation buttons for month and year are visible.")]
 | 
						|
        public bool HeaderNavigationEnabled
 | 
						|
        {
 | 
						|
            get { return _HeaderNavigationEnabled; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_HeaderNavigationEnabled != value)
 | 
						|
                {
 | 
						|
                    _HeaderNavigationEnabled = value;
 | 
						|
                    OnHeaderNavigationEnabledChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnHeaderNavigationEnabledChanged()
 | 
						|
        {
 | 
						|
            ItemContainer nav = GetNavigationContainer();
 | 
						|
            bool b = _HeaderNavigationEnabled;
 | 
						|
            nav.SubItems[NavDecreaseMonth].Visible = b;
 | 
						|
            nav.SubItems[NavIncreaseMonth].Visible = b;
 | 
						|
            nav.SubItems[NavDecreaseYear].Visible = b;
 | 
						|
            nav.SubItems[NavIncreaseYear].Visible = b;
 | 
						|
            nav.NeedRecalcSize = true;
 | 
						|
            this.OnAppearanceChanged();
 | 
						|
            this.Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Specifies the navigation container background style. Navigation container displays month, year and optional buttons. Default value is an empty style which means that container does not display any background.
 | 
						|
        /// BeginGroup property set to true will override this style on some styles.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Style"), Description("Indicates navigation container background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public ElementStyle NavigationBackgroundStyle
 | 
						|
        {
 | 
						|
            get { return GetNavigationContainer().BackgroundStyle; }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _ShowTodayMarker = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether today marker that indicates TodayDate is visible on the calendar. Default value is true.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether today marker that indicates TodayDate is visible on the calendar.")]
 | 
						|
        public bool ShowTodayMarker
 | 
						|
        {
 | 
						|
            get { return _ShowTodayMarker; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_ShowTodayMarker != value)
 | 
						|
                {
 | 
						|
                    _ShowTodayMarker = value;
 | 
						|
                    UpdateTodayMarker();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private DateTime _TodayDate = DateTime.MinValue;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the value that is used by calendar as today's date.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public DateTime TodayDate
 | 
						|
        {
 | 
						|
            get { return _TodayDate; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                value = value.Date;
 | 
						|
                if (_TodayDate != value)
 | 
						|
                {
 | 
						|
                    _TodayDate = value;
 | 
						|
                    if (_ShowTodayMarker)
 | 
						|
                        UpdateTodayMarker();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets a value indicating whether the TodayDate property has been explicitly set. 
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        public bool TodayDateSet
 | 
						|
        {
 | 
						|
            get { return _TodayDate != DateTime.MinValue; }
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpdateTodayMarker()
 | 
						|
        {
 | 
						|
            DateTime today = _ShowTodayMarker ? (_TodayDate == DateTime.MinValue ? DateTime.Today : DateTime.MinValue) : DateTime.MinValue;
 | 
						|
            bool noMarker = today == DateTime.MinValue;
 | 
						|
            foreach (BaseItem item in this.SubItems)
 | 
						|
            {
 | 
						|
                DayLabel day = item as DayLabel;
 | 
						|
                if (day != null)
 | 
						|
                {
 | 
						|
                    if (noMarker)
 | 
						|
                        day.IsToday = false;
 | 
						|
                    else
 | 
						|
                        day.IsToday = (day.Date == today);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private System.DateTime _MinDate = DateTimeGroup.MinDateTime;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the minimum date and time that can be selected in the control.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Indicates minimum date and time that can be selected in the control.")]
 | 
						|
        public System.DateTime MinDate
 | 
						|
        {
 | 
						|
            get { return _MinDate; }
 | 
						|
            set { _MinDate = value;
 | 
						|
                UpdateNavigationButtonsEnabled();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether Value property should be serialized by Windows Forms designer.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>true if value serialized otherwise false.</returns>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeMinDate()
 | 
						|
        {
 | 
						|
            return !MinDate.Equals(DateTimeGroup.MinDateTime);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Reset the MinDate property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetMinDate()
 | 
						|
        {
 | 
						|
            MinDate = DateTimeGroup.MinDateTime;
 | 
						|
        }
 | 
						|
 | 
						|
        private System.DateTime _MaxDate = DateTimeGroup.MaxDateTime;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the maximum date and time that can be selected in the control.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Indicates maximum date and time that can be selected in the control.")]
 | 
						|
        public System.DateTime MaxDate
 | 
						|
        {
 | 
						|
            get { return _MaxDate; }
 | 
						|
            set { _MaxDate = value;
 | 
						|
                UpdateNavigationButtonsEnabled();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether Value property should be serialized by Windows Forms designer.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>true if value serialized otherwise false.</returns>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeMaxDate()
 | 
						|
        {
 | 
						|
            return !_MaxDate.Equals(DateTimeGroup.MaxDateTime);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Reset the MaxDate property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetMaxDate()
 | 
						|
        {
 | 
						|
            MaxDate = DateTimeGroup.MaxDateTime;
 | 
						|
        }
 | 
						|
 | 
						|
        private int _NavigationMonthsAheadVisibility = 1;
 | 
						|
        internal int NavigationMonthsAheadVisibility
 | 
						|
        {
 | 
						|
            get { return _NavigationMonthsAheadVisibility; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_NavigationMonthsAheadVisibility != value)
 | 
						|
                {
 | 
						|
                    _NavigationMonthsAheadVisibility = value;
 | 
						|
                    UpdateNavigationButtonsEnabled();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _DayClickAutoClosePopup = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether clicking the day closes the parent popup if item is on popup.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DefaultValue(true)]
 | 
						|
        public bool DayClickAutoClosePopup
 | 
						|
        {
 | 
						|
            get { return _DayClickAutoClosePopup; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _DayClickAutoClosePopup)
 | 
						|
                {
 | 
						|
                    bool oldValue = _DayClickAutoClosePopup;
 | 
						|
                    _DayClickAutoClosePopup = value;
 | 
						|
                    OnDayClickAutoClosePopupChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Called when DayClickAutoClosePopup property has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="oldValue">Old property value</param>
 | 
						|
        /// <param name="newValue">New property value</param>
 | 
						|
        protected virtual void OnDayClickAutoClosePopupChanged(bool oldValue, bool newValue)
 | 
						|
        {
 | 
						|
            //OnPropertyChanged(new PropertyChangedEventArgs("DayClickAutoClosePopup"));
 | 
						|
            foreach (BaseItem item in this.SubItems)
 | 
						|
            {
 | 
						|
                if (item is DayLabel)
 | 
						|
                    item.AutoCollapseOnClick = newValue;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    #region Year Selector
 | 
						|
    internal class YearSelectorControl : BaseItemControl
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the YearSelectoControl class.
 | 
						|
        /// </summary>
 | 
						|
        public YearSelectorControl()
 | 
						|
        {
 | 
						|
            _YearSelector = new YearSelectorContainer();
 | 
						|
            this.HostItem = _YearSelector;
 | 
						|
            this.FocusCuesEnabled = false;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnResize(EventArgs e)
 | 
						|
        {
 | 
						|
            _YearSelector.FixedSize = Dpi.Descale(this.Size);
 | 
						|
            base.OnResize(e);
 | 
						|
        }
 | 
						|
 | 
						|
        private YearSelectorContainer _YearSelector;
 | 
						|
        public YearSelectorContainer YearSelector
 | 
						|
        {
 | 
						|
            get { return _YearSelector; }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    internal class CenturySelectorControl : BaseItemControl
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the CenturySelectorControl class.
 | 
						|
        /// </summary>
 | 
						|
        public CenturySelectorControl()
 | 
						|
        {
 | 
						|
            _CenturySelector = new CenturySelectorContainer();
 | 
						|
            this.HostItem = _CenturySelector;
 | 
						|
            this.FocusCuesEnabled = false;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnResize(EventArgs e)
 | 
						|
        {
 | 
						|
            _CenturySelector.FixedSize = Dpi.Descale(this.Size);
 | 
						|
            base.OnResize(e);
 | 
						|
        }
 | 
						|
 | 
						|
        private CenturySelectorContainer _CenturySelector;
 | 
						|
        public CenturySelectorContainer CenturySelector
 | 
						|
        {
 | 
						|
            get { return _CenturySelector; }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    internal class YearSelectorContainer : ItemContainer
 | 
						|
    {
 | 
						|
        private Size _FixedButtonSize = new Size(13, 18);
 | 
						|
        private ItemContainer _YearsContainer = null;
 | 
						|
        private LabelItem _CenturyLabel = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the YearSelectorContainer class.
 | 
						|
        /// </summary>
 | 
						|
        public YearSelectorContainer()
 | 
						|
        {
 | 
						|
            this.LayoutOrientation = eOrientation.Vertical;
 | 
						|
 | 
						|
            // Add navigation container
 | 
						|
            ItemContainer cont = new ItemContainer();
 | 
						|
            cont.Name = "yearSelectonContainerHeader";
 | 
						|
            cont.AutoCollapseOnClick = false;
 | 
						|
            cont.MinimumSize = new Size(0, _FixedButtonSize.Height + 3);
 | 
						|
            cont.LayoutOrientation = eOrientation.Horizontal;
 | 
						|
            cont.HorizontalItemAlignment = eHorizontalItemsAlignment.Center;
 | 
						|
            cont.VerticalItemAlignment = eVerticalItemsAlignment.Middle;
 | 
						|
            cont.ItemSpacing = 2;
 | 
						|
            ButtonItem nav = new ButtonItem("NavDecreaseYears");
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"left\"/>";
 | 
						|
            nav.Click += YearsDecreaseClick;
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = _FixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
            LabelItem label = new LabelItem("CenturyLabel");
 | 
						|
            label.AutoCollapseOnClick = false;
 | 
						|
            label.GlobalItem = false;
 | 
						|
            label.TextAlignment = StringAlignment.Center;
 | 
						|
            label.TextLineAlignment = StringAlignment.Center;
 | 
						|
            label.PaddingBottom = 2;
 | 
						|
            label.Text = "2010-2019";
 | 
						|
            label.Click += ShowCenturySelector;
 | 
						|
            label.Cursor = Cursors.Hand;
 | 
						|
            _CenturyLabel = label;
 | 
						|
            cont.SubItems.Add(label);
 | 
						|
            nav = new ButtonItem("NavIncreaseYears");
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"right\"/>";
 | 
						|
            nav.Click += YearsIncreaseClick;
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = _FixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
            this.SubItems.Add(cont);
 | 
						|
 | 
						|
            cont = new ItemContainer();
 | 
						|
            cont.LayoutOrientation = eOrientation.Horizontal;
 | 
						|
            cont.MultiLine = true;
 | 
						|
            this.SubItems.Add(cont);
 | 
						|
            for (int i = 0; i < 12; i++)
 | 
						|
            {
 | 
						|
                ButtonItem by = new ButtonItem("yearSelector" + i.ToString());
 | 
						|
                by.Text = (2009 + i).ToString();
 | 
						|
                by.FixedSize = new Size(54, 35);
 | 
						|
                by._FixedSizeCenterText = true;
 | 
						|
                by.OptionGroup = "year";
 | 
						|
                by.AutoCheckOnClick = true;
 | 
						|
                by.AutoCollapseOnClick = false;
 | 
						|
                by.Click += YearClick;
 | 
						|
                cont.SubItems.Add(by);
 | 
						|
            }
 | 
						|
            _YearsContainer = cont;
 | 
						|
            CenturyYearStart = (DateTime.Today.Year / 10) * 10;
 | 
						|
        }
 | 
						|
 | 
						|
        private void YearClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            ButtonItem button = (ButtonItem)sender;
 | 
						|
            int year = int.Parse(button.Text);
 | 
						|
            this.SelectedYear = year;
 | 
						|
            OnSelectedYearChanged(EventArgs.Empty);
 | 
						|
        }
 | 
						|
 | 
						|
        public event EventHandler SelectedYearChanged;
 | 
						|
        /// <summary>
 | 
						|
        /// Raises SelectedYearChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnSelectedYearChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            EventHandler handler = SelectedYearChanged;
 | 
						|
            if (handler != null)
 | 
						|
                handler(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _TextColor = Color.Empty;
 | 
						|
        public Color TextColor
 | 
						|
        {
 | 
						|
            get { return _TextColor; }
 | 
						|
            set { _TextColor = value; OnTextColorChanged(); }
 | 
						|
        }
 | 
						|
        private void OnTextColorChanged()
 | 
						|
        {
 | 
						|
            SetTextColor(this.SubItems);
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetTextColor(SubItemsCollection subItems)
 | 
						|
        {
 | 
						|
            foreach (BaseItem item in subItems)
 | 
						|
            {
 | 
						|
                if (item is ButtonItem)
 | 
						|
                {
 | 
						|
                    ((ButtonItem)item).ForeColor = _TextColor;
 | 
						|
                    ((ButtonItem)item).HotForeColor = _TextColor;
 | 
						|
                }
 | 
						|
                else if (item is LabelItem)
 | 
						|
                    ((LabelItem)item).ForeColor = _TextColor;
 | 
						|
                else if (item is ItemContainer)
 | 
						|
                    SetTextColor(item.SubItems);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int _CenturyYearStart;
 | 
						|
        public int CenturyYearStart
 | 
						|
        {
 | 
						|
            get { return _CenturyYearStart; }
 | 
						|
            set { _CenturyYearStart = value; UpdateYears(); }
 | 
						|
        }
 | 
						|
        private int _SelectedYear;
 | 
						|
        public int SelectedYear
 | 
						|
        {
 | 
						|
            get { return _SelectedYear; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _SelectedYear = value;
 | 
						|
                foreach (BaseItem item in _YearsContainer.SubItems)
 | 
						|
                {
 | 
						|
                    if (item.Name.StartsWith("yearSelector"))
 | 
						|
                    {
 | 
						|
                        ButtonItem by = (ButtonItem)item;
 | 
						|
                        if (by.Text == _SelectedYear.ToString())
 | 
						|
                        {
 | 
						|
                            by.Checked = true;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
                        else if (by.Checked)
 | 
						|
                            by.Checked = false;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void UpdateYears()
 | 
						|
        {
 | 
						|
            // Assumes this indicates century start
 | 
						|
            int y = _CenturyYearStart - 1;
 | 
						|
            foreach (BaseItem item in _YearsContainer.SubItems)
 | 
						|
            {
 | 
						|
                if (item.Name.StartsWith("yearSelector"))
 | 
						|
                {
 | 
						|
                    ButtonItem by = (ButtonItem)item;
 | 
						|
                    by.Text = y.ToString();
 | 
						|
                    if (y == _SelectedYear)
 | 
						|
                        by.Checked = true;
 | 
						|
                    else if (by.Checked)
 | 
						|
                        by.Checked = false;
 | 
						|
                    y++;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            _CenturyLabel.Text = string.Format("{0}-{1}", _CenturyYearStart, _CenturyYearStart + 10);
 | 
						|
            NeedRecalcSize = true;
 | 
						|
            this.Refresh();
 | 
						|
        }
 | 
						|
        protected override void OnFixedSizeChanged(Size oldValue, Size newValue)
 | 
						|
        {
 | 
						|
            base.OnFixedSizeChanged(oldValue, newValue);
 | 
						|
            // Update buttons size
 | 
						|
            Size size = newValue;
 | 
						|
            size.Height -= _FixedButtonSize.Height + 4;
 | 
						|
            size.Width -= 4;
 | 
						|
            Size sb = new Size(size.Width / 4, size.Height / 3);
 | 
						|
            //sb.Width = (int)(sb.Width / Dpi.Factor.Width);
 | 
						|
            //sb.Height = (int)(sb.Height / Dpi.Factor.Height);
 | 
						|
            foreach (BaseItem item in _YearsContainer.SubItems)
 | 
						|
            {
 | 
						|
                if (item.Name.StartsWith("yearSelector"))
 | 
						|
                {
 | 
						|
                    ButtonItem by = (ButtonItem)item;
 | 
						|
                    by.FixedSize = sb;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void YearsDecreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (CenturyYearStart - 10 > 1760)
 | 
						|
                CenturyYearStart -= 10;
 | 
						|
        }
 | 
						|
        private void YearsIncreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            CenturyYearStart += 10;
 | 
						|
        }
 | 
						|
        private CenturySelectorControl _CenturySelector = null;
 | 
						|
        private void ShowCenturySelector(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_CenturySelector != null) return;
 | 
						|
            _CenturySelector = new CenturySelectorControl();
 | 
						|
            Control parent = (Control)this.ContainerControl;
 | 
						|
 | 
						|
            _CenturySelector.Size = new Size(8, 8);
 | 
						|
            _CenturySelector.Location = new Point(this.LeftInternal + (this.WidthInternal - 8) / 2, this.TopInternal + (this.HeightInternal - 8) / 2);
 | 
						|
            _CenturySelector.Style = eDotNetBarStyle.StyleManagerControlled;
 | 
						|
            if (BarFunctions.IsOffice2007Style(this.Style))
 | 
						|
            {
 | 
						|
                Office2007ColorTable table = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
 | 
						|
                ElementStyle es = (ElementStyle)table.StyleClasses[ElementStyleClassKeys.ItemPanelKey];
 | 
						|
                _CenturySelector.BackgroundStyle.BackColor = es.BackColor;
 | 
						|
                _CenturySelector.BackgroundStyle.BackColor2 = es.BackColor2;
 | 
						|
            }
 | 
						|
            else
 | 
						|
                _CenturySelector.BackgroundStyle.BackColor = SystemColors.Window;
 | 
						|
            _CenturySelector.CenturySelector.TextColor = this.TextColor;
 | 
						|
            parent.Controls.Add(_CenturySelector);
 | 
						|
 | 
						|
            Rectangle targetBounds = this.Bounds;
 | 
						|
            DevComponents.DotNetBar.Animation.AnimationRectangle anim = new DevComponents.DotNetBar.Animation.AnimationRectangle(
 | 
						|
                new AnimationRequest(_CenturySelector, "Bounds", targetBounds),
 | 
						|
                DevComponents.DotNetBar.Animation.AnimationEasing.EaseInOutQuad, 200);
 | 
						|
            anim.AutoDispose = true;
 | 
						|
            anim.Start();
 | 
						|
 | 
						|
            _CenturySelector.CenturySelector.SelectedCenturyChanged += SelectedCenturyChanged;
 | 
						|
        }
 | 
						|
        private void SelectedCenturyChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            this.CenturyYearStart = _CenturySelector.CenturySelector.SelectedCentury;
 | 
						|
            Rectangle targetBounds = this.Bounds;
 | 
						|
            DevComponents.DotNetBar.Animation.AnimationRectangle anim = new DevComponents.DotNetBar.Animation.AnimationRectangle(
 | 
						|
                new AnimationRequest(_CenturySelector, "Bounds", new Rectangle(this.LeftInternal + (this.WidthInternal - 8) / 2, this.TopInternal + (this.HeightInternal - 8) / 2, 8, 8)),
 | 
						|
                DevComponents.DotNetBar.Animation.AnimationEasing.EaseInOutQuad, 200);
 | 
						|
            anim.AutoDispose = true;
 | 
						|
            anim.AnimationCompleted += new EventHandler(AnimationCompleted);
 | 
						|
            anim.Start();
 | 
						|
        }
 | 
						|
        public void RemoveCenturySelector()
 | 
						|
        {
 | 
						|
            if (_CenturySelector == null) return;
 | 
						|
            Control parent = (Control)this.ContainerControl;
 | 
						|
            parent.Controls.Remove(_CenturySelector);
 | 
						|
            _CenturySelector.CenturySelector.SelectedCenturyChanged -= SelectedCenturyChanged;
 | 
						|
            _CenturySelector.Dispose();
 | 
						|
            _CenturySelector = null;
 | 
						|
        }
 | 
						|
        void AnimationCompleted(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            RemoveCenturySelector();
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
    #endregion
 | 
						|
 | 
						|
    #region Century Selector
 | 
						|
    internal class CenturySelectorContainer : ItemContainer
 | 
						|
    {
 | 
						|
        private Size _FixedButtonSize = new Size(13, 18);
 | 
						|
        private ItemContainer _YearsContainer = null;
 | 
						|
        private LabelItem _CenturyLabel = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the YearSelectorContainer class.
 | 
						|
        /// </summary>
 | 
						|
        public CenturySelectorContainer()
 | 
						|
        {
 | 
						|
            this.LayoutOrientation = eOrientation.Vertical;
 | 
						|
 | 
						|
            // Add navigation container
 | 
						|
            ItemContainer cont = new ItemContainer();
 | 
						|
            cont.AutoCollapseOnClick = false;
 | 
						|
            cont.MinimumSize = new Size(0, _FixedButtonSize.Height + 3);
 | 
						|
            cont.LayoutOrientation = eOrientation.Horizontal;
 | 
						|
            cont.HorizontalItemAlignment = eHorizontalItemsAlignment.Center;
 | 
						|
            cont.VerticalItemAlignment = eVerticalItemsAlignment.Middle;
 | 
						|
            cont.ItemSpacing = 2;
 | 
						|
            ButtonItem nav = new ButtonItem("NavDecreaseYears");
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"left\"/>";
 | 
						|
            nav.Click += YearsDecreaseClick;
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = _FixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
            LabelItem label = new LabelItem("CenturyLabel");
 | 
						|
            label.AutoCollapseOnClick = false;
 | 
						|
            label.GlobalItem = false;
 | 
						|
            label.TextAlignment = StringAlignment.Center;
 | 
						|
            label.TextLineAlignment = StringAlignment.Center;
 | 
						|
            label.PaddingBottom = 2;
 | 
						|
            label.Text = "2000-2099";
 | 
						|
            _CenturyLabel = label;
 | 
						|
            cont.SubItems.Add(label);
 | 
						|
            nav = new ButtonItem("NavIncreaseYears");
 | 
						|
            nav.GlobalItem = false;
 | 
						|
            nav._FadeEnabled = false;
 | 
						|
            nav.Text = "<expand direction=\"right\"/>";
 | 
						|
            nav.Click += YearsIncreaseClick;
 | 
						|
            nav.AutoCollapseOnClick = false;
 | 
						|
            nav.FixedSize = _FixedButtonSize;
 | 
						|
            nav._FixedSizeCenterText = true;
 | 
						|
            nav.ClickAutoRepeat = true;
 | 
						|
            cont.SubItems.Add(nav);
 | 
						|
            this.SubItems.Add(cont);
 | 
						|
 | 
						|
            cont = new ItemContainer();
 | 
						|
            cont.LayoutOrientation = eOrientation.Horizontal;
 | 
						|
            cont.MultiLine = true;
 | 
						|
            this.SubItems.Add(cont);
 | 
						|
            for (int i = 0; i < 12; i++)
 | 
						|
            {
 | 
						|
                ButtonItem by = new ButtonItem("centurySelector" + i.ToString());
 | 
						|
                by.Text = (2009 + i).ToString();
 | 
						|
                by.FixedSize = new Size(54, 35);
 | 
						|
                by._FixedSizeCenterText = true;
 | 
						|
                by.OptionGroup = "century";
 | 
						|
                by.AutoCheckOnClick = true;
 | 
						|
                by.Click += CenturyClick;
 | 
						|
                cont.SubItems.Add(by);
 | 
						|
            }
 | 
						|
            _YearsContainer = cont;
 | 
						|
            CenturyYearStart = (DateTime.Today.Year / 100) * 100;
 | 
						|
        }
 | 
						|
 | 
						|
        private void CenturyClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            ButtonItem button = (ButtonItem)sender;
 | 
						|
            int year = (int)button.Tag;
 | 
						|
            this.SelectedCentury = year;
 | 
						|
        }
 | 
						|
 | 
						|
        public event EventHandler SelectedCenturyChanged;
 | 
						|
        /// <summary>
 | 
						|
        /// Raises SelectedYearChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnSelectedCenturyChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            EventHandler handler = SelectedCenturyChanged;
 | 
						|
            if (handler != null)
 | 
						|
                handler(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _TextColor = Color.Empty;
 | 
						|
        public Color TextColor
 | 
						|
        {
 | 
						|
            get { return _TextColor; }
 | 
						|
            set { _TextColor = value; OnTextColorChanged(); }
 | 
						|
        }
 | 
						|
        private void OnTextColorChanged()
 | 
						|
        {
 | 
						|
            SetTextColor(this.SubItems);
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetTextColor(SubItemsCollection subItems)
 | 
						|
        {
 | 
						|
            foreach (BaseItem item in subItems)
 | 
						|
            {
 | 
						|
                if (item is ButtonItem)
 | 
						|
                {
 | 
						|
                    ((ButtonItem)item).ForeColor = _TextColor;
 | 
						|
                    ((ButtonItem)item).HotForeColor = _TextColor;
 | 
						|
                }
 | 
						|
                else if (item is LabelItem)
 | 
						|
                    ((LabelItem)item).ForeColor = _TextColor;
 | 
						|
                else if (item is ItemContainer)
 | 
						|
                    SetTextColor(item.SubItems);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int _CenturyYearStart;
 | 
						|
        public int CenturyYearStart
 | 
						|
        {
 | 
						|
            get { return _CenturyYearStart; }
 | 
						|
            set { _CenturyYearStart = value; UpdateYears(); }
 | 
						|
        }
 | 
						|
        private int _SelectedYear;
 | 
						|
        public int SelectedCentury
 | 
						|
        {
 | 
						|
            get { return _SelectedYear; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _SelectedYear = value;
 | 
						|
                foreach (BaseItem item in _YearsContainer.SubItems)
 | 
						|
                {
 | 
						|
                    if (item.Name.StartsWith("centurySelector"))
 | 
						|
                    {
 | 
						|
                        ButtonItem by = (ButtonItem)item;
 | 
						|
                        if ((int)by.Tag == _SelectedYear)
 | 
						|
                        {
 | 
						|
                            by.Checked = true;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                OnSelectedCenturyChanged(EventArgs.Empty);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void UpdateYears()
 | 
						|
        {
 | 
						|
            // Assumes this indicates century start
 | 
						|
            int y = _CenturyYearStart - 10;
 | 
						|
            foreach (BaseItem item in _YearsContainer.SubItems)
 | 
						|
            {
 | 
						|
                if (item.Name.StartsWith("centurySelector"))
 | 
						|
                {
 | 
						|
                    ButtonItem by = (ButtonItem)item;
 | 
						|
                    by.Text = string.Format("<div>{0}-<br/>{1}</div>", y, y + 9);
 | 
						|
                    by.Tag = y;
 | 
						|
                    if (y == _SelectedYear)
 | 
						|
                        by.Checked = true;
 | 
						|
                    else if (by.Checked)
 | 
						|
                        by.Checked = false;
 | 
						|
                    y += 10;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            _CenturyLabel.Text = string.Format("{0}-{1}", _CenturyYearStart, _CenturyYearStart + 99);
 | 
						|
            NeedRecalcSize = true;
 | 
						|
            this.Refresh();
 | 
						|
        }
 | 
						|
        protected override void OnFixedSizeChanged(Size oldValue, Size newValue)
 | 
						|
        {
 | 
						|
            base.OnFixedSizeChanged(oldValue, newValue);
 | 
						|
            // Update buttons size
 | 
						|
            Size size = newValue;
 | 
						|
            size.Height -= _FixedButtonSize.Height + 4;
 | 
						|
            size.Width -= 4;
 | 
						|
            Size sb = new Size(size.Width / 4, size.Height / 3);
 | 
						|
            //sb.Width = (int)(sb.Width / Dpi.Factor.Width);
 | 
						|
            //sb.Height = (int)(sb.Height / Dpi.Factor.Height);
 | 
						|
            foreach (BaseItem item in _YearsContainer.SubItems)
 | 
						|
            {
 | 
						|
                if (item.Name.StartsWith("centurySelector"))
 | 
						|
                {
 | 
						|
                    ButtonItem by = (ButtonItem)item;
 | 
						|
                    by.FixedSize = sb;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void YearsDecreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (CenturyYearStart - 100 > 1760)
 | 
						|
                CenturyYearStart -= 100;
 | 
						|
        }
 | 
						|
        private void YearsIncreaseClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            CenturyYearStart += 100;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    #endregion
 | 
						|
 | 
						|
    #region MonthSelector
 | 
						|
    internal class MonthSelectorControl : BaseItemControl
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the CenturySelectorControl class.
 | 
						|
        /// </summary>
 | 
						|
        public MonthSelectorControl()
 | 
						|
        {
 | 
						|
            _MonthSelector = new MonthSelectorContainer();
 | 
						|
            this.HostItem = _MonthSelector;
 | 
						|
            this.FocusCuesEnabled = false;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnResize(EventArgs e)
 | 
						|
        {
 | 
						|
            _MonthSelector.FixedSize = Dpi.Descale(this.Size);
 | 
						|
            base.OnResize(e);
 | 
						|
        }
 | 
						|
 | 
						|
        private MonthSelectorContainer _MonthSelector;
 | 
						|
        public MonthSelectorContainer MonthSelector
 | 
						|
        {
 | 
						|
            get { return _MonthSelector; }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    internal class MonthSelectorContainer : ItemContainer
 | 
						|
    {
 | 
						|
        private const string STR_MonthSelector = "monthSelector";
 | 
						|
        private Size _FixedButtonSize = new Size(13, 18);
 | 
						|
        private ItemContainer _MonthsContainer = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the YearSelectorContainer class.
 | 
						|
        /// </summary>
 | 
						|
        public MonthSelectorContainer()
 | 
						|
        {
 | 
						|
            this.LayoutOrientation = eOrientation.Vertical;
 | 
						|
 | 
						|
            // Add navigation container
 | 
						|
            ItemContainer cont = new ItemContainer();
 | 
						|
            cont.LayoutOrientation = eOrientation.Horizontal;
 | 
						|
            cont.MultiLine = true;
 | 
						|
            cont.AutoCollapseOnClick = false;
 | 
						|
            this.SubItems.Add(cont);
 | 
						|
 | 
						|
            for (int i = 1; i <= 12; i++)
 | 
						|
            {
 | 
						|
                ButtonItem by = new ButtonItem(STR_MonthSelector + i.ToString());
 | 
						|
                by.Text = i.ToString();
 | 
						|
                by.Tag = i;
 | 
						|
                by.FixedSize = new Size(54, 35);
 | 
						|
                by._FixedSizeCenterText = true;
 | 
						|
                by.OptionGroup = "month";
 | 
						|
                by.AutoCheckOnClick = true;
 | 
						|
                by.Click += MonthClick;
 | 
						|
                by.AutoCollapseOnClick = false;
 | 
						|
                cont.SubItems.Add(by);
 | 
						|
            }
 | 
						|
            _MonthsContainer = cont;
 | 
						|
        }
 | 
						|
 | 
						|
        public bool IsEmpty
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                foreach (BaseItem item in _MonthsContainer.SubItems)
 | 
						|
                {
 | 
						|
                    if(item is ButtonItem && item.Name.StartsWith(STR_MonthSelector) && ((ButtonItem)item).Checked)
 | 
						|
                        return false;
 | 
						|
                }
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value)
 | 
						|
                {
 | 
						|
                    _SelectedMonth = 1;
 | 
						|
                    foreach (BaseItem item in _MonthsContainer.SubItems)
 | 
						|
                    {
 | 
						|
                        if (item is ButtonItem && item.Name.StartsWith(STR_MonthSelector) && ((ButtonItem)item).Checked)
 | 
						|
                            ((ButtonItem)item).Checked = false;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void MonthClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            ButtonItem button = (ButtonItem)sender;
 | 
						|
            int month = (int)button.Tag;
 | 
						|
            this.SelectedMonth = month;
 | 
						|
            OnSelectedMonthChanged(EventArgs.Empty);
 | 
						|
        }
 | 
						|
 | 
						|
        public event EventHandler SelectedMonthChanged;
 | 
						|
        /// <summary>
 | 
						|
        /// Raises SelectedYearChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnSelectedMonthChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            EventHandler handler = SelectedMonthChanged;
 | 
						|
            if (handler != null)
 | 
						|
                handler(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _TextColor = Color.Empty;
 | 
						|
        public Color TextColor
 | 
						|
        {
 | 
						|
            get { return _TextColor; }
 | 
						|
            set { _TextColor = value; OnTextColorChanged(); }
 | 
						|
        }
 | 
						|
        private void OnTextColorChanged()
 | 
						|
        {
 | 
						|
            SetTextColor(this.SubItems);
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetTextColor(SubItemsCollection subItems)
 | 
						|
        {
 | 
						|
            foreach (BaseItem item in subItems)
 | 
						|
            {
 | 
						|
                if (item is ButtonItem)
 | 
						|
                {
 | 
						|
                    ((ButtonItem)item).ForeColor = _TextColor;
 | 
						|
                    ((ButtonItem)item).HotForeColor = _TextColor;
 | 
						|
                }
 | 
						|
                else if (item is LabelItem)
 | 
						|
                    ((LabelItem)item).ForeColor = _TextColor;
 | 
						|
                else if (item is ItemContainer)
 | 
						|
                    SetTextColor(item.SubItems);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int _SelectedMonth = 1;
 | 
						|
        public int SelectedMonth
 | 
						|
        {
 | 
						|
            get { return _SelectedMonth; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value <= 0) value = 1;
 | 
						|
                if (value > 12) value = 12;
 | 
						|
                _SelectedMonth = value;
 | 
						|
 | 
						|
                ButtonItem month = (ButtonItem)_MonthsContainer.SubItems[STR_MonthSelector + _SelectedMonth.ToString()];
 | 
						|
                if (month != null)
 | 
						|
                {
 | 
						|
                    month.Checked = true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _UseMonthNames = false;
 | 
						|
        public bool UseMonthNames
 | 
						|
        {
 | 
						|
            get { return _UseMonthNames; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _UseMonthNames = value;
 | 
						|
                UpdateMonthText();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpdateMonthText()
 | 
						|
        {
 | 
						|
            string[] monthNames = new string[0];
 | 
						|
            if (_UseMonthNames)
 | 
						|
            {
 | 
						|
                CultureInfo ci = DateTimeInput.GetActiveCulture();
 | 
						|
                monthNames = ci.DateTimeFormat.AbbreviatedMonthNames;
 | 
						|
            }
 | 
						|
            foreach (BaseItem item in _MonthsContainer.SubItems)
 | 
						|
            {
 | 
						|
                if (item.Name.StartsWith(STR_MonthSelector))
 | 
						|
                {
 | 
						|
                    ButtonItem by = (ButtonItem)item;
 | 
						|
                    int month = (int)by.Tag;
 | 
						|
                    if (_UseMonthNames)
 | 
						|
                    {
 | 
						|
                        by.Text = monthNames[month - 1];
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        by.Text = month.ToString();
 | 
						|
                    }
 | 
						|
                    //if (month == _SelectedMonth)
 | 
						|
                    //    by.Checked = true;
 | 
						|
                    //else if (by.Checked)
 | 
						|
                    //    by.Checked = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            NeedRecalcSize = true;
 | 
						|
            this.Refresh();
 | 
						|
        }
 | 
						|
        protected override void OnFixedSizeChanged(Size oldValue, Size newValue)
 | 
						|
        {
 | 
						|
            base.OnFixedSizeChanged(oldValue, newValue);
 | 
						|
            // Update buttons size
 | 
						|
            Size size = newValue;
 | 
						|
            size.Height -= _FixedButtonSize.Height + 4;
 | 
						|
            size.Width -= 4;
 | 
						|
            Size sb = new Size(size.Width / 4, size.Height / 3);
 | 
						|
            //sb.Width = (int)(sb.Width/Dpi.Factor.Width);
 | 
						|
            //sb.Height = (int)(sb.Height/Dpi.Factor.Height);
 | 
						|
            foreach (BaseItem item in _MonthsContainer.SubItems)
 | 
						|
            {
 | 
						|
                if (item.Name.StartsWith(STR_MonthSelector))
 | 
						|
                {
 | 
						|
                    ButtonItem by = (ButtonItem)item;
 | 
						|
                    by.FixedSize = sb;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    #endregion
 | 
						|
 | 
						|
    internal enum eCurrentSingleMonthCalendarOperation
 | 
						|
    {
 | 
						|
        None,
 | 
						|
        AnimatingShowYearSelector,
 | 
						|
        AnimatingHideYearSelector,
 | 
						|
        AnimatingShowMonthSelector,
 | 
						|
        AnimatingHideMonthSelector
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif
 |