5e80f1f64ac7823cf9caadd4d372cd1234868b36
[mono.git] / mcs / class / referencesource / System.Activities.Presentation / System.Activities.Core.Presentation / System / ServiceModel / Activities / Presentation / ContentDialogViewModel.cs
1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //----------------------------------------------------------------
4
5 namespace System.ServiceModel.Activities.Presentation
6 {
7     using System.Activities.Presentation;
8     using System.Activities.Presentation.Hosting;
9     using System.Activities.Presentation.Model;
10     using System.Collections.ObjectModel;
11     using System.ComponentModel;
12
13     class ContentDialogViewModel<TMessage, TParameter> : INotifyPropertyChanged
14         where TMessage : new()
15         where TParameter : new()
16     {
17         EditingMode editingMode = EditingMode.Message;
18         ModelItem messageExpression;
19         Type declaredMessageType;
20
21         public ContentDialogViewModel(ModelItem modelItem)
22         {
23             this.ModelItem = modelItem;
24             InitializeMessageAndParameterData();
25         }
26
27         public event PropertyChangedEventHandler PropertyChanged;
28
29         public bool IsEditingEnabled
30         {
31             get
32             {
33                 return !this.Context.Items.GetValue<ReadOnlyState>().IsReadOnly;
34             }
35         }
36
37         public bool IsMessageChecked
38         {
39             get
40             {
41                 return this.editingMode == EditingMode.Message;
42             }
43             set
44             {
45                 if (value != this.IsMessageChecked)
46                 {
47                     this.editingMode = value ? EditingMode.Message : EditingMode.Parameter;
48                     OnModeChanged();
49                 }
50             }
51         }
52
53         public bool IsParameterChecked
54         {
55             get
56             {
57                 return this.editingMode == EditingMode.Parameter;
58             }
59             set
60             {
61                 if (value != this.IsParameterChecked)
62                 {
63                     this.editingMode = value ? EditingMode.Parameter : EditingMode.Message;
64                     OnModeChanged();
65                 }
66             }
67         }
68
69         public ModelItem ModelItem
70         {
71             get;
72             private set;
73         }
74
75         public EditingContext Context
76         {
77             get
78             {
79                 return this.ModelItem.GetEditingContext();
80             }
81         }
82
83         public ModelItem MessageExpression
84         {
85             get
86             {
87                 return this.messageExpression;
88             }
89             set
90             {
91                 this.messageExpression = value;
92                 if (this.PropertyChanged != null)
93                 {
94                     this.PropertyChanged(this, new PropertyChangedEventArgs("MessageExpression"));
95                 }
96             }
97         }
98
99         public Type DeclaredMessageType
100         {
101             get
102             {
103                 return this.declaredMessageType;
104             }
105             set
106             {
107                 this.declaredMessageType = value;
108                 if (this.PropertyChanged != null)
109                 {
110                     this.PropertyChanged(this, new PropertyChangedEventArgs("DeclaredMessageType"));
111                 }
112             }
113         }
114
115         public bool IsDictionary
116         {
117             get;
118             private set;
119         }
120
121         public Type UnderlyingArgumentType
122         {
123             get;
124             private set;
125         }
126
127         public ObservableCollection<DynamicArgumentWrapperObject> DynamicArguments
128         {
129             get;
130             set;
131         }
132
133         internal bool OnOk()
134         {
135             ModelProperty contentProperty = this.ModelItem.Properties["Content"];
136             if (this.editingMode == EditingMode.Parameter)
137             {
138                 contentProperty.SetValue(new TParameter());
139                 DynamicArgumentDesigner.WrapperCollectionToModelItem(this.DynamicArguments,
140                                         contentProperty.Value.Properties["Parameters"].Value,
141                                         this.IsDictionary, this.UnderlyingArgumentType);
142             }
143             else
144             {
145                 if (this.DeclaredMessageType == null && this.MessageExpression == null)
146                 {
147                     contentProperty.SetValue(null);
148                 }
149                 else
150                 {
151                     contentProperty.SetValue(new TMessage());
152                     contentProperty.Value.Properties["Message"].SetValue(this.MessageExpression);
153                     contentProperty.Value.Properties["DeclaredMessageType"].SetValue(this.DeclaredMessageType);
154                 }
155             }
156
157             return true;
158         }
159
160         void InitializeMessageAndParameterData()
161         {
162             ModelItem parameterModelItem;
163             ModelTreeManager modelTreeManager = (this.ModelItem as IModelTreeItem).ModelTreeManager;
164
165             ModelItem contentModelItem = this.ModelItem.Properties["Content"].Value;
166             if (contentModelItem == null)
167             {
168                 this.messageExpression = modelTreeManager.WrapAsModelItem(new TMessage()).Properties["Message"].Value;
169                 this.declaredMessageType = null;
170                 parameterModelItem = modelTreeManager.WrapAsModelItem(new TParameter()).Properties["Parameters"].Value;
171             }
172             else
173             {
174                 if (contentModelItem.ItemType == typeof(TMessage))
175                 {
176                     this.editingMode = EditingMode.Message;
177                     this.messageExpression = contentModelItem.Properties["Message"].Value;
178                     this.declaredMessageType = (Type)contentModelItem.Properties["DeclaredMessageType"].ComputedValue;
179                     parameterModelItem = modelTreeManager.WrapAsModelItem(new TParameter()).Properties["Parameters"].Value;
180                 }
181                 else
182                 {
183                     this.editingMode = EditingMode.Parameter;
184                     this.messageExpression = modelTreeManager.WrapAsModelItem(new TMessage()).Properties["Message"].Value;
185                     this.declaredMessageType = null;
186                     parameterModelItem = contentModelItem.Properties["Parameters"].Value;
187                 }
188             }
189
190             bool isDictionary;
191             Type underlyingArgumentType;
192             this.DynamicArguments = DynamicArgumentDesigner.ModelItemToWrapperCollection(
193                                                 parameterModelItem,
194                                                 out isDictionary,
195                                                 out underlyingArgumentType);
196
197             this.IsDictionary = isDictionary;
198             this.UnderlyingArgumentType = underlyingArgumentType;
199         }
200
201         void OnModeChanged()
202         {
203             if (this.PropertyChanged != null)
204             {
205                 this.PropertyChanged(this, new PropertyChangedEventArgs("IsMessageChecked"));
206                 this.PropertyChanged(this, new PropertyChangedEventArgs("IsParameterChecked"));
207             }
208         }
209
210         enum EditingMode
211         {
212             Message,
213             Parameter
214         }
215     }
216 }