From b385ea69de8e509c3879a43f37951dfb3b3e414f Mon Sep 17 00:00:00 2001 From: Peter Forstmeier Date: Wed, 1 Jul 2015 20:24:06 +0200 Subject: [PATCH] Pdf from Rectangle and Circle as Container --- .../Src/Exporter/Visitors/AbstractVisitor.cs | 4 + .../Src/Pdf/PdfHelper.cs | 10 +-- .../Src/Pdf/PdfVisitor.cs | 81 +++++++++++++------ .../Src/Wpf/Visitor/WpfVisitor.cs | 18 ++--- 4 files changed, 73 insertions(+), 40 deletions(-) diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/AbstractVisitor.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/AbstractVisitor.cs index d6adb5c0f3..5852f3910c 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/AbstractVisitor.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/AbstractVisitor.cs @@ -100,5 +100,9 @@ namespace ICSharpCode.Reporting.Exporter.Visitors static protected bool IsGraphicsContainer (IExportColumn column) { return column is GraphicsContainer; } + + static protected IAcceptor AsAcceptor (IExportColumn element) { + return element as IAcceptor; + } } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfHelper.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfHelper.cs index 7b9345098a..9d9ff2fafd 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfHelper.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfHelper.cs @@ -57,9 +57,9 @@ namespace ICSharpCode.Reporting.Pdf - public static void DrawRectangle (IExportColumn column, XGraphics graphics) { - FillRectangle(column.DisplayRectangle,column.FrameColor,graphics); - } +// public static void DrawRectangle (IExportColumn column, XGraphics graphics) { +// FillRectangle(column.DisplayRectangle,column.FrameColor,graphics); +// } public static void FillRectangle(XRect rect,Color color,XGraphics graphics) { @@ -78,7 +78,7 @@ namespace ICSharpCode.Reporting.Pdf } - public static XPen CreateDashedPen(IExportGraphics exportRectangle) + public static XPen CreatePen(IExportGraphics exportRectangle) { var pen = PdfHelper.PdfPen(exportRectangle); pen.DashStyle = PdfHelper.DashStyle(exportRectangle); @@ -140,7 +140,7 @@ namespace ICSharpCode.Reporting.Pdf } - public static Point LocationRelToParent (ExportColumn column) { + public static Point LocationRelToParent (IExportColumn column) { return new Point(column.Parent.Location.X + column.Location.X, column.Parent.Location.Y + column.Location.Y); } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfVisitor.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfVisitor.cs index 5945431ccd..ff3116ee33 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfVisitor.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Pdf/PdfVisitor.cs @@ -37,13 +37,12 @@ namespace ICSharpCode.Reporting.Pdf XTextFormatter textFormatter; Point containerLocation; - public PdfVisitor(PdfDocument pdfDocument) - { + public PdfVisitor(PdfDocument pdfDocument){ this.pdfDocument = pdfDocument; } - public override void Visit(ExportPage page) - { + + public override void Visit(ExportPage page){ PdfPage = pdfDocument.AddPage(); xGraphics = XGraphics.FromPdfPage(PdfPage); textFormatter = new XTextFormatter(xGraphics); @@ -52,7 +51,6 @@ namespace ICSharpCode.Reporting.Pdf public override void Visit(ExportContainer exportContainer){ - foreach (var element in exportContainer.ExportedItems) { if (IsContainer(element)) { var container = element as ExportContainer; @@ -67,8 +65,7 @@ namespace ICSharpCode.Reporting.Pdf } - void RenderRow(IExportContainer container) - { + void RenderRow(IExportContainer container){ if (IsGraphicsContainer(container)) { RenderGraphicsContainer(container); } else { @@ -77,8 +74,7 @@ namespace ICSharpCode.Reporting.Pdf } - void RenderGraphicsContainer(IExportColumn column) - { + void RenderGraphicsContainer(IExportColumn column){ var graphicsContainer = column as GraphicsContainer; if (graphicsContainer != null) { var rect = column as ExportRectangle; @@ -97,8 +93,9 @@ namespace ICSharpCode.Reporting.Pdf void RenderDataRow (IExportContainer row) { var r = new Rectangle(containerLocation,row.DisplayRectangle.Size); PdfHelper.FillRectangle(r,row.BackColor,xGraphics); - foreach (IAcceptor element in row.ExportedItems) { - element.Accept(this); + foreach (var element in row.ExportedItems) { + var acceptor = element as IAcceptor; + acceptor.Accept(this); } } @@ -117,34 +114,72 @@ namespace ICSharpCode.Reporting.Pdf } - public override void Visit(ExportLine exportLine) { var columnLocation = containerLocation; columnLocation.Offset(exportLine.Location); - var pen = PdfHelper.CreateDashedPen(exportLine); + var pen = PdfHelper.CreatePen(exportLine); xGraphics.DrawLine(pen,columnLocation.ToXPoints(),new Point(exportLine.Size.Width,columnLocation.Y).ToXPoints()); } public override void Visit (ExportRectangle exportRectangle) { - var pen = PdfHelper.CreateDashedPen(exportRectangle); - xGraphics.DrawRectangle(pen, - PdfHelper.CreateBrush(exportRectangle.BackColor), - new XRect(containerLocation.ToXPoints(), - exportRectangle.Size.ToXSize())); + var savedLocation = containerLocation; + xGraphics.DrawRectangle(PdfHelper.CreatePen(exportRectangle), + PdfHelper.CreateBrush(exportRectangle.BackColor), + new XRect(containerLocation.ToXPoints(), + exportRectangle.Size.ToXSize())); + + if (exportRectangle.ExportedItems.Count > 0) { + /* + foreach (var element in exportRectangle.ExportedItems) { + if (IsGraphicsContainer(element)) { + var loc = new Point(containerLocation.X + element.Location.X, + containerLocation.Y + element.Location.Y); + + containerLocation =loc; + RenderGraphicsContainer(element); + containerLocation = savedLocation; + } else { + var acceptor = AsAcceptor(element); + acceptor.Accept(this); + } + } + */ + RenderContainerInternal(exportRectangle,savedLocation); + } } - + public override void Visit(ExportCircle exportCircle){ - var pen = PdfHelper.CreateDashedPen(exportCircle); + var savedLocation = containerLocation; + var pen = PdfHelper.CreatePen(exportCircle); xGraphics.DrawEllipse(pen, - PdfHelper.CreateBrush(exportCircle.BackColor) , - new XRect(containerLocation.ToXPoints(), - exportCircle.Size.ToXSize())); + PdfHelper.CreateBrush(exportCircle.BackColor) , + new XRect(containerLocation.ToXPoints(), + exportCircle.Size.ToXSize())); + if (exportCircle.ExportedItems.Count > 0) { + RenderContainerInternal (exportCircle,savedLocation); + } } + void RenderContainerInternal(IExportContainer graphicsContainer,Point savedLocation) + { + foreach (var element in graphicsContainer.ExportedItems) { + if (IsGraphicsContainer(element)) { + var loc = new Point(containerLocation.X + element.Location.X, + containerLocation.Y + element.Location.Y); + containerLocation = loc; + RenderGraphicsContainer(element); + containerLocation = savedLocation; + } else { + var acceptor = AsAcceptor(element); + acceptor.Accept(this); + } + } + } + public PdfPage PdfPage {get; private set;} } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/Visitor/WpfVisitor.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/Visitor/WpfVisitor.cs index fa030f9566..6a444012be 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/Visitor/WpfVisitor.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/Visitor/WpfVisitor.cs @@ -48,8 +48,7 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor fixedPage = FixedDocumentCreator.CreateFixedPage(page); FixedPage = fixedPage; foreach (var element in page.ExportedItems) { - var acceptor = element as IAcceptor; - acceptor.Accept(this); + AsAcceptor(element).Accept(this); fixedPage.Children.Add(sectionCanvas); } } @@ -68,8 +67,7 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor if (IsContainer(element)) { RenderRow(canvas, (IExportContainer)element); } else { - var acceptor = element as IAcceptor; - acceptor.Accept(this); + AsAcceptor(element).Accept(this); canvas.Children.Add(UIElement); } } @@ -78,8 +76,7 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor } - void RenderRow(Canvas canvas, IExportContainer container) - { + void RenderRow(Canvas canvas, IExportContainer container){ if (IsGraphicsContainer(container)) { canvas.Children.Add(RenderGraphicsContainer(container)); } else { @@ -154,7 +151,6 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor var visual = new DrawingVisual(); using (var dc = visual.RenderOpen()){ var iss = ToBitmapSource(exportImage.Image); - dc.DrawImage(iss,new Rect(exportImage.Location.ToWpf(), new Size(exportImage.DesiredSize.Width,exportImage.DesiredSize.Height))); } @@ -170,7 +166,6 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor stream.Position = 0; BitmapImage result = new BitmapImage(); result.BeginInit(); - result.CacheOption = BitmapCacheOption.OnLoad; result.StreamSource = stream; result.EndInit(); @@ -193,8 +188,7 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor elementCanvas = RenderGraphicsContainer(element); containerCanvas.Children.Add(elementCanvas); } else { - var acceptor = element as IAcceptor; - acceptor.Accept(this); + AsAcceptor(element).Accept(this); containerCanvas.Children.Add(UIElement); } containerCanvas.UpdateLayout(); @@ -204,6 +198,7 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor UIElement = border; } + public override void Visit(ExportLine exportLine){ var pen = FixedDocumentCreator.CreateWpfPen(exportLine); @@ -230,8 +225,7 @@ namespace ICSharpCode.Reporting.WpfReportViewer.Visitor Canvas CreateItemsInContainer (List items) { var canvas = new Canvas(); foreach (var element in items) { - var acceptor = element as IAcceptor; - acceptor.Accept(this); + AsAcceptor(element).Accept(this); canvas.Children.Add(UIElement); } return canvas;