From 8975a86e54829238fd3a3f13d4d0a88a69958738 Mon Sep 17 00:00:00 2001 From: peterforstmeier Date: Sat, 2 Oct 2010 20:35:11 +0200 Subject: [PATCH] Wizard can create grouped Tablelayout --- .../ReportLayout/AbstractLayout.cs | 21 ++++ .../ReportWizard/ReportLayout/ListLayout.cs | 22 +--- .../ReportWizard/ReportLayout/TableLayout.cs | 55 +++++--- .../Project/DataManager/DataNavigator.cs | 5 +- .../Converters/GroupedRowConverter.cs | 1 - .../Exporter/Converters/TableConverter.cs | 117 ++++++++++++++---- 6 files changed, 165 insertions(+), 56 deletions(-) diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs index f13c8ebe71..aa4e410d22 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs @@ -170,6 +170,27 @@ namespace ICSharpCode.Reports.Addin.ReportWizard } + #region Grouping + + protected ICSharpCode.Reports.Core.BaseGroupedRow CreateGroupHeader(Point headerLocation) + { + ICSharpCode.Reports.Core.BaseDataItem dataItem = new ICSharpCode.Reports.Core.BaseDataItem(); + + dataItem.ColumnName = ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; + + dataItem.DataType = ReportModel.ReportSettings.GroupColumnsCollection[0].DataTypeName; + dataItem.Location = new Point (10,5); + dataItem.Size = new Size (150,20); + dataItem.Text = ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; + + ICSharpCode.Reports.Core.BaseGroupedRow groupHeader = new ICSharpCode.Reports.Core.BaseGroupedRow(); + groupHeader.Location = headerLocation; + groupHeader.Size = new Size (300,30); + groupHeader.Items.Add(dataItem); + return groupHeader; + } + + #endregion protected ReportModel ReportModel {get; private set;} diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs index 5c6e2441ee..8b20caa3e0 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs @@ -46,7 +46,10 @@ namespace ICSharpCode.Reports.Addin.ReportWizard } if (base.ReportModel.ReportSettings.GroupColumnsCollection.Count > 0) { - InsertGroupHeader(); + var groupheader = base.CreateGroupHeader(new Point (5,10)); + + base.ReportModel.DetailSection.Items.Add(groupheader); + ParentItem.Location = new Point(ParentItem.Location.X,50); ParentItem.Size = new Size(ParentItem.Size.Width,40); section.Size = new Size(section.Size.Width,100); @@ -62,23 +65,6 @@ namespace ICSharpCode.Reports.Addin.ReportWizard } - - private void InsertGroupHeader() - { - ICSharpCode.Reports.Core.BaseDataItem dataItem = new ICSharpCode.Reports.Core.BaseDataItem(); - dataItem.ColumnName = base.ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; - dataItem.DataType = base.ReportModel.ReportSettings.GroupColumnsCollection[0].DataTypeName; - dataItem.Location = new Point (10,5); - dataItem.Size = new Size (150,20); - dataItem.Text = base.ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; - - ICSharpCode.Reports.Core.BaseGroupedRow groupHeader = new ICSharpCode.Reports.Core.BaseGroupedRow(); - groupHeader.Location = new Point(5,10); - groupHeader.Size = new Size (300,30); - groupHeader.Items.Add(dataItem); - base.ReportModel.DetailSection.Items.Add(groupHeader); - } - #endregion } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs index e0c5a570b9..e843d8246d 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs @@ -4,6 +4,7 @@ using System; using System.Drawing; using ICSharpCode.Reports.Core; +using ICSharpCode.Reports.Core.Interfaces; namespace ICSharpCode.Reports.Addin.ReportWizard { @@ -43,36 +44,62 @@ namespace ICSharpCode.Reports.Addin.ReportWizard AdjustContainer(base.ReportModel.DetailSection,table); - ICSharpCode.Reports.Core.BaseRowItem r1 = CreateRowWithTextColumns(table, + + ICSharpCode.Reports.Core.BaseRowItem headerRow = CreateRowWithTextColumns(table, this.reportItems); + Point insertLocation = new Point (margin.Left,headerRow.Location.Y + headerRow.Size.Height + margin.Bottom + margin.Top); + + + if (base.ReportModel.ReportSettings.GroupColumnsCollection.Count > 0) { + var groupHeader = base.CreateGroupHeader(insertLocation); + table.Items.Add(groupHeader); + insertLocation = new Point(margin.Left,insertLocation.Y + groupHeader.Size.Height + margin.Bottom + margin.Top); + } + - ICSharpCode.Reports.Core.BaseRowItem r2 = new ICSharpCode.Reports.Core.BaseRowItem(); + ICSharpCode.Reports.Core.BaseRowItem detailRow = new ICSharpCode.Reports.Core.BaseRowItem(); + AdjustContainer (table,detailRow); - AdjustContainer (table,r2); - - r2.Location = new Point (margin.Left, - r1.Location.Y + r1.Size.Height + margin.Bottom + margin.Top); + + detailRow.Location = insertLocation; - int defX = r2.Size.Width / this.reportItems.Count; + int defX = detailRow.Size.Width / this.reportItems.Count; - int startX = r2.Location.X + margin.Left; + int startX = detailRow.Location.X + margin.Left; foreach (ICSharpCode.Reports.Core.BaseReportItem ir in this.reportItems) { Point np = new Point(startX,margin.Top); startX += defX; ir.Location = np; - ir.Parent = r2; - r2.Items.Add(ir); + ir.Parent = detailRow; + detailRow.Items.Add(ir); } - table.Size = new Size (table.Size.Width, - margin.Top + r1.Size.Height + margin.Bottom + r2.Size.Height + margin.Bottom); + insertLocation = new Point(margin.Left,insertLocation.Y + detailRow.Size.Height + margin.Bottom + margin.Top); + + + table.Items.Add (headerRow); + table.Items.Add (detailRow); + + table.Size = CalculateContainerSize(table,margin); + section.Size = new Size (section.Size.Width,table.Size.Height + margin.Top + margin.Bottom); - table.Items.Add (r1); - table.Items.Add (r2); base.ReportModel.DetailSection.Items.Add(table); } + + + private Size CalculateContainerSize(ISimpleContainer container,System.Drawing.Printing.Margins margin) + { + int h = margin.Top; + + foreach (ICSharpCode.Reports.Core.BaseReportItem item in container.Items) + { + h = h + item.Size.Height + margin.Bottom; + } + h = h + 3*margin.Bottom; + return new Size (container.Size.Width,h); + } } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs index 5c9aab5257..5f80861061 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs @@ -43,10 +43,10 @@ namespace ICSharpCode.Reports.Core } - public bool HasMoreData { + public bool HasMoreData + { get { if (this.CurrentRow < store.IndexList.Count -1 ){ -// if (this.CurrentRow < this.Count -1 ){ return true; } else { return false; @@ -122,6 +122,7 @@ namespace ICSharpCode.Reports.Core #endregion + #region Try make recursive with ChildNavigavtor public IDataNavigator GetChildNavigator() diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs index 0de0b6fb77..3f3502b487 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs @@ -2,7 +2,6 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; using System.Linq; diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs index 258ebf6966..80bad6e8f3 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs @@ -17,9 +17,8 @@ namespace ICSharpCode.Reports.Core.Exporter private ITableContainer baseTable; public TableConverter(IDataNavigator dataNavigator, - ExporterPage singlePage, - - ILayouter layouter ):base(dataNavigator,singlePage,layouter) + ExporterPage singlePage, ILayouter layouter ):base(dataNavigator,singlePage,layouter) + { } @@ -88,31 +87,107 @@ namespace ICSharpCode.Reports.Core.Exporter Rectangle pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)simpleContainer,currentPosition); if (PrintHelper.IsPageFull(pageBreakRect,base.SectionBounds)) - { + { base.BuildNewPage(mylist,section); - - currentPosition = BaseConverter.BaseConvert(mylist,headerContainer, - defaultLeftPos, - base.SectionBounds.ReportHeaderRectangle.Location); - - } - currentPosition = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); + currentPosition = BaseConverter.BaseConvert(mylist,headerContainer, + defaultLeftPos, + base.SectionBounds.ReportHeaderRectangle.Location); + + } + + currentPosition = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); + + simpleContainer.Size = base.RestoreSize; + } + while (base.DataNavigator.MoveNext()); + //Allway's reset the DataNavigator + base.DataNavigator.Reset(); + base.DataNavigator.MoveNext(); + SectionBounds.ReportFooterRectangle = new Rectangle(SectionBounds.ReportFooterRectangle.Left, + currentPosition.Y, + SectionBounds.ReportFooterRectangle.Width, + SectionBounds.ReportFooterRectangle.Height); + } + } + } + return mylist; + } + + + + private ExporterCollection old_ConvertInternal(ExporterCollection mylist) + { + + Point currentPosition = new Point(PrintHelper.DrawingAreaRelativeToParent(this.baseTable.Parent,this.baseTable).Location.X, + base.SectionBounds.DetailStart.Y); + + int defaultLeftPos = currentPosition.X; + + Point dataAreaStart = new Point(baseTable.Items[0].Location.X,baseTable.Items[0].Location.Y + currentPosition.Y); + + ISimpleContainer headerContainer = null; + + + + this.baseTable.Items.SortByLocation(); + + foreach (ISimpleContainer simpleContainer in this.baseTable.Items) + { + if (simpleContainer.Items.Count > 0) { + simpleContainer.Location = new Point (simpleContainer.Location.X,simpleContainer.Location.Y); + simpleContainer.Parent = (BaseReportItem)this.baseTable; + base.SaveSize( new Size (simpleContainer.Size.Width,simpleContainer.Size.Height)); + // Header/FooterRow + + if (PrintHelper.IsTextOnlyRow(simpleContainer) ) { + headerContainer = simpleContainer; + currentPosition = BaseConverter.BaseConvert(mylist,headerContainer,defaultLeftPos,currentPosition); + } + + else + { + // DataRegion + base.SaveSize(simpleContainer.Size); + do { + // + BaseSection section = this.baseTable.Parent as BaseSection; + PrintHelper.AdjustSectionLocation(section); + + base.FillRow(simpleContainer); + + StandardPrinter.EvaluateRow(base.Evaluator,mylist); + + base.PrepareContainerForConverting(null,simpleContainer); + + Rectangle pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)simpleContainer,currentPosition); + + if (PrintHelper.IsPageFull(pageBreakRect,base.SectionBounds)) + { + base.BuildNewPage(mylist,section); - simpleContainer.Size = base.RestoreSize; + currentPosition = BaseConverter.BaseConvert(mylist,headerContainer, + defaultLeftPos, + base.SectionBounds.ReportHeaderRectangle.Location); + } - while (base.DataNavigator.MoveNext()); - //Allway's reset the DataNavigator - base.DataNavigator.Reset(); - base.DataNavigator.MoveNext(); - SectionBounds.ReportFooterRectangle = new Rectangle(SectionBounds.ReportFooterRectangle.Left, - currentPosition.Y, - SectionBounds.ReportFooterRectangle.Width, - SectionBounds.ReportFooterRectangle.Height); + + currentPosition = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); + + simpleContainer.Size = base.RestoreSize; } + while (base.DataNavigator.MoveNext()); + //Allway's reset the DataNavigator + base.DataNavigator.Reset(); + base.DataNavigator.MoveNext(); + SectionBounds.ReportFooterRectangle = new Rectangle(SectionBounds.ReportFooterRectangle.Left, + currentPosition.Y, + SectionBounds.ReportFooterRectangle.Width, + SectionBounds.ReportFooterRectangle.Height); } } - return mylist; } + return mylist; } } +}