/// <summary>
 /// Returns an array of summary objects.
 /// </summary>
 /// <param name="emptySummaries">The empty summaries.</param>
 /// <returns></returns>
 public ITreeTableSummary[] GetSummaries(ITreeTableEmptySummaryArraySource emptySummaries)
 {
     if (summaries == null)
     {
         summaries = OnGetSummaries(emptySummaries) ?? emptySummaryArray;
     }
     return(summaries);
 }
        /// <summary>
        /// Returns an array of summary objects.
        /// </summary>
        public ITreeTableSummary[] GetSummaries(ITreeTableEmptySummaryArraySource emptySummaries)
        {
            if (this.Root == null)
            {
                return(emptySummaries.GetEmptySummaries());
            }

            return(((ITreeTableSummaryNode)this.Root).GetSummaries(emptySummaries));
        }
        /// <summary>
        /// Called from <see cref="GetSummaries"/> when called the first time after summaries were invalidated.
        /// </summary>
        /// <param name="emptySummaries">The empty summaries.</param>
        /// <returns></returns>
        public virtual ITreeTableSummary[] OnGetSummaries(ITreeTableEmptySummaryArraySource emptySummaries)
        {
            ITreeTableSummary[]          summaries          = null;
            ITreeTableSummaryArraySource summaryArraySource = GetSummaryArraySource();

            if (summaryArraySource != null)
            {
                bool summaryChanged;
                summaries = summaryArraySource.GetSummaries(emptySummaries, out summaryChanged);
            }
            return(summaries);
        }
        /// <summary>
        /// Returns an array of summary objects.
        /// </summary>
        /// <param name="emptySummaries">The empty summaries.</param>
        /// <returns></returns>
        public ITreeTableSummary[] GetSummaries(ITreeTableEmptySummaryArraySource emptySummaries)
        {
            if (Tree.IsInitializing)
            {
                return(null);
            }
            else if (_summaries == null)
            {
                ITreeTableSummary[] left  = GetLeftC().GetSummaries(emptySummaries);
                ITreeTableSummary[] right = GetRightC().GetSummaries(emptySummaries);
                if (left != null && right != null)
                {
                    int reuseLeft  = 0;
                    int reuseRight = 0;
                    _summaries = new ITreeTableSummary[left.Length];
                    for (int i = 0; i < _summaries.Length; i++)
                    {
                        _summaries[i] = left[i].Combine(right[i]);

                        // preserve memory optimization
                        if (reuseLeft == i || reuseRight == i)
                        {
                            if (Object.ReferenceEquals(_summaries[i], left[i]))
                            {
                                reuseLeft++;
                            }
                            else if (Object.ReferenceEquals(_summaries[i], right[i]))
                            {
                                reuseRight++;
                            }
                        }
                    }

                    // preserve memory optimization
                    if (reuseLeft == _summaries.Length)
                    {
                        _summaries = left;
                    }
                    else if (reuseRight == _summaries.Length)
                    {
                        _summaries = right;
                    }
                }
            }
            return(_summaries);
        }
 /// <summary>
 /// Returns an array of summary objects.
 /// </summary>
 public ITreeTableSummary[] GetSummaries(ITreeTableEmptySummaryArraySource emptySummaries)
 {
     return(thisTree.GetSummaries(emptySummaries));
 }