예제 #1
0
 /// <summary>
 /// This method is raised when Children.Comparer is chamged
 /// </summary>
 /// <param name="sender">The collection in which the comparer was changed</param>
 protected void OnChildListComparerChanged(ObservableSortedCollection <ObservableSortedTree <T> > sender,
                                           IComparer <ObservableSortedTree <T> > oldComparer)
 {
     //this.Comparer = sender.Comparer;
     OnPropertyChanged(nameof(Comparer));
     OnComparerChanged(oldComparer);
 }
예제 #2
0
 protected ObservableSortedTree(T value, IComparer <ObservableSortedTree <T> > comparer, ObservableSortedCollection <ObservableSortedTree <T> > children)
 {
     Value    = value;
     Children = children;
     Comparer = comparer;
     Root     = this;
 }
예제 #3
0
 /// <summary>
 /// attaches and detaches events for the child list when it is changed. Triggered by setting this.Children
 /// </summary>
 /// <param name="oldChildren">the old child tree list</param>
 /// <param name="newChildren">the new child tree list</param>
 private void manageChildListEvents(ObservableSortedCollection <ObservableSortedTree <T> > oldChildren,
                                    ObservableSortedCollection <ObservableSortedTree <T> > newChildren)
 {
     if (oldChildren != null)
     {
         oldChildren.ItemAdded       -= OnChildTreeAdded;
         oldChildren.ItemRemoved     -= OnChildTreeRemoved;
         oldChildren.ItemChanged     -= OnChildTreeChanged;
         oldChildren.ComparerChanged -= OnChildListComparerChanged;
         foreach (var child in oldChildren)
         {
             OnDetachChild(child);
         }
     }
     //_children = newChildren;
     if (newChildren != null)
     {
         newChildren.ItemAdded       += OnChildTreeAdded;
         newChildren.ItemRemoved     += OnChildTreeRemoved;
         newChildren.ItemChanged     += OnChildTreeChanged;
         newChildren.ComparerChanged += OnChildListComparerChanged;
         foreach (var child in newChildren)
         {
             OnAttachChild(child);
         }
     }
 }
예제 #4
0
        } = true;                                   //use this bool to allow constructor set child list and child factory (whhich call setChildren)

        protected override void setChildren(ObservableSortedCollection <ObservableSortedTree <T> > newChildren)
        {
            if (initialising)
            {
                base.setChildren(newChildren);
            }
            else
            {
                throw new NotImplementedException("Cannot manually set the children list in a lazy tree");
            }
        }
예제 #5
0
        /// <summary>
        /// Overrideable method for setting the collection of current child tree elements
        /// Note: Parent, and hence Root, automatically updated for all new children
        ///
        /// </summary>
        /// <param name="newChildren">the list of child tree elements</param>
        protected virtual void setChildren(ObservableSortedCollection <ObservableSortedTree <T> > newChildren)
        {
            if (ReferenceEquals(newChildren, _children))
            {
                return;
            }
            var old = _children;

            _children = newChildren;
            // _children.Comparer = this.Comparer;
            manageChildListEvents(old, _children);
            OnChildListChanged(old);
            OnPropertyChanged(nameof(Children));
            //OnPropertyChanged(nameof(HasChildren));
        }
예제 #6
0
        protected virtual void OnChildListChanged(ObservableSortedCollection <ObservableSortedTree <T> > oldChildren)
        {
            /*if (this._children != null)
             *  this._children.Comparer = this.Comparer;*/

            ChildListChanged?.Invoke(this, oldChildren);
            bool oldHasChild = oldChildren != null && oldChildren.Count > 0;
            bool newHasChild = this._children != null && this._children.Count > 0;

            if (oldChildren != null && this.Children != null)
            {
                this.Children.Comparer = oldChildren.Comparer;
            }
            if (oldHasChild != newHasChild)
            {
                OnPropertyChanged(nameof(HasChildren));
            }
        }
예제 #7
0
        public void GenerateChildren()
        {
            //regenerating children bool is to allow child factory to be called when it has been changed
            //if AreChildrenGenerated is true when the child factory is changed, this function would return immediately, and the old children would remain
            //this allows the old chilren to be destroyed and new children created when needed
            if (AreChildrenGenerated && !regeneratingChildren)
            {
                return;
            }
            regeneratingChildren = false;
            AreChildrenGenerated = true;
            var childCollection = new ObservableSortedCollection <ObservableSortedTree <T> >(_inheritComparer);

            _inheritComparer = null;
            base.setChildren(childCollection);
            //AreChildrenGenerated must be set to true before base.GetChildren, otherwise it will think the children have not yet been generated and start generating them again

            base.getChildren().AddRange(InternalChildFactory(this));
            onChildrenGenerated();
        }