1943 lines
		
	
	
		
			77 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1943 lines
		
	
	
		
			77 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if FRAMEWORK20
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Globalization;
 | 
						|
using System.Collections;
 | 
						|
using System.Net;
 | 
						|
using DevComponents.DotNetBar;
 | 
						|
using System.Drawing;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace DevComponents.Editors.DateTimeAdv
 | 
						|
{
 | 
						|
    [ToolboxBitmap(typeof(DotNetBarManager), "DateTimeInput.ico"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.DateTimeInputDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
 | 
						|
    [DefaultBindingProperty("ValueObject"), DefaultProperty("ValueObject")]
 | 
						|
    public class DateTimeInput : VisualControlBase, ICommandSource
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        private DateTimeGroup _DateInputGroup = null;
 | 
						|
        private ButtonItem _PopupItem = null;
 | 
						|
        private MonthCalendarItem _MonthCalendar = null;
 | 
						|
        private TimeSelectorItem _TimeSelector = null;
 | 
						|
        private LabelItem _Spacer = null;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Events
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when the Value or IsEmpty property changes.
 | 
						|
        /// <remarks>
 | 
						|
        /// This event is not raised when the entered date is earlier than MinDateTime or later than MaxDateTime.
 | 
						|
        /// </remarks>
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler ValueChanged;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when the Value or IsEmpty property changes. This event occurs at the same time and has same function as ValueChanged event. It is provided for binding support.
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler ValueObjectChanged;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when the Format property value has changed. 
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler FormatChanged;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when Clear button is clicked and allows you to cancel the default action performed by the button.
 | 
						|
        /// </summary>
 | 
						|
        public event CancelEventHandler ButtonClearClick;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when Drop-Down button that shows calendar is clicked and allows you to cancel showing of the popup.
 | 
						|
        /// </summary>
 | 
						|
        public event CancelEventHandler ButtonDropDownClick;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when ValueObject property is set and it allows you to provide custom parsing for the values.
 | 
						|
        /// </summary>
 | 
						|
        public event ParseDateTimeValueEventHandler ParseValue;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when ShowCheckBox property is set to true and user changes the lock status of the control by clicking the check-box.
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler LockUpdateChanged;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Constructor
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the DateTimeInput class.
 | 
						|
        /// </summary>
 | 
						|
        public DateTimeInput()
 | 
						|
        {
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// Copies the current value in the control to the Clipboard.
 | 
						|
        /// </summary>
 | 
						|
        public virtual void Copy()
 | 
						|
        {
 | 
						|
            if (_DateInputGroup != null) Clipboard.SetText(this.Text);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Pastes the current Clipboard content if possible as the value into the control.
 | 
						|
        /// </summary>
 | 
						|
        public virtual void Paste()
 | 
						|
        {
 | 
						|
            if (_DateInputGroup != null) Text = Clipboard.GetText();
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Moves the current control value to the Clipboard.
 | 
						|
        /// </summary>
 | 
						|
        public virtual void Cut()
 | 
						|
        {
 | 
						|
            if (_DateInputGroup != null)
 | 
						|
            {
 | 
						|
                Copy();
 | 
						|
                if(this.AllowEmptyState)
 | 
						|
                    ValueObject = null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override PopupItem CreatePopupItem()
 | 
						|
        {
 | 
						|
            ButtonItem button = new ButtonItem("sysPopupProvider");
 | 
						|
            button.PopupClose += new EventHandler(DropDownPopupClose);
 | 
						|
 | 
						|
            ItemContainer container = new ItemContainer();
 | 
						|
            container.LayoutOrientation = eOrientation.Horizontal;
 | 
						|
            container.BackgroundStyle.Padding = 4;
 | 
						|
 | 
						|
            MonthCalendarItem mc = new MonthCalendarItem();
 | 
						|
            mc.CalendarDimensions = new Size(1, 1);
 | 
						|
            //mc.DayClickAutoClosePopup = false;
 | 
						|
            //mc.BackgroundStyle.BackColor = SystemColors.Window;
 | 
						|
            mc.DateChanged += new EventHandler(PopupSelectedDateChanged);
 | 
						|
            container.SubItems.Add(mc);
 | 
						|
            button.SubItems.Add(container);
 | 
						|
 | 
						|
            LabelItem sep = new LabelItem();
 | 
						|
            sep.Width = 8;
 | 
						|
            sep.AutoCollapseOnClick = false;
 | 
						|
            sep.Visible = false;
 | 
						|
            container.SubItems.Add(sep);
 | 
						|
            TimeSelectorItem timeSelector = new TimeSelectorItem();
 | 
						|
            timeSelector.SelectorType = _TimeSelectorType;
 | 
						|
            timeSelector.SelectedTimeChanged += new EventHandler(TimeSelectorChanged);
 | 
						|
            timeSelector.TimeFormat = _TimeSelectorTimeFormat;
 | 
						|
            timeSelector.Visible = false;
 | 
						|
            container.SubItems.Add(timeSelector);
 | 
						|
 | 
						|
            _PopupItem = button;
 | 
						|
            _MonthCalendar = mc;
 | 
						|
            _TimeSelector = timeSelector;
 | 
						|
            _Spacer = sep;
 | 
						|
            UpdateTimeSelectorItemSize();
 | 
						|
            return button;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
 | 
						|
        {
 | 
						|
            base.ScaleControl(factor, specified);
 | 
						|
            _PopupItem.NotifyScaleItem(factor);
 | 
						|
            UpdateTimeSelectorItemSize();
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpdateTimeSelectorItemSize()
 | 
						|
        {
 | 
						|
            if (_TimeSelector == null) return;
 | 
						|
            _TimeSelector.HourMinuteButtonSize = new Size(_TimeSelector.HourMinuteButtonSize.Width, this.Font.Height <= 15 ? 15 : Dpi.DescaleHeight(this.Font.Height) + 1);
 | 
						|
        }
 | 
						|
        protected override void OnFontChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            UpdateTimeSelectorItemSize();
 | 
						|
            base.OnFontChanged(e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether popup calendar is open.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        public bool IsPopupCalendarOpen
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _PopupItem.Expanded;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_PopupItem.Expanded != value)
 | 
						|
                    ToggleCalendarPopup();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _PopupCalendarKeyboardNavigationEnabled = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether selected date on popup calendar can be changed using keyboard arrow keys.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DefaultValue(true)]
 | 
						|
        public bool PopupCalendarKeyboardNavigationEnabled
 | 
						|
        {
 | 
						|
            get { return _PopupCalendarKeyboardNavigationEnabled; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _PopupCalendarKeyboardNavigationEnabled = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
 | 
						|
        protected override bool OnKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
 | 
						|
        {
 | 
						|
            if (IsPopupCalendarOpen)
 | 
						|
            {
 | 
						|
                int days = 0;
 | 
						|
                int wParamInt = WinApi.ToInt(wParam);
 | 
						|
                if (_PopupCalendarKeyboardNavigationEnabled)
 | 
						|
                {
 | 
						|
                    if (wParamInt == 37) // Left Arrow
 | 
						|
                        days = -1;
 | 
						|
                    else if (wParamInt == 39) // Right Arrow
 | 
						|
                        days = 1;
 | 
						|
                    else if (wParamInt == 40) // Down Arrow
 | 
						|
                        days = 7;
 | 
						|
                    else if (wParamInt == 38) // Up Arrow
 | 
						|
                        days = -7;
 | 
						|
                }
 | 
						|
                else if (wParamInt == 13 && _MonthCalendar.SelectedDate != DateTime.MinValue) // Enter
 | 
						|
                {
 | 
						|
                    ToggleCalendarPopup();
 | 
						|
                    return true;
 | 
						|
                }
 | 
						|
 | 
						|
                if (days != 0)
 | 
						|
                {
 | 
						|
                    if (_MonthCalendar.SelectedDate == DateTime.MinValue)
 | 
						|
                        _MonthCalendar.SelectedDate = DateTime.Today;
 | 
						|
                    else
 | 
						|
                        _MonthCalendar.SelectedDate = _MonthCalendar.SelectedDate.AddDays(days);
 | 
						|
                    if (_MonthCalendar.DisplayMonth.Month != _MonthCalendar.SelectedDate.Month)
 | 
						|
                        _MonthCalendar.DisplayMonth = _MonthCalendar.SelectedDate;
 | 
						|
                    return true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return base.OnKeyDown(hWnd, wParam, lParam);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the default date-time values that are used by the control.
 | 
						|
        /// </summary>
 | 
						|
        public static DateTime DateTimeDefaults = DateTime.Today;
 | 
						|
 | 
						|
        private void TimeSelectorChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            DateTime date = this.Value;
 | 
						|
            if (date == DateTime.MinValue) date = DateTimeDefaults;
 | 
						|
            if (date != DateTime.MinValue && date != DateTime.MaxValue)
 | 
						|
                date = new DateTime(date.Year, date.Month, date.Day, _TimeSelector.SelectedTime.Hours, _TimeSelector.SelectedTime.Minutes, _TimeSelector.SelectedTime.Seconds);
 | 
						|
            if (this.MinDate != DateTime.MinValue && date < this.MinDate) date = this.MinDate;
 | 
						|
            _DateInputGroup.Value = date;
 | 
						|
        }
 | 
						|
        private void PopupSelectedDateChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_MonthCalendar.SelectedDate == DateTime.MinValue)
 | 
						|
                this.IsEmpty = true;
 | 
						|
            else
 | 
						|
            {
 | 
						|
                DateTime date = _MonthCalendar.SelectedDate;
 | 
						|
                DateTime value = this.Value;
 | 
						|
                if (value != DateTime.MinValue && value != DateTime.MaxValue)
 | 
						|
                    date = new DateTime(date.Year, date.Month, date.Day, value.Hour, value.Minute, value.Second);
 | 
						|
                if (this.MinDate != DateTime.MinValue && date < this.MinDate) date = this.MinDate;
 | 
						|
                _DateInputGroup.Value = date;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override VisualItem CreateRootVisual()
 | 
						|
        {
 | 
						|
            _ButtonClear = new InputButtonSettings(this);
 | 
						|
            _ButtonDropDown = new InputButtonSettings(this);
 | 
						|
            _ButtonFreeText = new InputButtonSettings(this);
 | 
						|
 | 
						|
            _DateInputGroup = new DateTimeGroup();
 | 
						|
            _DateInputGroup.IsRootVisual = true;
 | 
						|
            _DateInputGroup.ValueChanged += new EventHandler(InputGroup_ValueChanged);
 | 
						|
            FormatToDateTimeGroup();
 | 
						|
            return _DateInputGroup;
 | 
						|
        }
 | 
						|
 | 
						|
        private void InputGroup_ValueChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (!IsPopupCalendarOpen)
 | 
						|
                OnValueChanged(e);
 | 
						|
            else
 | 
						|
                _FireValueChangedOnPopupClose = true;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override bool IsWatermarkRendered
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return !(this.Focused || _FreeTextEntryBox != null && _FreeTextEntryBox.Focused) && _DateInputGroup.IsEmpty;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _ShowCheckBox = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value indicating whether a check box is displayed to the left of the selected date.
 | 
						|
        /// Set to true if a check box is displayed to the left of the selected date; otherwise, false. The default is false.
 | 
						|
        /// <remarks>
 | 
						|
        /// When the ShowCheckBox property is set to true, a check box is displayed to the left of the date in the control. When the check box is selected, the date/time value can be updated. When the check box is cleared, the date/time value is unable to be changed.
 | 
						|
        /// You can handle the LockUpdateChanged event to be notified when this check box is checked and unchecked. Use LockUpdateChecked property 
 | 
						|
        /// to get or sets whether check box is checked.
 | 
						|
        /// </remarks>
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Description("Indicates whether a check box is displayed to the left of the input value which allows locking of the control.")]
 | 
						|
        public bool ShowCheckBox
 | 
						|
        {
 | 
						|
            get { return _ShowCheckBox; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _ShowCheckBox = value;
 | 
						|
                OnFormatChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value indicating whether a spin button control (up-down control) is used to adjust the date/time value. The default is false. 
 | 
						|
        /// <remarks>
 | 
						|
        /// When the ShowUpDown property is set to true, a spin button control is shown to adjust value of currently focused input item. 
 | 
						|
        /// The date and time can be adjusted by selecting each element individually and using the up and down buttons to change the value.
 | 
						|
        /// </remarks>
 | 
						|
        /// </summary>
 | 
						|
        private bool _ShowUpDown = false;
 | 
						|
        [DefaultValue(false)]
 | 
						|
        public bool ShowUpDown
 | 
						|
        {
 | 
						|
            get { return _ShowUpDown; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _ShowUpDown = value;
 | 
						|
                OnFormatChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the date time value of the control. You can use IsEmpty property to check whether control holds an empty value.
 | 
						|
        /// Setting this property to System.DateTime(0) will also make the control Empty if AllowEmptyState=true.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Indicates date time value of the control"), Bindable(BindableSupport.Yes)]
 | 
						|
        public System.DateTime Value
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.Value; }
 | 
						|
            set 
 | 
						|
            {
 | 
						|
                if (this.AllowEmptyState && value.Equals(new System.DateTime(((long)(0)))))
 | 
						|
                    this.IsEmpty = true;
 | 
						|
                else
 | 
						|
                    _DateInputGroup.Value = value; 
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <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 ShouldSerializeValue()
 | 
						|
        {
 | 
						|
            if (!this.AllowEmptyState && this.Value.Date == DateTime.Today) return false;
 | 
						|
 | 
						|
            return !_DateInputGroup.IsEmpty;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Resets Value property to default value. Used by Windows Forms designer.
 | 
						|
        /// </summary>
 | 
						|
        public void ResetValue()
 | 
						|
        {
 | 
						|
            if (this.AllowEmptyState)
 | 
						|
                this.IsEmpty = true;
 | 
						|
            else
 | 
						|
                this.Value = DateTime.Now;
 | 
						|
        }
 | 
						|
 | 
						|
        public override string Text
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return base.Text;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                this.ValueObject = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the date/time value of the control as an object. This property allows you to bind to the database fields and supports
 | 
						|
        /// null values. Expected value is DateTime object or null to indicate no date selected.
 | 
						|
        /// </summary>
 | 
						|
        [Bindable(true), RefreshProperties(RefreshProperties.All), TypeConverter(typeof(DateTimeConverter)), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public object ValueObject
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (this.IsEmpty)
 | 
						|
                    return null;
 | 
						|
                return Value;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (AcceptCustomValueObject(value))
 | 
						|
                    return;
 | 
						|
                else if (IsNull(value) || value is string && value=="")
 | 
						|
                    this.IsEmpty = true;
 | 
						|
                else if (value is System.DateTime)
 | 
						|
                {
 | 
						|
                    this.Value = (System.DateTime)value;
 | 
						|
                }
 | 
						|
                else if (value is string)
 | 
						|
                {
 | 
						|
                    System.DateTime d = new System.DateTime();
 | 
						|
                    if (System.DateTime.TryParse(value.ToString(), out d))
 | 
						|
                        this.Value = d;
 | 
						|
                    else
 | 
						|
                        throw new ArgumentException("ValueObject property expects either null/nothing value or DateTime type.");
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    throw new ArgumentException("ValueObject property expects either null/nothing value or DateTime type.");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool AcceptCustomValueObject(object value)
 | 
						|
        {
 | 
						|
            ParseDateTimeValueEventArgs e = new ParseDateTimeValueEventArgs(value);
 | 
						|
            OnParseValue(e);
 | 
						|
            if (e.IsParsed)
 | 
						|
            {
 | 
						|
                this.Value = e.ParsedValue;
 | 
						|
            }
 | 
						|
 | 
						|
            return e.IsParsed;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the ParseValue event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnParseValue(ParseDateTimeValueEventArgs e)
 | 
						|
        {
 | 
						|
            if (ParseValue != null)
 | 
						|
                ParseValue(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the values of the nested DateTimeGroup items.
 | 
						|
        /// <remarks>
 | 
						|
        /// When nested date-time groups are used note that some of the features of the control are disabled, notably minimum and maximum values
 | 
						|
        /// for nested date-times.
 | 
						|
        /// </remarks>
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public System.DateTime[] Values
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.Values; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _DateInputGroup.Values = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether empty null/nothing state of the control is allowed. Default value is true which means that IsEmpty property
 | 
						|
        /// may return true if input value is resets or ValueObject set to null/nothing.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether empty null/nothing state of the control is allowed.")]
 | 
						|
        public bool AllowEmptyState
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.AllowEmptyState; }
 | 
						|
            set { _DateInputGroup.AllowEmptyState = value; this.Invalidate(); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether control is empty i.e. it does not hold a valid DateTime value.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public bool IsEmpty
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.IsEmpty; }
 | 
						|
            set { _DateInputGroup.IsEmpty = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <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 _DateInputGroup.MinDate; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _DateInputGroup.MinDate = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether Value property should be serialized by Windows Forms designer.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>true if value serialized otherwise false.</returns>
 | 
						|
        public bool ShouldSerializeMinDate()
 | 
						|
        {
 | 
						|
            return !MinDate.Equals(DateTimeGroup.MinDateTime);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Reset the MinDate property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        public void ResetMinDate()
 | 
						|
        {
 | 
						|
            MinDate = DateTimeGroup.MinDateTime;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <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 _DateInputGroup.MaxDate; }
 | 
						|
            set { _DateInputGroup.MaxDate = value; }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether Value property should be serialized by Windows Forms designer.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>true if value serialized otherwise false.</returns>
 | 
						|
        public bool ShouldSerializeMaxDate()
 | 
						|
        {
 | 
						|
            return !_DateInputGroup.MaxDate.Equals(DateTimeGroup.MaxDateTime);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Reset the MaxDate property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        public void ResetMaxDate()
 | 
						|
        {
 | 
						|
            MaxDate = DateTimeGroup.MaxDateTime;
 | 
						|
        }
 | 
						|
 | 
						|
        private eDateTimePickerFormat _Format = eDateTimePickerFormat.Short;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the format date/time is displayed in. To specify custom format set this value to Custom and specify custom format using CustomFormat property.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eDateTimePickerFormat.Short)]
 | 
						|
        public eDateTimePickerFormat Format
 | 
						|
        {
 | 
						|
            get { return _Format; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_Format != value)
 | 
						|
                {
 | 
						|
                    _Format = value;
 | 
						|
                    OnFormatChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private string _CustomFormat = "";
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the custom date/time format string. 
 | 
						|
        /// </summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// <para>
 | 
						|
        /// To display string literals that contain date and time separators or format strings listed below, 
 | 
						|
        /// you must use escape characters in the substring. For example, to display the date as "June 15 at 12:00 PM", 
 | 
						|
        /// set the CustomFormat property to "MMMM dd 'at' t:mm tt". If the "at" substring is not enclosed by escape characters,
 | 
						|
        /// the result is "June 15 aP 12:00PM" because the "t" character is read as the one-letter A.M./P.M. format string (see the format string table below).
 | 
						|
        /// </para>
 | 
						|
        /// <para>
 | 
						|
        /// To display single quote in custom format use two single quotes characters like so '' after each other and they will be displayed as single quote.
 | 
						|
        /// </para>
 | 
						|
        /// The following list shows all the valid format strings and their descriptions:
 | 
						|
        /// <list type="table">
 | 
						|
        /// <listheader>
 | 
						|
        /// <term>Format String</term>
 | 
						|
        /// <description>Description</description>
 | 
						|
        /// </listheader>
 | 
						|
        /// <item>
 | 
						|
        /// <term>d</term>
 | 
						|
        /// <description>The one- or two-digit day.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>dd</term>
 | 
						|
        /// <description>The two-digit day. Single-digit day values are preceded by a 0. </description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>ddd</term>
 | 
						|
        /// <description>The three-character day-of-week abbreviation.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>dddd</term>
 | 
						|
        /// <description>The full day-of-week name.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>jjj</term>
 | 
						|
        /// <description>The three-digit day-of-year day. Single and two-digit values are preceded by 0.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>j</term>
 | 
						|
        /// <description>The three-digit day-of-year day.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>h</term>
 | 
						|
        /// <description>The one- or two-digit hour in 12-hour format.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>hh</term>
 | 
						|
        /// <description>The two-digit hour in 12-hour format. Single digit values are preceded by a 0. </description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>H</term>
 | 
						|
        /// <description>The one- or two-digit hour in 24-hour format. </description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>HH</term>
 | 
						|
        /// <description>The two-digit hour in 24-hour format. Single digit values are preceded by a 0.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>m</term>
 | 
						|
        /// <description>The one- or two-digit minute.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>mm</term>
 | 
						|
        /// <description>The two-digit minute. Single digit values are preceded by a 0.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>M</term>
 | 
						|
        /// <description>The one- or two-digit month number.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>MM</term>
 | 
						|
        /// <description>The two-digit month number. Single digit values are preceded by a 0.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>MMM</term>
 | 
						|
        /// <description>The three-character month abbreviation.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>MMMM</term>
 | 
						|
        /// <description>The full month name.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>s</term>
 | 
						|
        /// <description>The one- or two-digit seconds.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>ss</term>
 | 
						|
        /// <description>The two-digit seconds. Single digit values are preceded by a 0.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>t</term>
 | 
						|
        /// <description>The one-letter A.M./P.M. abbreviation (A.M. is displayed as "A").</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>tt</term>
 | 
						|
        /// <description>The two-letter A.M./P.M. abbreviation (A.M. is displayed as "AM").</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>y</term>
 | 
						|
        /// <description>The one-digit year (2001 is displayed as "1").</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>yy</term>
 | 
						|
        /// <description>The last two digits of the year (2001 is displayed as "01").</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>yyyy</term>
 | 
						|
        /// <description>The full year (2001 is displayed as "2001").</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>{</term>
 | 
						|
        /// <description>Starts the nested date-time group inside of the control. Note that nested groups must always be closed. 
 | 
						|
        /// Nested date-time groups can be used to represent range of input date/time values in the control
 | 
						|
        /// To access nested values use Values property. For example to have control represent the input from two time values you could set
 | 
						|
        /// CustomFormat to 'from' {HH:mm} 'to' {HH:mm} which will create two nested date/time groups that represent the time value. Entered
 | 
						|
        /// time values can be accessed through Values property which return an array of all input values.</description>
 | 
						|
        /// </item>
 | 
						|
        /// <item>
 | 
						|
        /// <term>}</term>
 | 
						|
        /// <description>Ends the nested date-time input group.</description>
 | 
						|
        /// </item>
 | 
						|
        /// </list>
 | 
						|
        /// </remarks>
 | 
						|
        [DefaultValue(""), Description("Indicates the custom date/time format string. "), Localizable(true)]
 | 
						|
        public string CustomFormat
 | 
						|
        {
 | 
						|
            get { return _CustomFormat; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value == null) value = "";
 | 
						|
                if (value != _CustomFormat)
 | 
						|
                {
 | 
						|
                    _CustomFormat = value;
 | 
						|
                    OnFormatChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnFormatChanged()
 | 
						|
        {
 | 
						|
            FormatToDateTimeGroup();
 | 
						|
            Invalidate();
 | 
						|
            UpdateSelectorVisibility();
 | 
						|
            if (FormatChanged != null)
 | 
						|
                FormatChanged(this, new EventArgs());
 | 
						|
        }
 | 
						|
 | 
						|
        private void FormatToDateTimeGroup()
 | 
						|
        {
 | 
						|
            if (_CustomFormat.Length > 0 && _Format == eDateTimePickerFormat.Custom)
 | 
						|
                ParseFormat(this.CustomFormat);
 | 
						|
            else if (_Format != eDateTimePickerFormat.Custom)
 | 
						|
                ParseFormat(GetSystemFormatString(_Format));
 | 
						|
            else
 | 
						|
                _DateInputGroup.Items.Clear();
 | 
						|
        }
 | 
						|
 | 
						|
        private string GetSystemFormatString(eDateTimePickerFormat format)
 | 
						|
        {
 | 
						|
            if (format == eDateTimePickerFormat.Long)
 | 
						|
                return DateTimeInput.GetActiveCulture().DateTimeFormat.LongDatePattern;
 | 
						|
            else if (format == eDateTimePickerFormat.Short)
 | 
						|
                return DateTimeInput.GetActiveCulture().DateTimeFormat.ShortDatePattern;
 | 
						|
            else if (format == eDateTimePickerFormat.ShortTime)
 | 
						|
                return DateTimeInput.GetActiveCulture().DateTimeFormat.ShortTimePattern;
 | 
						|
            else if (format == eDateTimePickerFormat.LongTime)
 | 
						|
                return DateTimeInput.GetActiveCulture().DateTimeFormat.LongTimePattern;
 | 
						|
 | 
						|
            return "";
 | 
						|
        }
 | 
						|
 | 
						|
        private static CultureInfo _CurrentCulture = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the CultureInfo for the culture used by the DateTime Input controls and Month Calendar controls.
 | 
						|
        /// Default value is null which indicates that controls will use CurrentUICulture.
 | 
						|
        /// </summary>
 | 
						|
        public static CultureInfo CurrentCulture
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _CurrentCulture;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _CurrentCulture = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Culture used by the date time input and month calendar controls
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>reference to CultureInfo</returns>
 | 
						|
        public static CultureInfo GetActiveCulture()
 | 
						|
        {
 | 
						|
            return _CurrentCulture != null ? _CurrentCulture : CultureInfo.CurrentCulture;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether auto-overwrite functionality for input is enabled. When in auto-overwrite mode input field will erase existing entry
 | 
						|
        /// and start new one if typing is continued after InputComplete method is called.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether auto-overwrite functionality for input is enabled.")]
 | 
						|
        public bool AutoOverwrite
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.AutoOverwrite; }
 | 
						|
            set { _DateInputGroup.AutoOverwrite = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        private void ParseFormat(string format)
 | 
						|
        {
 | 
						|
            _DateInputGroup.Items.Clear();
 | 
						|
 | 
						|
            if (_ShowCheckBox)
 | 
						|
            {
 | 
						|
                LockUpdateCheckBox checkBox = new LockUpdateCheckBox();
 | 
						|
                _DateInputGroup.Items.Add(checkBox);
 | 
						|
                checkBox.CheckedChanged += new EventHandler(LockCheckedChanged);
 | 
						|
            }
 | 
						|
 | 
						|
            if (format.Length == 0) return;
 | 
						|
 | 
						|
            StringBuilder inputStack = new StringBuilder(format.Length);
 | 
						|
            bool quote = false;
 | 
						|
            Stack<VisualGroup> groupStack = new Stack<VisualGroup>();
 | 
						|
            VisualGroup currentGroup = _DateInputGroup;
 | 
						|
 | 
						|
            for (int i = 0; i < format.Length; i++)
 | 
						|
            {
 | 
						|
                if (format[i] == '\'') // Trigger/Exit quote mode
 | 
						|
                {
 | 
						|
                    if (quote)
 | 
						|
                        quote = false;
 | 
						|
                    else
 | 
						|
                        quote = true;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                if (quote) // Quote mode adds everything under the quotes
 | 
						|
                {
 | 
						|
                    inputStack.Append(format[i]);
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                string s = format.Substring(i, Math.Min(4, format.Length - i));
 | 
						|
                bool match = false;
 | 
						|
                if (s == "dddd") // The full day-of-week name or three-character day-of-week abbreviation.
 | 
						|
                {
 | 
						|
                    DayLabelItem dayLabel = new DayLabelItem();
 | 
						|
                    currentGroup.Items.Add(dayLabel);
 | 
						|
                    i += 3;
 | 
						|
                    match = true;
 | 
						|
                }
 | 
						|
                else if (s == "MMMM") // Full month name
 | 
						|
                {
 | 
						|
                    MonthNameInput month = new MonthNameInput();
 | 
						|
                    currentGroup.Items.Add(month);
 | 
						|
                    i += 3;
 | 
						|
                    match = true;
 | 
						|
                }
 | 
						|
                else if (s == "yyyy") // 4 digit year
 | 
						|
                {
 | 
						|
                    NumericYearInput year = new NumericYearInput();
 | 
						|
                    currentGroup.Items.Add(year);
 | 
						|
                    i += 3;
 | 
						|
                    match = true;
 | 
						|
                }
 | 
						|
 | 
						|
                if (!match)
 | 
						|
                {
 | 
						|
                    s = format.Substring(i, Math.Min(3, format.Length - i));
 | 
						|
                    if (s == "ddd") // The three-character day-of-week abbreviation.
 | 
						|
                    {
 | 
						|
                        DayLabelItem dayLabel = new DayLabelItem();
 | 
						|
                        dayLabel.UseAbbreviatedNames = true;
 | 
						|
                        currentGroup.Items.Add(dayLabel);
 | 
						|
                        i += 2;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "MMM") // The three-character month abbreviation.
 | 
						|
                    {
 | 
						|
                        MonthNameInput month = new MonthNameInput();
 | 
						|
                        month.UseAbbreviatedNames = true;
 | 
						|
                        currentGroup.Items.Add(month);
 | 
						|
                        i += 2;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "jjj") // The three-digit day of year...
 | 
						|
                    {
 | 
						|
                        NumericDayOfYearInput day = new NumericDayOfYearInput();
 | 
						|
                        day.DisplayFormat = "000";
 | 
						|
                        currentGroup.Items.Add(day);
 | 
						|
                        i += 2;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                if (!match)
 | 
						|
                {
 | 
						|
                    s = format.Substring(i, Math.Min(2, format.Length - i));
 | 
						|
                    if (s == "dd") // The two-digit day. Single-digit day values are preceded by a 0.
 | 
						|
                    {
 | 
						|
                        NumericDayInput day = new NumericDayInput();
 | 
						|
                        day.DisplayFormat = "00";
 | 
						|
                        currentGroup.Items.Add(day);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "hh") // The two-digit hour in 12-hour format. Single digit values are preceded by a 0. 
 | 
						|
                    {
 | 
						|
                        NumericHourInput hour = new NumericHourInput();
 | 
						|
                        hour.DisplayFormat = "00";
 | 
						|
                        hour.Is24HourFormat = false;
 | 
						|
                        currentGroup.Items.Add(hour);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "HH") // The two-digit hour in 24-hour format. Single digit values are preceded by a 0.
 | 
						|
                    {
 | 
						|
                        NumericHourInput hour = new NumericHourInput();
 | 
						|
                        hour.DisplayFormat = "00";
 | 
						|
                        hour.Is24HourFormat = true;
 | 
						|
                        currentGroup.Items.Add(hour);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "mm") // The two-digit minute. Single digit values are preceded by a 0. 
 | 
						|
                    {
 | 
						|
                        NumericMinuteInput minute = new NumericMinuteInput();
 | 
						|
                        minute.DisplayFormat = "00";
 | 
						|
                        currentGroup.Items.Add(minute);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "MM") // The two-digit month number. Single digit values are preceded by a 0. 
 | 
						|
                    {
 | 
						|
                        NumericMonthInput month = new NumericMonthInput();
 | 
						|
                        month.DisplayFormat = "00";
 | 
						|
                        currentGroup.Items.Add(month);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "ss") // The two-digit seconds. Single digit values are preceded by a 0. 
 | 
						|
                    {
 | 
						|
                        NumericSecondInput second = new NumericSecondInput();
 | 
						|
                        second.DisplayFormat = "00";
 | 
						|
                        currentGroup.Items.Add(second);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "tt") // The two-letter A.M./P.M. abbreviation (A.M. is displayed as "AM").
 | 
						|
                    {
 | 
						|
                        HourPeriodInput period = new HourPeriodInput();
 | 
						|
                        currentGroup.Items.Add(period);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "yy") // The last two digits of the year (2001 is displayed as "01"). 
 | 
						|
                    {
 | 
						|
                        NumericYearInput year = new NumericYearInput();
 | 
						|
                        year.YearDisplayFormat = eYearDisplayFormat.TwoDigit;
 | 
						|
                        currentGroup.Items.Add(year);
 | 
						|
                        i += 1;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                if (!match)
 | 
						|
                {
 | 
						|
                    s = format[i].ToString();
 | 
						|
                    if (s == "d") // The one- or two-digit day. 
 | 
						|
                    {
 | 
						|
                        NumericDayInput day = new NumericDayInput();
 | 
						|
                        currentGroup.Items.Add(day);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "h") // The one- or two-digit hour in 12-hour format.
 | 
						|
                    {
 | 
						|
                        NumericHourInput hour = new NumericHourInput();
 | 
						|
                        hour.Is24HourFormat = false;
 | 
						|
                        currentGroup.Items.Add(hour);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "H") //The one- or two-digit hour in 24-hour format. 
 | 
						|
                    {
 | 
						|
                        NumericHourInput hour = new NumericHourInput();
 | 
						|
                        hour.Is24HourFormat = true;
 | 
						|
                        currentGroup.Items.Add(hour);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "m") // The one- or two-digit minute. 
 | 
						|
                    {
 | 
						|
                        NumericMinuteInput minute = new NumericMinuteInput();
 | 
						|
                        currentGroup.Items.Add(minute);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "M") // The one- or two-digit month number. 
 | 
						|
                    {
 | 
						|
                        NumericMonthInput month = new NumericMonthInput();
 | 
						|
                        currentGroup.Items.Add(month);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "s") // The one- or two-digit seconds. 
 | 
						|
                    {
 | 
						|
                        NumericSecondInput second = new NumericSecondInput();
 | 
						|
                        currentGroup.Items.Add(second);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "t") // The one-letter A.M./P.M. abbreviation (A.M. is displayed as "A"). 
 | 
						|
                    {
 | 
						|
                        HourPeriodInput period = new HourPeriodInput();
 | 
						|
                        period.UseSingleLetterLabel = true;
 | 
						|
                        currentGroup.Items.Add(period);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "y") // The one-digit year (2001 is displayed as "1"). 
 | 
						|
                    {
 | 
						|
                        NumericYearInput year = new NumericYearInput();
 | 
						|
                        year.YearDisplayFormat = eYearDisplayFormat.OneDigit;
 | 
						|
                        currentGroup.Items.Add(year);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "j") // The three-digit day of year...
 | 
						|
                    {
 | 
						|
                        NumericDayOfYearInput day = new NumericDayOfYearInput();
 | 
						|
                        currentGroup.Items.Add(day);
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "{") // Begins the group of data entries
 | 
						|
                    {
 | 
						|
                        if (inputStack.Length > 0)
 | 
						|
                        {
 | 
						|
                            VisualLabel label = new VisualLabel();
 | 
						|
                            label.Text = inputStack.ToString();
 | 
						|
                            currentGroup.Items.Add(label);
 | 
						|
                            inputStack = new StringBuilder(format.Length);
 | 
						|
                        }
 | 
						|
                        DateTimeGroup group = new DateTimeGroup();
 | 
						|
                        currentGroup.Items.Add(group);
 | 
						|
                        groupStack.Push(currentGroup);
 | 
						|
                        currentGroup = group;
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                    else if (s == "}") // Ends the group of data entries
 | 
						|
                    {
 | 
						|
                        currentGroup = groupStack.Pop();
 | 
						|
                        match = true;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                if (match)
 | 
						|
                {
 | 
						|
                    if (inputStack.Length > 0)
 | 
						|
                    {
 | 
						|
                        VisualLabel label = new VisualLabel();
 | 
						|
                        label.Text = inputStack.ToString();
 | 
						|
                        //label.TextPadding = new DevComponents.DotNetBar.Padding(0, 1, 0, 0);
 | 
						|
                        currentGroup.Items.Insert(currentGroup.Items.Count - 1, label);
 | 
						|
                        inputStack = new StringBuilder(format.Length);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    inputStack.Append(format[i]);
 | 
						|
            }
 | 
						|
 | 
						|
            if (inputStack.Length > 0)
 | 
						|
            {
 | 
						|
                VisualLabel label = new VisualLabel();
 | 
						|
                label.Text = inputStack.ToString();
 | 
						|
                currentGroup.Items.Add(label);
 | 
						|
            }
 | 
						|
 | 
						|
            if (_ShowUpDown)
 | 
						|
            {
 | 
						|
                VisualUpDownButton upDownButton = new VisualUpDownButton();
 | 
						|
                upDownButton.Alignment = eItemAlignment.Right;
 | 
						|
                upDownButton.AutoChange = eUpDownButtonAutoChange.FocusedItem;
 | 
						|
                _DateInputGroup.Items.Add(upDownButton);
 | 
						|
            }
 | 
						|
 | 
						|
            RecreateButtons();
 | 
						|
 | 
						|
            if (_ShowCheckBox)
 | 
						|
                this.LockUpdateCheckBox.Checked = _LockUpdateChecked;
 | 
						|
        }
 | 
						|
 | 
						|
        private LockUpdateCheckBox LockUpdateCheckBox
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_DateInputGroup.Items[0] is LockUpdateCheckBox)
 | 
						|
                    return (LockUpdateCheckBox)_DateInputGroup.Items[0];
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void LockCheckedChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            LockUpdateCheckBox checkBox = LockUpdateCheckBox;
 | 
						|
            if (checkBox != null)
 | 
						|
                _LockUpdateChecked = checkBox.Checked;
 | 
						|
 | 
						|
            OnLockUpdateChanged(e);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _LockUpdateChecked = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether check box shown using ShowCheckBox property which locks/unlocks the control update is checked.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Description("Indicates whether check box shown using ShowCheckBox property which locks/unlocks the control update is checked.")]
 | 
						|
        public bool LockUpdateChecked
 | 
						|
        {
 | 
						|
            get { return _LockUpdateChecked; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_LockUpdateChecked != value)
 | 
						|
                {
 | 
						|
                    _LockUpdateChecked = value;
 | 
						|
                    LockUpdateCheckBox checkBox = LockUpdateCheckBox;
 | 
						|
                    if (checkBox != null)
 | 
						|
                        checkBox.Checked = _LockUpdateChecked;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the LockUpdateChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event data./</param>
 | 
						|
        protected virtual void OnLockUpdateChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            if (LockUpdateChanged != null)
 | 
						|
                LockUpdateChanged(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the ValueChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnValueChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            if (IsInitializing) return;
 | 
						|
 | 
						|
            if (ValueChanged != null)
 | 
						|
                ValueChanged(this, e);
 | 
						|
            if (ValueObjectChanged != null)
 | 
						|
                ValueObjectChanged(this, e);
 | 
						|
            if (this.IsEmpty)
 | 
						|
            {
 | 
						|
                base.Text = "";
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                string format = "";
 | 
						|
                if (this.Format == eDateTimePickerFormat.Custom)
 | 
						|
                    format = this.CustomFormat;
 | 
						|
                else
 | 
						|
                    format = GetSystemFormatString(this.Format);
 | 
						|
                if (format == "")
 | 
						|
                    format = GetSystemFormatString(eDateTimePickerFormat.Short);
 | 
						|
                if (format == "")
 | 
						|
                    base.Text = this.Value.ToString();
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    try
 | 
						|
                    {
 | 
						|
                        base.Text = this.Value.ToString(format);
 | 
						|
                    }
 | 
						|
                    catch
 | 
						|
                    {
 | 
						|
                        base.Text = "";
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (FreeTextEntryMode && _FreeTextEntryBox != null)
 | 
						|
                _FreeTextEntryBox.Text = this.Text;
 | 
						|
 | 
						|
            ExecuteCommand();
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnValidating(CancelEventArgs e)
 | 
						|
        {
 | 
						|
            _DateInputGroup.UpdateValue(false);
 | 
						|
            base.OnValidating(e);
 | 
						|
        }
 | 
						|
 | 
						|
        private InputButtonSettings _ButtonDropDown = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the object that describes the settings for the button that shows drop-down calendar when clicked.
 | 
						|
        /// </summary>
 | 
						|
        [Category("Buttons"), Description("Describes the settings for the button that shows drop-down calendar when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public InputButtonSettings ButtonDropDown
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _ButtonDropDown;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private InputButtonSettings _ButtonClear = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the object that describes the settings for the button that clears the content of the control when clicked.
 | 
						|
        /// </summary>
 | 
						|
        [Category("Buttons"), Description("Describes the settings for the button that clears the content of the control when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public InputButtonSettings ButtonClear
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _ButtonClear;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override System.Collections.SortedList CreateSortedButtonList()
 | 
						|
        {
 | 
						|
            SortedList list = base.CreateSortedButtonList();
 | 
						|
            if (_ButtonClear.Visible)
 | 
						|
            {
 | 
						|
                VisualItem button = CreateButton(_ButtonClear);
 | 
						|
                if (_ButtonClear.ItemReference != null)
 | 
						|
                    _ButtonClear.ItemReference.Click -= new EventHandler(ClearButtonClick);
 | 
						|
                _ButtonClear.ItemReference = button;
 | 
						|
                button.Click += new EventHandler(ClearButtonClick);
 | 
						|
                list.Add(_ButtonClear, button);
 | 
						|
            }
 | 
						|
            if (_ButtonDropDown.Visible)
 | 
						|
            {
 | 
						|
                VisualItem button = CreateButton(_ButtonDropDown);
 | 
						|
                if (_ButtonDropDown.ItemReference != null)
 | 
						|
                {
 | 
						|
                    _ButtonDropDown.ItemReference.MouseDown -= new MouseEventHandler(DropDownButtonMouseDown);
 | 
						|
                    _ButtonDropDown.ItemReference.Click -= new EventHandler(DropDownButtonClick);
 | 
						|
                }
 | 
						|
                _ButtonDropDown.ItemReference = button;
 | 
						|
                button.MouseDown += new MouseEventHandler(DropDownButtonMouseDown);
 | 
						|
                button.Click += new EventHandler(DropDownButtonClick);
 | 
						|
                list.Add(_ButtonDropDown, button);
 | 
						|
            }
 | 
						|
            if (_ButtonFreeText.Visible)
 | 
						|
            {
 | 
						|
                VisualItem button = CreateButton(_ButtonFreeText);
 | 
						|
                if (_ButtonFreeText.ItemReference != null)
 | 
						|
                    _ButtonFreeText.ItemReference.Click -= new EventHandler(FreeTextButtonClick);
 | 
						|
                _ButtonFreeText.ItemReference = button;
 | 
						|
                button.Click += FreeTextButtonClick;
 | 
						|
                list.Add(_ButtonFreeText, button);
 | 
						|
            }
 | 
						|
 | 
						|
            return list;
 | 
						|
        }
 | 
						|
 | 
						|
        private void DropDownButtonClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (e is KeyEventArgs)
 | 
						|
            {
 | 
						|
                ToggleCalendarPopup();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void DropDownButtonMouseDown(object sender, MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (e.Button != MouseButtons.Left || _CloseTime != DateTime.MinValue && DateTime.Now.Subtract(_CloseTime).TotalMilliseconds < 150)
 | 
						|
            {
 | 
						|
                _CloseTime = DateTime.MinValue;
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            ToggleCalendarPopup();
 | 
						|
        }
 | 
						|
 | 
						|
        private void ToggleCalendarPopup()
 | 
						|
        {
 | 
						|
            CancelEventArgs cancelArgs = new CancelEventArgs();
 | 
						|
            OnButtonDropDownClick(cancelArgs);
 | 
						|
            if (cancelArgs.Cancel) return;
 | 
						|
 | 
						|
            _PopupItem.SetDisplayRectangle(this.ClientRectangle);
 | 
						|
 | 
						|
            _MonthCalendar.ReloadLocalizedStrings();
 | 
						|
 | 
						|
            // Check the day size in case larger font is applied to the control
 | 
						|
            if (this.Font.Height > Dpi.Height(_MonthCalendar.DaySize.Height))
 | 
						|
            {
 | 
						|
                _MonthCalendar.DaySize = new Size((int)Math.Ceiling(this.Font.Height * 1.6f), this.Font.Height + 1);
 | 
						|
            }
 | 
						|
 | 
						|
            if (this.RightToLeft == RightToLeft.No)
 | 
						|
                _PopupItem.PopupLocation = new Point(this.Width - _PopupItem.PopupSize.Width, this.Height);
 | 
						|
 | 
						|
            if (this.MinDate != DateTime.MinValue)
 | 
						|
                _MonthCalendar.MinDate = this.MinDate.Date; //.AddDays(-(this.MinDate.Day - 1));
 | 
						|
            else
 | 
						|
                _MonthCalendar.MinDate = this.MinDate;
 | 
						|
 | 
						|
            _MonthCalendar.MaxDate = this.MaxDate.Date;
 | 
						|
            if (!this.IsEmpty)
 | 
						|
            {
 | 
						|
                _MonthCalendar.SelectedDate = this.Value;
 | 
						|
                _TimeSelector.SelectedDateTime = this.Value;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                _MonthCalendar.SelectedDate = DateTime.MinValue;
 | 
						|
                _TimeSelector.SelectedTime = TimeSpan.Zero;
 | 
						|
            }
 | 
						|
 | 
						|
            if (_MonthCalendar.SelectedDate != DateTime.MinValue)
 | 
						|
                _MonthCalendar.DisplayMonth = _MonthCalendar.SelectedDate;
 | 
						|
            else
 | 
						|
                _MonthCalendar.DisplayMonth = DateTime.Today;
 | 
						|
            _PopupItem.Expanded = !_PopupItem.Expanded;
 | 
						|
        }
 | 
						|
        private bool _FireValueChangedOnPopupClose = false;
 | 
						|
        private DateTime _CloseTime = DateTime.MinValue;
 | 
						|
        private void DropDownPopupClose(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_FireValueChangedOnPopupClose)
 | 
						|
                OnValueChanged(EventArgs.Empty);
 | 
						|
            _FireValueChangedOnPopupClose = false;
 | 
						|
            _CloseTime = DateTime.Now;
 | 
						|
            if (_MonthCalendar != null)
 | 
						|
                _MonthCalendar.DropDownClosed();
 | 
						|
            if (_TimeSelector != null)
 | 
						|
                _TimeSelector.DropDownClosed();
 | 
						|
        }
 | 
						|
 | 
						|
        //protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
 | 
						|
        //{
 | 
						|
        //    if ((keyData & Keys.Down) == Keys.Down && Control.ModifierKeys == Keys.Alt)
 | 
						|
        //    {
 | 
						|
        //        if (_PopupItem != null && !_PopupItem.Expanded)
 | 
						|
        //            ToggleCalendarPopup();
 | 
						|
 | 
						|
        //    }
 | 
						|
        //    return base.ProcessCmdKey(ref msg, keyData);
 | 
						|
        //}
 | 
						|
 | 
						|
        private void ClearButtonClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            CancelEventArgs cancelArgs = new CancelEventArgs();
 | 
						|
            OnButtonClearClick(cancelArgs);
 | 
						|
            if (cancelArgs.Cancel) return;
 | 
						|
            this.IsEmpty = true;
 | 
						|
        }
 | 
						|
 | 
						|
        private InputButtonSettings _ButtonFreeText = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the object that describes the settings for the button that switches the control into the free-text entry mode when clicked.
 | 
						|
        /// </summary>
 | 
						|
        [Category("Buttons"), Description("Describes the settings for the button that switches the control into the free-text entry mode when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public InputButtonSettings ButtonFreeText
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _ButtonFreeText;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override VisualItem CreateButton(InputButtonSettings buttonSettings)
 | 
						|
        {
 | 
						|
            VisualItem item = null;
 | 
						|
            if (buttonSettings == _ButtonDropDown)
 | 
						|
            {
 | 
						|
                item = new VisualDropDownButton();
 | 
						|
                ApplyButtonSettings(buttonSettings, item as VisualButton);
 | 
						|
            }
 | 
						|
            else
 | 
						|
                item = base.CreateButton(buttonSettings);
 | 
						|
            VisualButton button = item as VisualButton;
 | 
						|
            button.ClickAutoRepeat = false;
 | 
						|
 | 
						|
            if (buttonSettings == _ButtonClear)
 | 
						|
            {
 | 
						|
                if (buttonSettings.Image == null && string.IsNullOrEmpty(buttonSettings.Text))
 | 
						|
                {
 | 
						|
                    //if (Dpi.Factor.Width > 1)
 | 
						|
                        button.Symbol = "\uf00d";
 | 
						|
                    //else
 | 
						|
                    //    button.Image = DevComponents.DotNetBar.BarFunctions.LoadBitmap("SystemImages.DateReset.png");
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else if (buttonSettings == _ButtonFreeText)
 | 
						|
            {
 | 
						|
                if (buttonSettings.Image == null && string.IsNullOrEmpty(buttonSettings.Text))
 | 
						|
                {
 | 
						|
                    //if (Dpi.Factor.Width > 1)
 | 
						|
                        button.Symbol = "\uf040";
 | 
						|
                    //else
 | 
						|
                    //    button.Image = DevComponents.DotNetBar.BarFunctions.LoadBitmap("SystemImages.FreeText.png");
 | 
						|
                }
 | 
						|
                button.Checked = buttonSettings.Checked;
 | 
						|
            }
 | 
						|
 | 
						|
            return item;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the ButtonClearClick event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        protected virtual void OnButtonClearClick(CancelEventArgs e)
 | 
						|
        {
 | 
						|
            if (ButtonClearClick != null)
 | 
						|
                ButtonClearClick(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the ButtonDropDownClick event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        protected virtual void OnButtonDropDownClick(CancelEventArgs e)
 | 
						|
        {
 | 
						|
            if (ButtonDropDownClick != null)
 | 
						|
                ButtonDropDownClick(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether input part of the control is read-only. When set to true the input part of the control becomes
 | 
						|
        /// read-only and does not allow the typing. However, drop-down part if visible still allows user to change the value of the control
 | 
						|
        /// Use this property to allow change of the value through drop-down picker only.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Description("Indicates whether input part of the control is read-only.")]
 | 
						|
        public bool IsInputReadOnly
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.IsReadOnly; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _DateInputGroup.IsReadOnly = value;
 | 
						|
                if (_FreeTextEntryBox != null)
 | 
						|
                    _FreeTextEntryBox.ReadOnly = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether empty input values (year, month or day) are set to defaults while user is entering data. Default value is true.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Behavior"), Description("Indicates whether empty input values (year, month or day) are set to defaults while user is entering data")]
 | 
						|
        public bool DefaultInputValues
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.DefaultInputValues; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _DateInputGroup.DefaultInputValues = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the reference to the internal MonthCalendarItem control which is used to display calendar when drop-down is open.
 | 
						|
        /// </summary>
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Description("Gets the reference to the internal MonthCalendarAdv control which is used to display calendar when drop-down is open.")]
 | 
						|
        public MonthCalendarItem MonthCalendar
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _MonthCalendar;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override Size DefaultSize
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return new Size(200, base.DefaultSize.Height);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _AutoSelectDate = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether first day in month is automatically selected on popup date picker when month or year is changed.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), DefaultValue(false), Category("Behavior"), Description("Indicates whether first day in month is automatically selected on popup date picker when month or year is changed.")]
 | 
						|
        public bool AutoSelectDate
 | 
						|
        {
 | 
						|
            get { return _AutoSelectDate; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _AutoSelectDate = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _AutoAdvance = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether input focus is automatically advanced to next input field when input is complete in current one.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Category("Behavior"), Description("Indicates whether input focus is automatically advanced to next input field when input is complete in current one.")]
 | 
						|
        public bool AutoAdvance
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.AutoAdvance; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_DateInputGroup.AutoAdvance != value)
 | 
						|
                {
 | 
						|
                    _DateInputGroup.AutoAdvance = value;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// List of characters that when pressed would select next input field. For example if you are
 | 
						|
        /// allowing time input you could set this property to : so when user presses the : character,
 | 
						|
        /// the input is forwarded to the next input field.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(""), Category("Behavior"), Description("List of characters that when pressed would select next input field.")]
 | 
						|
        public string SelectNextInputCharacters
 | 
						|
        {
 | 
						|
            get { return _DateInputGroup.SelectNextInputCharacters; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_DateInputGroup.SelectNextInputCharacters != value)
 | 
						|
                {
 | 
						|
                    _DateInputGroup.SelectNextInputCharacters = value;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private eDateTimeSelectorVisibility _DateTimeSelectorVisibility = eDateTimeSelectorVisibility.Auto;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the date-time selectors visibility on popup. Default value is Auto which will select selector visibility based on Format property setting.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eDateTimeSelectorVisibility.Auto), Category("Behavior"), Description("")]
 | 
						|
        public eDateTimeSelectorVisibility DateTimeSelectorVisibility
 | 
						|
        {
 | 
						|
            get { return _DateTimeSelectorVisibility; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _DateTimeSelectorVisibility)
 | 
						|
                {
 | 
						|
                    eDateTimeSelectorVisibility oldValue = _DateTimeSelectorVisibility;
 | 
						|
                    _DateTimeSelectorVisibility = value;
 | 
						|
                    OnDateTimeSelectorVisibilityChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void UpdateSelectorVisibility()
 | 
						|
        {
 | 
						|
            bool timeSelectorVisible = false;
 | 
						|
            bool dateSelectorVisible = true;
 | 
						|
            if (_DateTimeSelectorVisibility == eDateTimeSelectorVisibility.Auto)
 | 
						|
            {
 | 
						|
                if (_Format == eDateTimePickerFormat.LongTime || _Format == eDateTimePickerFormat.ShortTime)
 | 
						|
                {
 | 
						|
                    timeSelectorVisible = true;
 | 
						|
                    dateSelectorVisible = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else if (_DateTimeSelectorVisibility == eDateTimeSelectorVisibility.TimeSelector)
 | 
						|
            {
 | 
						|
                timeSelectorVisible = true;
 | 
						|
                dateSelectorVisible = false;
 | 
						|
            }
 | 
						|
            else if (_DateTimeSelectorVisibility == eDateTimeSelectorVisibility.Both)
 | 
						|
                timeSelectorVisible = true;
 | 
						|
            _MonthCalendar.Visible = dateSelectorVisible;
 | 
						|
            _TimeSelector.Visible = timeSelectorVisible;
 | 
						|
            if (dateSelectorVisible && timeSelectorVisible)
 | 
						|
            {
 | 
						|
                _Spacer.Visible = true;
 | 
						|
                //_MonthCalendar.DaySize = new Size(28, 19);
 | 
						|
                _MonthCalendar.DayClickAutoClosePopup = false;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                _Spacer.Visible = false;
 | 
						|
                //_MonthCalendar.ResetDaySize();
 | 
						|
                _MonthCalendar.DayClickAutoClosePopup = true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Returns reference to internal time selector item which is used on drop-down to select time when control is used in time entry mode.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        public TimeSelectorItem TimeSelectorItem
 | 
						|
        {
 | 
						|
            get { return _TimeSelector; }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Called when DateTimeSelectorVisibility property has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="oldValue">Old property value</param>
 | 
						|
        /// <param name="newValue">New property value</param>
 | 
						|
        protected virtual void OnDateTimeSelectorVisibilityChanged(eDateTimeSelectorVisibility oldValue, eDateTimeSelectorVisibility newValue)
 | 
						|
        {
 | 
						|
            //OnPropertyChanged(new PropertyChangedEventArgs("DateTimeSelectorVisibility"));
 | 
						|
            UpdateSelectorVisibility();
 | 
						|
        }
 | 
						|
 | 
						|
        private eTimeSelectorFormat _TimeSelectorTimeFormat = eTimeSelectorFormat.System;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the popup time selector time format used to present time by the selector i.e. 12H or 24H format.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eTimeSelectorFormat.System), Category("Appearance"), Description("Indicates popup time selector time format used to present time by the selector i.e. 12H or 24H format."), Localizable(true)]
 | 
						|
        public eTimeSelectorFormat TimeSelectorTimeFormat
 | 
						|
        {
 | 
						|
            get { return _TimeSelectorTimeFormat; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _TimeSelectorTimeFormat)
 | 
						|
                {
 | 
						|
                    eTimeSelectorFormat oldValue = _TimeSelectorTimeFormat;
 | 
						|
                    _TimeSelectorTimeFormat = value;
 | 
						|
                    OnTimeSelectorTimeFormatChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Called when TimeFormat property has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="oldValue">Old property value</param>
 | 
						|
        /// <param name="newValue">New property value</param>
 | 
						|
        protected virtual void OnTimeSelectorTimeFormatChanged(eTimeSelectorFormat oldValue, eTimeSelectorFormat newValue)
 | 
						|
        {
 | 
						|
            if (_TimeSelector != null)
 | 
						|
                _TimeSelector.TimeFormat = _TimeSelectorTimeFormat;
 | 
						|
        }
 | 
						|
 | 
						|
        private eTimeSelectorType _TimeSelectorType = eTimeSelectorType.MonthCalendarStyle;
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates the type of popup time selector used.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eTimeSelectorType.MonthCalendarStyle), Category("Appearance"), Description("Indicates the type of popup time selector used.")]
 | 
						|
        public eTimeSelectorType TimeSelectorType
 | 
						|
        {
 | 
						|
            get { return _TimeSelectorType; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _TimeSelectorType)
 | 
						|
                {
 | 
						|
                    eTimeSelectorType oldValue = _TimeSelectorType;
 | 
						|
                    _TimeSelectorType = value;
 | 
						|
                    OnTimeSelectorTypeChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Called when TimeSelectorType property has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="oldValue">Old property value</param>
 | 
						|
        /// <param name="newValue">New property value</param>
 | 
						|
        protected virtual void OnTimeSelectorTypeChanged(eTimeSelectorType oldValue, eTimeSelectorType newValue)
 | 
						|
        {
 | 
						|
            //OnPropertyChanged(new PropertyChangedEventArgs("TimeSelectorType"));
 | 
						|
            if (_TimeSelector != null)
 | 
						|
                _TimeSelector.SelectorType = _TimeSelectorType;
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ICommandSource Members
 | 
						|
        protected virtual void ExecuteCommand()
 | 
						|
        {
 | 
						|
            if (_Command == null) return;
 | 
						|
            CommandManager.ExecuteCommand(this);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the command assigned to the item. Default value is null.
 | 
						|
        /// <remarks>Note that if this property is set to null Enabled property will be set to false automatically to disable the item.</remarks>
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null), Category("Commands"), Description("Indicates the command assigned to the item.")]
 | 
						|
        public Command Command
 | 
						|
        {
 | 
						|
            get { return (Command)((ICommandSource)this).Command; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                ((ICommandSource)this).Command = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private ICommand _Command = null;
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        ICommand ICommandSource.Command
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _Command;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                bool changed = false;
 | 
						|
                if (_Command != value)
 | 
						|
                    changed = true;
 | 
						|
 | 
						|
                if (_Command != null)
 | 
						|
                    CommandManager.UnRegisterCommandSource(this, _Command);
 | 
						|
                _Command = value;
 | 
						|
                if (value != null)
 | 
						|
                    CommandManager.RegisterCommand(this, value);
 | 
						|
                if (changed)
 | 
						|
                    OnCommandChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called when Command property value changes.
 | 
						|
        /// </summary>
 | 
						|
        protected virtual void OnCommandChanged()
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        private object _CommandParameter = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets user defined data value that can be passed to the command when it is executed.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), DefaultValue(null), Category("Commands"), Description("Indicates user defined data value that can be passed to the command when it is executed."), System.ComponentModel.TypeConverter(typeof(System.ComponentModel.StringConverter)), System.ComponentModel.Localizable(true)]
 | 
						|
        public object CommandParameter
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _CommandParameter;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _CommandParameter = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Free-Text Entry Support
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs if Free-Text entry value is not natively recognized by the control and provides you with opportunity to convert that value to the
 | 
						|
        /// value control expects.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs if Free-Text entry value is not natively recognized by the control and provides you with opportunity to convert that value to the value control expects."), Category("Free-Text")]
 | 
						|
        public event FreeTextEntryConversionEventHandler ConvertFreeTextEntry;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when Free-Text button is clicked and allows you to cancel its default action.
 | 
						|
        /// </summary>
 | 
						|
        public event CancelEventHandler ButtonFreeTextClick;
 | 
						|
 | 
						|
        private void FreeTextButtonClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            CancelEventArgs cancelArgs = new CancelEventArgs();
 | 
						|
            OnButtonFreeTextClick(cancelArgs);
 | 
						|
            if (cancelArgs.Cancel) return;
 | 
						|
 | 
						|
            FreeTextEntryMode = !FreeTextEntryMode;
 | 
						|
            _ButtonFreeText.Checked = FreeTextEntryMode;
 | 
						|
            if (FreeTextEntryMode && _FreeTextEntryBox != null && !_FreeTextEntryBox.Focused)
 | 
						|
                _FreeTextEntryBox.Focus();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        protected virtual void OnButtonFreeTextClick(CancelEventArgs e)
 | 
						|
        {
 | 
						|
            CancelEventHandler handler = ButtonFreeTextClick;
 | 
						|
            if (handler != null) handler(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _AutoResolveFreeTextEntries = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether free text entries are attempted to be auto-resolved to dates like Today to today's date or Now to date and time now etc. Default value is true.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Free-Text"), Description("Indicates whether free text entries are attempted to be auto-resolved to dates like Today to today's date or Now to date and time now etc.")]
 | 
						|
        public bool AutoResolveFreeTextEntries
 | 
						|
        {
 | 
						|
            get { return _AutoResolveFreeTextEntries; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _AutoResolveFreeTextEntries = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _AutoOffFreeTextEntry = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether free-text entry is automatically turned off when control loses input focus. Default value is false.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Category("Free-Text"), Description("Indicates whether free-text entry is automatically turned off when control loses input focus.")]
 | 
						|
        public bool AutoOffFreeTextEntry
 | 
						|
        {
 | 
						|
            get { return _AutoOffFreeTextEntry; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _AutoOffFreeTextEntry = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _FreeTextEntryMode = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether control input is in free-text input mode. Default value is false.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Category("Free-Text"), Description("Indicates whether control input is in free-text input mode.")]
 | 
						|
        public bool FreeTextEntryMode
 | 
						|
        {
 | 
						|
            get { return _FreeTextEntryMode; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _FreeTextEntryMode = value;
 | 
						|
                OnFreeTextEntryModeChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnFreeTextEntryModeChanged()
 | 
						|
        {
 | 
						|
            if (!_FreeTextEntryMode)
 | 
						|
            {
 | 
						|
                if (_FreeTextEntryBox != null)
 | 
						|
                {
 | 
						|
                    _FreeTextEntryBox.ApplyValue -= ApplyFreeTextValue;
 | 
						|
                    _FreeTextEntryBox.RevertValue -= RevertFreeTextValue;
 | 
						|
                    _FreeTextEntryBox.LostFocus -= FreeTextLostFocus;
 | 
						|
                    this.Controls.Remove(_FreeTextEntryBox);
 | 
						|
                    _FreeTextEntryBox.Dispose();
 | 
						|
                    _FreeTextEntryBox = null;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                UpdateFreeTextBoxVisibility();
 | 
						|
            }
 | 
						|
            if (_ButtonFreeText != null) _ButtonFreeText.Checked = _FreeTextEntryMode;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnIsKeyboardFocusWithinChanged()
 | 
						|
        {
 | 
						|
            if (_FreeTextEntryMode)
 | 
						|
            {
 | 
						|
                UpdateFreeTextBoxVisibility();
 | 
						|
                if (this.IsKeyboardFocusWithin)
 | 
						|
                {
 | 
						|
                    Control textBox = GetFreeTextBox();
 | 
						|
                    if (!textBox.Focused)
 | 
						|
                        textBox.Focus();
 | 
						|
                    if (FocusHighlightEnabled)
 | 
						|
                        textBox.BackColor = this.FocusHighlightColor;
 | 
						|
                }
 | 
						|
                else if (FocusHighlightEnabled)
 | 
						|
                {
 | 
						|
                    Control textBox = GetFreeTextBox();
 | 
						|
                    textBox.BackColor = SystemColors.Window;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            base.OnIsKeyboardFocusWithinChanged();
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpdateFreeTextBoxVisibility()
 | 
						|
        {
 | 
						|
            FreeTextEntryBox textBox = (FreeTextEntryBox)GetFreeTextBox();
 | 
						|
            if (this.IsKeyboardFocusWithin)
 | 
						|
            {
 | 
						|
                textBox.Visible = true;
 | 
						|
                textBox.Text = this.Text;
 | 
						|
                RootVisualItem.InvalidateArrange();
 | 
						|
                this.Invalidate();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (textBox.Visible)
 | 
						|
                {
 | 
						|
                    if (textBox.Focused)
 | 
						|
                        textBox.HideOnLostFocus();
 | 
						|
                    else
 | 
						|
                        textBox.Visible = false;
 | 
						|
                    RootVisualItem.InvalidateArrange();
 | 
						|
                    this.Invalidate();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override bool SupportsFreeTextEntry
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private FreeTextEntryBox _FreeTextEntryBox = null;
 | 
						|
        protected override Control GetFreeTextBox()
 | 
						|
        {
 | 
						|
            if (_FreeTextEntryBox == null)
 | 
						|
            {
 | 
						|
                _FreeTextEntryBox = new FreeTextEntryBox();
 | 
						|
                _FreeTextEntryBox.ApplyValue += ApplyFreeTextValue;
 | 
						|
                _FreeTextEntryBox.RevertValue += RevertFreeTextValue;
 | 
						|
                _FreeTextEntryBox.LostFocus += FreeTextLostFocus;
 | 
						|
                _FreeTextEntryBox.BorderStyle = BorderStyle.None;
 | 
						|
                _FreeTextEntryBox.ReadOnly = this.IsInputReadOnly;
 | 
						|
                this.Controls.Add(_FreeTextEntryBox);
 | 
						|
            }
 | 
						|
 | 
						|
            return _FreeTextEntryBox;
 | 
						|
        }
 | 
						|
 | 
						|
        private void RevertFreeTextValue(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_FreeTextEntryBox != null) _FreeTextEntryBox.Text = this.Text;
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual void OnConvertFreeTextEntry(FreeTextEntryConversionEventArgs e)
 | 
						|
        {
 | 
						|
            FreeTextEntryConversionEventHandler handler = this.ConvertFreeTextEntry;
 | 
						|
            if (handler != null) handler(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool ParseFreeTextValue(out DateTime date)
 | 
						|
        {
 | 
						|
            try
 | 
						|
            {
 | 
						|
                return (this.Format == eDateTimePickerFormat.Custom && DateTime.TryParseExact(_FreeTextEntryBox.Text, this.CustomFormat, null, DateTimeStyles.None, out date) ||
 | 
						|
                                    DateTime.TryParse(_FreeTextEntryBox.Text, out date)) && _AutoResolveFreeTextEntries;
 | 
						|
            }
 | 
						|
            catch
 | 
						|
            {
 | 
						|
                date = DateTime.MinValue;
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void ApplyFreeTextValue(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_FreeTextEntryBox == null) return;
 | 
						|
            if (string.IsNullOrEmpty(_FreeTextEntryBox.Text))
 | 
						|
                this.ValueObject = null;
 | 
						|
            else
 | 
						|
            {
 | 
						|
                DateTime date;
 | 
						|
                if (ParseFreeTextValue(out date))
 | 
						|
                {
 | 
						|
                    this.Value = date;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    FreeTextEntryConversionEventArgs eventArgs = new FreeTextEntryConversionEventArgs(_FreeTextEntryBox.Text);
 | 
						|
                    OnConvertFreeTextEntry(eventArgs);
 | 
						|
                    if (eventArgs.IsValueConverted)
 | 
						|
                    {
 | 
						|
                        if (eventArgs.ControlValue is DateTime)
 | 
						|
                            this.Value = (DateTime)eventArgs.ControlValue;
 | 
						|
                        else if (eventArgs.ControlValue == null)
 | 
						|
                            this.ValueObject = null;
 | 
						|
                        else
 | 
						|
                            throw new ArgumentException("ControlValue assigned is not DateTime type.");
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        if (_AutoResolveFreeTextEntries)
 | 
						|
                        {
 | 
						|
                            date=DateTime.MinValue;
 | 
						|
                            string text = _FreeTextEntryBox.Text.ToLower();
 | 
						|
                            if (text == "now")
 | 
						|
                                date = DateTime.Now;
 | 
						|
                            else if (text == "today")
 | 
						|
                                date = DateTime.Today;
 | 
						|
                            else if (text == "tomorrow")
 | 
						|
                                date = DateTime.Today.AddDays(1);
 | 
						|
                            else if (text == "yesterday")
 | 
						|
                                date = DateTime.Today.AddDays(-1);
 | 
						|
                            if (date == DateTime.MinValue)
 | 
						|
                                this.ValueObject = null;
 | 
						|
                            else
 | 
						|
                                this.Value = date;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void FreeTextLostFocus(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (_AutoOffFreeTextEntry && !this.IsKeyboardFocusWithin)
 | 
						|
                this.FreeTextEntryMode = false;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void HideFreeTextBoxEntry()
 | 
						|
        {
 | 
						|
            if (_FreeTextEntryBox != null) _FreeTextEntryBox.Visible = false;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override bool IsFreeTextEntryVisible
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _FreeTextEntryMode && this.IsKeyboardFocusWithin;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
    }
 | 
						|
    /// <summary>
 | 
						|
    /// Defines the date-time selector visibility for DateTimeInput control popup.
 | 
						|
    /// </summary>
 | 
						|
    public enum eDateTimeSelectorVisibility
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Depending on DateTimeInput.Format property setting either date or time selector is used.
 | 
						|
        /// </summary>
 | 
						|
        Auto,
 | 
						|
        /// <summary>
 | 
						|
        /// Only date selector is visible.
 | 
						|
        /// </summary>
 | 
						|
        DateSelector,
 | 
						|
        /// <summary>
 | 
						|
        /// Only time selector is visible on popup.
 | 
						|
        /// </summary>
 | 
						|
        TimeSelector,
 | 
						|
        /// <summary>
 | 
						|
        /// Both date and time selectors are visible.
 | 
						|
        /// </summary>
 | 
						|
        Both
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif
 | 
						|
 |