mirror of
https://github.com/openhardwaremonitor/openhardwaremonitor
synced 2025-08-22 09:57:20 +00:00
141 lines
3.3 KiB
C#
141 lines
3.3 KiB
C#
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
|
|
{
|
|
|
|
#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);
|
|
}
|
|
}
|
|
}
|