File: Configuration\ProfileGroupSettingsCollection.cs
Project: ndp\fx\src\xsp\system\Web\System.Web.csproj (System.Web)
//------------------------------------------------------------------------------
// <copyright file="ProfileGroupSettingsCollection.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
namespace System.Web.Configuration {
    using System;
    using System.Xml;
    using System.Configuration;
    using System.Collections.Specialized;
    using System.Collections;
    using System.IO;
    using System.Text;
    using System.Web.Util;
    using System.Security.Permissions;
 
    [ConfigurationCollection(typeof(ProfileGroupSettings), AddItemName = "group")]
    public sealed class ProfileGroupSettingsCollection : ConfigurationElementCollection {
        private static ConfigurationPropertyCollection _properties;
        private bool bModified = false;
 
        static ProfileGroupSettingsCollection() {
            _properties = new ConfigurationPropertyCollection();
        }
 
        public ProfileGroupSettingsCollection() {
            AddElementName = "group";
            ClearElementName = String.Empty; // This collection does not support Clear tags
            EmitClear = false;
        }
 
        protected override ConfigurationPropertyCollection Properties {
            get {
                return _properties;
            }
        }
 
        // public properties
        public String[] AllKeys {
            get {
                return StringUtil.ObjectArrayToStringArray(BaseGetAllKeys());
            }
        }
        
        public new ProfileGroupSettings this[string name] {
            get {
                return (ProfileGroupSettings)BaseGet(name);
            }
        }
        
        public ProfileGroupSettings this[int index] {
            get {
                return (ProfileGroupSettings)BaseGet(index);
            }
            set {
                if (BaseGet(index) != null) {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
 
        internal void AddOrReplace(ProfileGroupSettings groupSettings) {
            BaseAdd(groupSettings, false);
        }
 
        // Protected Overrides
        protected override ConfigurationElement CreateNewElement() {
            return new ProfileGroupSettings();
        }
 
        protected override Object GetElementKey(ConfigurationElement element) {
            return ((ProfileGroupSettings)element).Name;
        }
 
        // Internal access to ConfigurationElement methods
        internal bool InternalIsModified() {
            return IsModified();
        }
 
        internal void InternalResetModified() {
            ResetModified();
        }
 
        internal void InternalReset(ConfigurationElement parentElement) {
            Reset(parentElement);
        }
 
        internal void InternalUnMerge(ConfigurationElement sourceElement, ConfigurationElement parentElement,
                                      ConfigurationSaveMode saveMode) {
            // This requires a special unmerge because it should not act like an element in a collection
            // which is the default behavior
            Unmerge(sourceElement, parentElement, saveMode); // Base merge to get locks merged
            BaseClear(); // don't use the merged data however
 
            ProfileGroupSettingsCollection source = sourceElement as ProfileGroupSettingsCollection;
            ProfileGroupSettingsCollection parent = parentElement as ProfileGroupSettingsCollection;
 
            // foreach group in the source we should unmerge the individual settings.
            foreach (ProfileGroupSettings settings in source) {
                ProfileGroupSettings settingsFromParent = parent.Get(settings.Name);
                ProfileGroupSettings deltaSettings = new ProfileGroupSettings();
 
                deltaSettings.InternalUnmerge(settings, settingsFromParent, saveMode);
                BaseAdd(deltaSettings);
            }
            
        }
 
        internal bool InternalSerialize(XmlWriter writer, bool serializeCollectionKey) {
            if (EmitClear == true) {
                throw new ConfigurationErrorsException(SR.GetString(SR.Clear_not_valid));
            }
 
            return SerializeElement(writer, serializeCollectionKey);
        }
 
        // public methods
        public void Add(ProfileGroupSettings group) {
            BaseAdd(group);
        }
        
        public ProfileGroupSettings Get(int index) {
            return (ProfileGroupSettings)BaseGet(index);
        }
        
        public ProfileGroupSettings Get(string name) {
            return (ProfileGroupSettings)BaseGet(name);
        }
 
        public String GetKey(int index) {
            return (String) BaseGetKey(index);
        }
        
        public void Set(ProfileGroupSettings group) {
            BaseAdd(group, false);
        }
 
        public int IndexOf(ProfileGroupSettings group) {
            return BaseIndexOf(group);
        }
 
        public void Remove(string name) {
            ConfigurationElement elem = BaseGet(name);
            if (elem != null) {
                ElementInformation elemInfo = elem.ElementInformation;
                if (elemInfo.IsPresent) {
                    BaseRemove(name);
                }
                else {
                    throw new ConfigurationErrorsException(SR.GetString(SR.Config_base_cannot_remove_inherited_items));
                }
            }
        }
 
        public void RemoveAt(int index) {
            ConfigurationElement elem = BaseGet(index);
            if (elem != null) {
                ElementInformation elemInfo = elem.ElementInformation;
                if (elemInfo.IsPresent) {
                    BaseRemoveAt(index);
                }
                else {
                    throw new ConfigurationErrorsException(SR.GetString(SR.Config_base_cannot_remove_inherited_items));
                }
            }
        }
 
        public void Clear() {
            int index = Count-1;
            bModified = true;
 
            for (int i = index; i >= 0; i--) {
                ConfigurationElement elem = BaseGet(i);
                if (elem != null) {
                    ElementInformation elemInfo = elem.ElementInformation;
                    if (elemInfo.IsPresent) {
                        BaseRemoveAt(i);
                    }
                }
            }
        }
        
        protected override void ResetModified() {
            bModified = false;
            base.ResetModified();
        }
 
        protected override bool IsModified() {
            if (bModified == true) {
                return true;
            }
            return base.IsModified();
        }
 
    }
}