1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //------------------------------------------------------------
4 
5 namespace System.Workflow.Activities.Design
6 {
7     using System;
8     using System.Collections.Generic;
9     using System.Text;
10     using System.Drawing.Design;
11     using System.ComponentModel;
12     using System.ComponentModel.Design;
13     using System.Windows.Forms.Design;
14     using System.Workflow.ComponentModel;
15     using System.Workflow.ComponentModel.Design;
16     using System.Diagnostics;
17     using System.ServiceModel;
18     using System.Windows.Forms;
19 
20     internal class ServiceOperationUIEditor : UITypeEditor
21     {
22 
TryPickOperation(IServiceProvider serviceProvider, Activity activity, OperationInfoBase currentOperation, out OperationInfoBase selectedOperation)23         public static bool TryPickOperation(IServiceProvider serviceProvider, Activity activity, OperationInfoBase currentOperation, out OperationInfoBase selectedOperation)
24         {
25             selectedOperation = null;
26             bool isReceiveActivity = activity is ReceiveActivity;
27             try
28             {
29                 using (OperationPickerDialog operationPicker = new OperationPickerDialog(serviceProvider, isReceiveActivity))
30                 {
31                     Walker activityTreeWalker = new Walker();
32                     Type allowedActivityType = null;
33 
34                     if (isReceiveActivity)
35                     {
36                         allowedActivityType = typeof(ReceiveActivity);
37                     }
38                     else
39                     {
40                         allowedActivityType = typeof(SendActivity);
41                     }
42 
43                     activityTreeWalker.FoundActivity += delegate(Walker walker, WalkerEventArgs eventArgs)
44                     {
45                         Activity foundActivity = eventArgs.CurrentActivity;
46                         if (!(allowedActivityType.IsAssignableFrom(foundActivity.GetType())))
47                         {
48                             return;
49                         }
50 
51                         if (!foundActivity.Enabled)
52                         {
53                             return;
54                         }
55 
56                         if (foundActivity is ReceiveActivity)
57                         {
58                             ReceiveActivity reciveActivity = foundActivity as ReceiveActivity;
59                             if (reciveActivity.ServiceOperationInfo != null)
60                             {
61                                 operationPicker.AddServiceOperation(reciveActivity.ServiceOperationInfo, reciveActivity);
62                             }
63                         }
64                         if (foundActivity is SendActivity)
65                         {
66                             SendActivity sendActivity = foundActivity as SendActivity;
67                             if (sendActivity.ServiceOperationInfo != null)
68                             {
69                                 operationPicker.AddServiceOperation(sendActivity.ServiceOperationInfo, sendActivity);
70                             }
71                         }
72                     };
73                     activityTreeWalker.Walk(activity.RootActivity);
74                     OperationInfoBase currentServiceOperationInfo = currentOperation as OperationInfoBase;
75                     if (currentServiceOperationInfo != null)
76                     {
77                         operationPicker.SelectedOperation = currentServiceOperationInfo;
78                     }
79                     DialogResult dialogResult = operationPicker.ShowDialog();
80                     if ((operationPicker.SelectedOperation != null) && (dialogResult == DialogResult.OK) && !operationPicker.SelectedOperation.Equals(currentServiceOperationInfo))
81                     {
82                         selectedOperation = operationPicker.SelectedOperation.Clone();
83                         return true;
84                     }
85                 }
86             }
87             catch (Exception e)
88             {
89                 DesignerHelpers.ShowMessage(serviceProvider, e.Message, DR.GetString(DR.WorkflowDesignerTitle), MessageBoxButtons.OK,
90                     MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
91                 throw;
92             }
93 
94             return false;
95         }
EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)96         public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
97         {
98             if (context == null)
99             {
100                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
101             }
102             if (provider == null)
103             {
104                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("provider");
105             }
106 
107             OperationInfoBase pickedServiceOperation = null;
108             if (TryPickOperation(provider, (Activity) context.Instance, (OperationInfoBase) value, out pickedServiceOperation))
109             {
110                 return pickedServiceOperation;
111             }
112             else
113             {
114                 return base.EditValue(context, provider, value);
115             }
116 
117         }
118 
119 
GetEditStyle(ITypeDescriptorContext context)120         public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
121         {
122             return UITypeEditorEditStyle.Modal;
123         }
124     }
125 }
126