|
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.Design;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Runtime.Serialization;
using System.Workflow.ComponentModel.Compiler;
using System.ComponentModel.Design.Serialization;
using System.Collections.Specialized;
using System.Xml;
using System.Web.Services.Protocols;
using System.Windows.Forms.Design;
using System.Security.Permissions;
using System.Workflow.Activities.Common;
#region Class InvokeWebServiceToolboxItem
[Serializable]
internal sealed class InvokeWebServiceToolboxItem : ActivityToolboxItem
{
public InvokeWebServiceToolboxItem(Type type)
: base(type)
{
}
private InvokeWebServiceToolboxItem(SerializationInfo info, StreamingContext context)
{
base.Deserialize(info, context);
}
public override IComponent[] CreateComponentsWithUI(IDesignerHost host)
{
Uri url = null;
Type proxyClass = null;
IExtendedUIService extUIService = host.GetService(typeof(IExtendedUIService)) as IExtendedUIService;
if (extUIService != null)
extUIService.AddWebReference(out url, out proxyClass);
IComponent[] components = base.CreateComponentsWithUI(host);
if (components.GetLength(0) > 0)
{
InvokeWebServiceActivity webService = components[0] as InvokeWebServiceActivity;
if (webService != null)
webService.ProxyClass = proxyClass;
}
return components;
}
}
#endregion
#region Class InvokeWebServiceDesigner
[ActivityDesignerTheme(typeof(InvokeWebServiceDesignerTheme))]
internal sealed class InvokeWebServiceDesigner : ActivityDesigner
{
#region Members, Constructor and Destructor
private string url = null;
#endregion
#region Properties and Methods
protected override void PreFilterProperties(IDictionary properties)
{
base.PreFilterProperties(properties);
if (properties["URL"] == null)
properties["URL"] = new WebServiceUrlPropertyDescriptor(Activity.Site, TypeDescriptor.CreateProperty(this.GetType(), "URL", typeof(string), DesignOnlyAttribute.Yes, MergablePropertyAttribute.No));
//
ITypeProvider typeProvider = (ITypeProvider)GetService(typeof(ITypeProvider));
if (typeProvider == null)
throw new InvalidOperationException(SR.GetString(SR.General_MissingService, typeof(ITypeProvider).FullName));
InvokeWebServiceActivity invokeWebService = Activity as InvokeWebServiceActivity;
invokeWebService.GetParameterPropertyDescriptors(properties);
}
[SRCategory(SR.Activity)]
[SRDescription(SR.URLDescr)]
[Editor(typeof(WebServicePickerEditor), typeof(UITypeEditor))]
[RefreshProperties(RefreshProperties.All)]
public string URL
{
get
{
if (this.url == null)
{
InvokeWebServiceActivity invokeWebServiceDecl = Activity as InvokeWebServiceActivity;
IExtendedUIService extUIService = (IExtendedUIService)Activity.Site.GetService(typeof(IExtendedUIService));
if (extUIService != null && invokeWebServiceDecl.ProxyClass != null)
{
Uri uri = extUIService.GetUrlForProxyClass(invokeWebServiceDecl.ProxyClass);
this.url = (uri != null) ? uri.ToString() : string.Empty;
}
}
return this.url;
}
set
{
if (this.url != value)
{
this.url = value;
IExtendedUIService extUIService = (IExtendedUIService)Activity.Site.GetService(typeof(IExtendedUIService));
if (extUIService == null)
throw new InvalidOperationException(SR.GetString(SR.General_MissingService, typeof(IExtendedUIService).FullName));
//Create the designer transaction
DesignerTransaction trans = null;
IDesignerHost host = Activity.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (host != null)
trans = host.CreateTransaction(SR.GetString(SR.ChangingVariable));
try
{
PropertyDescriptorUtils.SetPropertyValue(Activity.Site, TypeDescriptor.GetProperties(Activity)["ProxyClass"], Activity, string.IsNullOrEmpty(this.url) ? null : extUIService.GetProxyClassForUrl(new Uri(this.url)));
if (trans != null)
trans.Commit();
}
finally
{
if (trans != null)
((IDisposable)trans).Dispose();
}
}
}
}
protected override void OnActivityChanged(ActivityChangedEventArgs e)
{
base.OnActivityChanged(e);
if (e.Member != null)
{
if (e.Member.Name == "ProxyClass")
{
if (Activity.Site != null)
{
InvokeWebServiceActivity invokeWebServiceDecl = e.Activity as InvokeWebServiceActivity;
PropertyDescriptorUtils.SetPropertyValue(Activity.Site, TypeDescriptor.GetProperties(Activity)["MethodName"], Activity, String.Empty);
IExtendedUIService extUIService = (IExtendedUIService)Activity.Site.GetService(typeof(IExtendedUIService));
if (extUIService == null)
throw new Exception(SR.GetString(SR.General_MissingService, typeof(IExtendedUIService).FullName));
if (invokeWebServiceDecl.ProxyClass == null)
{
this.url = null;
}
else
{
Uri uri = extUIService.GetUrlForProxyClass(invokeWebServiceDecl.ProxyClass);
this.url = (uri != null) ? uri.ToString() : string.Empty;
}
}
}
if ((e.Member.Name == "MethodName" || e.Member.Name == "TargetWorkflow")
&& e.Activity is InvokeWebServiceActivity)
(e.Activity as InvokeWebServiceActivity).ParameterBindings.Clear();
if (e.Member.Name == "ProxyClass" || e.Member.Name == "MethodName")
TypeDescriptor.Refresh(e.Activity);
}
}
#endregion
}
#endregion
#region InvokeWebServiceDesignerTheme
internal sealed class InvokeWebServiceDesignerTheme : ActivityDesignerTheme
{
public InvokeWebServiceDesignerTheme(WorkflowTheme theme)
: base(theme)
{
this.ForeColor = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
this.BorderColor = Color.FromArgb(0xFF, 0x94, 0xB6, 0xF7);
this.BorderStyle = DashStyle.Solid;
this.BackColorStart = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
this.BackColorEnd = Color.FromArgb(0xFF, 0xA5, 0xC3, 0xF7);
this.BackgroundStyle = LinearGradientMode.Horizontal;
}
}
#endregion
#region Class WebServiceUrlPropertyDescriptor
internal sealed class WebServiceUrlPropertyDescriptor : DynamicPropertyDescriptor
{
internal WebServiceUrlPropertyDescriptor(IServiceProvider serviceProvider, PropertyDescriptor pd)
: base(serviceProvider, pd)
{
}
public override bool IsReadOnly
{
get
{
return true;
}
}
}
#endregion
internal sealed class WebServicePickerEditor : UITypeEditor
{
private IWindowsFormsEditorService editorService;
public WebServicePickerEditor()
{
}
public override object EditValue(ITypeDescriptorContext typeDescriptorContext, IServiceProvider serviceProvider, object o)
{
object returnVal = o;
this.editorService = (IWindowsFormsEditorService)serviceProvider.GetService(typeof(IWindowsFormsEditorService));
IExtendedUIService extUIService = (IExtendedUIService)serviceProvider.GetService(typeof(IExtendedUIService));
if (editorService != null && extUIService != null)
{
Uri url = null;
Type proxyClass = null;
if (DialogResult.OK == extUIService.AddWebReference(out url, out proxyClass))
{
returnVal = (url != null) ? url.ToString() : string.Empty;
typeDescriptorContext.PropertyDescriptor.SetValue(typeDescriptorContext.Instance, returnVal as string);
}
}
return returnVal;
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext typeDescriptorContext)
{
return UITypeEditorEditStyle.Modal;
}
}
}
|