From 1deff73d2bbf2e734554745a587e70f2dc0558b8 Mon Sep 17 00:00:00 2001 From: peterforstmeier Date: Sun, 10 Oct 2010 20:06:50 +0200 Subject: [PATCH] Refactor DataRenderer to show groupings --- .../Project/ReportExplorer/ExplorerTree.cs | 3 +- .../ICSharpCode.Reports.Core.csproj | 2 + .../Project/DataManager/DataManager.cs | 1 - .../Exporter/Converters/BaseConverter.cs | 3 +- .../AggregateFunctions/AggregateFunction.cs | 2 +- .../ReportingService/FieldReference.cs | 3 +- .../Project/Interfaces/IItemConverter.cs | 20 +- .../Project/Printing/AbstractDataRenderer.cs | 4 +- .../Project/Printing/RenderDataReport.cs | 19 +- .../Project/Printing/RenderTable.cs | 230 ++++++++++++++++++ .../Project/Printing/RendererFactory.cs | 38 +++ 11 files changed, 303 insertions(+), 22 deletions(-) create mode 100644 src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderTable.cs create mode 100644 src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RendererFactory.cs diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs index 2c49e1d109..70bec05113 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs @@ -337,7 +337,6 @@ namespace ICSharpCode.Reports.Addin } - public void BuildTree () { this.BeginUpdate(); @@ -345,10 +344,12 @@ namespace ICSharpCode.Reports.Addin SetSortColumns(); SetGroupColumns(); SetParameters(); +// SetFunctions(); this.ExpandAll(); this.EndUpdate(); } + #endregion #region Build Basic Tree diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj index ce4fa1c731..ce082baaa2 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj @@ -272,7 +272,9 @@ + + Component diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs index 768dadb030..53250ed5c9 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs @@ -64,7 +64,6 @@ namespace ICSharpCode.Reports.Core { } } - #endregion diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs index e8ec5c272f..7732655d62 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs @@ -157,10 +157,11 @@ namespace ICSharpCode.Reports.Core.Exporter } - public ExporterPage SinglePage { + public ISinglePage SinglePage { get { return singlePage; } } + public SectionBounds SectionBounds { get { return sectionBounds; } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs index 3373aaaa18..fe3ee2d674 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs @@ -126,7 +126,7 @@ namespace SimpleExpressionEvaluator.Compilation.Functions.AggregateFunctions } } else { string str = String.Format ("<{0}> not found in AggregateFunction",data.ToString()); - throw new FieldNotFoundException(str); +// throw new FieldNotFoundException(str); } } return list; diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs index 07ffdb05eb..a94626164d 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs @@ -40,8 +40,7 @@ namespace SimpleExpressionEvaluator.Compilation.Functions.ReportingService if (item != null) { retval = item.Value.ToString(); } else { - retval= String.Format(System.Globalization.CultureInfo.InvariantCulture, - "!! Can't find <{0}> !! ",variable.VariableName); + retval = GlobalValues.UnkownFunctionMessage(variable.VariableName); } return retval; } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs index ce9eef915d..be798add86 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs @@ -6,22 +6,34 @@ using System.Drawing; using ICSharpCode.Reports.Core.BaseClasses; using ICSharpCode.Reports.Core.Events; using ICSharpCode.Reports.Core.Exporter; +using ICSharpCode.Reports.Expressions.ReportingLanguage; namespace ICSharpCode.Reports.Core.Interfaces { /// /// Description of IItemConverter. /// - public interface IBaseConverter - { - ExporterCollection Convert (BaseReportItem parent,BaseReportItem item); + /// + public interface IRenderer + { event EventHandler PageFull; event EventHandler SectionRendering; SectionBounds SectionBounds {get;} IDataNavigator DataNavigator {get;} Rectangle ParentRectangle {get;} - ExporterPage SinglePage {get;} + ISinglePage SinglePage {get;} ILayouter Layouter {get;} Graphics Graphics {get;set;} } + + public interface IBaseRenderer + { + void Render(ISimpleContainer container,ReportPageEventArgs rpea,IExpressionEvaluatorFacade evaluator); + } + + + public interface IBaseConverter:IRenderer + { + ExporterCollection Convert (BaseReportItem parent,BaseReportItem item); + } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs index 2e7c466ce8..9b29439419 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs @@ -86,9 +86,7 @@ namespace ICSharpCode.Reports.Core Rectangle r = StandardPrinter.RenderContainer(row,Evaluator,currentPosition,rpea); - currentPosition =PrintHelper.ConvertRectangleToCurentPosition (r); - -// currentPosition = new Point(parent.Location.X + row.Location.X,currentPosition.Y); + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); tableContainer.Location = saveLocation; Console.WriteLine("----"); diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs index 4110d2b498..fc3cf14635 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs @@ -155,12 +155,19 @@ namespace ICSharpCode.Reports.Core { rpea.PrintPageEventArgs.HasMorePages = false; return; } - + ITableContainer tableContainer = base.CurrentSection.Items[0] as ITableContainer; + IBaseRenderer r = PrintRendererFactory.CreateRenderer(base.CurrentSection.Items[0],nav,base.SinglePage,base.Layout,CurrentSection); + if ( r != null) { +// r.Render(tableContainer,rpea,Evaluator); + } + + // branch to render table's etc if (tableContainer != null) { + tableContainer.DataNavigator = nav; tableContainer.Parent = base.CurrentSection; if (rpea.SinglePage.PageNumber == 1) { @@ -175,7 +182,8 @@ namespace ICSharpCode.Reports.Core { this.ReportDocument.DetailsDone = true; } - else { + else + { // first element if (base.SinglePage.PageNumber ==1) { @@ -212,13 +220,6 @@ namespace ICSharpCode.Reports.Core { } } - - -// if (this.dataNavigator.CurrentRow % 2 == 0) { -// PrintHelper.DebugRectangle(rpea.PrintPageEventArgs.Graphics,r); -// } - - base.CurrentSection.SectionOffset = currentPosition.Y; rpea.LocationAfterDraw = new Point (rpea.LocationAfterDraw.X, diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderTable.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderTable.cs new file mode 100644 index 0000000000..69f0e25611 --- /dev/null +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderTable.cs @@ -0,0 +1,230 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 10.10.2010 + * Time: 17:37 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Drawing; +using ICSharpCode.Reports.Core.BaseClasses.Printing; +using ICSharpCode.Reports.Core.Interfaces; +using ICSharpCode.Reports.Expressions.ReportingLanguage; + +namespace ICSharpCode.Reports.Core +{ + /// + /// Description of RenderTable. + /// + public class RenderTable:IBaseRenderer + { + + IDataNavigator dataNavigator; + Rectangle parentRectangle; + ISinglePage singlePage; + ILayouter layouter; + ReportPageEventArgs reportPageEventArgs; + BaseSection currentSection; + + public RenderTable(IDataNavigator datanavigator,Rectangle parentRectangle,ISinglePage singlePage,ILayouter layouter,BaseSection section) + { + this.dataNavigator = datanavigator; + + this.parentRectangle = parentRectangle; + this.singlePage = singlePage; + this.layouter = layouter; + this.currentSection = section; + + } + + + public event EventHandler PageFull; + + public event EventHandler SectionRendering; + + + public void Render (ISimpleContainer table,ReportPageEventArgs rpea,IExpressionEvaluatorFacade evaluator) + { + if (this.dataNavigator.CurrentRow < 0 ) { + this.dataNavigator.MoveNext(); + } + this.reportPageEventArgs = rpea; + Point saveLocation = table.Location; + Rectangle pageBreakRect = Rectangle.Empty; + + Point currentPosition = new Point(PrintHelper.DrawingAreaRelativeToParent(this.currentSection,table).Location.X, + this.currentSection.Location.Y); + table.Items.SortByLocation(); + + Size rs = Size.Empty; + + + ISimpleContainer headerRow = null; + + var simpleContainer = table.Items[0] as ISimpleContainer; + +// foreach (BaseRowItem row in table.Items) +// { + rs = simpleContainer.Size; + PrintHelper.AdjustParent(table as BaseReportItem,table.Items); + +// if (PrintHelper.IsTextOnlyRow(simpleContainer) ) +// { + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,simpleContainer); + + var r = StandardPrinter.RenderContainer(simpleContainer,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + table.Location = saveLocation; +// } +// else { + //--------------- + simpleContainer = table.Items[1] as ISimpleContainer; + + int adjust = simpleContainer.Location.Y - saveLocation.Y; + simpleContainer.Location = new Point(simpleContainer.Location.X,simpleContainer.Location.Y - adjust - 3 * GlobalValues.GapBetweenContainer); + rs = simpleContainer.Size; + + do { + + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)table,currentPosition); + + if (PrintHelper.IsPageFull(pageBreakRect,this.SectionBounds)) { + Console.WriteLine("PageBreak - PageFull"); + table.Location = saveLocation; + AbstractRenderer.PageBreak(ReportPageEventArgs); + return; + } + + this.dataNavigator.Fill(simpleContainer.Items); + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,simpleContainer); + + r = StandardPrinter.RenderContainer(simpleContainer,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + simpleContainer.Size = rs; + } + while (this.dataNavigator.MoveNext()); + //----- +// } + } + + + + + public void old_Render (ISimpleContainer table,ReportPageEventArgs rpea,IExpressionEvaluatorFacade evaluator) + { + if (this.dataNavigator.CurrentRow < 0 ) { + this.dataNavigator.MoveNext(); + } + this.reportPageEventArgs = rpea; + Point saveLocation = table.Location; + Rectangle pageBreakRect = Rectangle.Empty; + + Point currentPosition = new Point(PrintHelper.DrawingAreaRelativeToParent(this.currentSection,table).Location.X, + this.currentSection.Location.Y); + table.Items.SortByLocation(); + + Size rs = Size.Empty; + + + + + foreach (BaseRowItem row in table.Items) + { + rs = row.Size; + PrintHelper.AdjustParent(table as BaseReportItem,table.Items); + + if (PrintHelper.IsTextOnlyRow(row) ) + { + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,row); + + Rectangle r = StandardPrinter.RenderContainer(row,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + table.Location = saveLocation; + } + else { + int adjust = row.Location.Y - saveLocation.Y; + row.Location = new Point(row.Location.X,row.Location.Y - adjust - 3 * GlobalValues.GapBetweenContainer); + rs = row.Size; + + do { + + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)table,currentPosition); + + if (PrintHelper.IsPageFull(parentRectangle,this.SectionBounds)) { + Console.WriteLine("PageBreak - PageFull"); + table.Location = saveLocation; + AbstractRenderer.PageBreak(ReportPageEventArgs); + return; + } + + this.dataNavigator.Fill(row.Items); + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,row); + + Rectangle r = StandardPrinter.RenderContainer(row,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + row.Size = rs; + } + while (this.dataNavigator.MoveNext()); + + } + + row.Size = rs; + } +// base.NotifyAfterPrint (rpea.LocationAfterDraw); + } + + + + public ICSharpCode.Reports.Core.BaseClasses.SectionBounds SectionBounds { + get { + return this.singlePage.SectionBounds; + } + } + + public IDataNavigator DataNavigator { + get { + return this.dataNavigator; + } + } + + public System.Drawing.Rectangle ParentRectangle { + get { + return this.parentRectangle; + } + } + + public ISinglePage SinglePage { + get { + return this.singlePage; + } + } + + public ILayouter Layouter { + get { + return this.layouter; + } + } + + public System.Drawing.Graphics Graphics {get;set;} + + + public ReportPageEventArgs ReportPageEventArgs { + get { return reportPageEventArgs; } + set { reportPageEventArgs = value; } + } + + } +} diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RendererFactory.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RendererFactory.cs new file mode 100644 index 0000000000..44668b4d5e --- /dev/null +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RendererFactory.cs @@ -0,0 +1,38 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 10.10.2010 + * Time: 17:28 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Drawing; +using ICSharpCode.Reports.Core.Interfaces; + +namespace ICSharpCode.Reports.Core +{ + /// + /// Description of RendererFactory. + /// + public class PrintRendererFactory + { + + public static IBaseRenderer CreateRenderer (BaseReportItem itemToConvert,IDataNavigator dataNavigator, + ISinglePage singlePage,ILayouter layouter,BaseSection section) + { + + Type t = itemToConvert.GetType(); + if (t.Equals(typeof(BaseTableItem))) { + Console.WriteLine("render Table"); + return new RenderTable(dataNavigator,Rectangle.Empty,singlePage,layouter,section); + } + + if (t.Equals(typeof(BaseRowItem))) { +// return new GroupedRowConverter (dataNavigator,singlePage,layouter); + Console.WriteLine("render Row"); + } + return null; + } + } +}