using System; using System.ComponentModel; using FastReport.Matrix; using FastReport.Utils; using FastReport.Data; using FastReport.Table; using System.Drawing.Design; namespace FastReport.CrossView { /// /// Represents the crossview object that is used to print cube slice or slicegrid. /// public partial class CrossViewObject : TableBase { #region Fields //private FastCubeSource fastCubeSource; private CubeSourceBase cubeSource; private bool showTitle; private bool showXAxisFieldsCaption; private bool showYAxisFieldsCaption; private string style; private CrossViewData data; private string modifyResultEvent; private CrossViewHelper helper; private bool saveVisible; private MatrixStyleSheet styleSheet; #endregion #region Properties /// /// Allows to modify the prepared matrix elements such as cells, rows, columns. /// public event EventHandler ModifyResult; /// /// Gets or sets a value indicating whether to show a title row. /// [DefaultValue(false)] [Category("Behavior")] public bool ShowTitle { get { return showTitle; } set { showTitle = value; if (IsDesigning) { //Data.CreateDescriptors(); //FHelper.CreateOtherDescriptor(); BuildTemplate(); } } } /// /// Gets or sets a value indicating whether to show a X Axis fields Caption. /// [DefaultValue(false)] [Category("Behavior")] public bool ShowXAxisFieldsCaption { get { return showXAxisFieldsCaption; } set { showXAxisFieldsCaption = value; if (IsDesigning) { //Data.CreateDescriptors(); //FHelper.CreateOtherDescriptor(); BuildTemplate(); } } } /// /// Gets or sets a value indicating whether to show a Y Axis fields Caption. /// [DefaultValue(false)] [Category("Behavior")] public bool ShowYAxisFieldsCaption { get { return showYAxisFieldsCaption; } set { showYAxisFieldsCaption = value; if (IsDesigning) { //Data.CreateDescriptors(); //FHelper.CreateOtherDescriptor(); BuildTemplate(); } } } /// /// Gets or sets a matrix style. /// [Category("Appearance")] [Editor("FastReport.TypeEditors.CrossViewStyleEditor, FastReport", typeof(UITypeEditor))] public new string Style { get { return style; } set { style = value; Helper.UpdateStyle(); } } /// /// Gets or sets a script method name that will be used to handle the /// event. /// /// /// See the event for more details. /// [Category("Build")] public string ModifyResultEvent { get { return modifyResultEvent; } set { modifyResultEvent = value; } } /// /// /// [Browsable(false)] public string ColumnDescriptorsIndexes { get { return Data.ColumnDescriptorsIndexes; } set { if (!IsDesigning) Data.ColumnDescriptorsIndexes = value; } } /// /// /// [Browsable(false)] public string RowDescriptorsIndexes { get { return Data.RowDescriptorsIndexes; } set { if (!IsDesigning) Data.RowDescriptorsIndexes = value; } } /// /// /// [Browsable(false)] public string ColumnTerminalIndexes { get { return Data.ColumnTerminalIndexes; } set { if (!IsDesigning) Data.ColumnTerminalIndexes = value; } } /// /// /// [Browsable(false)] public string RowTerminalIndexes { get { return Data.RowTerminalIndexes; } set { if (!IsDesigning) Data.RowTerminalIndexes = value; } } /// /// Gets or sets a cube source. /// [Category("Data")] public CubeSourceBase CubeSource { get { return cubeSource; } set { if (cubeSource != value) { if (cubeSource != null) { cubeSource.Disposed -= new EventHandler(CubeSource_Disposed); cubeSource.OnChanged -= new EventHandler(CubeSource_OnChanged); } if (value != null) { value.Disposed += new EventHandler(CubeSource_Disposed); value.OnChanged += new EventHandler(CubeSource_OnChanged); } cubeSource = value; Data.CubeSource = value; if (IsDesigning) { Data.CreateDescriptors(); helper.CreateOtherDescriptor(); BuildTemplate(); } } } } /// /// Gets the object that holds data of Cube /// /// /// See the class for more details. /// [Browsable(false)] public CrossViewData Data { get { return data; } } internal MatrixStyleSheet StyleSheet { get { return styleSheet; } } private CrossViewHelper Helper { get { return helper; } } private bool IsResultCrossView { get { return !IsDesigning /*&& Data.Columns.Count == 0 && Data.Rows.Count == 0 */; } } private BandBase ParentBand { get { BandBase parentBand = this.Band; if (parentBand is ChildBand) parentBand = (parentBand as ChildBand).GetTopParentBand; return parentBand; } } private DataBand FootersDataBand { get { DataBand dataBand = null; if (ParentBand is GroupFooterBand) dataBand = ((ParentBand as GroupFooterBand).Parent as GroupHeaderBand).GroupDataBand; else if (ParentBand is DataFooterBand) dataBand = ParentBand.Parent as DataBand; return dataBand; } } private bool IsOnFooter { get { DataBand dataBand = FootersDataBand; if (dataBand != null) { // return DataSource == dataBand.DataSource; } return false; } } #endregion #region Private Methods private void CreateResultTable() { SetResultTable(new TableResult()); // assign properties from this object. Do not use Assign method: TableResult is incompatible with MatrixObject. ResultTable.OriginalComponent = OriginalComponent; ResultTable.Alias = Alias; ResultTable.Border = Border.Clone(); ResultTable.Fill = Fill.Clone(); ResultTable.Bounds = Bounds; ResultTable.PrintOnParent = PrintOnParent; ResultTable.RepeatHeaders = RepeatHeaders; ResultTable.RepeatRowHeaders = RepeatRowHeaders; ResultTable.RepeatColumnHeaders = RepeatColumnHeaders; ResultTable.Layout = Layout; ResultTable.WrappedGap = WrappedGap; ResultTable.AdjustSpannedCellsWidth = AdjustSpannedCellsWidth; ResultTable.SetReport(Report); ResultTable.AfterData += new EventHandler(ResultTable_AfterData); } private void DisposeResultTable() { ResultTable.Dispose(); SetResultTable(null); } private void ResultTable_AfterData(object sender, EventArgs e) { OnModifyResult(e); } private void CubeSource_Disposed(object sender, EventArgs e) { Data.CubeSource = null; } private void CubeSource_OnChanged(object sender, EventArgs e) { Data.CreateDescriptors(); helper.CreateOtherDescriptor(); BuildTemplate(); } private void WireEvents(bool wire) { if (IsOnFooter) { DataBand dataBand = FootersDataBand; if (wire) dataBand.BeforePrint += new EventHandler(dataBand_BeforePrint); else dataBand.BeforePrint -= new EventHandler(dataBand_BeforePrint); } } private void dataBand_BeforePrint(object sender, EventArgs e) { /* bool firstRow = (sender as DataBand).IsFirstRow; if (firstRow) Helper.StartPrint(); Helper.AddDataRow(); */ } #endregion #region Protected Methods /// protected override void DeserializeSubItems(FRReader reader) { if (String.Compare(reader.ItemName, "CrossViewColumns", true) == 0) reader.Read(Data.Columns); else if (String.Compare(reader.ItemName, "CrossViewRows", true) == 0) reader.Read(Data.Rows); else if (String.Compare(reader.ItemName, "CrossViewCells", true) == 0) reader.Read(Data.Cells); else base.DeserializeSubItems(reader); } #endregion #region Public Methods /// public override void Assign(Base source) { base.Assign(source); CrossViewObject src = source as CrossViewObject; CubeSource = src.CubeSource; ShowTitle = src.ShowTitle; ShowXAxisFieldsCaption = src.ShowXAxisFieldsCaption; ShowYAxisFieldsCaption = src.ShowYAxisFieldsCaption; Style = src.Style; // MatrixEvenStylePriority = src.MatrixEvenStylePriority; } /// public override void Serialize(FRWriter writer) { if (writer.SerializeTo != SerializeTo.SourcePages) { writer.Write(Data.Columns); writer.Write(Data.Rows); writer.Write(Data.Cells); } else RefreshTemplate(true); base.Serialize(writer); CrossViewObject c = writer.DiffObject as CrossViewObject; if (CubeSource != c.CubeSource) writer.WriteRef("CubeSource", CubeSource); if (ColumnDescriptorsIndexes != c.ColumnDescriptorsIndexes) writer.WriteStr("ColumnDescriptorsIndexes", ColumnDescriptorsIndexes); if (RowDescriptorsIndexes != c.RowDescriptorsIndexes) writer.WriteStr("RowDescriptorsIndexes", RowDescriptorsIndexes); if (ColumnTerminalIndexes != c.ColumnTerminalIndexes) writer.WriteStr("ColumnTerminalIndexes", ColumnTerminalIndexes); if (RowTerminalIndexes != c.RowTerminalIndexes) writer.WriteStr("RowTerminalIndexes", RowTerminalIndexes); if (ShowTitle != c.ShowTitle) writer.WriteBool("ShowTitle", ShowTitle); if (ShowXAxisFieldsCaption != c.ShowXAxisFieldsCaption) writer.WriteBool("ShowXAxisFieldsCaption", ShowXAxisFieldsCaption); if (ShowYAxisFieldsCaption != c.ShowYAxisFieldsCaption) writer.WriteBool("ShowYAxisFieldsCaption", ShowYAxisFieldsCaption); if (Style != c.Style) writer.WriteStr("Style", Style); // if (MatrixEvenStylePriority != c.MatrixEvenStylePriority) // writer.WriteValue("MatrixEvenStylePriority", MatrixEvenStylePriority); if (ModifyResultEvent != c.ModifyResultEvent) writer.WriteStr("ModifyResultEvent", ModifyResultEvent); } /// /// Creates or updates the matrix template. /// /// /// Call this method after you modify the matrix descriptors using the /// object's properties. /// public void BuildTemplate() { Helper.BuildTemplate(); } #endregion #region Report Engine /// public override void InitializeComponent() { base.InitializeComponent(); WireEvents(true); } /// public override void FinalizeComponent() { base.FinalizeComponent(); WireEvents(false); } /// public override void SaveState() { saveVisible = Visible; BandBase parent = Parent as BandBase; if (!Visible || (parent != null && !parent.Visible)) return; // create the result table that will be rendered in the preview CreateResultTable(); Visible = false; if (parent != null) { parent.Height = Top; parent.CanGrow = false; parent.CanShrink = false; parent.AfterPrint += new EventHandler(ResultTable.GeneratePages); } } /// public override void GetData() { base.GetData(); if (Data.SourceAssigned) { // if (!IsOnFooter) // { Helper.StartPrint(); Helper.AddData(); // } Helper.FinishPrint(); } } /// public override void RestoreState() { BandBase parent = Parent as BandBase; if (!saveVisible || (parent != null && !parent.Visible)) return; if (parent != null) parent.AfterPrint -= new EventHandler(ResultTable.GeneratePages); DisposeResultTable(); Visible = saveVisible; } /// /// This method fires the ModifyResult event and the script code connected to the ModifyResultEvent. /// /// Event data. public void OnModifyResult(EventArgs e) { if (ModifyResult != null) ModifyResult(this, e); InvokeEvent(ModifyResultEvent, e); } #endregion /// /// Initializes a new instance of the class. /// public CrossViewObject() { //FAutoSize = true; showXAxisFieldsCaption = true; showYAxisFieldsCaption = true; data = new CrossViewData(); helper = new CrossViewHelper(this); styleSheet = new MatrixStyleSheet(); styleSheet.Load(ResourceLoader.GetStream("cross.frss")); style = ""; RepeatHeaders = false; RepeatColumnHeaders = true; RepeatRowHeaders = true; //FFilter = ""; } } }