File: Code.cs
Project: ndp\cdf\src\WF\Activities\System.Workflow.Activities.csproj (System.Workflow.Activities)
namespace System.Workflow.Activities
{
    using System;
    using System.Text;
    using System.Reflection;
    using System.Collections;
    using System.CodeDom;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Drawing;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    using System.Workflow.ComponentModel.Serialization;
    using System.Collections.Generic;
    using System.Workflow.ComponentModel.Compiler;
 
    [SRDescription(SR.CodeActivityDescription)]
    [ToolboxItem(typeof(ActivityToolboxItem))]
    [Designer(typeof(CodeDesigner), typeof(IDesigner))]
    [ToolboxBitmap(typeof(CodeActivity), "Resources.code.png")]
    [DefaultEvent("ExecuteCode")]
    [SRCategory(SR.Standard)]
    [ActivityValidator(typeof(CodeActivityValidator))]
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    public sealed class CodeActivity : Activity
    {
        #region Constructors
 
        public CodeActivity()
        {
        }
 
        public CodeActivity(string name)
            : base(name)
        {
        }
 
        #endregion
 
        public static readonly DependencyProperty ExecuteCodeEvent = DependencyProperty.Register("ExecuteCode", typeof(EventHandler), typeof(CodeActivity));
 
        protected override sealed ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            base.RaiseEvent(CodeActivity.ExecuteCodeEvent, this, EventArgs.Empty);
 
            return ActivityExecutionStatus.Closed;
        }
 
        [SRCategory(SR.Handlers)]
        [SRDescription(SR.UserCodeHandlerDescr)]
        [MergableProperty(false)]
        public event EventHandler ExecuteCode
        {
            add
            {
                base.AddHandler(ExecuteCodeEvent, value);
            }
            remove
            {
                base.RemoveHandler(ExecuteCodeEvent, value);
            }
        }
 
        private class CodeActivityValidator : ActivityValidator
        {
            public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
            {
                ValidationErrorCollection errors = new ValidationErrorCollection();
 
                CodeActivity code = obj as CodeActivity;
                if (code == null)
                    throw new InvalidOperationException();
 
                // This violates the P || C validation condition, but we are compiling with csc.exe here!
                if (code.GetInvocationList<EventHandler>(CodeActivity.ExecuteCodeEvent).Length == 0 &&
                    code.GetBinding(CodeActivity.ExecuteCodeEvent) == null)
                {
                    Hashtable hashtable = code.GetValue(WorkflowMarkupSerializer.EventsProperty) as Hashtable;
                    if (hashtable == null || hashtable["ExecuteCode"] == null)
                        errors.Add(ValidationError.GetNotSetValidationError("ExecuteCode"));
                }
 
                errors.AddRange(base.Validate(manager, obj));
                return errors;
            }
        }
    }
}