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 }; } } }