/// <ToBeCompleted></ToBeCompleted>
        protected Attribute[] GetPropertyAttributes(IPropertyController controller, PropertyDescriptor descriptor)
        {
            if (controller == null)
            {
                throw new ArgumentNullException("controller");
            }
            if (descriptor == null)
            {
                throw new ArgumentNullException("descriptor");
            }
            try {
                int attrCount = descriptor.Attributes.Count;
                BrowsableAttribute          browsableAttr          = descriptor.Attributes[typeof(BrowsableAttribute)] as BrowsableAttribute;
                ReadOnlyAttribute           readOnlyAttr           = descriptor.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
                DescriptionAttribute        descriptionAttr        = descriptor.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
                RequiredPermissionAttribute requiredPermissionAttr = descriptor.Attributes[typeof(RequiredPermissionAttribute)] as RequiredPermissionAttribute;

                if (requiredPermissionAttr != null)
                {
                    object     propertyOwner = GetPropertyOwner(descriptor);
                    Permission permission    = requiredPermissionAttr.Permission;
                    // Check if property is viewable
                    if (!IsGranted(controller, permission, SecurityAccess.Modify, propertyOwner))
                    {
                        // Hide if PropertyDisplayMode is 'Hidden' and 'View' access is not granted,
                        // otherwise set peroperty to readonly
                        if (controller.PropertyDisplayMode == NonEditableDisplayMode.Hidden &&
                            !IsGranted(controller, permission, SecurityAccess.View, propertyOwner))
                        {
                            browsableAttr = BrowsableAttribute.No;
                        }
                        else
                        {
                            readOnlyAttr    = ReadOnlyAttribute.Yes;
                            descriptionAttr = GetNotGrantedDescription(descriptionAttr, permission);
                        }
                    }
                }

                // Now copy all attributes
                int cnt = descriptor.Attributes.Count;
                List <Attribute> result = new List <Attribute>(attrCount);
                // Add stored/modified attributes first
                if (browsableAttr != null)
                {
                    result.Add(browsableAttr);
                }
                if (readOnlyAttr != null)
                {
                    result.Add(readOnlyAttr);
                }
                if (descriptionAttr != null)
                {
                    result.Add(descriptionAttr);
                }
                if (requiredPermissionAttr != null)
                {
                    result.Add(requiredPermissionAttr);
                }
                // Copy all other attributes
                for (int i = 0; i < cnt; ++i)
                {
                    // Skip stored/modified attributes
                    if (descriptor.Attributes[i] is BrowsableAttribute)
                    {
                        continue;
                    }
                    else if (descriptor.Attributes[i] is ReadOnlyAttribute)
                    {
                        continue;
                    }
                    else if (descriptor.Attributes[i] is DescriptionAttribute)
                    {
                        continue;
                    }
                    else if (descriptor.Attributes[i] is EditorAttribute)
                    {
                        if (readOnlyAttr != null && readOnlyAttr.IsReadOnly)
                        {
                            continue;
                        }
                    }
                    result.Add(descriptor.Attributes[i]);
                }
                return(result.ToArray());
            } catch (Exception) {
                throw;
            }
        }
        /// <summary>
        /// Initializes a new instance of <see cref="T:Dataweb.NShape.Advanced.PropertyDescriptorDg" />
        /// </summary>
        public PropertyDescriptorDg(IPropertyController controller, PropertyDescriptor descriptor, Attribute[] attributes)
            : base(descriptor.Name, attributes)
        {
            this.descriptor = descriptor;
            this.controller = controller;

            // We have to store the attributes and return their values in the appropriate
            // methods because if we don't, modifying the readonly attribute will not work
            browsableAttr = Attributes[typeof(BrowsableAttribute)] as BrowsableAttribute;
            readOnlyAttr = Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
            descriptionAttr = Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
            permissionAttr = descriptor.Attributes[typeof(RequiredPermissionAttribute)] as RequiredPermissionAttribute;
        }