File: UI\MobileControls\ObjectListField.cs
Project: ndp\fx\src\mit\System\Web\System.Web.Mobile.csproj (System.Web.Mobile)
//------------------------------------------------------------------------------
// <copyright file="ObjectListField.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Security.Permissions;
 
namespace System.Web.UI.MobileControls
{
    /*
     * Object List Field class.
     *
     * Copyright (c) 2000 Microsoft Corporation
     */
 
    /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField"]/*' />
    [
        PersistName("Field")
    ]
    [AspNetHostingPermission(SecurityAction.LinkDemand, 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 sealed class ObjectListField : IStateManager
    {
        private StateBag _stateBag = new StateBag();
        private bool _marked;
        private PropertyDescriptor _dataFieldDescriptor;
        private ObjectList _owner;
        private bool _selfReference = false;
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.Name"]/*' />
        [
            DefaultValue("")
        ]
        public String Name
        {
            get
            {
                String s = (String)ViewState["Name"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["Name"] = value;
            }
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.DataField"]/*' />
        [
            DefaultValue("")
        ]
        public String DataField
        {
            get
            {
                String s = (String)ViewState["DataField"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["DataField"] = value;
                NotifyOwnerChange();
            }
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.DataFormatString"]/*' />
        [
            DefaultValue("")
        ]
        public String DataFormatString
        {
            get
            {
                String s = (String)ViewState["DataFormatString"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["DataFormatString"] = value;
                NotifyOwnerChange();
            }
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.Title"]/*' />
        [
            DefaultValue("")
        ]
        public String Title
        {
            get
            {
                String s = (String)ViewState["Title"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["Title"] = value;
            }
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.Visible"]/*' />
        [
            DefaultValue(true)
        ]
        public bool Visible
        {
            get
            {
                Object b = ViewState["Visible"];
                return (b == null) ? true : (bool)b;
            }
            set
            {
                ViewState["Visible"] = value;
            }
        }
 
        internal bool SelfReference
        {
            get
            {
                return _selfReference;
            }
            set
            {
                _selfReference = value;
            }
        }
 
        internal String UniqueID
        {
            get
            {
                Object o = ViewState["Name"];
                if (o != null)
                {
                    return (String)o;
                }
                return (String)ViewState["DataField"];
            }
        }
 
        private void NotifyOwnerChange()
        {
            // Only called if databinding behavior of the field changes.
            if (_owner != null)
            {
                _owner.OnFieldChanged(false);   // fieldAddedOrRemoved = false;
            }
        }
 
        private StateBag ViewState
        {
            get
            {
                return _stateBag;
            }
        }
 
        internal void SetOwner(ObjectList owner) {
            _owner = owner;
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.DataBindItem"]/*' />
        public void DataBindItem(int fieldIndex, ObjectListItem item)
        {
            Object dataItem = item.DataItem;
            if (dataItem == null)
            {
                return;
            }
                
            if (!SelfReference)
            {
                String dataField = DataField;
                if (dataField.Length == 0)
                {
                    return;
                }
 
                _dataFieldDescriptor = TypeDescriptor.GetProperties(dataItem).Find(dataField, true);
                if (_dataFieldDescriptor == null && !_owner.MobilePage.DesignMode)
                {
                    throw new Exception(
                        SR.GetString(SR.ObjectListField_DataFieldNotFound, dataField));
                }
            }
 
            Object data;
            if (_dataFieldDescriptor != null)
            {
                data = _dataFieldDescriptor.GetValue(dataItem);
            }
            // Use fake databound text if the datasource is not accessible at designtime.
            else if (_owner.MobilePage.DesignMode)
            {
                data = SR.GetString(SR.ObjectListField_DataBoundText);
            }
            else
            {
                Debug.Assert(SelfReference, "Shouldn't get this far if !SelfReference");
                data = dataItem;
            }
 
            String dataText;
            if ((data != null) && (data != System.DBNull.Value))
            {
                String dataFormatString = DataFormatString;
                if (dataFormatString.Length > 0)
                {
                    dataText = String.Format(CultureInfo.InvariantCulture, dataFormatString, data);
                }
                else
                {
                    dataText = data.ToString();
                }
            }
            else
            {
                dataText = String.Empty;
            }
            item[fieldIndex] = dataText;
        }
 
        /////////////////////////////////////////////////////////////////////////
        //  STATE MANAGEMENT
        /////////////////////////////////////////////////////////////////////////
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.IStateManager.IsTrackingViewState"]/*' />
        /// <internalonly/>
        bool IStateManager.IsTrackingViewState
        {
            get
            {
                return _marked;
            }
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.IStateManager.TrackViewState"]/*' />
        /// <internalonly/>
        void IStateManager.TrackViewState()
        {
            _marked = true;
            ((IStateManager)ViewState).TrackViewState();
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.IStateManager.LoadViewState"]/*' />
        /// <internalonly/>
        void IStateManager.LoadViewState(Object state)
        {
            if (state != null)
            {
                ((IStateManager)ViewState).LoadViewState(state);
            }
        }
 
        /// <include file='doc\ObjectListField.uex' path='docs/doc[@for="ObjectListField.IStateManager.SaveViewState"]/*' />
        /// <internalonly/>
        Object IStateManager.SaveViewState()
        {
            return ((IStateManager)ViewState).SaveViewState();
        }
 
        internal void SetDirty()
        {
            // VSWHIDBEY 236464. The bag needs to be set dirty not individual items.
            _stateBag.SetDirty(true);
/*
            foreach (StateItem item in _stateBag.Values)
            {
                item.IsDirty = true;
            }
*/
        }
 
        internal void ClearViewState()
        {
            ViewState.Clear();
        }
    }
 
}