File: UI\MobileControls\Command.cs
Project: ndp\fx\src\mit\System\Web\System.Web.Mobile.csproj (System.Web.Mobile)
//------------------------------------------------------------------------------
// <copyright file="Command.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Drawing.Design;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Permissions;
 
namespace System.Web.UI.MobileControls
{
 
    /*
     * Mobile Command class.
     *
     * Copyright (c) 2000 Microsoft Corporation
     */
    /// <include file='doc\Command.uex' path='docs/doc[@for="Command"]/*' />
    [
        DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, " + AssemblyRef.SystemDesign),
        DefaultEvent("Click"),
        DefaultProperty("Text"),
        Designer(typeof(System.Web.UI.Design.MobileControls.CommandDesigner)),
        DesignerAdapter(typeof(System.Web.UI.Design.MobileControls.Adapters.DesignerCommandAdapter)),
        ToolboxData("<{0}:Command runat=\"server\">Command</{0}:Command>"),
        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 Command : TextControl, IPostBackEventHandler, IPostBackDataHandler
    {
        private static readonly Object EventClick = new Object ();
        private static readonly Object EventItemCommand = new Object ();
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.OnPreRender"]/*' />
        protected override void OnPreRender(EventArgs e) 
        {
            base.OnPreRender(e);
            // If this control will be rendered as an image
 
            Debug.Assert(ImageUrl != null);
            if (MobilePage != null
                && ImageUrl.Length != 0
                && MobilePage.Device.SupportsImageSubmit)
            {
                // HTML input controls of type image postback as name.x and
                // name.y which is not associated with this control by default
                // in Page.ProcessPostData().
                MobilePage.RegisterRequiresPostBack(this);
            }
        }
        
        /// <internalonly/>
        protected bool LoadPostData(String key, NameValueCollection data)
        {
            bool dataChanged;
            bool handledByAdapter =
                Adapter.LoadPostData(key, data, null, out dataChanged);
 
            // If the adapter handled the post back and set dataChanged this
            // was an image button (responds with ID.x and ID.y).
            if (handledByAdapter)
            {
                if(dataChanged)
                {
                    Page.RegisterRequiresRaiseEvent(this);
                }
            }
            // Otherwise if the adapter did not handle the past back, use
            // the same method as Page.ProcessPostData().
            else if(data[key] != null)
            {
                Page.RegisterRequiresRaiseEvent(this);
            }
            return false;  // no need to raise PostDataChangedEvent.
        }
 
        /// <internalonly/>
        protected void RaisePostDataChangedEvent() {
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.SoftkeyLabel"]/*' />
        [
            Bindable(true),
            DefaultValue(""),
            MobileCategory(SR.Category_Behavior),
            MobileSysDescription(SR.Command_SoftkeyLabel)
        ]
        public String SoftkeyLabel
        {
            get
            {
                String s = (String) ViewState["Softkeylabel"];
                return((s != null) ? s : String.Empty);
            }
            set
            {
                ViewState["Softkeylabel"] = value;
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.CommandName"]/*' />
        [
            Bindable(true),
            DefaultValue(""),
            MobileCategory(SR.Category_Behavior),
            MobileSysDescription(SR.Command_CommandName)
        ]
        public String CommandName
        {
            get
            {
                String s = (String) ViewState["CommandName"];
                return((s != null) ? s : String.Empty);
            }
            set
            {
                ViewState["CommandName"] = value;
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.CommandArgument"]/*' />
        [
            Bindable(true),
            DefaultValue(""),
            MobileCategory(SR.Category_Behavior),
            MobileSysDescription(SR.Command_CommandArgument)
        ]
        public String CommandArgument
        {
            get
            {
                String s = (String) ViewState["CommandArgument"];
                return((s != null) ? s : String.Empty);
            }
            set
            {
                ViewState["CommandArgument"] = value;
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.ImageUrl"]/*' />
        [
            Bindable(true),
            DefaultValue(""),
            Editor(typeof(System.Web.UI.Design.MobileControls.ImageUrlEditor),
                   typeof(UITypeEditor)),
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.Image_ImageUrl)
        ]
        public String ImageUrl
        {
            get
            {
                String s = (String) ViewState["ImageUrl"];
                return((s != null) ? s : String.Empty);
            }
            set
            {
                ViewState["ImageUrl"] = value;
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.CausesValidation"]/*' />
        [
            Bindable(false),
            DefaultValue(true),
            MobileCategory(SR.Category_Behavior),
            MobileSysDescription(SR.Command_CausesValidation)
        ]
        public bool CausesValidation
        {
            get
            {
                object b = ViewState["CausesValidation"];
                return((b == null) ? true : (bool)b);
            }
            set
            {
                ViewState["CausesValidation"] = value;
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.Format"]/*' />
        [
            Bindable(true),
            DefaultValue(CommandFormat.Button),
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.Command_Format)
        ]
        public CommandFormat Format
        {
            get
            {
                Object o = ViewState["Format"];
                return((o == null) ? CommandFormat.Button : (CommandFormat)o);
            }
            set
            {
                ViewState["Format"] = value;
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.OnClick"]/*' />
        protected virtual void OnClick(EventArgs e)
        {
            EventHandler onClickHandler = (EventHandler)Events[EventClick];
            if (onClickHandler != null)
            {
                onClickHandler(this,e);
            }
        }
        
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.OnItemCommand"]/*' />
        protected virtual void OnItemCommand(CommandEventArgs e)
        {
            CommandEventHandler onItemCommandHandler = (CommandEventHandler)Events[EventItemCommand];
            if (onItemCommandHandler != null)
            {
                onItemCommandHandler(this,e);
            }
 
            RaiseBubbleEvent (this, e);
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.Click"]/*' />
        [        
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.Command_OnClick)
        ]
        public event EventHandler Click
        {
            add 
            {
                Events.AddHandler(EventClick, value);
            }
            remove 
            {
                Events.RemoveHandler(EventClick, value);
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.ItemCommand"]/*' />
        [        
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.Command_OnItemCommand)
        ]
        public event CommandEventHandler ItemCommand
        {
            add 
            {
                Events.AddHandler(EventItemCommand, value);
            }
            remove 
            {
                Events.RemoveHandler(EventItemCommand, value);
            }
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.IPostBackEventHandler.RaisePostBackEvent"]/*' />
        /// <internalonly/>
        protected void RaisePostBackEvent(String argument)
        {
            if (CausesValidation)
            {
                MobilePage.Validate();
            }
 
            // It is legitimate to reset the form back to the first page
            // after a form submit.
            Form.CurrentPage = 1;
 
            OnClick (EventArgs.Empty);
            OnItemCommand (new CommandEventArgs(CommandName, CommandArgument));
        }
 
        /// <include file='doc\Command.uex' path='docs/doc[@for="Command.IsFormSubmitControl"]/*' />
        protected override bool IsFormSubmitControl()
        {
            return true;
        }
 
        #region IPostBackEventHandler implementation
        void IPostBackEventHandler.RaisePostBackEvent(String eventArgument) {
            RaisePostBackEvent(eventArgument);
        }
        #endregion 
 
        #region IPostBackDataHandler implementation
        bool IPostBackDataHandler.LoadPostData(String key, NameValueCollection data) {
            return LoadPostData(key, data);
        }
 
        void IPostBackDataHandler.RaisePostDataChangedEvent() {
            RaisePostDataChangedEvent();
        }
        #endregion
    }
}