Browse Source

Arrange/ArrangeStrategy.cs handles recursive Containers

reports
Peter Forstmeier 12 years ago
parent
commit
2ade3a2716
  1. 131
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/ArrangeStrategy.cs
  2. 1
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/MeasurementStrategy.cs
  3. 1
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/ExportRenderer/FixedDocumentCreator.cs
  4. 8
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/DebugVisitor.cs
  5. 1
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Globals/MeasurementService.cs
  6. 13
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/DataPageBuilder.cs

131
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/ArrangeStrategy.cs

@ -7,9 +7,10 @@ @@ -7,9 +7,10 @@
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Collections.Generic;
using ICSharpCode.Reporting.Interfaces.Export;
namespace ICSharpCode.Reporting.Arrange
@ -19,78 +20,122 @@ namespace ICSharpCode.Reporting.Arrange @@ -19,78 +20,122 @@ namespace ICSharpCode.Reporting.Arrange
/// </summary>
///
public interface IArrangeStrategy
{
void Arrange(IExportColumn exportColumn);
}
{
void Arrange(IExportColumn exportColumn);
}
internal class ContainerArrangeStrategy:IArrangeStrategy
{
public void Arrange(IExportColumn exportColumn){
Console.WriteLine("Start arrange------");
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 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);
List<IExportColumn> canGrowItems = CreateCangrowList(container);
if (canGrowItems.Count > 0) {
var arSize = ArrangeInternal(container);
Console.WriteLine("Ret from arrange {0}",arSize);
container.DesiredSize = new Size(arSize.Width,arSize.Height);
}
}
Console.WriteLine("End arrange------");
}
static List<IExportColumn> CreateCangrowList(IExportContainer container)
{
var l1 = new List<IExportColumn>();
foreach (var element in container.Descendents()) {
if (element.CanGrow) {
l1.Add(element);
}
}
return l1;
}
static Size ArrangeInternal(IExportContainer container)
{
var result = container.DisplayRectangle;
Console.WriteLine();
Console.WriteLine("enter arrange for <{0}> with {1}",container.Name,result);
foreach (var element in container.ExportedItems) {
var con = element as IExportContainer;
if (con != null) {
Console.WriteLine("recursive");
con.DesiredSize = result.Size;
ArrangeInternal(con);
}
var testRext = new Rectangle(element.DisplayRectangle.Left + result.Left,
element.DisplayRectangle.Top + result.Top,
element.DesiredSize.Width,
element.DesiredSize.Height);
if (!result.Contains(testRext)) {
Console.WriteLine("No fit do arrange container {0} - elem {1}",result.Bottom,testRext.Bottom);
Console.WriteLine("{0} - {1}",result.Bottom,testRext.Bottom);
var r1 = Rectangle.Union(result,testRext);
result = new Rectangle(result.Left,
result.Top,
container.DisplayRectangle.Width,
element.DisplayRectangle.Size.Height);
Console.WriteLine("Union {0}",r1);
Console.WriteLine("{0} - {1}",result.Bottom,testRext.Bottom);
container.DesiredSize = result.Size;
} else {
container.DesiredSize = container.Size;
Console.WriteLine("Nothing to arrange {0} - {1}",result.Bottom,testRext.Bottom);
}
}
return result.Size;
}
/*
public void old_Arrange(IExportColumn exportColumn)
{
public void a_Arrange(IExportColumn exportColumn){
if (exportColumn == null)
throw new ArgumentNullException("exportColumn");
var container = exportColumn as IExportContainer;
if ((container != null) && (container.ExportedItems.Count > 0)) {
BiggestRectangle = FindBiggestRectangle(container);
var resizeable = from resize in container.ExportedItems
where ((resize.CanGrow))
select resize;
if (resizeable.Any()) {
if (!BiggestRectangle.IsEmpty) {
var containerRectangle = new Rectangle(container.Location,container.Size);
var desiredRectangle = Rectangle.Union(containerRectangle,BiggestRectangle);
container.DesiredSize = new Size(container.Size.Width,desiredRectangle.Size.Height + 5);
}
//minimun Location
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);
} else {
container.DesiredSize = container.Size;
}
}
}
*/
}
static class Extensions {
private Rectangle FindBiggestRectangle (IExportContainer container)
{
var rect = Rectangle.Empty;
foreach (var item in container.ExportedItems
.Where(item => item.DesiredSize.Height > BiggestRectangle.Size.Height))
{
rect = new Rectangle(new Point(container.Location.X + item.Location.X,
container.Location.Y + item.Location.Y)
,item.DesiredSize);
}
return rect;
public static IEnumerable<IExportColumn> Descendents(this IExportContainer node) {
if (node == null) throw new ArgumentNullException("node");
if(node.ExportedItems.Count > 0) {
foreach (var child in node.ExportedItems) {
var cont = child as IExportContainer;
if (cont != null) {
foreach (var desc in Descendents(cont)) {
yield return desc;
}
}
yield return child;
}
}
}
public Rectangle BiggestRectangle {get; private set;}
*/
}
}

1
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Arrange/MeasurementStrategy.cs

@ -32,7 +32,6 @@ namespace ICSharpCode.Reporting.Arrange @@ -32,7 +32,6 @@ namespace ICSharpCode.Reporting.Arrange
foreach (var element in items) {
if (element is IExportContainer) {
Console.WriteLine("Measure -> Container found");
Measure(element,graphics);
}
var tbi = element as IExportText;

1
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/ExportRenderer/FixedDocumentCreator.cs

@ -49,6 +49,7 @@ namespace ICSharpCode.Reporting.ExportRenderer @@ -49,6 +49,7 @@ namespace ICSharpCode.Reporting.ExportRenderer
public Canvas CreateContainer(ExportContainer container) {
var canvas = CreateCanvas(container);
Console.WriteLine("WPF Create Container with {0}",container.DesiredSize);
var size = container.DesiredSize.ToWpf();
canvas.Measure(size);
canvas.Arrange(new Rect(new Point(),size ));

8
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/DebugVisitor.cs

@ -22,26 +22,18 @@ namespace ICSharpCode.Reporting.Exporter.Visitors @@ -22,26 +22,18 @@ namespace ICSharpCode.Reporting.Exporter.Visitors
public override void Visit(ExportPage page)
{
Console.WriteLine();
Console.WriteLine("<Page> {0} - {1} Items {2}",
page.Name,page.Location,page.BackColor);
base.Visit(page);
}
public override void Visit(ExportContainer exportContainer)
{
Console.WriteLine();
Console.WriteLine("\t{0} - {1} Items {2}",
exportContainer.Name,exportContainer.Location,exportContainer.BackColor);
Console.WriteLine("\thas Child {0}",exportContainer.ExportedItems.Count);
base.Visit(exportContainer);
}
public override void Visit(ExportText exportColumn)
{
Console.WriteLine("\t\t<ExportText> {0} - {1}", exportColumn.Text,exportColumn.Location);
}
}
}

1
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Globals/MeasurementService.cs

@ -20,7 +20,6 @@ namespace ICSharpCode.Reporting.Globals @@ -20,7 +20,6 @@ namespace ICSharpCode.Reporting.Globals
public static Size Measure (IExportText item,Graphics graphics) {
Console.WriteLine("Measure {0}",item.Text);
if (!item.CanGrow) {
return item.Size;
}

13
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/DataPageBuilder.cs

@ -99,8 +99,8 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -99,8 +99,8 @@ namespace ICSharpCode.Reporting.PageBuilder
AdjustLocationInSection(sectionPosition, convertedItems);
var rr = new Rectangle(sectionContainer.DisplayRectangle.X,sectionContainer.DisplayRectangle.Y,sectionContainer.Size.Width,
sectionContainer.Size.Height + convertedItems[0].Size.Height );
// var rr = new Rectangle(sectionContainer.DisplayRectangle.X,sectionContainer.DisplayRectangle.Y,sectionContainer.Size.Width,
// sectionContainer.Size.Height + convertedItems[0].Size.Height );
// keep this for 'KeepTogether'
@ -143,9 +143,8 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -143,9 +143,8 @@ namespace ICSharpCode.Reporting.PageBuilder
sectionContainer.Location = pagePosition;
}
MeasureAndArrangeContainer(sectionContainer);
sectionContainer.ExportedItems.AddRange(convertedItems);
MeasureAndArrangeContainer(sectionContainer);
exportRows.Add(sectionContainer);
pagePosition = new Point(CurrentSection.Location.X, pagePosition.Y + sectionContainer.DesiredSize.Height + 1);
}
@ -160,7 +159,7 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -160,7 +159,7 @@ namespace ICSharpCode.Reporting.PageBuilder
CurrentPage = CreateNewPage();
WriteStandardSections();
CurrentLocation = DetailStart;
ResetPosition();
// ResetPosition();
}
@ -193,11 +192,11 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -193,11 +192,11 @@ namespace ICSharpCode.Reporting.PageBuilder
return false;
}
/*
Point ResetPosition () {
return new Point(DetailStart.X,1);
}
*/
static void AdjustLocationInSection(Point sectionPosition,List<IExportColumn> convertedItems)
{

Loading…
Cancel
Save