1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //----------------------------------------------------------------
4 namespace System.ServiceModel.Activities.Presentation
6 using System.Activities;
7 using System.Activities.Presentation;
8 using System.Activities.Presentation.Model;
9 using System.Activities.Presentation.View;
10 using System.Collections;
11 using System.Collections.ObjectModel;
12 using System.Collections.Specialized;
15 using System.Windows.Input;
16 using System.Globalization;
17 using System.Collections.Generic;
19 internal partial class CorrelationInitializerDesigner
21 DataGridHelper correlationInitializerDGHelper;
23 const string CorrelationInitializersKey = "CorrelationInitializers";
25 public static readonly DependencyProperty ActivityProperty = DependencyProperty.Register(
28 typeof(CorrelationInitializerDesigner),
29 new UIPropertyMetadata(OnActivityChanged));
31 static readonly ICommand AddNewInitializerCommand = new RoutedCommand();
33 public CorrelationInitializerDesigner()
35 this.InitializeComponent();
38 public ModelItem Activity
40 get { return (ModelItem)GetValue(ActivityProperty); }
41 set { SetValue(ActivityProperty, value); }
44 ModelItemCollection CorrelationInitializers
46 get { return this.Activity.Properties[CorrelationInitializersKey].Collection; }
49 protected override void OnInitialized(EventArgs args)
51 base.OnInitialized(args);
53 this.CommandBindings.Add(new CommandBinding(AddNewInitializerCommand, this.OnAddNewInitializerExecuted));
55 //create data grid helper
56 this.correlationInitializerDGHelper = new DataGridHelper(this.correlationInitializers, this);
57 this.correlationInitializerDGHelper.ShowValidationErrorAsToolTip = true;
58 this.correlationInitializerDGHelper.AddNewRowContent = (string)this.FindResource("addNewInitializer");
59 this.correlationInitializerDGHelper.AddNewRowCommand = CorrelationInitializerDesigner.AddNewInitializerCommand;
62 void OnAddNewInitializerExecuted(object sender, ExecutedRoutedEventArgs e)
64 var initializer = (CanUseQueryCorrelationInitializer(this.Activity) ?
65 (CorrelationInitializer)new QueryCorrelationInitializer() : (CorrelationInitializer)new ContextCorrelationInitializer());
66 var result = this.CorrelationInitializers.Add(initializer);
67 var wrapper = new CorrelationInitializerEntry(result);
68 this.correlationInitializerDGHelper.Source<IList>().Add(wrapper);
69 this.correlationInitializerDGHelper.BeginRowEdit(wrapper);
72 static bool CanUseQueryCorrelationInitializer(ModelItem activity)
77 if (activity.IsAssignableFrom<Receive>() || activity.IsAssignableFrom<Send>())
79 ModelItem serializationOption;
80 activity.TryGetPropertyValue(out serializationOption, "SerializerOption");
81 result = SerializerOption.XmlSerializer != (SerializerOption)serializationOption.GetCurrentValue();
83 else if (activity.IsAssignableFrom<SendReply>() || activity.IsAssignableFrom<ReceiveReply>())
86 activity.TryGetPropertyValue(out request, "Request");
87 result = CanUseQueryCorrelationInitializer(request);
93 void OnDataCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
97 case NotifyCollectionChangedAction.Remove:
98 foreach (CorrelationInitializerEntry entry in e.OldItems)
100 this.CorrelationInitializers.Remove(entry.ReflectedObject);
108 internal void CleanupObjectMap()
112 void OnActivityChanged()
114 if (null != this.Activity)
116 var source = new ObservableCollection<CorrelationInitializerEntry>();
118 foreach (var entry in this.CorrelationInitializers)
120 var wrapper = new CorrelationInitializerEntry(entry);
124 this.correlationInitializers.ItemsSource = source;
125 source.CollectionChanged += this.OnDataCollectionChanged;
129 static void OnActivityChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
131 var activity = e.NewValue as ModelItem;
132 if (null != activity && !activity.IsMessagingActivity())
134 throw FxTrace.Exception.AsError(new NotSupportedException(activity.ItemType.FullName));
136 ((CorrelationInitializerDesigner)sender).OnActivityChanged();
139 void OnEditingControlLoaded(object sender, RoutedEventArgs args)
141 DataGridHelper.OnEditingControlLoaded(sender, args);
144 void OnEditingControlUnloaded(object sender, RoutedEventArgs args)
146 DataGridHelper.OnEditingControlUnloaded(sender, args);
149 internal sealed class CorrelationInitializerEntry : DesignObjectWrapper
151 internal static readonly string HandleProperty = "CorrelationHandle";
152 internal static readonly string CorrelationTypeProperty = "CorrelationType";
153 internal static readonly string MessageQuerySetModelPropertyProperty = "MessageQuerySet";
155 static readonly string[] Properties = new string[] { HandleProperty, CorrelationTypeProperty, MessageQuerySetModelPropertyProperty };
157 #region Initialize type properties code
158 public static PropertyDescriptorData[] InitializeTypeProperties()
160 return new PropertyDescriptorData[]
162 new PropertyDescriptorData()
164 PropertyName = HandleProperty,
165 PropertyType = typeof(InArgument),
166 PropertySetter = (instance, newValue) =>
168 ((CorrelationInitializerEntry)instance).SetHandle(newValue);
170 PropertyGetter = (instance) => (((CorrelationInitializerEntry)instance).GetHandle()),
172 new PropertyDescriptorData()
174 PropertyName = CorrelationTypeProperty,
175 PropertyType = typeof(Type),
176 PropertyValidator = (instance, newValue, errors) => (((CorrelationInitializerEntry)instance).ValidateCorrelationType(newValue, errors)),
177 PropertySetter = (instance, newValue) =>
179 ((CorrelationInitializerEntry)instance).SetCorrelationType(newValue);
181 PropertyGetter = (instance) => (((CorrelationInitializerEntry)instance).GetCorrelationType()),
183 new PropertyDescriptorData()
185 PropertyName = MessageQuerySetModelPropertyProperty,
186 PropertyType = typeof(ModelProperty),
187 PropertyGetter = (instance) => (((CorrelationInitializerEntry)instance).GetMessageQuerySetModelProperty()),
194 public CorrelationInitializerEntry()
196 throw FxTrace.Exception.AsError(new NotSupportedException());
199 public CorrelationInitializerEntry(ModelItem initializer) : base(initializer)
203 protected override string AutomationId
205 get { return ((ModelItemCollection)this.ReflectedObject.Parent).IndexOf(this.ReflectedObject).ToString(CultureInfo.InvariantCulture); }
208 internal object GetHandle()
210 return this.ReflectedObject.Properties[HandleProperty].ComputedValue;
213 void SetHandle(object value)
215 InArgument handle = (InArgument)(value is ModelItem ? ((ModelItem)value).GetCurrentValue() : value);
216 this.ReflectedObject.Properties[HandleProperty].SetValue(handle);
219 internal Type GetCorrelationType()
221 return this.ReflectedObject.ItemType;
224 void SetCorrelationType(object value)
226 Type type = (Type)(value is ModelItem ? ((ModelItem)value).GetCurrentValue() : value);
227 var source = (ModelItemCollection)this.ReflectedObject.Parent;
228 int index = source.IndexOf(this.ReflectedObject);
229 var oldInitalizer = (CorrelationInitializer)this.ReflectedObject.GetCurrentValue();
230 var newInitializer = (CorrelationInitializer)Activator.CreateInstance(type);
231 newInitializer.CorrelationHandle = oldInitalizer.CorrelationHandle;
233 source.RemoveAt(index);
234 this.Initialize(source.Insert(index, newInitializer));
235 this.RaisePropertyChangedEvent(MessageQuerySetModelPropertyProperty);
238 bool ValidateCorrelationType(object value, List<string> errors)
240 Type type = (Type)(value is ModelItem ? ((ModelItem)value).GetCurrentValue() : value);
241 var activity = this.ReflectedObject.Parent.Parent;
242 if (typeof(QueryCorrelationInitializer).IsAssignableFrom(type) && !CorrelationInitializerDesigner.CanUseQueryCorrelationInitializer(activity))
244 errors.Add(System.Activities.Core.Presentation.SR.CorrelationInitializerNotSupported);
246 return 0 == errors.Count;
249 internal ModelProperty GetMessageQuerySetModelProperty()
251 return this.ReflectedObject.Properties[MessageQuerySetModelPropertyProperty];