using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Media;
using FWindSoft.Data;
using FWindSoft.SystemExtensions;
using FWindSoft.Wpf.Controls;
namespace FWindSoft.Wpf.History
{
///
/// 控件数据保存
///
public class ControlDataManager
{
private List m_ValueProviders;
public ControlDataManager()
{
m_ValueProviders = new List();
ValueProviders = new ReadOnlyCollection(m_ValueProviders);
}
public ControlDataManager(List providers) : this()
{
m_ValueProviders.AddRange(providers);
}
public ReadOnlyCollection ValueProviders { get; private set; }
public void RegistValueProvider(ElementValueProvider provider)
{
this.m_ValueProviders.Insert(0, provider);
}
#region 静态方法
///
/// 获取默认的provider
///
///
public static List GetDefaultProvider()
{
List providers = new List();
providers.Add(new TextBoxValueProvider());
providers.Add(new CheckBoxValueProvider());
providers.Add(new ComBoxValueProvider());
providers.Add(new ListBoxValueProvider());
providers.Add(new RadioValueProvider());
return providers;
}
#endregion
private ElementValueProvider GetElementValueProvider(Control control)
{
ElementValueProvider provider = HistoryControl.GetValueAdapter(control);
var controlType = control.GetType();
//if (provider == null)
//{
// provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(controlType));
//}
if (provider == null)
{
var objectType = typeof(object);
for (Type tempType = controlType; tempType != objectType && tempType != null; tempType = tempType.BaseType)
{
provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(tempType));
if (provider!=null)
{
break;
}
}
//provider = this.ValueProviders.FirstOrDefault(c => controlType.IsBaseType(c.RefControlType));
}
if (provider != null)
{
provider = provider.Clone();
provider.SetAdapterControl(control);
}
return provider;
}
private IValueProvider GetValueProvider(Control control)
{
IValueProvider provider = null;
do
{
if (control is IValueProvider)
{
provider = (IValueProvider)control;
break;
}
provider = GetElementValueProvider(control);
} while (false);
return provider;
}
#region 公开方法
///
/// 获取数据
///
///
public List GetControlData(Visual visual)
{
List items = new List();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i);
if (childVisual != null)
{
Control control = childVisual as Control;
if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid))
{
var provider = GetValueProvider(control);
if (provider != null)
{
var saveItem = new ControlSaveItem();
saveItem.ControlId = control.Uid;
saveItem.ControlName = control.Name;
saveItem.ControlType = control.GetType().Name;
saveItem.ControlValue = provider.GetValue().ToString();
items.Add(saveItem);
}
else
{
items.AddRange(GetControlData(control));
}
}
else
{
items.AddRange(GetControlData(childVisual));
}
}
}
return items;
}
///
/// 设置数据
///
///
///
public void SetControlData(Visual visual, List datas)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i);
if (childVisual != null)
{
Control control = childVisual as Control;
if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid))
{
var saveItem = datas.FirstOrDefault(s => s.ControlId == control.Uid);
var provider = GetValueProvider(control);
if (provider != null && saveItem != null)
{
provider.SetValue(saveItem.ControlValue);
}
else
{
SetControlData(childVisual, datas);
}
}
else
{
SetControlData(childVisual, datas);
}
}
}
}
}
#endregion
}