File: AuthoringOM\DependencyObject.cs
Project: ndp\cdf\src\WF\Common\System.Workflow.ComponentModel.csproj (System.Workflow.ComponentModel)
#pragma warning disable 1634, 1691
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Reflection;
using System.ComponentModel.Design.Serialization;
 
namespace System.Workflow.ComponentModel
{
 
    //TBD: DharmaS, Move the collections to the LocalStore class and have DO keep a ref to LS
    [DesignerSerializer(typeof(WorkflowMarkupSerializer), typeof(WorkflowMarkupSerializer))]
    [DesignerSerializer(typeof(DependencyObjectCodeDomSerializer), typeof(CodeDomSerializer))]
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    public abstract class DependencyObject : IComponent, IDependencyObjectAccessor, IDisposable
    {
        private static DependencyProperty SiteProperty = DependencyProperty.Register("Site", typeof(ISite), typeof(DependencyObject), new PropertyMetadata(DependencyPropertyOptions.Metadata, new Attribute[] { new BrowsableAttribute(false), new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden) }));
        private static DependencyProperty ReadonlyProperty = DependencyProperty.Register("Readonly", typeof(bool), typeof(DependencyObject), new PropertyMetadata(DependencyPropertyOptions.Metadata | DependencyPropertyOptions.ReadOnly, new Attribute[] { new BrowsableAttribute(false), new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden) }));
        private static DependencyProperty ParentDependencyObjectProperty = DependencyProperty.Register("ParentDependencyObject", typeof(DependencyObject), typeof(DependencyObject), new PropertyMetadata(null, new Attribute[] { new BrowsableAttribute(false), new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden) }));
        private static DependencyProperty UserDataProperty = DependencyProperty.Register("UserData", typeof(IDictionary), typeof(DependencyObject), new PropertyMetadata(DependencyPropertyOptions.Metadata | DependencyPropertyOptions.ReadOnly, new Attribute[] { new BrowsableAttribute(false), new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden) }));
 
        //design meta data holder
        [NonSerialized]
        private IDictionary<DependencyProperty, object> metaProperties = new Dictionary<DependencyProperty, object>();
        [NonSerialized]
        private bool readonlyPropertyValue;
 
        protected DependencyObject()
        {
            //
            SetReadOnlyPropertyValue(ReadonlyProperty, false);
            readonlyPropertyValue = false;
            //
            SetReadOnlyPropertyValue(UserDataProperty, Hashtable.Synchronized(new Hashtable()));
        }
 
        ~DependencyObject()
        {
            // In designer/build scenarios, some dependencies may be missing, which could cause a 
            // JIT failure in user overrides of Dispose. Ignore these failures so they don't
            // crash the process.
            if (this.DesignMode)
            {
                try
                {
                    Dispose(false);
                }
                // These are the most common JIT exceptions for this scenario, based on Watson data
                catch (TypeInitializationException)
                {
                }
                catch (System.IO.FileNotFoundException)
                {
                }
            }
            else
            {
                Dispose(false);
            }
        }
 
        internal bool Readonly
        {
            get
            {
                return (bool)GetValue(ReadonlyProperty);
            }
            set
            {
                SetReadOnlyPropertyValue(ReadonlyProperty, value);
                readonlyPropertyValue = value;
            }
        }
 
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public IDictionary UserData
        {
            get
            {
                return (IDictionary)GetValue(UserDataProperty);
            }
        }
 
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        protected internal bool DesignMode
        {
            get
            {
                return !readonlyPropertyValue;
            }
        }
        protected DependencyObject ParentDependencyObject
        {
            get
            {
                return (DependencyObject)this.GetValue(ParentDependencyObjectProperty);
            }
        }
 
        #region Dynamic Property Support
        public void SetBinding(DependencyProperty dependencyProperty, ActivityBind bind)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            if (dependencyProperty.DefaultMetadata != null && dependencyProperty.DefaultMetadata.IsReadOnly)
                throw new ArgumentException(SR.GetString(SR.Error_DPReadOnly), "dependencyProperty");
 
            if (dependencyProperty.OwnerType == null)
                throw new ArgumentException(SR.GetString(SR.Error_MissingOwnerTypeProperty), "dependencyProperty");
 
            if (!dependencyProperty.IsAttached && !dependencyProperty.OwnerType.IsAssignableFrom(this.GetType()))
                throw new InvalidOperationException(SR.GetString(SR.Error_InvalidDependencyProperty, this.GetType().FullName, dependencyProperty.Name, dependencyProperty.OwnerType.FullName));
 
            if (!this.DesignMode)
                throw new InvalidOperationException(SR.GetString(SR.Error_CanNotChangeAtRuntime));
 
            if (dependencyProperty.DefaultMetadata != null && dependencyProperty.DefaultMetadata.IsMetaProperty && !typeof(ActivityBind).IsAssignableFrom(dependencyProperty.PropertyType))
                throw new ArgumentException(SR.GetString(SR.Error_DPMetaPropertyBinding), "dependencyProperty");
 
            if (this.metaProperties.ContainsKey(dependencyProperty))
                this.metaProperties[dependencyProperty] = bind;
            else
                this.metaProperties.Add(dependencyProperty, bind);
 
            // Remove the instance value
            if (this.DependencyPropertyValues.ContainsKey(dependencyProperty))
                this.DependencyPropertyValues.Remove(dependencyProperty);
        }
 
        // 
 
 
 
 
 
        public ActivityBind GetBinding(DependencyProperty dependencyProperty)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            //Designer needs the bind and not bound value
            return (this.metaProperties.ContainsKey(dependencyProperty) ? this.metaProperties[dependencyProperty] as ActivityBind : null);
        }
        public object GetValue(DependencyProperty dependencyProperty)
        {
            //Return the property values
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            if (dependencyProperty.IsEvent)
                throw new ArgumentException(SR.GetString(SR.Error_DPGetValueHandler), "dependencyProperty");
 
            // Get type-specific metadata for this property
            PropertyMetadata metadata = dependencyProperty.DefaultMetadata;
            if (metadata.GetValueOverride != null)
                return metadata.GetValueOverride(this);
 
            return GetValueCommon(dependencyProperty, metadata);
        }
 
        private object GetValueCommon(DependencyProperty dependencyProperty, PropertyMetadata metadata)
        {
            //ok, the default case
            // pick either the instance bag or meta bag, instance bag is given first chance
            object value;
            if (!this.DependencyPropertyValues.TryGetValue(dependencyProperty, out value))
            {
                if (metaProperties == null || !metaProperties.TryGetValue(dependencyProperty, out value))
                    return dependencyProperty.DefaultMetadata.DefaultValue;
            }
 
            //Designer needs the bind and not bound value
            if (this.metaProperties != null && !this.DesignMode && value is ActivityBind && !typeof(ActivityBind).IsAssignableFrom(dependencyProperty.PropertyType))
                value = this.GetBoundValue((ActivityBind)value, dependencyProperty.PropertyType);
 
            if (value == null || value is ActivityBind)
                return dependencyProperty.DefaultMetadata.DefaultValue;
 
            if (!dependencyProperty.PropertyType.IsAssignableFrom(value.GetType()))
                throw new InvalidOperationException(SR.GetString(SR.Error_DynamicPropertyTypeValueMismatch, new object[] { dependencyProperty.PropertyType.FullName, dependencyProperty.Name, value.GetType().FullName }));
 
            return value;
        }
 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public object GetValueBase(DependencyProperty dependencyProperty)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            return this.GetValueCommon(dependencyProperty, dependencyProperty.DefaultMetadata);
        }
 
        protected internal void SetReadOnlyPropertyValue(DependencyProperty dependencyProperty, object value)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            if (!dependencyProperty.DefaultMetadata.IsReadOnly)
                throw new InvalidOperationException(SR.GetString(SR.Error_NotReadOnlyProperty, dependencyProperty.Name, dependencyProperty.OwnerType.FullName));
 
            if (!dependencyProperty.IsAttached && !dependencyProperty.OwnerType.IsAssignableFrom(this.GetType()))
                throw new InvalidOperationException(SR.GetString(SR.Error_InvalidDependencyProperty, this.GetType().FullName, dependencyProperty.Name, dependencyProperty.OwnerType.FullName));
 
            IDictionary<DependencyProperty, object> properties = null;
            if (dependencyProperty.DefaultMetadata.IsMetaProperty)
                properties = this.metaProperties;
            else
                properties = this.DependencyPropertyValues;
 
            if (properties.ContainsKey(dependencyProperty))
                properties[dependencyProperty] = value;
            else
                properties.Add(dependencyProperty, value);
        }
 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public void SetValueBase(DependencyProperty dependencyProperty, object value)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            PropertyMetadata metadata = dependencyProperty.DefaultMetadata;
            this.SetValueCommon(dependencyProperty, value, metadata, metadata.ShouldAlwaysCallOverride);
        }
 
 
        public void SetValue(DependencyProperty dependencyProperty, object value)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            PropertyMetadata metadata = dependencyProperty.DefaultMetadata;
            this.SetValueCommon(dependencyProperty, value, metadata, true);
        }
 
        internal void SetValueCommon(DependencyProperty dependencyProperty, object value, PropertyMetadata metadata, bool shouldCallSetValueOverrideIfExists)
        {
            if (dependencyProperty.DefaultMetadata.IsReadOnly)
                throw new ArgumentException(SR.GetString(SR.Error_DPReadOnly), "dependencyProperty");
            if (value is ActivityBind)
                throw new ArgumentException(SR.GetString(SR.Error_DPSetValueBind), "value");
            if (dependencyProperty.IsEvent)
                throw new ArgumentException(SR.GetString(SR.Error_DPSetValueHandler), "dependencyProperty");
 
            if (!dependencyProperty.IsAttached && !dependencyProperty.OwnerType.IsAssignableFrom(this.GetType()))
                throw new InvalidOperationException(SR.GetString(SR.Error_InvalidDependencyProperty, this.GetType().FullName, dependencyProperty.Name, dependencyProperty.OwnerType.FullName));
 
            //ok, the default case
            // Work around  Declarative conditions
            if (!this.DesignMode && (dependencyProperty.DefaultMetadata.IsMetaProperty && dependencyProperty != Design.ConditionTypeConverter.DeclarativeConditionDynamicProp))
                throw new InvalidOperationException(SR.GetString(SR.Error_CanNotChangeAtRuntime));
 
            if (value != null && !dependencyProperty.PropertyType.IsAssignableFrom(value.GetType()))
                throw new ArgumentException(SR.GetString(SR.Error_DynamicPropertyTypeValueMismatch, new object[] { dependencyProperty.PropertyType.FullName, dependencyProperty.Name, value.GetType().FullName }), "value");
 
            // Set type-specific metadata for this property if the delegate was specified
            if (shouldCallSetValueOverrideIfExists && metadata.SetValueOverride != null)
            {
                metadata.SetValueOverride(this, value);
                return;
            }
 
            //Even if the DependencyProperty is an instance property if its value is of type bind
            //we store it in MetaProperties, We need this to make bind work
            IDictionary<DependencyProperty, object> properties = null;
            if (dependencyProperty.DefaultMetadata.IsMetaProperty)
                properties = this.metaProperties;
            else
                properties = this.DependencyPropertyValues;
 
 
            object oldMetaValue = null;
            if (this.metaProperties != null && this.metaProperties.ContainsKey(dependencyProperty))
            {
                oldMetaValue = this.metaProperties[dependencyProperty];
                if (this.DesignMode)
                    this.metaProperties.Remove(dependencyProperty);
            }
            if (!this.DesignMode && (oldMetaValue is ActivityBind))
            {
                this.SetBoundValue((ActivityBind)oldMetaValue, value);
            }
            else
            {
                if (properties.ContainsKey(dependencyProperty))
                    properties[dependencyProperty] = value;
                else
                    properties.Add(dependencyProperty, value);
            }
        }
 
        public bool RemoveProperty(DependencyProperty dependencyProperty)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            bool removed = false;
            if (dependencyProperty.DefaultMetadata != null && dependencyProperty.DefaultMetadata.IsMetaProperty)
            {
                if (!DesignMode)
                    throw new InvalidOperationException(SR.GetString(SR.Error_CanNotChangeAtRuntime));
                removed = this.metaProperties.Remove(dependencyProperty);
            }
            else
            {
                //These statements are required as InstanceProperties which are Bind are stored as MetaProperties
                removed = this.metaProperties.Remove(dependencyProperty);
                removed |= this.DependencyPropertyValues.Remove(dependencyProperty);
            }
            return removed;
        }
 
        public void AddHandler(DependencyProperty dependencyEvent, object value)
        {
            if (dependencyEvent == null)
                throw new ArgumentNullException("dependencyEvent");
 
            if (value == null)
                throw new ArgumentNullException("value");
 
            if (value is ActivityBind)
                throw new ArgumentException(SR.GetString(SR.Error_DPSetValueBind), "value");
 
            if (dependencyEvent.DefaultMetadata != null && dependencyEvent.DefaultMetadata.IsMetaProperty)
                throw new ArgumentException(SR.GetString(SR.Error_DPAddHandlerMetaProperty), "dependencyEvent");
 
            if (!dependencyEvent.IsEvent)
                throw new ArgumentException(SR.GetString(SR.Error_DPAddHandlerNonEvent), "dependencyEvent");
 
            if (dependencyEvent.PropertyType == null)
                throw new ArgumentException(SR.GetString(SR.Error_DPPropertyTypeMissing), "dependencyEvent");
 
            if (dependencyEvent.OwnerType == null)
                throw new ArgumentException(SR.GetString(SR.Error_MissingOwnerTypeProperty), "dependencyEvent");
 
            if (!dependencyEvent.IsAttached && !dependencyEvent.OwnerType.IsAssignableFrom(this.GetType()))
                throw new InvalidOperationException(SR.GetString(SR.Error_InvalidDependencyProperty, this.GetType().FullName, dependencyEvent.Name, dependencyEvent.OwnerType.FullName));
 
            if (value != null && !dependencyEvent.PropertyType.IsAssignableFrom(value.GetType()))
                throw new ArgumentException(SR.GetString(SR.Error_DynamicPropertyTypeValueMismatch, new object[] { dependencyEvent.PropertyType.FullName, dependencyEvent.Name, value.GetType().FullName }), "value");
 
            // get appropriate meta bag or instance bag
            IDictionary<DependencyProperty, object> properties = this.DependencyPropertyValues;
 
            // add it to array list
            ArrayList eventListeners = null;
            if (properties.ContainsKey(dependencyEvent))
            {
                eventListeners = (ArrayList)properties[dependencyEvent];
            }
            else
            {
                eventListeners = new ArrayList();
                properties.Add(dependencyEvent, eventListeners);
            }
            eventListeners.Add(value);
            if (this.DesignMode && this.metaProperties.ContainsKey(dependencyEvent))
                this.metaProperties.Remove(dependencyEvent);
        }
 
        public void RemoveHandler(DependencyProperty dependencyEvent, object value)
        {
            if (dependencyEvent == null)
                throw new ArgumentNullException("dependencyEvent");
            if (value == null)
                throw new ArgumentNullException("value");
            if (value is ActivityBind)
                throw new ArgumentException(SR.GetString(SR.Error_DPRemoveHandlerBind), "value");
 
            if (dependencyEvent.DefaultMetadata != null && dependencyEvent.DefaultMetadata.IsMetaProperty)
                throw new ArgumentException(SR.GetString(SR.Error_DPAddHandlerMetaProperty), "dependencyEvent");
 
            if (!dependencyEvent.IsEvent)
                throw new ArgumentException(SR.GetString(SR.Error_DPAddHandlerNonEvent), "dependencyEvent");
 
            // get appropriate meta bag or instance bag
            IDictionary<DependencyProperty, object> properties = this.DependencyPropertyValues;
            if (properties.ContainsKey(dependencyEvent))
            {
                ArrayList eventListeners = (ArrayList)properties[dependencyEvent];
                if (eventListeners.Contains(value))
                    eventListeners.Remove(value);
                if (eventListeners.Count == 0)
                    properties.Remove(dependencyEvent);
            }
        }
 
        internal object GetHandler(DependencyProperty dependencyEvent)
        {
            if (dependencyEvent == null)
                throw new ArgumentNullException("dependencyEvent");
 
            if (!dependencyEvent.IsEvent)
                throw new ArgumentException("dependencyEvent");
 
            IDictionary<DependencyProperty, object> properties = this.DependencyPropertyValues;
            if (properties.ContainsKey(dependencyEvent))
            {
                ArrayList handlers = properties[dependencyEvent] as ArrayList;
                if (handlers != null && handlers.Count != 0)
                {
                    if (handlers.Count == 1)
                        return handlers[0];
                    else //Combine 
                    {
                        Delegate delegateHandler = handlers[0] as Delegate;
                        for (int i = 1; i < handlers.Count; ++i)
                        {
                            delegateHandler = Delegate.Combine(delegateHandler, handlers[i] as Delegate);
                        }
 
                        return delegateHandler;
                    }
                }
            }
            return null;
        }
 
        public bool IsBindingSet(DependencyProperty dependencyProperty)
        {
            if (dependencyProperty == null)
                throw new ArgumentNullException("dependencyProperty");
 
            return (!this.DependencyPropertyValues.ContainsKey(dependencyProperty) &&
                    this.metaProperties.ContainsKey(dependencyProperty) &&
                    this.metaProperties[dependencyProperty] is ActivityBind);
        }
 
        public bool MetaEquals(DependencyObject dependencyObject)
        {
#pragma warning suppress 56506
            return dependencyObject != null && dependencyObject.metaProperties == this.metaProperties;
        }
 
        #region IDependencyObjectAccessor
 
        void IDependencyObjectAccessor.InitializeInstanceForRuntime(IWorkflowCoreRuntime workflowCoreRuntime)
        {
            OnInitializeInstanceForRuntime(workflowCoreRuntime);
        }
        internal virtual void OnInitializeInstanceForRuntime(IWorkflowCoreRuntime workflowCoreRuntime)
        {
        }
 
        //This is invoked for every activating instance
        void IDependencyObjectAccessor.InitializeActivatingInstanceForRuntime(DependencyObject parentDependencyObject, IWorkflowCoreRuntime workflowCoreRuntime)
        {
            if (parentDependencyObject != null)
                this.DependencyPropertyValues[ParentDependencyObjectProperty] = parentDependencyObject;
 
            // InitializeForRuntime call allows people to put more meta properties in the bag.
            foreach (DependencyProperty dependencyProperty in this.MetaDependencyProperties)
            {
                object propValue = this.metaProperties[dependencyProperty];
                if (propValue is DependencyObject)
                {
                    ((IDependencyObjectAccessor)propValue).InitializeActivatingInstanceForRuntime(this, workflowCoreRuntime);
                    this.DependencyPropertyValues[dependencyProperty] = propValue;
                }
                else if (propValue is WorkflowParameterBindingCollection)
                {
                    IList collection = propValue as IList;
                    for (int index2 = 0; index2 < collection.Count; index2++)
                        ((IDependencyObjectAccessor)collection[index2]).InitializeActivatingInstanceForRuntime(this, workflowCoreRuntime);
                    this.DependencyPropertyValues[dependencyProperty] = propValue;
                }
            }
            OnInitializeActivatingInstanceForRuntime(workflowCoreRuntime);
 
            this.Readonly = true;
        }
        internal virtual void OnInitializeActivatingInstanceForRuntime(IWorkflowCoreRuntime workflowCoreRuntime)
        {
            InitializeProperties();
        }
 
        void IDependencyObjectAccessor.InitializeDefinitionForRuntime(DependencyObject parentDependencyObject)
        {
            if (parentDependencyObject != null)
                this.DependencyPropertyValues[ParentDependencyObjectProperty] = parentDependencyObject;
 
            // InitializeForRuntime call allows people to put more meta properties in the bag.
            foreach (DependencyProperty dependencyProperty in this.MetaDependencyProperties)
            {
                object propValue = this.metaProperties[dependencyProperty];
                if (propValue is DependencyObject)
                {
                    ((IDependencyObjectAccessor)propValue).InitializeDefinitionForRuntime(this);
                    this.DependencyPropertyValues[dependencyProperty] = propValue;
                }
                else if (propValue is WorkflowParameterBindingCollection)
                {
                    IList collection = propValue as IList;
                    for (int index2 = 0; index2 < collection.Count; index2++)
                        ((IDependencyObjectAccessor)collection[index2]).InitializeDefinitionForRuntime(this);
                    this.DependencyPropertyValues[dependencyProperty] = propValue;
                }
                else if (propValue is ActivityBind)
                {
                    Activity activity = ResolveOwnerActivity();
                    if (activity != null)
                        ((ActivityBind)propValue).SetContext(activity);
                }
            }
            OnInitializeDefinitionForRuntime();
            InitializeProperties();
            this.Readonly = true;
        }
        internal virtual void OnInitializeDefinitionForRuntime()
        {
        }
        protected virtual void InitializeProperties()
        {
        }
        internal virtual void FixUpMetaProperties(DependencyObject originalObject)
        {
            if (originalObject == null)
                throw new ArgumentNullException();
 
            this.metaProperties = originalObject.metaProperties;
            this.readonlyPropertyValue = true;       // alway readonly if fixing up
            foreach (KeyValuePair<DependencyProperty, object> keyValuePair in this.DependencyPropertyValues)
            {
                if (keyValuePair.Key != ParentDependencyObjectProperty && originalObject.DependencyPropertyValues.ContainsKey(keyValuePair.Key))
                {
                    object originalPropValue = originalObject.DependencyPropertyValues[keyValuePair.Key];
                    if (keyValuePair.Value is DependencyObject)
                    {
                        ((DependencyObject)keyValuePair.Value).FixUpMetaProperties(originalPropValue as DependencyObject);
                    }
                    else if (keyValuePair.Value is WorkflowParameterBindingCollection)
                    {
                        IList collection = keyValuePair.Value as IList;
                        IList originalCollection = originalPropValue as IList;
                        for (int index = 0; index < collection.Count; index++)
                        {
                            ((DependencyObject)collection[index]).FixUpMetaProperties(originalCollection[index] as DependencyObject);
                        }
                    }
                }
            }
        }
        T[] IDependencyObjectAccessor.GetInvocationList<T>(DependencyProperty dependencyEvent)
        {
            return this.GetInvocationList<T>(dependencyEvent);
        }
        protected T[] GetInvocationList<T>(DependencyProperty dependencyEvent)
        {
            if (dependencyEvent == null)
                throw new ArgumentNullException("dependencyEvent");
 
            if (!dependencyEvent.IsEvent)
                throw new ArgumentException(SR.GetString(SR.Error_DPAddHandlerNonEvent), "dependencyEvent");
 
            // pick the appropriate meta bag or instance bag, first priority is to instance bag
            IDictionary<DependencyProperty, object> properties = null;
            if (this.DependencyPropertyValues.ContainsKey(dependencyEvent))
                properties = this.DependencyPropertyValues;
            else
                properties = this.metaProperties;
 
            List<T> delegates = new List<T>();
            if (properties.ContainsKey(dependencyEvent))
            {
                if (properties[dependencyEvent] is ActivityBind)
                {
                    if (!this.DesignMode)
                    {
                        T delegateValue = default(T);
                        delegateValue = (T)this.GetBoundValue((ActivityBind)properties[dependencyEvent], typeof(T));
                        if (delegateValue is T)
                            delegates.Add(delegateValue);
                    }
                }
                else
                {
                    foreach (object value in (ArrayList)properties[dependencyEvent])
                    {
                        if (value is T)
                        {
                            delegates.Add((T)value);
                        }
                    }
                }
            }
            return delegates.ToArray();
        }
        #endregion
 
        internal IList<DependencyProperty> MetaDependencyProperties
        {
            get
            {
                return new List<DependencyProperty>(this.metaProperties.Keys).AsReadOnly();
            }
        }
 
        //
        private IDictionary<DependencyProperty, object> dependencyPropertyValues = null;
        internal IDictionary<DependencyProperty, object> DependencyPropertyValues
        {
            get
            {
                if (this.dependencyPropertyValues == null)
                    this.dependencyPropertyValues = new Dictionary<DependencyProperty, object>();
                return this.dependencyPropertyValues;
            }
        }
 
        #endregion
 
        #region Bind resolution Support
 
        [EditorBrowsableAttribute(EditorBrowsableState.Never)]
        protected virtual object GetBoundValue(ActivityBind bind, Type targetType)
        {
            if (bind == null)
                throw new ArgumentNullException("bind");
            if (targetType == null)
                throw new ArgumentNullException("targetType");
 
            object returnVal = bind;
            Activity activity = ResolveOwnerActivity();
            if (activity != null)
                returnVal = bind.GetRuntimeValue(activity, targetType);
 
            return returnVal;
        }
        [EditorBrowsableAttribute(EditorBrowsableState.Never)]
        protected virtual void SetBoundValue(ActivityBind bind, object value)
        {
            if (bind == null)
                throw new ArgumentNullException("bind");
 
            Activity activity = ResolveOwnerActivity();
            if (activity != null)
                bind.SetRuntimeValue(activity, value);
        }
 
        // 
        private Activity ResolveOwnerActivity()
        {
            DependencyObject activityDependencyObject = this;
            while (activityDependencyObject != null && !(activityDependencyObject is Activity))
                activityDependencyObject = activityDependencyObject.ParentDependencyObject;
            return activityDependencyObject as Activity;
        }
 
        #endregion
 
        #region IComponent Members
 
        private event EventHandler disposed;
 
        event EventHandler IComponent.Disposed
        {
            add
            {
                disposed += value;
            }
            remove
            {
                disposed -= value;
            }
        }
 
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [EditorBrowsableAttribute(EditorBrowsableState.Never)]
        public ISite Site
        {
            get
            {
                return (ISite)GetValue(SiteProperty);
            }
            set
            {
                SetValue(SiteProperty, value);
            }
        }
 
        #endregion
 
        #region IDisposable Members
 
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
 
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (this.Site != null && this.Site.Container != null)
                    this.Site.Container.Remove(this);
 
                if (disposed != null)
                    disposed(this, EventArgs.Empty);
            }
        }
        #endregion
    }
}