File: System\Workflow\Activities\ReceiveActivityDesigner.cs
Project: ndp\cdf\src\NetFx35\System.WorkflowServices\System.WorkflowServices.csproj (System.WorkflowServices)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
 
namespace System.Workflow.Activities
{
    using System.Collections;
    using System.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    using System.Drawing;
    using System.Reflection;
    using System.Workflow.ComponentModel;
    using System.ComponentModel.Design;
    using System.Workflow.Activities.Design;
    using System.ServiceModel;
    using System.Workflow.ComponentModel.Compiler;
    using System.Windows.Forms;
 
 
    [ActivityDesignerTheme(typeof(ReceiveActivityDesignerTheme))]
    class ReceiveActivityDesigner : SequenceDesigner
    {
        static ActivityComparer<ReceiveActivity> matchByContractCallback;
        static ActivityComparer<ReceiveActivity> matchByOperationCallback;
 
        public override Size MinimumSize
        {
            get
            {
                return new Size(170, 80);
            }
        }
 
        public override string Text
        {
            get
            {
                if (this.ReceiveActivity.ServiceOperationInfo != null)
                {
                    string operationName = this.ReceiveActivity.ServiceOperationInfo.Name;
                    if (!String.IsNullOrEmpty(operationName))
                    {
                        return operationName;
                    }
                }
                return base.Text;
 
            }
        }
 
        protected override ActivityDesignerVerbCollection Verbs
        {
            get
            {
                ActivityDesignerVerbCollection verbs = new ActivityDesignerVerbCollection();
                foreach (ActivityDesignerVerb verb in base.Verbs)
                {
                    verbs.Add(verb);
                }
 
                ActivityDesignerVerb findSimilarOperationsVerb = new FindSimilarActivitiesVerb<ReceiveActivity>(
                    this, MatchByOperationCallback, SR2.GetString(SR2.ShowActivitiesWithSameOperation));
                verbs.Add(findSimilarOperationsVerb);
 
                ActivityDesignerVerb findSimilarContractVerb = new FindSimilarActivitiesVerb<ReceiveActivity>(
                    this, MatchByContractCallback, SR2.GetString(SR2.ShowActivitiesWithSameContract));
                verbs.Add(findSimilarContractVerb);
 
                return verbs;
            }
        }
 
        static ActivityComparer<ReceiveActivity> MatchByContractCallback
        {
            get
            {
                if (matchByContractCallback == null)
                {
                    matchByContractCallback = new ActivityComparer<ReceiveActivity>(MatchByContract);
                }
                return matchByContractCallback;
            }
        }
 
        static ActivityComparer<ReceiveActivity> MatchByOperationCallback
        {
            get
            {
                if (matchByOperationCallback == null)
                {
                    matchByOperationCallback = new ActivityComparer<ReceiveActivity>(MatchByOperation);
                }
                return matchByOperationCallback;
            }
        }
 
        ReceiveActivity ReceiveActivity
        {
            get { return this.Activity as ReceiveActivity; }
 
        }
 
        internal static bool MatchByContract(OperationInfoBase source, OperationInfoBase target)
        {
            if ((source == null) || (target == null))
            {
                return false;
            }
            string sourceContract = source.GetContractFullName(null);
            string targetContract = target.GetContractFullName(null);
            return MatchNames(sourceContract, targetContract);
        }
 
        internal static bool MatchByOperation(OperationInfoBase source, OperationInfoBase target)
        {
            if (!MatchByContract(source, target))
            {
                return false;
            }
            return MatchNames(source.Name, target.Name);
        }
 
        protected override void Initialize(Activity activity)
        {
            base.Initialize(activity);
 
            IExtenderListService extenderListService = (IExtenderListService)GetService(typeof(IExtenderListService));
            if (extenderListService != null)
            {
                bool foundExtender = false;
                foreach (IExtenderProvider extenderProvider in extenderListService.GetExtenderProviders())
                {
                    if (extenderProvider.GetType() == typeof(WorkflowServiceAttributesPropertyProviderExtender))
                    {
                        foundExtender = true;
                    }
                }
 
                if (!foundExtender)
                {
                    IExtenderProviderService extenderProviderService = (IExtenderProviderService)GetService(typeof(IExtenderProviderService));
                    if (extenderProviderService != null)
                    {
                        extenderProviderService.AddExtenderProvider(new WorkflowServiceAttributesPropertyProviderExtender());
                    }
                }
            }
        }
 
        protected override void OnActivityChanged(ActivityChangedEventArgs e)
        {
            base.OnActivityChanged(e);
            if (e.Member != null && e.Member.Name == ReceiveActivity.ServiceOperationInfoProperty.Name)
            {
                ReceiveActivity receiveActivity = e.Activity as ReceiveActivity;
                if (receiveActivity != null)
                {
                    receiveActivity.ParameterBindings.Clear();
                }
 
                TypeDescriptor.Refresh(e.Activity);
                PerformLayout();
            }
        }
 
        protected override void OnMouseDoubleClick(System.Windows.Forms.MouseEventArgs e)
        {
            // Do not allow editing if activity is locked
            if (this.IsLocked)
            {
                return;
            }
 
            OperationInfoBase pickedServiceOperation = null;
            if (ServiceOperationUIEditor.TryPickOperation(this.Activity.Site, this.Activity, this.ReceiveActivity.ServiceOperationInfo, out pickedServiceOperation))
            {
                PropertyDescriptorUtils.SetPropertyValue(this.Activity.Site, ServiceOperationHelpers.GetServiceOperationInfoPropertyDescriptor(this.Activity), this.Activity, pickedServiceOperation);
            }
        }
 
        protected override void OnPaint(ActivityDesignerPaintEventArgs e)
        {
            base.OnPaint(e);
            Rectangle incomingArrowRect = new Rectangle(this.Location.X - 2, this.Location.Y + 20, 24, 24);
            Rectangle outgoingArrowRect = new Rectangle(this.Location.X + 22, this.Location.Y + this.Size.Height - 45, -24, 24);
            e.Graphics.DrawImage(ImageResources.Arrow, incomingArrowRect);
            bool isOneWay = false;
 
 
            if (ReceiveActivity.ServiceOperationInfo != null)
            {
                // Refresh the referenced design time types in the serviceoperationInfo object properties;
                //ServiceOperationHelpers.RefreshReferencedDesignTimeTypes(this.Activity.Site as IServiceProvider, operation);
                isOneWay = this.ReceiveActivity.ServiceOperationInfo.GetIsOneWay(this.Activity.Site as IServiceProvider);
            }
            if (!isOneWay)
            {
                e.Graphics.DrawImage(ImageResources.Arrow, outgoingArrowRect);
            }
        }
 
        protected override void PreFilterProperties(IDictionary properties)
        {
            base.PreFilterProperties(properties);
            ReceiveActivity receiveActivity = this.Activity as ReceiveActivity;
            if (receiveActivity != null)
            {
                receiveActivity.GetParameterPropertyDescriptors(properties);
            }
        }
 
        static bool MatchByContract(ReceiveActivity source, ReceiveActivity target)
        {
            return MatchByContract(source.ServiceOperationInfo, target.ServiceOperationInfo);
        }
 
        static bool MatchByOperation(ReceiveActivity source, ReceiveActivity target)
        {
            return MatchByOperation(source.ServiceOperationInfo, target.ServiceOperationInfo);
        }
 
        static bool MatchNames(string sourceName, string targetName)
        {
            if (string.IsNullOrEmpty(sourceName) || string.IsNullOrEmpty(targetName))
            {
                return false;
            }
            return (sourceName == targetName);
        }
 
    }
 
}