FastReport
192 строки · 4.7 Кб
1using System;2using System.Collections.Generic;3using System.Text;4using FastReport.Table;5
6namespace FastReport.Matrix7{
8internal class MatrixHeaderItem : MatrixDescriptor9{10private MatrixHeaderItem parent;11private List<MatrixHeaderItem> items;12private object value;13private int index;14private bool isTotal;15private int dataRowNo;16private bool pageBreak;17private bool isSplitted;18
19public MatrixHeaderItem Parent20{21get { return parent; }22}23
24public List<MatrixHeaderItem> Items25{26get { return items; }27}28
29public object Value30{31get { return value; }32set { this.value = value; }33}34
35public int Index36{37get { return index; }38set { index = value; }39}40
41public int Span42{43get44{45List<MatrixHeaderItem> terminalItems = new List<MatrixHeaderItem>();46GetTerminalItems(terminalItems);47return terminalItems.Count;48}49}50
51public bool IsTotal52{53get { return isTotal; }54set { isTotal = value; }55}56
57public object[] Values58{59get60{61int count = 0;62MatrixHeaderItem item = this;63
64while (item.Parent != null)65{66count++;67item = item.Parent;68}69
70object[] values = new object[count];71item = this;72int index = count - 1;73
74while (item.Parent != null)75{76values[index] = item.Value;77index--;78item = item.Parent;79}80
81return values;82}83}84
85public int DataRowNo86{87get { return dataRowNo; }88set { dataRowNo = value; }89}90
91public bool PageBreak92{93get { return pageBreak; }94set { pageBreak = value; }95}96
97internal bool IsSplitted98{99get { return isSplitted; }100set { isSplitted = value; }101}102
103public int Find(object value, SortOrder sort)104{105if (Items.Count == 0)106return -1;107
108if (sort == SortOrder.None)109{110for (int i = 0; i < Items.Count; i++)111{112IComparable i1 = Items[i].Value as IComparable;113
114int result = 0;115if (i1 != null)116result = i1.CompareTo(value);117else if (value != null)118result = -1;119
120if (result == 0)121return i;122}123return ~Items.Count;124}125else126{127MatrixHeaderItem header = new MatrixHeaderItem(null);128header.Value = value;129return Items.BinarySearch(header, new HeaderComparer(sort));130}131}132
133public void Clear()134{135Items.Clear();136}137
138private void GetTerminalItems(List<MatrixHeaderItem> list)139{140if (Items.Count == 0 && !IsSplitted)141list.Add(this);142else143{144foreach (MatrixHeaderItem item in Items)145{146item.GetTerminalItems(list);147}148}149}150
151public List<MatrixHeaderItem> GetTerminalItems()152{153List<MatrixHeaderItem> result = new List<MatrixHeaderItem>();154GetTerminalItems(result);155return result;156}157
158public MatrixHeaderItem(MatrixHeaderItem parent)159{160this.parent = parent;161items = new List<MatrixHeaderItem>();162isSplitted = false;163}164
165
166private class HeaderComparer : IComparer<MatrixHeaderItem>167{168private SortOrder sort;169
170public int Compare(MatrixHeaderItem x, MatrixHeaderItem y)171{172int result = 0;173IComparable i1 = x.Value as IComparable;174IComparable i2 = y.Value as IComparable;175
176if (i1 != null)177result = i1.CompareTo(i2);178else if (i2 != null)179result = -1;180if (sort == SortOrder.Descending)181result = -result;182
183return result;184}185
186public HeaderComparer(SortOrder sort)187{188this.sort = sort;189}190}191}192}
193