File: UI\MobileControls\Calendar.cs
Project: ndp\fx\src\mit\System\Web\System.Web.Mobile.csproj (System.Web.Mobile)
//------------------------------------------------------------------------------
// <copyright file="Calendar.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Drawing.Design;
using System.Web;
using System.Web.UI;
using System.Web.UI.Design.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using WebCntrls = System.Web.UI.WebControls;
using System.Security.Permissions;
 
namespace System.Web.UI.MobileControls
{
 
    /*
     * Mobile Calendar class.
     * The Calendar control allows developers to easily add date picking
     * functionality to a Mobile application.
     *
     * Copyright (c) 2000 Microsoft Corporation
     */
    /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar"]/*' />
    [
        DataBindingHandler(typeof(System.Web.UI.Design.MobileControls.CalendarDataBindingHandler)),
        DefaultEvent("SelectionChanged"),
        DefaultProperty("SelectedDate"),
        Designer(typeof(System.Web.UI.Design.MobileControls.CalendarDesigner)),
        DesignerAdapter(typeof(System.Web.UI.Design.MobileControls.Adapters.DesignerCalendarAdapter)),
        ToolboxData("<{0}:Calendar runat=\"server\"></{0}:Calendar>"),
        ToolboxItem("System.Web.UI.Design.WebControlToolboxItem, " + AssemblyRef.SystemDesign)
    ]
    [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
    [Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")]
    public class Calendar : MobileControl, IPostBackEventHandler
    {
        private WebCntrls.Calendar _webCalendar;
 
        // Static objects to identify individual events stored in Events
        // property.
        private static readonly Object EventSelectionChanged = new Object();
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.Calendar"]/*' />
        public Calendar() : base()
        {
            _webCalendar = CreateWebCalendar();
            _webCalendar.Visible = false;
            Controls.Add(_webCalendar);
 
            // Adding wrapper event handlers for event properties exposed by
            // the aggregated control.  For more details about the mechanism,
            // please see the comment in the constructor of
            // Mobile.UI.AdRotator.
            EventHandler eventHandler =
                new EventHandler(WebSelectionChanged);
 
            _webCalendar.SelectionChanged += eventHandler;
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.CreateWebCalendar"]/*' />
        protected virtual WebCntrls.Calendar CreateWebCalendar()
        {
            return new WebCntrls.Calendar();
        }
 
        /////////////////////////////////////////////////////////////////////
        // Mimic some of the properties exposed in the original Web Calendar
        // control.  Only those properties that are meaningful and useful to
        // mobile device adapters are exposed.  Other properties, which are
        // used mostly for the complex HTML specific rendering (like the one
        // rendered by WebForms Calendar), can be set via the property that
        // exposed the aggregated WebForms Calendar directly.
        // 
        // Most properties are got and set directly from the original Calendar
        // control.  For event properties, event references are stored locally
        // as they cannot be returned from the aggregated child control.
        /////////////////////////////////////////////////////////////////////
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.WebCalendar"]/*' />
        [
            Bindable(false),
            Browsable(false),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public WebCntrls.Calendar WebCalendar
        {
            get
            {
                return _webCalendar;
            }
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.FirstDayOfWeek"]/*' />
        [
            Bindable(true),
            DefaultValue(FirstDayOfWeek.Default),
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.Calendar_FirstDayOfWeek)
        ]
        public FirstDayOfWeek FirstDayOfWeek
        {
            get
            {
                return _webCalendar.FirstDayOfWeek;
            }
            set
            {
                _webCalendar.FirstDayOfWeek = value;
            }
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.SelectedDate"]/*' />
        [
            Bindable(true),
            DefaultValue(typeof(DateTime), "1/1/0001"),
            MobileSysDescription(SR.Calendar_SelectedDate)
        ]
        public DateTime SelectedDate
        {
            get
            {
                return _webCalendar.SelectedDate;
            }
            set
            {
                _webCalendar.SelectedDate = value;
            }
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.SelectedDates"]/*' />
        [
            Browsable(false),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]   
        public SelectedDatesCollection SelectedDates
        {
            get
            {
                return _webCalendar.SelectedDates;
            }
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.SelectionMode"]/*' />
        [
            Bindable(true),
            DefaultValue(CalendarSelectionMode.Day),
            MobileCategory(SR.Category_Behavior),
            MobileSysDescription(SR.Calendar_SelectionMode)
        ]
        public CalendarSelectionMode SelectionMode
        {
            get
            {
                return _webCalendar.SelectionMode;
            }
            set
            {
                _webCalendar.SelectionMode = value;
            }
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.ShowDayHeader"]/*' />
        [
            Bindable(true),
            DefaultValue(true),
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.Calendar_ShowDayHeader)
        ]
        public bool ShowDayHeader
        {
            get
            {
                return _webCalendar.ShowDayHeader;
            }
            set
            {
                _webCalendar.ShowDayHeader = value;
            }
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.VisibleDate"]/*' />
        [
            Bindable(true),
            DefaultValue(typeof(DateTime), "1/1/0001"),
            MobileSysDescription(SR.Calendar_VisibleDate)
        ]
        public DateTime VisibleDate
        {
            get
            {
                return _webCalendar.VisibleDate;
            }
            set
            {
                _webCalendar.VisibleDate = value;
            }
        } 
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.CalendarEntryText"]/*' />
        [
            Bindable(true),
            DefaultValue(""),
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.Calendar_CalendarEntryText)
        ]
        public String CalendarEntryText
        {
            get
            {
                String s = (String) ViewState["CalendarEntryText"];
                return((s != null) ? s : String.Empty);
            }
            set
            {
                ViewState["CalendarEntryText"] = value;
            }
        }
 
        /////////////////////////////////////////////////////////////////////
        //  BEGIN STYLE PROPERTIES
        /////////////////////////////////////////////////////////////////////
 
 
        /////////////////////////////////////////////////////////////////////
        //  END STYLE PROPERTIES
        /////////////////////////////////////////////////////////////////////
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.SelectionChanged"]/*' />
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.Calendar_OnSelectionChanged)
        ]
        public event EventHandler SelectionChanged
        {
            add
            {
                Events.AddHandler(EventSelectionChanged, value);
            }
            remove
            {
                Events.RemoveHandler(EventSelectionChanged, value);
            }
        }
 
        // protected method (which can be overridden by subclasses) for
        // raising user events
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.OnSelectionChanged"]/*' />
        protected virtual void OnSelectionChanged()
        {
            EventHandler handler = (EventHandler)Events[EventSelectionChanged];
            if (handler != null)
            {
                handler(this, new EventArgs());
            }
        }
 
        private void WebSelectionChanged(Object sender, EventArgs e)
        {
            // Invoke user events for further manipulation specified by user
            OnSelectionChanged();
        }
 
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.IPostBackEventHandler.RaisePostBackEvent"]/*' />
        /// <internalonly/>
        protected void RaisePostBackEvent(String eventArgument)
        {
            // There can be cases that the original form is
            // involved in the generation of multiple cards in the same WML
            // deck.  Here is to reset the right active form.
            if (MobilePage.ActiveForm != Form)
            {
                MobilePage.ActiveForm = Form;
            }
 
            Adapter.HandlePostBackEvent(eventArgument);
        }
 
        // A wrapper to raise the SelectionChangedEvent when a date is selected
        // by the user.  This can be called by different adapters when they have
        // collected the selected date.
        /// <include file='doc\Calendar.uex' path='docs/doc[@for="Calendar.RaiseSelectionChangedEvent"]/*' />
        public void RaiseSelectionChangedEvent()
        {
            WebSelectionChanged(this, new EventArgs());
        }
 
        #region IPostBackEventHandler implementation
        void IPostBackEventHandler.RaisePostBackEvent(String eventArgument) {
            RaisePostBackEvent(eventArgument);
        }
        #endregion 
    }
}