using OpenTap;
using OpenTap.Addin.Annotation;
using OpenTapEditor.Entity;
using OpenTapEditor.Provider;
using OpenTapEditor.UI;
using Panuon.WPF.UI;
using System.ComponentModel;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Xml.Serialization;
using UILib.DpUtil;
namespace OpenTapEditor
{
public class UISettingsProvider
{
private static ITypeData resourceTypeData = TypeData.FromType(typeof(IResource));
///
/// 获取需要渲染的属性
///
///
///
public static Dictionary GetRenderProperty(object obj)
{
var res = new Dictionary();
var properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var property in properties)
{
if (property.GetCustomAttribute() != null)
{
res[property.Name] = property;
}
}
return res;
}
///
/// 获取需要渲染的方法
///
///
///
public static Dictionary GetRenderMethods(object obj)
{
var res = new Dictionary();
var methods = obj.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);
foreach (var method in methods)
{
if (method.GetCustomAttribute() != null)
{
res[method.Name] = method;
}
}
return res;
}
public static bool FilterMember(IMemberData member)
{
if (member.DeclaringType.DescendsTo(resourceTypeData) && member.Name == nameof(Resource.Name))
return true;
if (member.GetAttribute() is BrowsableAttribute attr)
return attr.Browsable;
if (member.HasAttribute())
return true;
return member.Attributes.Any(a => a is XmlIgnoreAttribute) == false && member.Writable;
}
public static Grid GetControl(object obj)
{
var grid = new Grid()
{
};
// 继承 App 级别的所有资源
grid.Resources.MergedDictionaries.Add(Application.Current.Resources);
var properties = GetRenderProperty(obj);
int i = 0;
string GroupName = new Guid().ToString();
foreach (var key in properties.Keys)
{
var property = properties[key];
var display = property.GetCustomAttribute();
var fg = new FormGroup
{
Orientation = Orientation.Horizontal,
GroupName = GroupName
};
fg.SetValue(FormGroup.HeaderProperty, new DynamicResourceExtension(display.Name).ProvideValue(null));
grid.RowDefinitions.Add(new RowDefinition()
{
Height = new GridLength(1, GridUnitType.Auto)
});
grid.Children.Add(fg);
Grid.SetRow(fg, i);
var element = FormGroupProvider.RanderElement(obj, display, property);
//if (element is VariableTextBox vtb)
//{
// BindingOperations.SetBinding(vtb, VariableTextBox.SeqProperty,
// new Binding("Seq")
// {
// Source = parent,
// });
//}
fg.Content = element;
//BindingOperations.SetBinding(fg, FormGroup.IsEnabledProperty, new Binding(nameof(StepSettingView.CanEdit))
//{
// Source = parent,
//});
if (property.GetCustomAttribute() is DependOnAttribute doa)
{
BindingOperations.SetBinding(fg, FrameworkElement.VisibilityProperty, new Binding(doa.BindingName)
{
Source = obj,
Converter = VisibilityConvertor.Instance,
ConverterParameter = doa.TargetValue
});
}
i++;
}
foreach (var node in GetRenderMethods(obj))
{
var method = node.Value;
var display = method.GetCustomAttribute();
var btn = new Button
{
Content = display.Name
};
btn.Click += (sender, e) =>
{
method.Invoke(obj, null);
};
grid.RowDefinitions.Add(new RowDefinition()
{
Height = new GridLength(1, GridUnitType.Auto)
});
grid.Children.Add(btn);
Grid.SetRow(btn, i);
Grid.SetColumn(btn, 0);
i++;
}
if (obj is ITestStepParent tsp)
{
grid.RowDefinitions.Add(new RowDefinition()
{
Height = new GridLength(1, GridUnitType.Auto)
});
var fg = new FormGroup
{
Orientation = Orientation.Horizontal,
Header = "Break Condition",
GroupName = GroupName
};
grid.Children.Add(fg);
Grid.SetRow(fg, i);
var s = BreakConditionProperty.GetBreakCondition(tsp);
var element = new BreakConditionCtrl
{
Source = tsp
};
fg.Content = element;
}
GridHelper.SetSpace(grid, 5);
GridHelper.RefreshGridSpace(grid);
return grid;
}
}
}