From 770eef87c68cd18f714f99e11d749154c6c8fb5e Mon Sep 17 00:00:00 2001 From: Peter Forstmeier Date: Mon, 2 Sep 2013 20:28:05 +0200 Subject: [PATCH] Use FormattedText to measure Text. --- .../ICSharpCode.Reporting.csproj | 1 + .../Src/Arrange/ArrangeStrategy.cs | 28 +++++- .../Src/Arrange/MeasurementStrategy.cs | 4 +- .../Src/BaseClasses/ExtensionMethods.cs | 94 +++++++++++++++++++ .../ExportRenderer/FixedDocumentCreator.cs | 71 ++++++++++---- .../Src/Exporter/WpfExporter.cs | 2 +- .../Src/Globals/MeasurementService.cs | 9 +- .../Src/Interfaces/Export/IExportContainer.cs | 1 - .../Src/PageBuilder/BasePageBuilder.cs | 20 ++-- .../Converter/ContainerConverter.cs | 30 +++--- .../Converter/IContainerConverter.cs | 8 +- .../Src/PageBuilder/DataPageBuilder.cs | 11 +-- .../PageBuilder/ExportColumns/ExportColumn.cs | 3 +- .../Src/Wpf/PreviewViewModel.cs | 3 +- .../ContainerArrangeStrategyFixture.cs | 86 +++++++++++------ .../PageBuilder/ContainerConverterFixture.cs | 15 +-- 16 files changed, 288 insertions(+), 98 deletions(-) create mode 100644 src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/BaseClasses/ExtensionMethods.cs diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj index 9f3d847afa..300cd0f690 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj @@ -76,6 +76,7 @@ + diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/ArrangeStrategy.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/ArrangeStrategy.cs index 13970d4264..eeb06e2f72 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/ArrangeStrategy.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/ArrangeStrategy.cs @@ -30,8 +30,32 @@ namespace ICSharpCode.Reporting.Arrange { } + + public void Arrange(IExportColumn exportColumn){ + if (exportColumn == null) + throw new ArgumentNullException("exportColumn"); + var container = exportColumn as IExportContainer; + if ((container != null) && (container.ExportedItems.Count > 0)) { + var resizeable = from resize in container.ExportedItems + where ((resize.CanGrow)) + select resize; + if (resizeable.Any()) { + + //minimun Location +// var minLocation = (from p in container.ExportedItems orderby p.Location.Y select p).First(); + var maxLocation = (from p in container.ExportedItems orderby p.Location.Y select p).Last(); + // maximum Size + var maxBottom = (from p in container.ExportedItems orderby p.DisplayRectangle.Bottom select p).Last(); + container.DesiredSize = new Size(container.Size.Width,maxLocation.Location.Y + maxBottom.DesiredSize.Height + 5); - public void Arrange(IExportColumn exportColumn) + } else { + container.DesiredSize = container.Size; + } + } + } + + + public void old_Arrange(IExportColumn exportColumn) { if (exportColumn == null) throw new ArgumentNullException("exportColumn"); @@ -54,6 +78,8 @@ namespace ICSharpCode.Reporting.Arrange } } + + private Rectangle FindBiggestRectangle (IExportContainer container) { var rect = Rectangle.Empty; diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/MeasurementStrategy.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/MeasurementStrategy.cs index a5f45f3465..ff77a9124f 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/MeasurementStrategy.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/MeasurementStrategy.cs @@ -35,13 +35,13 @@ namespace ICSharpCode.Reporting.Arrange if (tbi != null) { element.DesiredSize = MeasurementService.Measure(tbi,graphics); } - Console.WriteLine("Measure -> {0} - {1}",element.Size,element.DesiredSize); } return exportColumn.DesiredSize; } } - internal class TextBasedMeasurementStrategy:IMeasurementStrategy + + class TextBasedMeasurementStrategy:IMeasurementStrategy { public Size Measure(IExportColumn exportColumn, Graphics graphics) diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/BaseClasses/ExtensionMethods.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/BaseClasses/ExtensionMethods.cs new file mode 100644 index 0000000000..ccf57c0e23 --- /dev/null +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/BaseClasses/ExtensionMethods.cs @@ -0,0 +1,94 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media; +namespace ICSharpCode.Reporting.BaseClasses +{ + /// + /// Description of ExtensionMethodes. + /// Copy from D:\git_Sharpdevelop_Reporting\src\AddIns\Misc\Reports\ICSharpCode.Reports.Core\Project\WPF\ExtensionMethodes.cs + /// + /// (this IEnumerable input, Action action) + { + if (input == null) + throw new ArgumentNullException("input"); + foreach (T element in input) { + action(element); + } + } + + #endregion + + #region system.drawing -> Wpf + + public static Point ToWpf(this System.Drawing.Point p) + { + return new Point(p.X, p.Y); + } + + public static Size ToWpf(this System.Drawing.Size s) + { + return new Size(s.Width, s.Height); + } + + public static Rect ToWpf(this System.Drawing.Rectangle rect) + { + return new Rect(rect.Location.ToWpf(), rect.Size.ToWpf()); + } + + public static System.Windows.Media.Color ToWpf(this System.Drawing.Color c) + { + return System.Windows.Media.Color.FromArgb(c.A, c.R, c.G, c.B); + } + + #endregion + + #region DPI independence + public static Rect TransformToDevice(this Rect rect, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return Rect.Transform(rect, matrix); + } + + public static Rect TransformFromDevice(this Rect rect, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return Rect.Transform(rect, matrix); + } + + public static Size TransformToDevice(this Size size, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return new Size(size.Width * matrix.M11, size.Height * matrix.M22); + } + + public static Size TransformFromDevice(this Size size, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return new Size(size.Width * matrix.M11, size.Height * matrix.M22); + } + + public static Point TransformToDevice(this Point point, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return new Point(point.X * matrix.M11, point.Y * matrix.M22); + } + + public static Point TransformFromDevice(this Point point, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return new Point(point.X * matrix.M11, point.Y * matrix.M22); + } + #endregion + + + } +} diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/ExportRenderer/FixedDocumentCreator.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/ExportRenderer/FixedDocumentCreator.cs index ee1f4b6a34..bf8db9fe20 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/ExportRenderer/FixedDocumentCreator.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/ExportRenderer/FixedDocumentCreator.cs @@ -7,6 +7,7 @@ * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; +using System.Globalization; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; @@ -19,6 +20,7 @@ using Brush = System.Windows.Media.Brush; using FontFamily = System.Windows.Media.FontFamily; using Pen = System.Windows.Media.Pen; using Size = System.Windows.Size; +using ICSharpCode.Reporting.BaseClasses; namespace ICSharpCode.Reporting.ExportRenderer { @@ -37,9 +39,12 @@ namespace ICSharpCode.Reporting.ExportRenderer public UIElement CreateFixedPage(ExportPage exportPage) { var fixedPage = new FixedPage(); - fixedPage.Width = exportPage.Size.Width; - fixedPage.Height = exportPage.Size.Height; - fixedPage.Background = ConvertBrush(System.Drawing.Color.Blue); + + fixedPage.Width = exportPage.Size.ToWpf().Width; + fixedPage.Height = exportPage.Size.ToWpf().Height; + +// fixedPage.Background = ConvertBrush(System.Drawing.Color.Blue); + fixedPage.Background = new SolidColorBrush(System.Drawing.Color.Blue.ToWpf()); return fixedPage; } @@ -47,15 +52,13 @@ namespace ICSharpCode.Reporting.ExportRenderer public UIElement CreateContainer(ExportContainer container) { var canvas = CreateCanvas(container); - - var size = new Size(container.DesiredSize.Width,container.DesiredSize.Height); - + var size = container.DesiredSize.ToWpf(); canvas.Measure(size); canvas.Arrange(new Rect(new Point(),size )); canvas.UpdateLayout(); - + return canvas; } @@ -64,28 +67,30 @@ namespace ICSharpCode.Reporting.ExportRenderer public TextBlock CreateTextBlock(ExportText exportText) { var textBlock = new TextBlock(); - -// textBlock.Text = exportText.Text; - textBlock.Width = exportText.DesiredSize.Width; - textBlock.Height = exportText.DesiredSize.Height; - + textBlock.Foreground = ConvertBrush(exportText.ForeColor); +// textBlock.Background = ConvertBrush(exportText.BackColor); + textBlock.Background = ConvertBrush(System.Drawing.Color.LightGray); + SetFont(textBlock,exportText); - textBlock.Background = ConvertBrush(exportText.BackColor); textBlock.TextWrapping = TextWrapping.WrapWithOverflow; -// textBlock.TextWrapping = TextWrapping.NoWrap; + string [] inlines = exportText.Text.Split(System.Environment.NewLine.ToCharArray()); - //string [] inlines = "jmb,.n,knn-.n.-n.n-.n.n.-"; + for (int i = 0; i < inlines.Length; i++) { if (inlines[i].Length > 0) { textBlock.Inlines.Add(new Run(inlines[i])); - textBlock.Inlines.Add(new LineBreak()); + textBlock.Inlines.Add(new LineBreak()); } } var li = textBlock.Inlines.LastInline; textBlock.Inlines.Remove(li); -// SetDimension(textBlock,exportText.StyleDecorator); + + var s = MeasureTextInWpf(exportText); + textBlock.Width = s.Width; + textBlock.Height = s.Height; + // textBlock.Background = ConvertBrush(exportText.StyleDecorator.BackColor); // SetContendAlignment(textBlock,exportText.StyleDecorator); @@ -93,6 +98,32 @@ namespace ICSharpCode.Reporting.ExportRenderer } + Size MeasureTextInWpf(ExportText exportText) + { + + FormattedText ft = new FormattedText(exportText.Text, + CultureInfo.CurrentCulture, + System.Windows.FlowDirection.LeftToRight, + new Typeface(exportText.Font.FontFamily.Name), + exportText.Font.Size, +// System.Windows.Media.Brushes.Black, + new SolidColorBrush(exportText.ForeColor.ToWpf()), + + null, + TextFormattingMode.Display); + + ft.MaxTextWidth = exportText.Size.Width * 96.0 / 72.0; + ft.MaxTextHeight = Double.MaxValue ; + + ft.SetFontSize(exportText.Font.Size * 96.0 / 72.0); + + var ss = new Size { + Width = ft.WidthIncludingTrailingWhitespace, + Height = ft.Height}; + return ss; + } + + Canvas CreateCanvas(ExportContainer container) { var canvas = new Canvas(); @@ -126,9 +157,11 @@ namespace ICSharpCode.Reporting.ExportRenderer void SetFont(TextBlock textBlock,IExportText exportText) { textBlock.FontFamily = new FontFamily(exportText.Font.FontFamily.Name); - - textBlock.FontSize = exportText.Font.Size * 96/72; + +//http://www.codeproject.com/Articles/441009/Drawing-Formatted-Text-in-a-Windows-Forms-Applicat +textBlock.FontSize = exportText.Font.Size * 96/72; + if (exportText.Font.Bold) { textBlock.FontWeight = FontWeights.Bold; } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/WpfExporter.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/WpfExporter.cs index 9e91576ea1..f838566082 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/WpfExporter.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/WpfExporter.cs @@ -12,7 +12,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Markup; - +using ICSharpCode.Reporting.BaseClasses; using ICSharpCode.Reporting.Exporter.Visitors; using ICSharpCode.Reporting.Interfaces.Export; using ICSharpCode.Reporting.PageBuilder.ExportColumns; diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Globals/MeasurementService.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Globals/MeasurementService.cs index 3e8499f3e9..17208e050b 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Globals/MeasurementService.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Globals/MeasurementService.cs @@ -27,11 +27,16 @@ namespace ICSharpCode.Reporting.Globals if (!item.CanGrow) { return item.Size; } + + var sf = new StringFormat(); + sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces; if (!String.IsNullOrEmpty(item.Text)) { SizeF size = graphics.MeasureString(item.Text.TrimEnd(), item.Font, - item.Size.Width); - var i = (int)size.Height/item.Font.Height; + item.Size.Width,sf); + +// var i = (int)size.Height/item.Font.Height; +// var x = i * item.Font.Height; if (size.Height < item.Size.Height) { return item.Size; } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Interfaces/Export/IExportContainer.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Interfaces/Export/IExportContainer.cs index ba7732a5b2..afb6e4c978 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Interfaces/Export/IExportContainer.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Interfaces/Export/IExportContainer.cs @@ -8,7 +8,6 @@ */ using System; using System.Collections.Generic; -using ICSharpCode.Reporting.PageBuilder.ExportColumns; namespace ICSharpCode.Reporting.Interfaces.Export { diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/BasePageBuilder.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/BasePageBuilder.cs index 4ab934cc5e..628412c8fb 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/BasePageBuilder.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/BasePageBuilder.cs @@ -7,6 +7,7 @@ * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; using System.Linq; @@ -58,7 +59,7 @@ namespace ICSharpCode.Reporting.PageBuilder protected void BuildPageHeader() { var pageHeader = CreateSection(ReportModel.PageHeader,CurrentLocation); - DetailStart = new Point(ReportModel.ReportSettings.LeftMargin,pageHeader.Location.Y + pageHeader.Size.Height +1); + DetailStart = new Point(ReportModel.ReportSettings.LeftMargin,pageHeader.Location.Y + pageHeader.DesiredSize.Height +1); AddSectionToPage(pageHeader); } @@ -101,16 +102,11 @@ namespace ICSharpCode.Reporting.PageBuilder } - protected bool PageFull(System.Collections.Generic.List columns) + protected bool PageFull(List columns) { var rectToPrint = new Rectangle(columns[0].Location,columns[0].Size); var rr = new Rectangle(new Point(columns[0].Location.X + DetailsRectangle.Location.X,columns[0].Location.Y + DetailsRectangle.Location.Y), columns[0].Size); - Console.WriteLine("------{0} - {1} - {2}",rectToPrint.ToString(),rr.ToString(),DetailEnds.Y); -// if (rectToPrint.Bottom > DetailEnds.Y) { -// Console.WriteLine("----------PageBreak---"); -// return true; -// } if (!DetailsRectangle.Contains(rr)) { return true; } @@ -140,9 +136,13 @@ namespace ICSharpCode.Reporting.PageBuilder protected IExportContainer CreateSection(IReportContainer container,Point location) { var containerConverter = new ContainerConverter(Graphics, location); - var convertedContainer = containerConverter.Convert(container); + var convertedContainer = containerConverter.ConvertToExportContainer(container); - var list = containerConverter.CreateConvertedList(container,convertedContainer); + var list = containerConverter.CreateConvertedList(container.Items); + + convertedContainer.ExportedItems.AddRange(list); + + containerConverter.SetParent(convertedContainer,list); convertedContainer.ExportedItems.AddRange(list); convertedContainer.DesiredSize = MeasureElement(convertedContainer); @@ -151,6 +151,8 @@ namespace ICSharpCode.Reporting.PageBuilder } + + protected void AddSectionToPage(IExportContainer header) { header.Parent = CurrentPage; diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/ContainerConverter.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/ContainerConverter.cs index ae362e42d0..188a35c266 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/ContainerConverter.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/ContainerConverter.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.Reporting.PageBuilder.Converter } - public virtual IExportContainer Convert(IReportContainer reportContainer) + public virtual IExportContainer ConvertToExportContainer(IReportContainer reportContainer) { var exportContainer = (ExportContainer)reportContainer.CreateExportColumn(); exportContainer.Location = CurrentLocation; @@ -40,33 +40,33 @@ namespace ICSharpCode.Reporting.PageBuilder.Converter } - public List CreateConvertedList(IReportContainer reportContainer, + public List CreateConvertedList(List items, Point position){ - - var itemsList = new List(); - foreach (var item in reportContainer.Items) { - var exportColumn = ExportColumnFactory.CreateItem(item); -// exportColumn.Parent = exportContainer; - exportColumn.Location = new Point(item.Location.X,item.Location.Y + position.Y); - itemsList.Add(exportColumn); + var list = CreateConvertedList(items); + foreach (var item in list) { + item.Location = new Point(item.Location.X,item.Location.Y + position.Y); } - return itemsList; + return list; } - public List CreateConvertedList(IReportContainer reportContainer - ,IExportContainer exportContainer){ - Console.WriteLine("CreateConvertedList {0}",reportContainer.Name); + public List CreateConvertedList(List items){ var itemsList = new List(); - foreach (var element in reportContainer.Items) { + foreach (var element in items) { var exportColumn = ExportColumnFactory.CreateItem(element); - exportColumn.Parent = exportContainer; itemsList.Add(exportColumn); } return itemsList; } + public void SetParent(IExportContainer parent, List convertedItems) + { + foreach (var item in convertedItems) { + item.Parent = parent; + } + } + internal IReportContainer Container { get; private set; } protected Point CurrentLocation { get; set; } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/IContainerConverter.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/IContainerConverter.cs index 7613e971b5..acf3030ef1 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/IContainerConverter.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/Converter/IContainerConverter.cs @@ -17,9 +17,9 @@ namespace ICSharpCode.Reporting.PageBuilder.Converter { internal interface IContainerConverter { - IExportContainer Convert(IReportContainer reportContainer); - List CreateConvertedList(IReportContainer reportContainer,IExportContainer exportContainer); - - List CreateConvertedList(IReportContainer reportContainer,Point position); + IExportContainer ConvertToExportContainer(IReportContainer reportContainer); + List CreateConvertedList(List items); + List CreateConvertedList(List items,Point position); + void SetParent(IExportContainer parent, List convertedItems); } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/DataPageBuilder.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/DataPageBuilder.cs index ed85292efa..21bb54ae6e 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/DataPageBuilder.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/DataPageBuilder.cs @@ -65,8 +65,8 @@ namespace ICSharpCode.Reporting.PageBuilder detail.Parent = CurrentPage; do { collectionSource.Fill(CurrentSection.Items); - var convertedItems = converter.CreateConvertedList(ReportModel.DetailSection,position); - SetParentToSection(detail,convertedItems); + var convertedItems = converter.CreateConvertedList(ReportModel.DetailSection.Items,position); + converter.SetParent(detail,convertedItems); if (PageFull(convertedItems)) { detail.ExportedItems.AddRange(convertedItems); CurrentPage.ExportedItems.Insert(2,detail); @@ -98,12 +98,7 @@ namespace ICSharpCode.Reporting.PageBuilder } - void SetParentToSection(IExportContainer detail, List convertedItems) - { - foreach (var item in convertedItems) { - item.Parent = detail; - } - } + /* void row_BuildDetail() diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/ExportColumns/ExportColumn.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/ExportColumns/ExportColumn.cs index 5c630d8d53..28c00c5862 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/ExportColumns/ExportColumn.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/ExportColumns/ExportColumn.cs @@ -45,7 +45,8 @@ namespace ICSharpCode.Reporting.PageBuilder.ExportColumns public Rectangle DisplayRectangle { get { - return new Rectangle(Location,Size); +// return new Rectangle(Location,Size); + return new Rectangle(Location,DesiredSize); } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/PreviewViewModel.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/PreviewViewModel.cs index f5d2c39bea..f09dc416d2 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/PreviewViewModel.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Wpf/PreviewViewModel.cs @@ -44,7 +44,8 @@ namespace ICSharpCode.Reporting.WpfReportViewer { var document = new FixedDocument(); var s = document.DocumentPaginator.PageSize; - document.DocumentPaginator.PageSize = new System.Windows.Size(reportSettings.PageSize.Width, reportSettings.PageSize.Height); + document.DocumentPaginator.PageSize = new System.Windows.Size(reportSettings.PageSize.Width, + reportSettings.PageSize.Height); return document; } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/MeasureArrange/ContainerArrangeStrategyFixture.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/MeasureArrange/ContainerArrangeStrategyFixture.cs index c59921aeab..8211e384cd 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/MeasureArrange/ContainerArrangeStrategyFixture.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/MeasureArrange/ContainerArrangeStrategyFixture.cs @@ -8,6 +8,8 @@ */ using System; using System.Drawing; +using System.Linq; + using ICSharpCode.Reporting.Arrange; using ICSharpCode.Reporting.Globals; using ICSharpCode.Reporting.Interfaces.Export; @@ -31,41 +33,34 @@ namespace ICSharpCode.Reporting.Test.MeasureArrange Assert.That(param.Size, Is.EqualTo(size)); } + [Test] public void ItemAtTopOfContainer() { var container = CreateContainer(); - container.ExportedItems[0].Location = container.Location; + + container.ExportedItems[0].Location = Point.Empty; Measure(container); strategy.Arrange(container); var containerRect = new Rectangle(container.Location,container.DesiredSize); - var itemRect = new Rectangle(container.ExportedItems[0].Location,container.ExportedItems[0].Size); - - Assert.That(containerRect.Contains(itemRect)); + + var arrangedRect = CreateItemRectangle(container); + Assert.That(containerRect.Contains(arrangedRect)); } - [Test] - public void ContainerResizeIfItemCanGrow () { - + public void ContainerNotResizeIfCanGrowEqualFalse () { var container = CreateContainer(); -// MakeCangGrow(container); Measure(container); strategy.Arrange(container); - strategy.Arrange(container); - var containerRect = new Rectangle(container.Location,container.DesiredSize); - - var child = container.ExportedItems[0]; - var childLocation = new Point(containerRect.Left + child.Location.X,containerRect.Top + child.Location.Y); - var childRect = new Rectangle(childLocation,child.DesiredSize); - Assert.That(containerRect.Contains(childRect)); + Assert.That(container.Size,Is.EqualTo(container.DesiredSize)); } [Test] - public void ContainerIs_5_Below_LargestItem() { + public void ContainerResizeIfItemCanGrow () { var container = CreateContainer(); MakeCangGrow(container); @@ -74,10 +69,8 @@ namespace ICSharpCode.Reporting.Test.MeasureArrange var containerRect = new Rectangle(container.Location,container.DesiredSize); - var child = container.ExportedItems[0]; - var childLocation = new Point(containerRect.Left + child.Location.X,containerRect.Top + child.Location.Y); - var childRect = new Rectangle(childLocation,child.DesiredSize); - Assert.That(containerRect.Bottom,Is.EqualTo(childRect.Bottom + 5)); + var arrangedRect = CreateItemRectangle(container); + Assert.That(containerRect.Contains(arrangedRect)); } @@ -88,11 +81,46 @@ namespace ICSharpCode.Reporting.Test.MeasureArrange Measure(container); strategy.Arrange(container); var containerRect = new Rectangle(container.Location,container.DesiredSize); - var arrangeRect = new Rectangle(new Point(container.Location.X + strategy.BiggestRectangle.Left, - strategy.BiggestRectangle.Top), - strategy.BiggestRectangle.Size); + var item = container.ExportedItems[0]; + + var arrangedRect = CreateItemRectangle(container); + + Assert.That(containerRect.Bottom,Is.EqualTo(arrangedRect.Bottom + 5)); + } + + + [Test] + public void ContainerContainsTwoItems_OneCanGrow () { + var container = CreateContainer(); + var item1 = new ExportText(){ + CanGrow = true, + Name = "Item1", + Location = new Point(80,20), + Size = new Size (60,70), + Parent = container + }; + container.ExportedItems.Add(item1); - Assert.That(containerRect.Bottom,Is.EqualTo(arrangeRect.Bottom + 5)); + Measure(container); + strategy.Arrange(container); + + foreach (var element in container.ExportedItems) { + var arrangedRect = new Rectangle(container.Location.X + element.Location.X,container.Location.Y + element.Location.Y, + element.Size.Width,element.Size.Height); + + Assert.That(container.DisplayRectangle.IntersectsWith(arrangedRect)); + Assert.That(container.DisplayRectangle.Contains(arrangedRect)); + } + } + + + Rectangle CreateItemRectangle(IExportContainer container) + { + var containerRect = new Rectangle(container.Location,container.DesiredSize); + var child = container.ExportedItems[0]; + var childLocation = new Point(containerRect.Left + child.Location.X, containerRect.Top + child.Location.Y); + var childRect = new Rectangle(childLocation, child.DesiredSize); + return childRect; } @@ -104,20 +132,22 @@ namespace ICSharpCode.Reporting.Test.MeasureArrange } + void Measure(IExportColumn container) { var mes = container.MeasurementStrategy(); - mes.Measure(container, graphics); + container.DesiredSize = mes.Measure(container, graphics); } + IExportContainer CreateContainer () { - + var container = new ExportContainer(){ Size = new Size (720,60), Location = new Point(50,50), Name ="Section" }; - + var item1 = new ExportText(){ Name = "Item1", Location = new Point(10,10), @@ -128,7 +158,7 @@ namespace ICSharpCode.Reporting.Test.MeasureArrange container.ExportedItems.Add(item1); return container; } - + [TestFixtureSetUp] public void Init() { diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/ContainerConverterFixture.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/ContainerConverterFixture.cs index 58361cd914..5ba2cde5ce 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/ContainerConverterFixture.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/ContainerConverterFixture.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.Reporting.Test.PageBuilder [Test] public void ConverterReturnExportContainer() { var converter = new ContainerConverter(graphics,new Point(30,30)); - var result = converter.Convert(container); + var result = converter.ConvertToExportContainer(container); Assert.That(result,Is.InstanceOf(typeof(IExportContainer))); } @@ -34,8 +34,8 @@ namespace ICSharpCode.Reporting.Test.PageBuilder public void ConverterReturnExportContainerwithTwoItems() { var converter = new ContainerConverter(graphics,new Point(30,30)); - var result = converter.Convert(container); - var list = converter.CreateConvertedList(container,new Point(30,30)); + var result = converter.ConvertToExportContainer(container); + var list = converter.CreateConvertedList(container.Items,new Point(30,30)); result.ExportedItems.AddRange(list); Assert.That(result.ExportedItems.Count,Is.EqualTo(2)); } @@ -45,15 +45,18 @@ namespace ICSharpCode.Reporting.Test.PageBuilder public void LocationIsAdjusted() { var location = new Point(30,30); var converter = new ContainerConverter(graphics,location); - var result = converter.Convert(container); + var result = converter.ConvertToExportContainer(container); Assert.That(result.Location,Is.EqualTo(location)); } [Test] public void ParentInChildsIsSet () { var converter = new ContainerConverter(graphics,container.Location); - var result = converter.Convert(container); - foreach (var element in result.ExportedItems) { + var convertedContainer = converter.ConvertToExportContainer(container); + var convertedList = converter.CreateConvertedList(container.Items); + converter.SetParent(convertedContainer,convertedList); + convertedContainer.ExportedItems.AddRange(convertedList); + foreach (var element in convertedContainer.ExportedItems) { Assert.That(element.Parent,Is.Not.Null); } }