File: UI\MobileControls\Design\Converters\FormConverter.cs
Project: ndp\fx\src\mit\System\Web\System.Web.Mobile.csproj (System.Web.Mobile)
//------------------------------------------------------------------------------
// <copyright file="FormConverter.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Web.UI.Design.MobileControls.Converters
{
    using System.Diagnostics;
    using System.Collections;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Web.UI;
    using System.Web.UI.MobileControls;
    using System.Web.UI.Design.MobileControls.Adapters;
 
    /// <summary>
    ///    <para>
    ///       Can filter and retrieve several types of values from Style controls.
    ///    </para>
    /// </summary>
    [
        System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
        Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)
    ]
    [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.")]
    internal class FormConverter : StringConverter
    {
        private Form GetContainingForm(MobileControl mc)
        {
            return FindContainer(mc, typeof(Form)) as Form;
        }
 
        private StyleSheet GetContainingStyleSheet(MobileControl mc)
        {
            return FindContainer(mc, typeof(StyleSheet)) as StyleSheet;
        }
 
        private Control FindContainer(MobileControl mc, Type containerType)
        {
            for (Control control = mc; control != null; control = control.Parent)
            {
                if (containerType.IsAssignableFrom(control.GetType()))
                {
                    return control;
                }
            }
            return null;
        }
 
        protected virtual ArrayList GetControls(ITypeDescriptorContext context)
        {
            ArrayList       controlList = new ArrayList();
            MobileControl   control = null;
            IContainer      container = context.Container;
 
            if (context.Instance is Array)
            {
                Array list = (Array)context.Instance;
                Debug.Assert(list.Length > 0);
 
                foreach(Object obj in list)
                {
                    Debug.Assert(obj is MobileControl);
                    Form form = GetContainingForm((MobileControl)obj);
 
                    // If the control is not within a Form control or a StyleSheet control,
                    // simply return the empty combobox.
                    // If the control is placed at UserControl top level, the ID of the 
                    // containing Form is null.
                    if ((form == null || form.ID == null) && 
                        GetContainingStyleSheet((MobileControl)obj) == null)
                    {
                        return null;
                    }
                }
                control = list.GetValue(0) as MobileControl;
            }
            else
            {
                if (context.Instance is MobileControl)
                {
                    control = (MobileControl) context.Instance;
                }
                else if (context.Instance is ChoicePropertyFilter)
                {
                    ChoicePropertyFilter filter = (ChoicePropertyFilter)context.Instance;
                    IDeviceSpecificDesigner designer = filter.Designer;
                    control = designer.UnderlyingObject as MobileControl;
                    Debug.Assert(control != null, "Not a control");
                }
                else
                {
                    Debug.Fail("Unrecognized object passed in");
                    return null;
                }
 
                Form form = GetContainingForm(control);
 
                // All controls must be contained within Forms or StyleSheets
                // Show empty combobox for the invalid control.
                if (form == null)
                {
                    if (GetContainingStyleSheet(control) == null)
                    {
                        return null;
                    }
                }
                // MobileUserControl has a default Form with null ID
                else if (form.ID == null && (GetContainingStyleSheet(control) == null))
                {
                    Debug.Assert(container is IDesignerHost &&
                        ((IDesignerHost)container).RootComponent is MobileUserControl);
 
                    // Just return an empty array list, so that url picker still works.
                    return controlList;
                }
            }
 
            // If container is null, try to get one from control's IContainer
            if (container == null)
            {
                ISite site = control.Site;
                Debug.Assert(site != null);
 
                container = site.Container;
            }
 
            // Is this possible?
            if (container == null)
            {
                Debug.Fail("container is null");
                return null;
            }
 
            foreach(IComponent component in container.Components)
            {
                Form candidate = component as Form;
                if (candidate != null &&
                    candidate.ID != null &&
                    candidate.ID.Length != 0)
                {
                    controlList.Add(ProcessControlId(candidate.ID));
                }
            }
 
            controlList.Sort();
            return controlList;
        }
 
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            if (context == null)
            {
                return null;
            }
 
            ArrayList objValues = GetControls(context);
            return (objValues != null? new StandardValuesCollection(objValues) : null);
        }
 
        /// <summary>
        ///    <para>
        ///       Gets whether
        ///       or not the context specified contains exclusive standard values.
        ///    </para>
        /// </summary>
        /// <param name='context'>
        ///    A type descriptor that indicates the context to convert from.
        /// </param>
        /// <returns>
        ///    <para>
        ///    <see langword='true'/> if the specified context contains exclusive standard 
        ///       values, otherwise <see langword='false'/>.
        ///    </para>
        /// </returns>
        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            return false;
        }
 
        /// <summary>
        ///    <para>
        ///       Gets whether or not the specified context contains supported standard
        ///       values.
        ///    </para>
        /// </summary>
        /// <param name='context'>
        ///    A type descriptor that indicates the context to convert from.
        /// </param>
        /// <returns>
        ///    <para>
        ///    <see langword='true'/> if the specified context conatins supported standard 
        ///       values, otherwise <see langword='false'/>.
        ///    </para>
        /// </returns>
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }
 
        /// <summary>
        ///     Override to manipulate the control id as it is added to the list.
        ///     Do not return the original string, make sure a copy is made.
        ///     See NavigateUrlConverter.cs for an example.
        /// </summary>
        protected virtual String ProcessControlId(String id)
        {
            return id;
        }
    }
}