public static SchemaMemberSelection CreateSelectionTree(object SourceObject, MemberAccesor SourceAccesor = null, IEnumerable <object> PreExclusion = null,
                                                                Func <object, Tuple <bool,                                // is-selectable
                                                                                     bool,                                // is-selected
                                                                                     bool,                                // can-show-is-selected
                                                                                     IRecognizableElement>                // action-info
                                                                      > MemberMergeSelectionDeterminer            = null,
                                                                Func <object, MemberAccesor, bool> ChildrenFilter = null, // Determines whether a child should be included for selection (e.g. "obj is Concept || obj.CompositeIdeas.Count >0")
                                                                SchemaMemberSelection DirectParent = null)
        {
            if (SourceAccesor == null)
            {
                SourceAccesor = GetAccesor(SourceObject);
            }

            if (SourceAccesor == null)
            {
                return(null);
            }

            var Selection = (MemberMergeSelectionDeterminer == null
                             ? Tuple.Create(false, false, false, (IRecognizableElement)null)
                             : MemberMergeSelectionDeterminer(SourceObject));

            var Result = new SchemaMemberSelection(SourceObject, SourceAccesor)
            {
                RefMember    = SourceObject,
                IsSelectable = Selection.Item1,
                IsSelected   = (Selection.Item2 &&
                                (PreExclusion == null || !PreExclusion.Contains(SourceObject))),
                CanShowIsSelected = Selection.Item3,
                ActionInfo        = Selection.Item4,
                Parent            = DirectParent
            };

            var SourceChildren = Result.MemberChildren;

            if (!SourceChildren.IsEmpty())
            {
                Result.Children = new List <SchemaMemberSelection>();
                foreach (var Child in SourceChildren)
                {
                    var ChildAccesor = GetAccesor(Child);
                    if (ChildrenFilter == null || (ChildAccesor != null && ChildrenFilter(Child, ChildAccesor)))
                    {
                        var SelItem = CreateSelectionTree(Child, ChildAccesor, PreExclusion,
                                                          MemberMergeSelectionDeterminer, ChildrenFilter, Result);
                        if (SelItem != null)
                        {
                            Result.Children.Add(SelItem);
                        }
                    }
                }
            }

            return(Result);
        }
        public static void RegisterMemberTypeOperationsSet <TMember>(Func <TMember, IEnumerable <object> > ChildrenGetterOp,
                                                                     Func <TMember, string> NameCaptionGetterOp,
                                                                     Func <TMember, string> SummaryGetterOp                 = null,
                                                                     Func <TMember, ImageSource> PictogramGetterOp          = null,
                                                                     Func <TMember, string> DescriptiveCaptionGetterOp      = null,
                                                                     Func <TMember, ImageSource> DefinitorPictogramGetterOp = null)
            where TMember : class
        {
            General.ContractRequiresNotNull(ChildrenGetterOp, NameCaptionGetterOp);

            var Accesor = new MemberAccesor {
                ChildrenGetter           = (obj => ChildrenGetterOp((TMember)obj)),
                NameCaptionGetter        = (obj => NameCaptionGetterOp((TMember)obj)),
                SummaryGetter            = (obj => SummaryGetterOp.NullDefault(ob => null)((TMember)obj)),
                PictogramGetter          = (obj => PictogramGetterOp.NullDefault(ob => null)((TMember)obj)),
                DescriptiveCaptionGetter = (obj => DescriptiveCaptionGetterOp.NullDefault(ob => null)((TMember)obj)),
                DefinitorPictogramGetter = (obj => DefinitorPictogramGetterOp.NullDefault(ob => null)((TMember)obj))
            };

            RegisteredMemberTypeOperationsSets.AddOrReplace(typeof(TMember), Accesor);
        }
 // ---------------------------------------------------------------------------------------------------------------------------------------------------------
 public SchemaMemberSelection(object RefMember, MemberAccesor Accesor)
 {
     this.RefMember = RefMember;
     this.Accesor   = Accesor;
 }