diff Source/Web/UI/WebObjectBinder.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Web/UI/WebObjectBinder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,251 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Design;
+using System.Web.Compilation;
+using System.Web.UI;
+
+using BLToolkit.ComponentModel;
+using BLToolkit.ComponentModel.Design;
+using BLToolkit.EditableObjects;
+
+namespace BLToolkit.Web.UI
+{
+	[DefaultProperty("TypeName")]
+	[ToolboxBitmap(typeof(WebObjectBinder))]
+#if !FW4
+	[Designer(typeof(BLToolkit.Web.UI.Design.WebObjectBinderDesigner))]
+#endif
+	[PersistChildren(false)]
+	[ParseChildren(true)]
+	[Description("BLToolkit Web Object Binder")]
+	[DisplayName("Object Binder")]
+	public class WebObjectBinder : DataSourceControl, IListSource
+	{
+		#region Constructors
+
+		public WebObjectBinder()
+		{
+			_objectBinder.ListChanged += _objectBinder_ListChanged;
+		}
+
+		#endregion
+
+		#region Public Members
+
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[Editor(typeof(TypeNameEditor), typeof(UITypeEditor))]
+		public string TypeName
+		{
+			get
+			{
+				Type type = _objectBinder.ItemType;
+				return type == null ? "(none)" : type.FullName;
+			}
+			set
+			{
+				_objectBinder.ItemType = string.IsNullOrEmpty(value) || value == "(none)"?
+					null: BuildManager.GetType(value, false, true);
+			}
+		}
+
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[Editor(typeof(ObjectViewTypeNameEditor), typeof(UITypeEditor))]
+		public string ObjectViewTypeName
+		{
+			get
+			{
+				Type type = _objectBinder.ObjectViewType;
+				return type == null ? "(none)" : type.FullName;
+			}
+			set
+			{
+				_objectBinder.ObjectViewType = string.IsNullOrEmpty(value) || value == "(none)"?
+					null: BuildManager.GetType(value, false, true);
+			}
+		}
+
+		[Browsable(false)]
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+		public object Object
+		{
+			get { return _objectBinder.Object;  }
+			set { _objectBinder.Object = value; }
+		}
+
+		[Browsable(false)]
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+		public IList List
+		{
+			get { return _objectBinder.List;  }
+			set { _objectBinder.List = value; }
+		}
+
+		#endregion
+
+		#region Protected members
+
+		internal ObjectBinder _objectBinder = new ObjectBinder();
+
+		private void _objectBinder_ListChanged(object sender, ListChangedEventArgs e)
+		{
+			switch (e.ListChangedType)
+			{
+				case ListChangedType.PropertyDescriptorAdded:
+				case ListChangedType.PropertyDescriptorChanged:
+				case ListChangedType.PropertyDescriptorDeleted:
+					RaiseDataSourceChangedEvent(e);
+					break;
+			}
+		}
+
+		public override void Dispose()
+		{
+			_objectBinder.Dispose();
+
+			base.Dispose();
+		}
+
+		#endregion
+
+		#region IListSource Members
+
+		bool IListSource.ContainsListCollection
+		{
+			get { return false; }
+		}
+
+		IList IListSource.GetList()
+		{
+			return _objectBinder.List;
+		}
+
+		#endregion
+
+		#region IDataSource Members
+
+		private ObjectDataSourceView _view;
+
+		protected override DataSourceView GetView(string viewName)
+		{
+			if (_view == null)
+				_view = new ObjectDataSourceView(this, "DefaultView");
+
+			return _view;
+		}
+
+		protected override ICollection GetViewNames()
+		{
+			return new string[] { "DefaultView" };
+		}
+
+		#endregion
+
+		#region ObjectDataSourceView
+
+		class ObjectDataSourceView : DataSourceView
+		{
+			public ObjectDataSourceView(WebObjectBinder owner, string viewName)
+				: base(owner, viewName)
+			{
+				_owner = owner;
+			}
+
+			readonly WebObjectBinder _owner;
+
+			protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
+			{
+				return new ObjectEnumerator(_owner._objectBinder, arguments);
+			}
+
+			public override bool CanDelete { get { return _owner._objectBinder.AllowRemove; } }
+			public override bool CanInsert { get { return _owner._objectBinder.AllowNew;    } }
+			public override bool CanUpdate { get { return _owner._objectBinder.AllowEdit;   } }
+			public override bool CanPage   { get { return true;                             } }
+			public override bool CanSort   { get { return true;                             } }
+			public override bool CanRetrieveTotalRowCount { get { return true; } }
+		}
+
+		#endregion
+
+		#region ObjectEnumerator
+
+		class ObjectEnumerator : ICollection
+		{
+			public ObjectEnumerator(ObjectBinder objectBinder, DataSourceSelectArguments arguments)
+			{
+				_objectBinder = objectBinder;
+				_arguments    = arguments;
+			}
+
+			private readonly ObjectBinder              _objectBinder;
+			private readonly DataSourceSelectArguments _arguments;
+
+			#region ICollection Members
+
+			public void CopyTo(Array array, int index)
+			{
+				_objectBinder.List.CopyTo(array, index);
+			}
+
+			public int Count
+			{
+				get { return _objectBinder.List.Count; }
+			}
+
+			public bool IsSynchronized
+			{
+				get { return _objectBinder.List.IsSynchronized; }
+			}
+
+			public object SyncRoot
+			{
+				get { return _objectBinder.List.SyncRoot; }
+			}
+
+			#endregion
+
+			#region IEnumerable Members
+
+			public IEnumerator GetEnumerator()
+			{
+				_arguments.AddSupportedCapabilities(DataSourceCapabilities.Page);
+				_arguments.AddSupportedCapabilities(DataSourceCapabilities.Sort);
+				_arguments.AddSupportedCapabilities(DataSourceCapabilities.RetrieveTotalRowCount);
+
+				EditableArrayList list = (EditableArrayList)_objectBinder.List;
+
+				_arguments.TotalRowCount = list.Count;
+
+				if (!string.IsNullOrEmpty(_arguments.SortExpression))
+				{
+					list = new EditableArrayList(list.ItemType, list.Count);
+					list.AddRange(_objectBinder.List);
+					list.SortEx(_arguments.SortExpression);
+				}
+
+				int start = _arguments.StartRowIndex >= 0? _arguments.StartRowIndex: 0;
+				int count = _arguments.MaximumRows    > 0?
+					Math.Min(_arguments.MaximumRows, list.Count): list.Count;
+
+				for (int i = 0; i < count; i++)
+				{
+					object o = list[i + start];
+
+					yield return o is ICustomTypeDescriptor? o: new ObjectHolder(o, _objectBinder);
+				}
+			}
+
+			#endregion
+		}
+
+		#endregion
+	}
+}