File: System\Configuration\PropertyInformation.cs
Project: ndp\fx\src\Configuration\System.Configuration.csproj (System.Configuration)
//------------------------------------------------------------------------------
// <copyright file="PropertyInformation.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
using System;
using System.Configuration;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Collections;
using System.Runtime.Serialization;
 
namespace System.Configuration {
 
    // PropertyInformation
    //
    // Contains information about a property
    //
    public sealed class PropertyInformation {
        
        private ConfigurationElement ThisElement = null;
        private string PropertyName;
        private ConfigurationProperty _Prop = null;
        private const string LockAll = "*";
        
        private ConfigurationProperty Prop {
            get {
                if (_Prop == null) {
                    _Prop = ThisElement.Properties[PropertyName];
                }
                return _Prop;
            }
        }
 
        internal PropertyInformation(ConfigurationElement thisElement, string propertyName) {
            PropertyName = propertyName;
            ThisElement = thisElement;
        }
 
        
        public string Name {
            get {
                return PropertyName;
            }
        }
 
 
        internal string ProvidedName {
            get {
                return Prop.ProvidedName;
            }
        }
 
 
        public object Value {
            get {
                return ThisElement[PropertyName];
            }
            set {
                ThisElement[PropertyName] = value;
            }
        }
 
        // DefaultValue
        //
        // What is the default value for this property
        //
        public object DefaultValue {
            get {
                return Prop.DefaultValue;
            }
        }
 
        // ValueOrigin
        //
        // Where was the property retrieved from
        //
        public PropertyValueOrigin ValueOrigin {
            get {
                if (ThisElement.Values[PropertyName] == null) {
                    return PropertyValueOrigin.Default;
                }
                if (ThisElement.Values.IsInherited(PropertyName)) {
                    return PropertyValueOrigin.Inherited;
                }
                return PropertyValueOrigin.SetHere;
            }
        }
 
        // IsModified
        //
        // Was the property Modified
        //
        public bool IsModified {
            get {
                if (ThisElement.Values[PropertyName] == null) {
                    return false;
                }
                if (ThisElement.Values.IsModified(PropertyName)) {
                    return true;
                }
                return false;
            }
        }
        // IsKey
        //
        // Is this property a key?
        //
        public bool IsKey {
            get {
                return Prop.IsKey;
            }
        }
 
        // IsRequired
        //
        // Is this property required?
        //
        public bool IsRequired {
            get {
                return Prop.IsRequired;
            }
        }
 
        // IsLocked
        //
        // Is this property locked?
        //
        public bool IsLocked {
            get {
                return ((ThisElement.LockedAllExceptAttributesList != null && !ThisElement.LockedAllExceptAttributesList.DefinedInParent(PropertyName)) ||
                    (ThisElement.LockedAttributesList != null && 
                        (ThisElement.LockedAttributesList.DefinedInParent(PropertyName) || 
                         ThisElement.LockedAttributesList.DefinedInParent(LockAll))) ||
                        (((ThisElement.ItemLocked & ConfigurationValueFlags.Locked)    != 0) &&
                         ((ThisElement.ItemLocked & ConfigurationValueFlags.Inherited) != 0)));
            }
        }
 
        // Source
        //
        // What is the source file where this data came from
        //
        public string Source {
            get {
                PropertySourceInfo psi = ThisElement.Values.GetSourceInfo(PropertyName);
                if (psi == null) {
                    psi = ThisElement.Values.GetSourceInfo(String.Empty);
                }
                if (psi == null) {
                    return String.Empty;
                }
                return psi.FileName;
            }
        }
 
        // LineNumber
        //
        // What is the line number associated with the source
        //
        // Note:
        //   1 is the first line in the file.  0 is returned when there is no 
        //   source
        //
        public int LineNumber {
            get {
                PropertySourceInfo psi = ThisElement.Values.GetSourceInfo(PropertyName);
                if (psi == null) {
                    psi = ThisElement.Values.GetSourceInfo(String.Empty);
                }
                if (psi == null) {
                    return 0;
                }
                return psi.LineNumber;
            }
        }
 
        // Type
        //
        // What is the type for the property
        //
        public Type Type {
            get {
                return Prop.Type;
            }
        }
 
        // Validator
        //
        public ConfigurationValidatorBase Validator {
            get {
                return Prop.Validator;
            }
        }
 
        // Converter
        //
        public TypeConverter Converter {
            get {
                return Prop.Converter;
            }
        }
 
        // Property description ( comments etc )
        public string Description {
            get {
                return Prop.Description;
            }
        }
    }
}