Trigger.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Framework / System / Windows / Trigger.cs / 1 / Trigger.cs

                            using MS.Utility; 
using System.IO;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Windows.Markup; 

using System; 
using System.Diagnostics; 

namespace System.Windows 
{
    /// 
    ///     A single Style property conditional dependency driver
    ///  
    [ContentProperty("Setters")]
    public class Trigger : TriggerBase, IAddChild 
    { 
        /// 
        ///     DependencyProperty of the conditional 
        /// 
        [Ambient]
        [Localizability(LocalizationCategory.None, Modifiability = Modifiability.Unmodifiable, Readability = Readability.Unreadable)] // Not localizable by-default
        public DependencyProperty Property 
        {
            get 
            { 
                // Verify Context Access
                VerifyAccess(); 

                return _property;
            }
            set 
            {
                // Verify Context Access 
                VerifyAccess(); 

                if (IsSealed) 
                {
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "Trigger"));
                }
 
                _property = value;
            } 
        } 

        ///  
        ///     Value of the condition (equality check)
        /// 
        [DependsOn("Property")]
        [DependsOn("SourceName")] 
        [Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)] // Not localizable by-default
        public object Value 
        { 
            get
            { 
                // Verify Context Access
                VerifyAccess();

                return _value; 
            }
            set 
            { 
                // Verify Context Access
                VerifyAccess(); 

                if (IsSealed)
                {
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "Trigger")); 
                }
 
                if (value is MarkupExtension) 
                {
                    throw new ArgumentException(SR.Get(SRID.ConditionValueOfMarkupExtensionNotSupported, 
                                                       value.GetType().Name));
                }

                if( value is Expression ) 
                {
                    throw new ArgumentException(SR.Get(SRID.ConditionValueOfExpressionNotSupported)); 
                } 

                _value = value; 
            }
        }

        ///  
        /// The x:Name of the object whose property shall
        /// trigger the associated setters to be applied. 
        /// If null, then this is the object being Styled 
        /// and not anything under its Template Tree.
        ///  
        [DefaultValue(null)]
        public string SourceName
        {
            get 
            {
                // Verify Context Access 
                VerifyAccess(); 

                return _sourceName; 
            }
            set
            {
                // Verify Context Access 
                VerifyAccess();
 
                if( IsSealed ) 
                {
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "Trigger")); 
                }

                _sourceName = value;
            } 
        }
 
        ///  
        /// Collection of Setter objects, which describes what to apply
        /// when this trigger is active. 
        /// 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public SetterBaseCollection Setters
        { 
            get
            { 
                // Verify Context Access 
                VerifyAccess();
 
                if( _setters == null )
                {
                    _setters = new SetterBaseCollection();
                } 
                return _setters;
            } 
        } 

        /// 
        /// This method is called to Add a Setter object as a child of the Style.
        ///
        ///
        /// The object to add as a child; it must be a Setter or subclass. 
        ///
        void IAddChild.AddChild (Object value) 
        { 
            // Verify Context Access
            VerifyAccess(); 

            Setters.Add(Trigger.CheckChildIsSetter(value));
        }
 
        ///
        /// This method is called by the parser when text appears under the tag in markup. 
        /// As default Styles do not support text, calling this method has no effect. 
        ///
        /// 
        /// Text to add as a child.
        ///
        void IAddChild.AddText (string text)
        { 
            // Verify Context Access
            VerifyAccess(); 
 
            XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this);
        } 

        // Shared by PropertyTrigger, MultiPropertyTrigger, DataTrigger, MultiDataTrigger
        internal static Setter CheckChildIsSetter( object o )
        { 
            if (o == null)
            { 
                throw new ArgumentNullException("o"); 
            }
 
            Setter setter = o as Setter;

            if (setter == null)
            { 
                throw new ArgumentException(SR.Get(SRID.UnexpectedParameterType, o.GetType(), typeof(Setter)), "o");
            } 
 
            return setter;
        } 

        internal sealed override void Seal()
        {
            if (IsSealed) 
            {
                return; 
            } 

            if (_property != null) 
            {
                // Ensure valid condition
                if (!_property.IsValidValue(_value))
                { 
                    throw new InvalidOperationException(SR.Get(SRID.InvalidPropertyValue, _value, _property.Name ));
                } 
            } 

            // Freeze the condition for the trigger 
            StyleHelper.SealIfSealable(_value);

            // Process the _setters collection: Copy values into PropertyValueList and seal the Setter objects.
            ProcessSettersCollection(_setters); 

            // Build conditions array from collection 
            TriggerConditions = new TriggerCondition[] { 
                new TriggerCondition(
                    _property, 
                    LogicalOp.Equals,
                    _value,
                    (_sourceName != null) ? _sourceName : StyleHelper.SelfName) };
 
            // Set Condition for all property triggers
            for (int i = 0; i < PropertyValues.Count; i++) 
            { 
                PropertyValue propertyValue = PropertyValues[i];
                propertyValue.Conditions = TriggerConditions; 
                // Put back modified struct
                PropertyValues[i] = propertyValue;
            }
 
            base.Seal();
        } 
 
        // evaluate the current state of the trigger
        internal override bool GetCurrentState(DependencyObject container, UncommonField dataField) 
        {
            Debug.Assert( TriggerConditions != null && TriggerConditions.Length == 1,
                "This method assumes there is exactly one TriggerCondition." );
 
            Debug.Assert( TriggerConditions[0].SourceChildIndex == 0,
                "This method was created to handle properties on the containing object, more work is needed to handle templated children too." ); 
 
            return TriggerConditions[0].Match(container.GetValue(TriggerConditions[0].Property));
        } 

        private DependencyProperty _property;
        private object _value = DependencyProperty.UnsetValue;
        private string _sourceName = null; 
        private SetterBaseCollection _setters = null;
    } 
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using MS.Utility; 
using System.IO;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Windows.Markup; 

using System; 
using System.Diagnostics; 

namespace System.Windows 
{
    /// 
    ///     A single Style property conditional dependency driver
    ///  
    [ContentProperty("Setters")]
    public class Trigger : TriggerBase, IAddChild 
    { 
        /// 
        ///     DependencyProperty of the conditional 
        /// 
        [Ambient]
        [Localizability(LocalizationCategory.None, Modifiability = Modifiability.Unmodifiable, Readability = Readability.Unreadable)] // Not localizable by-default
        public DependencyProperty Property 
        {
            get 
            { 
                // Verify Context Access
                VerifyAccess(); 

                return _property;
            }
            set 
            {
                // Verify Context Access 
                VerifyAccess(); 

                if (IsSealed) 
                {
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "Trigger"));
                }
 
                _property = value;
            } 
        } 

        ///  
        ///     Value of the condition (equality check)
        /// 
        [DependsOn("Property")]
        [DependsOn("SourceName")] 
        [Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)] // Not localizable by-default
        public object Value 
        { 
            get
            { 
                // Verify Context Access
                VerifyAccess();

                return _value; 
            }
            set 
            { 
                // Verify Context Access
                VerifyAccess(); 

                if (IsSealed)
                {
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "Trigger")); 
                }
 
                if (value is MarkupExtension) 
                {
                    throw new ArgumentException(SR.Get(SRID.ConditionValueOfMarkupExtensionNotSupported, 
                                                       value.GetType().Name));
                }

                if( value is Expression ) 
                {
                    throw new ArgumentException(SR.Get(SRID.ConditionValueOfExpressionNotSupported)); 
                } 

                _value = value; 
            }
        }

        ///  
        /// The x:Name of the object whose property shall
        /// trigger the associated setters to be applied. 
        /// If null, then this is the object being Styled 
        /// and not anything under its Template Tree.
        ///  
        [DefaultValue(null)]
        public string SourceName
        {
            get 
            {
                // Verify Context Access 
                VerifyAccess(); 

                return _sourceName; 
            }
            set
            {
                // Verify Context Access 
                VerifyAccess();
 
                if( IsSealed ) 
                {
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "Trigger")); 
                }

                _sourceName = value;
            } 
        }
 
        ///  
        /// Collection of Setter objects, which describes what to apply
        /// when this trigger is active. 
        /// 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public SetterBaseCollection Setters
        { 
            get
            { 
                // Verify Context Access 
                VerifyAccess();
 
                if( _setters == null )
                {
                    _setters = new SetterBaseCollection();
                } 
                return _setters;
            } 
        } 

        /// 
        /// This method is called to Add a Setter object as a child of the Style.
        ///
        ///
        /// The object to add as a child; it must be a Setter or subclass. 
        ///
        void IAddChild.AddChild (Object value) 
        { 
            // Verify Context Access
            VerifyAccess(); 

            Setters.Add(Trigger.CheckChildIsSetter(value));
        }
 
        ///
        /// This method is called by the parser when text appears under the tag in markup. 
        /// As default Styles do not support text, calling this method has no effect. 
        ///
        /// 
        /// Text to add as a child.
        ///
        void IAddChild.AddText (string text)
        { 
            // Verify Context Access
            VerifyAccess(); 
 
            XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this);
        } 

        // Shared by PropertyTrigger, MultiPropertyTrigger, DataTrigger, MultiDataTrigger
        internal static Setter CheckChildIsSetter( object o )
        { 
            if (o == null)
            { 
                throw new ArgumentNullException("o"); 
            }
 
            Setter setter = o as Setter;

            if (setter == null)
            { 
                throw new ArgumentException(SR.Get(SRID.UnexpectedParameterType, o.GetType(), typeof(Setter)), "o");
            } 
 
            return setter;
        } 

        internal sealed override void Seal()
        {
            if (IsSealed) 
            {
                return; 
            } 

            if (_property != null) 
            {
                // Ensure valid condition
                if (!_property.IsValidValue(_value))
                { 
                    throw new InvalidOperationException(SR.Get(SRID.InvalidPropertyValue, _value, _property.Name ));
                } 
            } 

            // Freeze the condition for the trigger 
            StyleHelper.SealIfSealable(_value);

            // Process the _setters collection: Copy values into PropertyValueList and seal the Setter objects.
            ProcessSettersCollection(_setters); 

            // Build conditions array from collection 
            TriggerConditions = new TriggerCondition[] { 
                new TriggerCondition(
                    _property, 
                    LogicalOp.Equals,
                    _value,
                    (_sourceName != null) ? _sourceName : StyleHelper.SelfName) };
 
            // Set Condition for all property triggers
            for (int i = 0; i < PropertyValues.Count; i++) 
            { 
                PropertyValue propertyValue = PropertyValues[i];
                propertyValue.Conditions = TriggerConditions; 
                // Put back modified struct
                PropertyValues[i] = propertyValue;
            }
 
            base.Seal();
        } 
 
        // evaluate the current state of the trigger
        internal override bool GetCurrentState(DependencyObject container, UncommonField dataField) 
        {
            Debug.Assert( TriggerConditions != null && TriggerConditions.Length == 1,
                "This method assumes there is exactly one TriggerCondition." );
 
            Debug.Assert( TriggerConditions[0].SourceChildIndex == 0,
                "This method was created to handle properties on the containing object, more work is needed to handle templated children too." ); 
 
            return TriggerConditions[0].Match(container.GetValue(TriggerConditions[0].Property));
        } 

        private DependencyProperty _property;
        private object _value = DependencyProperty.UnsetValue;
        private string _sourceName = null; 
        private SetterBaseCollection _setters = null;
    } 
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK