File: UI\MobileControls\MobileListItem.cs
Project: ndp\fx\src\mit\System\Web\System.Web.Mobile.csproj (System.Web.Mobile)
//------------------------------------------------------------------------------
// <copyright file="MobileListItem.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Permissions;
 
namespace System.Web.UI.MobileControls 
{
    /*
     * List Item type - enumeration.
     *
     * Copyright (c) 2000 Microsoft Corporation
     */
 
    /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItemType"]/*' />
    [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 enum MobileListItemType
    {
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItemType.HeaderItem"]/*' />
        HeaderItem,
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItemType.ListItem"]/*' />
        ListItem,
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItemType.FooterItem"]/*' />
        FooterItem,
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItemType.SeparatorItem"]/*' />
        SeparatorItem
    }
 
    /*
     * Mobile List Item class.
     *
     * Copyright (c) 2000 Microsoft Corporation
     */
 
    /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem"]/*' />
    [
        PersistName("Item"),
        ToolboxItem(false)
    ]
    [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 MobileListItem : TemplateContainer, IStateManager
    {
        private const int SELECTED = 0;
        private const int MARKED = 1;
        private const int TEXTISDIRTY = 2;
        private const int VALUEISDIRTY = 3;
        private const int SELECTIONISDIRTY = 4;
 
        private int _index;
        private MobileListItemType _itemType;
        private Object _dataItem;
        private String _text;
        private String _value;
        private BitArray _flags;
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.MobileListItem"]/*' />
        public MobileListItem() : this(null, null, null) 
        {
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.MobileListItem1"]/*' />
        public MobileListItem(String text) : this(null, text, null) 
        {
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.MobileListItem2"]/*' />
        public MobileListItem(String text, String value) : this(null, text, value)
        {
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.MobileListItem3"]/*' />
        public MobileListItem(MobileListItemType itemType) : this (null, null, null)
        {
            _itemType = itemType;
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.MobileListItem4"]/*' />
        public MobileListItem(Object dataItem, String text, String value)
        {
            _index = -1;
            _dataItem = dataItem;
            _text = text;
            _value = value;
            _flags = new BitArray(5);
            _itemType = MobileListItemType.ListItem;
        }
 
        internal MobileListItemType ItemType
        {
            get
            {
                return _itemType;
            }
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.Index"]/*' />
        [
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public int Index
        {
            get
            {
                return _index;
            }
        }
 
        internal void SetIndex(int value)
        {
            _index = value;
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.operatorMobileListItem"]/*' />
        public static implicit operator MobileListItem(String s) 
        {
            return new MobileListItem(s);
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.Text"]/*' />
        [
            DefaultValue("")
        ]        
        public String Text 
        {
            get 
            {
                String s;
                if (_text != null)
                {
                    s = _text;
                }
                else if (_value != null)
                {
                    s = _value;
                }
                else
                {
                    s = String.Empty;
                }
                return s;
            }
 
            set 
            {
                _text = value;
                if (((IStateManager)this).IsTrackingViewState)
                {
                    _flags.Set (TEXTISDIRTY,true);
                }
            }
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.Value"]/*' />
        [
            DefaultValue("")
        ]
        public String Value 
        {
            get 
            {
                String s;
                if (_value != null)
                {
                    s = _value;
                }
                else if (_text != null)
                {
                    s = _text;
                }
                else
                {
                    s = String.Empty;
                }
                return s;
            }
 
            set 
            {
                _value = value;
                if (_flags.Get (MARKED))
                {
                    _flags.Set (VALUEISDIRTY,true);
                }
            }
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.DataItem"]/*' />
        [
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public Object DataItem
        {
            get
            {
                return _dataItem;
            }
            set
            {
                _dataItem = value;
            }
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.Equals"]/*' />
        public override bool Equals(Object o) 
        {
            MobileListItem other = o as MobileListItem;
            if (other != null) 
            {
                return Value.Equals(other.Value) && Text.Equals(other.Text);
            }
            return false;
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.GetHashCode"]/*' />
        public override int GetHashCode()
        {
            return Value.GetHashCode();
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.FromString"]/*' />
        public static MobileListItem FromString(String s) 
        {
            return new MobileListItem(s);
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.ToString"]/*' />
        public override String ToString() 
        {
            return Text;
        }
 
        /////////////////////////////////////////////////////////////////////////
        //  STATE MANAGEMENT, FOR ITEM'S DATA (NON-CONTROL) STATE.
        /////////////////////////////////////////////////////////////////////////
 
        internal virtual Object SaveDataState()
        {
            String sa0 = _flags.Get(TEXTISDIRTY) ? _text : null;
            String sa1 = _flags.Get(VALUEISDIRTY) ? _value : null;
 
            if (sa0 == null && sa1 == null)
            {
                return null;
            }
            else
            {
                return new String[2] { sa0, sa1 };
            }
        }
 
        internal virtual void LoadDataState(Object state)
        {
            if (state != null) 
            {
                String[] sa = (String[])state;
                if (sa[0] != null)
                {
                    Text = sa[0];
                }
                if (sa[1] != null)
                {
                    Value = sa[1];
                }
            }
        }
 
        /// <internalonly/>
        protected new bool IsTrackingViewState
        {   
            get
            {
                return _flags.Get (MARKED);
            }
        }
 
        /// <internalonly/>
        protected new void LoadViewState(Object state) 
        {
            LoadDataState (state);
        }
 
        /// <internalonly/>
        protected new void TrackViewState() 
        {
            _flags.Set (MARKED, true);
        }
 
        /// <internalonly/>
        protected new Object SaveViewState() 
        {
            return SaveDataState ();
        }
 
        internal virtual bool Dirty 
        {
            get 
            { 
                return (_flags.Get(TEXTISDIRTY) || _flags.Get(VALUEISDIRTY)); 
            }
            set 
            { 
                _flags.Set (TEXTISDIRTY, value); 
                _flags.Set (VALUEISDIRTY, value); 
            }
        }
 
        internal bool SelectionDirty 
        {
            get 
            { 
                return _flags.Get(SELECTIONISDIRTY);
            }
            set 
            { 
                _flags.Set (SELECTIONISDIRTY, value); 
            }
        }
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="ListItem.Selected"]/*' />
        /// <devdoc>
        ///    <para>Specifies a value indicating whether the
        ///       item is selected.</para>
        /// </devdoc>
        [
            DefaultValue(false)
        ]
        public bool Selected {
            get { 
                return _flags.Get(SELECTED); 
            }
            set { 
                _flags.Set(SELECTED,value); 
                if (((IStateManager)this).IsTrackingViewState)
                {
                    SelectionDirty = true;
                }
            }
        }
 
        /////////////////////////////////////////////////////////////////////////
        //  EVENT BUBBLING
        /////////////////////////////////////////////////////////////////////////
 
        /// <include file='doc\MobileListItem.uex' path='docs/doc[@for="MobileListItem.OnBubbleEvent"]/*' />
        protected override bool OnBubbleEvent(Object source, EventArgs e) 
        {
            if (e is CommandEventArgs) 
            {
                ListCommandEventArgs args = new ListCommandEventArgs(this, source, (CommandEventArgs)e);
                RaiseBubbleEvent (this, args);
                return true;
            }
            return false;
        }
 
        #region Implementation of IStateManager
        /// <internalonly/>
        bool IStateManager.IsTrackingViewState {
            get {
                return IsTrackingViewState;
            }
        }
 
        /// <internalonly/>
        void IStateManager.LoadViewState(object state) {
            LoadViewState(state);
        }
 
        /// <internalonly/>
        void IStateManager.TrackViewState() {
            TrackViewState();
        }
 
        /// <internalonly/>
        object IStateManager.SaveViewState() {
            return SaveViewState();
        }
        #endregion
    } 
}