using System;
namespace DelftTools.Controls
{
///
/// This helper can be used to reuse another ViewInfo object, when its data is (sometimes) wrapped by
/// another object. By supplying an unwrap method, the resulting view info is deduced.
///
///
public static class ViewInfoWrapper
{
public static ViewInfo Create(ViewInfo originalViewInfo,
Func getTargetData,
Func additionalDataCheck = null,
Action afterCreate = null)
where TView : IView
{
if (getTargetData == null)
{
throw new ArgumentNullException("getTargetData", "You must supply a getTargetData method");
}
additionalDataCheck = additionalDataCheck ?? (d => true);
return new ViewInfo
{
AdditionalDataCheck =
(d) =>
{
if (!additionalDataCheck((TData) d))
{
return false;
}
var targetData = getTargetData((TData) d);
if (!(targetData is TTargetData))
{
return false;
}
return (originalViewInfo.AdditionalDataCheck == null ||
originalViewInfo.AdditionalDataCheck((TTargetData) targetData));
},
AfterCreate = (v, d) =>
{
if (originalViewInfo.AfterCreate != null)
{
originalViewInfo.AfterCreate((TView) v, (TTargetData) getTargetData((TData) d));
}
if (afterCreate != null)
{
afterCreate((TView) v, (TData) d);
}
},
GetViewName =
(v, o) =>
originalViewInfo.GetViewName != null
? originalViewInfo.GetViewName((TView) v, (TViewData) o)
: null,
CloseForData =
(v, o) =>
originalViewInfo.CloseForData != null &&
originalViewInfo.CloseForData((TView) v,
o is TTargetData ? (TTargetData) o : (TTargetData) getTargetData((TData) o)),
CompositeViewType = originalViewInfo.CompositeViewType,
DataType = typeof(TData),
ViewDataType = typeof(TViewData),
GetCompositeViewData = wrappedData =>
{
if (originalViewInfo.GetCompositeViewData != null)
{
return originalViewInfo.GetCompositeViewData((TTargetData) getTargetData((TData) wrappedData));
}
return null;
},
GetViewData = d =>
{
var targetData = (TTargetData) getTargetData((TData) d);
if (originalViewInfo.GetViewData == null)
{
return targetData;
}
return originalViewInfo.GetViewData(targetData);
},
OnActivateView = (v, d) =>
{
if (originalViewInfo.OnActivateView != null)
{
var targetData = (TTargetData) getTargetData((TData) d);
originalViewInfo.OnActivateView((TView) v, targetData);
}
},
Description = originalViewInfo.Description,
Image = originalViewInfo.Image,
ViewType = originalViewInfo.ViewType
};
}
}
}