0
|
1 using System;
|
|
2 using System.Collections;
|
|
3 using System.ComponentModel;
|
|
4 using System.Drawing;
|
|
5 using System.Drawing.Design;
|
|
6 using System.Web.Compilation;
|
|
7 using System.Web.UI;
|
|
8
|
|
9 using BLToolkit.ComponentModel;
|
|
10 using BLToolkit.ComponentModel.Design;
|
|
11 using BLToolkit.EditableObjects;
|
|
12
|
|
13 namespace BLToolkit.Web.UI
|
|
14 {
|
|
15 [DefaultProperty("TypeName")]
|
|
16 [ToolboxBitmap(typeof(WebObjectBinder))]
|
|
17 #if !FW4
|
|
18 [Designer(typeof(BLToolkit.Web.UI.Design.WebObjectBinderDesigner))]
|
|
19 #endif
|
|
20 [PersistChildren(false)]
|
|
21 [ParseChildren(true)]
|
|
22 [Description("BLToolkit Web Object Binder")]
|
|
23 [DisplayName("Object Binder")]
|
|
24 public class WebObjectBinder : DataSourceControl, IListSource
|
|
25 {
|
|
26 #region Constructors
|
|
27
|
|
28 public WebObjectBinder()
|
|
29 {
|
|
30 _objectBinder.ListChanged += _objectBinder_ListChanged;
|
|
31 }
|
|
32
|
|
33 #endregion
|
|
34
|
|
35 #region Public Members
|
|
36
|
|
37 [RefreshProperties(RefreshProperties.Repaint)]
|
|
38 [DefaultValue(null)]
|
|
39 [Category("Data")]
|
|
40 [Editor(typeof(TypeNameEditor), typeof(UITypeEditor))]
|
|
41 public string TypeName
|
|
42 {
|
|
43 get
|
|
44 {
|
|
45 Type type = _objectBinder.ItemType;
|
|
46 return type == null ? "(none)" : type.FullName;
|
|
47 }
|
|
48 set
|
|
49 {
|
|
50 _objectBinder.ItemType = string.IsNullOrEmpty(value) || value == "(none)"?
|
|
51 null: BuildManager.GetType(value, false, true);
|
|
52 }
|
|
53 }
|
|
54
|
|
55 [RefreshProperties(RefreshProperties.Repaint)]
|
|
56 [DefaultValue(null)]
|
|
57 [Category("Data")]
|
|
58 [Editor(typeof(ObjectViewTypeNameEditor), typeof(UITypeEditor))]
|
|
59 public string ObjectViewTypeName
|
|
60 {
|
|
61 get
|
|
62 {
|
|
63 Type type = _objectBinder.ObjectViewType;
|
|
64 return type == null ? "(none)" : type.FullName;
|
|
65 }
|
|
66 set
|
|
67 {
|
|
68 _objectBinder.ObjectViewType = string.IsNullOrEmpty(value) || value == "(none)"?
|
|
69 null: BuildManager.GetType(value, false, true);
|
|
70 }
|
|
71 }
|
|
72
|
|
73 [Browsable(false)]
|
|
74 [RefreshProperties(RefreshProperties.Repaint)]
|
|
75 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
76 public object Object
|
|
77 {
|
|
78 get { return _objectBinder.Object; }
|
|
79 set { _objectBinder.Object = value; }
|
|
80 }
|
|
81
|
|
82 [Browsable(false)]
|
|
83 [RefreshProperties(RefreshProperties.Repaint)]
|
|
84 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
85 public IList List
|
|
86 {
|
|
87 get { return _objectBinder.List; }
|
|
88 set { _objectBinder.List = value; }
|
|
89 }
|
|
90
|
|
91 #endregion
|
|
92
|
|
93 #region Protected members
|
|
94
|
|
95 internal ObjectBinder _objectBinder = new ObjectBinder();
|
|
96
|
|
97 private void _objectBinder_ListChanged(object sender, ListChangedEventArgs e)
|
|
98 {
|
|
99 switch (e.ListChangedType)
|
|
100 {
|
|
101 case ListChangedType.PropertyDescriptorAdded:
|
|
102 case ListChangedType.PropertyDescriptorChanged:
|
|
103 case ListChangedType.PropertyDescriptorDeleted:
|
|
104 RaiseDataSourceChangedEvent(e);
|
|
105 break;
|
|
106 }
|
|
107 }
|
|
108
|
|
109 public override void Dispose()
|
|
110 {
|
|
111 _objectBinder.Dispose();
|
|
112
|
|
113 base.Dispose();
|
|
114 }
|
|
115
|
|
116 #endregion
|
|
117
|
|
118 #region IListSource Members
|
|
119
|
|
120 bool IListSource.ContainsListCollection
|
|
121 {
|
|
122 get { return false; }
|
|
123 }
|
|
124
|
|
125 IList IListSource.GetList()
|
|
126 {
|
|
127 return _objectBinder.List;
|
|
128 }
|
|
129
|
|
130 #endregion
|
|
131
|
|
132 #region IDataSource Members
|
|
133
|
|
134 private ObjectDataSourceView _view;
|
|
135
|
|
136 protected override DataSourceView GetView(string viewName)
|
|
137 {
|
|
138 if (_view == null)
|
|
139 _view = new ObjectDataSourceView(this, "DefaultView");
|
|
140
|
|
141 return _view;
|
|
142 }
|
|
143
|
|
144 protected override ICollection GetViewNames()
|
|
145 {
|
|
146 return new string[] { "DefaultView" };
|
|
147 }
|
|
148
|
|
149 #endregion
|
|
150
|
|
151 #region ObjectDataSourceView
|
|
152
|
|
153 class ObjectDataSourceView : DataSourceView
|
|
154 {
|
|
155 public ObjectDataSourceView(WebObjectBinder owner, string viewName)
|
|
156 : base(owner, viewName)
|
|
157 {
|
|
158 _owner = owner;
|
|
159 }
|
|
160
|
|
161 readonly WebObjectBinder _owner;
|
|
162
|
|
163 protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
|
|
164 {
|
|
165 return new ObjectEnumerator(_owner._objectBinder, arguments);
|
|
166 }
|
|
167
|
|
168 public override bool CanDelete { get { return _owner._objectBinder.AllowRemove; } }
|
|
169 public override bool CanInsert { get { return _owner._objectBinder.AllowNew; } }
|
|
170 public override bool CanUpdate { get { return _owner._objectBinder.AllowEdit; } }
|
|
171 public override bool CanPage { get { return true; } }
|
|
172 public override bool CanSort { get { return true; } }
|
|
173 public override bool CanRetrieveTotalRowCount { get { return true; } }
|
|
174 }
|
|
175
|
|
176 #endregion
|
|
177
|
|
178 #region ObjectEnumerator
|
|
179
|
|
180 class ObjectEnumerator : ICollection
|
|
181 {
|
|
182 public ObjectEnumerator(ObjectBinder objectBinder, DataSourceSelectArguments arguments)
|
|
183 {
|
|
184 _objectBinder = objectBinder;
|
|
185 _arguments = arguments;
|
|
186 }
|
|
187
|
|
188 private readonly ObjectBinder _objectBinder;
|
|
189 private readonly DataSourceSelectArguments _arguments;
|
|
190
|
|
191 #region ICollection Members
|
|
192
|
|
193 public void CopyTo(Array array, int index)
|
|
194 {
|
|
195 _objectBinder.List.CopyTo(array, index);
|
|
196 }
|
|
197
|
|
198 public int Count
|
|
199 {
|
|
200 get { return _objectBinder.List.Count; }
|
|
201 }
|
|
202
|
|
203 public bool IsSynchronized
|
|
204 {
|
|
205 get { return _objectBinder.List.IsSynchronized; }
|
|
206 }
|
|
207
|
|
208 public object SyncRoot
|
|
209 {
|
|
210 get { return _objectBinder.List.SyncRoot; }
|
|
211 }
|
|
212
|
|
213 #endregion
|
|
214
|
|
215 #region IEnumerable Members
|
|
216
|
|
217 public IEnumerator GetEnumerator()
|
|
218 {
|
|
219 _arguments.AddSupportedCapabilities(DataSourceCapabilities.Page);
|
|
220 _arguments.AddSupportedCapabilities(DataSourceCapabilities.Sort);
|
|
221 _arguments.AddSupportedCapabilities(DataSourceCapabilities.RetrieveTotalRowCount);
|
|
222
|
|
223 EditableArrayList list = (EditableArrayList)_objectBinder.List;
|
|
224
|
|
225 _arguments.TotalRowCount = list.Count;
|
|
226
|
|
227 if (!string.IsNullOrEmpty(_arguments.SortExpression))
|
|
228 {
|
|
229 list = new EditableArrayList(list.ItemType, list.Count);
|
|
230 list.AddRange(_objectBinder.List);
|
|
231 list.SortEx(_arguments.SortExpression);
|
|
232 }
|
|
233
|
|
234 int start = _arguments.StartRowIndex >= 0? _arguments.StartRowIndex: 0;
|
|
235 int count = _arguments.MaximumRows > 0?
|
|
236 Math.Min(_arguments.MaximumRows, list.Count): list.Count;
|
|
237
|
|
238 for (int i = 0; i < count; i++)
|
|
239 {
|
|
240 object o = list[i + start];
|
|
241
|
|
242 yield return o is ICustomTypeDescriptor? o: new ObjectHolder(o, _objectBinder);
|
|
243 }
|
|
244 }
|
|
245
|
|
246 #endregion
|
|
247 }
|
|
248
|
|
249 #endregion
|
|
250 }
|
|
251 }
|