//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities { using System; using System.Activities.Runtime; using System.Activities.Validation; using System.Activities.XamlIntegration; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime; using System.Windows.Markup; using System.Xaml; [ContentProperty("Implementation")] public sealed class DynamicActivity : Activity, ICustomTypeDescriptor, IDynamicActivity { Activity runtimeImplementation; DynamicActivityTypeDescriptor typeDescriptor; Collection attributes; public DynamicActivity() : base() { this.typeDescriptor = new DynamicActivityTypeDescriptor(this); } public string Name { get { return this.typeDescriptor.Name; } set { this.typeDescriptor.Name = value; } } [DependsOn("Name")] public Collection Attributes { get { if (this.attributes == null) { this.attributes = new Collection(); } return this.attributes; } } [Browsable(false)] [DependsOn("Attributes")] public KeyedCollection Properties { get { return this.typeDescriptor.Properties; } } [DependsOn("Properties")] public new Collection Constraints { get { return base.Constraints; } } [TypeConverter(typeof(ImplementationVersionConverter))] [DefaultValue(null)] public new Version ImplementationVersion { get { return base.ImplementationVersion; } set { base.ImplementationVersion = value; } } [XamlDeferLoad(typeof(FuncDeferringLoader), typeof(Activity))] [DefaultValue(null)] [Browsable(false)] [Ambient] public new Func Implementation { get { return base.Implementation; } set { base.Implementation = value; } } KeyedCollection IDynamicActivity.Properties { get { return this.Properties; } } internal override void InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) { if (this.runtimeImplementation != null) { executor.ScheduleActivity(this.runtimeImplementation, instance, null, null, null); } } sealed internal override void OnInternalCacheMetadata(bool createEmptyBindings) { Activity body = null; if (this.Implementation != null) { body = this.Implementation(); } if (body != null) { SetImplementationChildrenCollection(new Collection { body }); } // Always cache the last body that we returned this.runtimeImplementation = body; ReflectedInformation information = new ReflectedInformation(this); SetImportedChildrenCollection(information.GetChildren()); SetVariablesCollection(information.GetVariables()); SetImportedDelegatesCollection(information.GetDelegates()); SetArgumentsCollection(information.GetArguments(), createEmptyBindings); } AttributeCollection ICustomTypeDescriptor.GetAttributes() { return this.typeDescriptor.GetAttributes(); } string ICustomTypeDescriptor.GetClassName() { return this.typeDescriptor.GetClassName(); } string ICustomTypeDescriptor.GetComponentName() { return this.typeDescriptor.GetComponentName(); } TypeConverter ICustomTypeDescriptor.GetConverter() { return this.typeDescriptor.GetConverter(); } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return this.typeDescriptor.GetDefaultEvent(); } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return this.typeDescriptor.GetDefaultProperty(); } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return this.typeDescriptor.GetEditor(editorBaseType); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return this.typeDescriptor.GetEvents(attributes); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return this.typeDescriptor.GetEvents(); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return this.typeDescriptor.GetProperties(); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { return this.typeDescriptor.GetProperties(attributes); } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this.typeDescriptor.GetPropertyOwner(pd); } } [ContentProperty("Implementation")] public sealed class DynamicActivity : Activity, ICustomTypeDescriptor, IDynamicActivity { Activity runtimeImplementation; DynamicActivityTypeDescriptor typeDescriptor; Collection attributes; public DynamicActivity() : base() { this.typeDescriptor = new DynamicActivityTypeDescriptor(this); } public string Name { get { return this.typeDescriptor.Name; } set { this.typeDescriptor.Name = value; } } [DependsOn("Name")] public Collection Attributes { get { if (this.attributes == null) { this.attributes = new Collection(); } return this.attributes; } } [Browsable(false)] [DependsOn("Attributes")] public KeyedCollection Properties { get { return this.typeDescriptor.Properties; } } [DependsOn("Properties")] public new Collection Constraints { get { return base.Constraints; } } [TypeConverter(typeof(ImplementationVersionConverter))] [DefaultValue(null)] public new Version ImplementationVersion { get { return base.ImplementationVersion; } set { base.ImplementationVersion = value; } } [XamlDeferLoad(typeof(FuncDeferringLoader), typeof(Activity))] [DefaultValue(null)] [Browsable(false)] [Ambient] public new Func Implementation { get { return base.Implementation; } set { base.Implementation = value; } } KeyedCollection IDynamicActivity.Properties { get { return this.Properties; } } internal override void InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) { if (this.runtimeImplementation != null) { executor.ScheduleActivity(this.runtimeImplementation, instance, null, null, null); } } sealed internal override void OnInternalCacheMetadataExceptResult(bool createEmptyBindings) { Activity body = null; if (this.Implementation != null) { body = this.Implementation(); } if (body != null) { SetImplementationChildrenCollection(new Collection { body }); } // Always cache the last body that we returned this.runtimeImplementation = body; ReflectedInformation information = new ReflectedInformation(this); SetImportedChildrenCollection(information.GetChildren()); SetVariablesCollection(information.GetVariables()); SetImportedDelegatesCollection(information.GetDelegates()); SetArgumentsCollection(information.GetArguments(), createEmptyBindings); } AttributeCollection ICustomTypeDescriptor.GetAttributes() { return this.typeDescriptor.GetAttributes(); } string ICustomTypeDescriptor.GetClassName() { return this.typeDescriptor.GetClassName(); } string ICustomTypeDescriptor.GetComponentName() { return this.typeDescriptor.GetComponentName(); } TypeConverter ICustomTypeDescriptor.GetConverter() { return this.typeDescriptor.GetConverter(); } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return this.typeDescriptor.GetDefaultEvent(); } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return this.typeDescriptor.GetDefaultProperty(); } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return this.typeDescriptor.GetEditor(editorBaseType); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return this.typeDescriptor.GetEvents(attributes); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return this.typeDescriptor.GetEvents(); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return this.typeDescriptor.GetProperties(); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { return this.typeDescriptor.GetProperties(attributes); } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this.typeDescriptor.GetPropertyOwner(pd); } } }