first commit
This commit is contained in:
@@ -0,0 +1,194 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Reflection;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Aga.Controls.Tree.NodeControls
|
||||
{
|
||||
public abstract class BindableControl : NodeControl
|
||||
{
|
||||
private struct MemberAdapter
|
||||
{
|
||||
private object _obj;
|
||||
private PropertyInfo _pi;
|
||||
private FieldInfo _fi;
|
||||
|
||||
public static readonly MemberAdapter Empty = new MemberAdapter();
|
||||
|
||||
public Type MemberType
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_pi != null)
|
||||
return _pi.PropertyType;
|
||||
else if (_fi != null)
|
||||
return _fi.FieldType;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public object Value
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_pi != null && _pi.CanRead)
|
||||
return _pi.GetValue(_obj, null);
|
||||
else if (_fi != null)
|
||||
return _fi.GetValue(_obj);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_pi != null && _pi.CanWrite)
|
||||
_pi.SetValue(_obj, value, null);
|
||||
else if (_fi != null)
|
||||
_fi.SetValue(_obj, value);
|
||||
}
|
||||
}
|
||||
|
||||
public MemberAdapter(object obj, PropertyInfo pi)
|
||||
{
|
||||
_obj = obj;
|
||||
_pi = pi;
|
||||
_fi = null;
|
||||
}
|
||||
|
||||
public MemberAdapter(object obj, FieldInfo fi)
|
||||
{
|
||||
_obj = obj;
|
||||
_fi = fi;
|
||||
_pi = null;
|
||||
}
|
||||
}
|
||||
|
||||
#region Properties
|
||||
|
||||
private bool _virtualMode = false;
|
||||
[DefaultValue(false), Category("Data")]
|
||||
public bool VirtualMode
|
||||
{
|
||||
get { return _virtualMode; }
|
||||
set { _virtualMode = value; }
|
||||
}
|
||||
|
||||
private string _propertyName = "";
|
||||
[DefaultValue(""), Category("Data")]
|
||||
public string DataPropertyName
|
||||
{
|
||||
get { return _propertyName; }
|
||||
set
|
||||
{
|
||||
if (_propertyName == null)
|
||||
_propertyName = string.Empty;
|
||||
_propertyName = value;
|
||||
}
|
||||
}
|
||||
|
||||
private bool _incrementalSearchEnabled = false;
|
||||
[DefaultValue(false)]
|
||||
public bool IncrementalSearchEnabled
|
||||
{
|
||||
get { return _incrementalSearchEnabled; }
|
||||
set { _incrementalSearchEnabled = value; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public virtual object GetValue(TreeNodeAdv node)
|
||||
{
|
||||
if (VirtualMode)
|
||||
{
|
||||
NodeControlValueEventArgs args = new NodeControlValueEventArgs(node);
|
||||
OnValueNeeded(args);
|
||||
return args.Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
return GetMemberAdapter(node).Value;
|
||||
}
|
||||
catch (TargetInvocationException ex)
|
||||
{
|
||||
if (ex.InnerException != null)
|
||||
throw new ArgumentException(ex.InnerException.Message, ex.InnerException);
|
||||
else
|
||||
throw new ArgumentException(ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void SetValue(TreeNodeAdv node, object value)
|
||||
{
|
||||
if (VirtualMode)
|
||||
{
|
||||
NodeControlValueEventArgs args = new NodeControlValueEventArgs(node);
|
||||
args.Value = value;
|
||||
OnValuePushed(args);
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
MemberAdapter ma = GetMemberAdapter(node);
|
||||
ma.Value = value;
|
||||
}
|
||||
catch (TargetInvocationException ex)
|
||||
{
|
||||
if (ex.InnerException != null)
|
||||
throw new ArgumentException(ex.InnerException.Message, ex.InnerException);
|
||||
else
|
||||
throw new ArgumentException(ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Type GetPropertyType(TreeNodeAdv node)
|
||||
{
|
||||
return GetMemberAdapter(node).MemberType;
|
||||
}
|
||||
|
||||
private MemberAdapter GetMemberAdapter(TreeNodeAdv node)
|
||||
{
|
||||
if (node.Tag != null && !string.IsNullOrEmpty(DataPropertyName))
|
||||
{
|
||||
Type type = node.Tag.GetType();
|
||||
PropertyInfo pi = type.GetProperty(DataPropertyName);
|
||||
if (pi != null)
|
||||
return new MemberAdapter(node.Tag, pi);
|
||||
else
|
||||
{
|
||||
FieldInfo fi = type.GetField(DataPropertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||
if (fi != null)
|
||||
return new MemberAdapter(node.Tag, fi);
|
||||
}
|
||||
}
|
||||
return MemberAdapter.Empty;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
if (string.IsNullOrEmpty(DataPropertyName))
|
||||
return GetType().Name;
|
||||
else
|
||||
return string.Format("{0} ({1})", GetType().Name, DataPropertyName);
|
||||
}
|
||||
|
||||
public event EventHandler<NodeControlValueEventArgs> ValueNeeded;
|
||||
private void OnValueNeeded(NodeControlValueEventArgs args)
|
||||
{
|
||||
if (ValueNeeded != null)
|
||||
ValueNeeded(this, args);
|
||||
}
|
||||
|
||||
public event EventHandler<NodeControlValueEventArgs> ValuePushed;
|
||||
private void OnValuePushed(NodeControlValueEventArgs args)
|
||||
{
|
||||
if (ValuePushed != null)
|
||||
ValuePushed(this, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user