179 lines
6.5 KiB
C#
179 lines
6.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Drawing.Design;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms.Design;
|
|
using System.Windows.Forms;
|
|
using System.Threading;
|
|
using System.Collections;
|
|
|
|
namespace DevComponents.DotNetBar.Design
|
|
{
|
|
public class DataMembersSelector : UITypeEditor
|
|
{
|
|
#region Constructor
|
|
private CheckedListBoxSelector _ListSelector;
|
|
private BindingContext _BindingContext;
|
|
/// <summary>
|
|
/// Initializes a new instance of the DataMembersSelector class.
|
|
/// </summary>
|
|
public DataMembersSelector()
|
|
{
|
|
_ListSelector = new CheckedListBoxSelector();
|
|
_BindingContext = new BindingContext();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Implementation
|
|
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
|
|
{
|
|
if (context != null
|
|
&& context.Instance != null
|
|
&& provider != null)
|
|
{
|
|
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
|
|
if (edSvc != null)
|
|
{
|
|
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(context.Instance)["DataSource"];
|
|
if (descriptor == null)
|
|
{
|
|
return value;
|
|
}
|
|
object dataSource = descriptor.GetValue(context.Instance);
|
|
LoadDataMembers(_ListSelector, dataSource, value);
|
|
|
|
edSvc.DropDownControl(_ListSelector);
|
|
|
|
string returnValue = "";
|
|
foreach (string item in _ListSelector.ListBox.CheckedItems)
|
|
{
|
|
if (returnValue.Length > 0) returnValue += ",";
|
|
returnValue += item;
|
|
}
|
|
return returnValue;
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
private bool IsSelected(string str,ref string[] selected)
|
|
{
|
|
string strl = str.ToLower();
|
|
for (int i = 0; i < selected.Length; i++)
|
|
{
|
|
string item = selected[i];
|
|
if (item.Trim().ToLower() == strl)
|
|
{
|
|
selected[i] = str;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
private void LoadDataMembers(CheckedListBoxSelector listSelector, object dataSource, object value)
|
|
{
|
|
listSelector.ListBox.Items.Clear();
|
|
string v = value as string;
|
|
if (v == null) v = "";
|
|
string[] selected = v.Split(',');
|
|
string dataMember = string.Empty;
|
|
|
|
if (dataSource is Type)
|
|
{
|
|
try
|
|
{
|
|
BindingSource source = new BindingSource();
|
|
source.DataSource = dataSource;
|
|
dataSource = source.List;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
if (IsCriticalException(exception))
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
if (this.IsBindableDataSource(dataSource))
|
|
{
|
|
PropertyDescriptorCollection properties = GetItemProperties(dataSource, string.Empty);
|
|
if (properties == null)
|
|
return;
|
|
for (int i = 0; i < properties.Count; i++)
|
|
{
|
|
PropertyDescriptor property = properties[i];
|
|
if (this.IsBindableDataMember(property))
|
|
{
|
|
string str = string.IsNullOrEmpty(dataMember) ? property.Name : (dataMember + "." + property.Name);
|
|
_ListSelector.ListBox.Items.Add(str, IsSelected(str,ref selected));
|
|
}
|
|
}
|
|
if (selected.Length > 1)
|
|
{
|
|
for (int i = 0; i < selected.Length; i++)
|
|
{
|
|
string s1 = selected[i];
|
|
int i1 = _ListSelector.ListBox.Items.IndexOf(s1);
|
|
_ListSelector.ListBox.Items.RemoveAt(i1);
|
|
_ListSelector.ListBox.Items.Insert(i, s1);
|
|
_ListSelector.ListBox.SetItemChecked(i, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool IsBindableDataMember(PropertyDescriptor property)
|
|
{
|
|
if (!typeof(byte[]).IsAssignableFrom(property.PropertyType))
|
|
{
|
|
ListBindableAttribute attribute = (ListBindableAttribute)property.Attributes[typeof(ListBindableAttribute)];
|
|
if ((attribute != null) && !attribute.ListBindable)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
private PropertyDescriptorCollection GetItemProperties(object dataSource, string dataMember)
|
|
{
|
|
CurrencyManager manager = (CurrencyManager)_BindingContext[dataSource, dataMember];
|
|
if (manager != null)
|
|
{
|
|
return manager.GetItemProperties();
|
|
}
|
|
return null;
|
|
}
|
|
private bool IsBindableDataSource(object dataSource)
|
|
{
|
|
if ((!(dataSource is IListSource) && !(dataSource is IList)) && !(dataSource is Array))
|
|
{
|
|
return false;
|
|
}
|
|
ListBindableAttribute attribute = (ListBindableAttribute)TypeDescriptor.GetAttributes(dataSource)[typeof(ListBindableAttribute)];
|
|
if ((attribute != null) && !attribute.ListBindable)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
private static bool IsCriticalException(Exception ex)
|
|
{
|
|
return (((((ex is NullReferenceException) || (ex is StackOverflowException)) || ((ex is OutOfMemoryException) ||
|
|
(ex is ThreadAbortException))) || ((ex is ExecutionEngineException) ||
|
|
(ex is IndexOutOfRangeException))) || (ex is AccessViolationException));
|
|
}
|
|
|
|
|
|
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
|
|
{
|
|
return UITypeEditorEditStyle.DropDown;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|