Browse Source

Arrange/ArrangeStrategy.cs handles recursive Containers

reports
Peter Forstmeier 12 years ago
parent
commit
2ade3a2716
  1. 129
      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

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

@ -7,9 +7,10 @@
* To change this template use Tools | Options | Coding | Edit Standard Headers. * To change this template use Tools | Options | Coding | Edit Standard Headers.
*/ */
using System; using System;
using System.Collections;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using System.Collections.Generic;
using ICSharpCode.Reporting.Interfaces.Export; using ICSharpCode.Reporting.Interfaces.Export;
namespace ICSharpCode.Reporting.Arrange namespace ICSharpCode.Reporting.Arrange
@ -19,78 +20,122 @@ namespace ICSharpCode.Reporting.Arrange
/// </summary> /// </summary>
/// ///
public interface IArrangeStrategy public interface IArrangeStrategy
{ {
void Arrange(IExportColumn exportColumn); void Arrange(IExportColumn exportColumn);
} }
internal class ContainerArrangeStrategy:IArrangeStrategy internal class ContainerArrangeStrategy:IArrangeStrategy
{ {
public void Arrange(IExportColumn exportColumn){ public void Arrange(IExportColumn exportColumn){
Console.WriteLine("Start arrange------");
if (exportColumn == null) if (exportColumn == null)
throw new ArgumentNullException("exportColumn"); throw new ArgumentNullException("exportColumn");
var container = exportColumn as IExportContainer; var container = exportColumn as IExportContainer;
if ((container != null) && (container.ExportedItems.Count > 0)) { if ((container != null) && (container.ExportedItems.Count > 0)) {
var resizeable = from resize in container.ExportedItems
where ((resize.CanGrow))
select resize;
if (resizeable.Any()) {
//minimun Location List<IExportColumn> canGrowItems = CreateCangrowList(container);
var maxLocation = (from p in container.ExportedItems orderby p.Location.Y select p).Last(); if (canGrowItems.Count > 0) {
// maximum Size var arSize = ArrangeInternal(container);
var maxBottom = (from p in container.ExportedItems orderby p.DisplayRectangle.Bottom select p).Last(); Console.WriteLine("Ret from arrange {0}",arSize);
container.DesiredSize = new Size(container.Size.Width,maxLocation.Location.Y + maxBottom.DesiredSize.Height + 5); 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 { } 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) if (exportColumn == null)
throw new ArgumentNullException("exportColumn"); throw new ArgumentNullException("exportColumn");
var container = exportColumn as IExportContainer; var container = exportColumn as IExportContainer;
if ((container != null) && (container.ExportedItems.Count > 0)) { if ((container != null) && (container.ExportedItems.Count > 0)) {
BiggestRectangle = FindBiggestRectangle(container);
var resizeable = from resize in container.ExportedItems var resizeable = from resize in container.ExportedItems
where ((resize.CanGrow)) where ((resize.CanGrow))
select resize; select resize;
if (resizeable.Any()) { if (resizeable.Any()) {
if (!BiggestRectangle.IsEmpty) {
var containerRectangle = new Rectangle(container.Location,container.Size); //minimun Location
var desiredRectangle = Rectangle.Union(containerRectangle,BiggestRectangle); var maxLocation = (from p in container.ExportedItems orderby p.Location.Y select p).Last();
container.DesiredSize = new Size(container.Size.Width,desiredRectangle.Size.Height + 5); // 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)
{ public static IEnumerable<IExportColumn> Descendents(this IExportContainer node) {
var rect = Rectangle.Empty; if (node == null) throw new ArgumentNullException("node");
if(node.ExportedItems.Count > 0) {
foreach (var item in container.ExportedItems foreach (var child in node.ExportedItems) {
.Where(item => item.DesiredSize.Height > BiggestRectangle.Size.Height)) var cont = child as IExportContainer;
{ if (cont != null) {
rect = new Rectangle(new Point(container.Location.X + item.Location.X, foreach (var desc in Descendents(cont)) {
container.Location.Y + item.Location.Y) yield return desc;
,item.DesiredSize); }
} }
return rect; 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
foreach (var element in items) { foreach (var element in items) {
if (element is IExportContainer) { if (element is IExportContainer) {
Console.WriteLine("Measure -> Container found");
Measure(element,graphics); Measure(element,graphics);
} }
var tbi = element as IExportText; var tbi = element as IExportText;

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

@ -49,6 +49,7 @@ namespace ICSharpCode.Reporting.ExportRenderer
public Canvas CreateContainer(ExportContainer container) { public Canvas CreateContainer(ExportContainer container) {
var canvas = CreateCanvas(container); var canvas = CreateCanvas(container);
Console.WriteLine("WPF Create Container with {0}",container.DesiredSize);
var size = container.DesiredSize.ToWpf(); var size = container.DesiredSize.ToWpf();
canvas.Measure(size); canvas.Measure(size);
canvas.Arrange(new Rect(new Point(),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
public override void Visit(ExportPage page) public override void Visit(ExportPage page)
{ {
Console.WriteLine();
Console.WriteLine("<Page> {0} - {1} Items {2}",
page.Name,page.Location,page.BackColor);
base.Visit(page); base.Visit(page);
} }
public override void Visit(ExportContainer exportContainer) 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); base.Visit(exportContainer);
} }
public override void Visit(ExportText exportColumn) 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
public static Size Measure (IExportText item,Graphics graphics) { public static Size Measure (IExportText item,Graphics graphics) {
Console.WriteLine("Measure {0}",item.Text);
if (!item.CanGrow) { if (!item.CanGrow) {
return item.Size; return item.Size;
} }

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

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

Loading…
Cancel
Save