Browse Source

Better implementation of Visitor Pattern (Debug and Expression)

reports
Peter Forstmeier 13 years ago
parent
commit
57b144d7c2
  1. 23
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/DebugExporter.cs
  2. 24
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/DebugVisitor.cs
  3. 32
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/ExpressionVisitor.cs
  4. 99
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionRunner.cs
  5. 3
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/FormPageBuilder.cs
  6. 1
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/PageLayoutFixture.cs

23
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/DebugExporter.cs

@ -8,9 +8,7 @@
*/ */
using System; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using ICSharpCode.Reporting.Exporter.Visitors; using ICSharpCode.Reporting.Exporter.Visitors;
using ICSharpCode.Reporting.Interfaces.Export;
using ICSharpCode.Reporting.PageBuilder.ExportColumns; using ICSharpCode.Reporting.PageBuilder.ExportColumns;
namespace ICSharpCode.Reporting.Exporter namespace ICSharpCode.Reporting.Exporter
@ -18,7 +16,7 @@ namespace ICSharpCode.Reporting.Exporter
/// <summary> /// <summary>
/// Description of DebugExporter. /// Description of DebugExporter.
/// </summary> /// </summary>
public class DebugExporter:BaseExporter class DebugExporter:BaseExporter
{ {
private DebugVisitor visitor; private DebugVisitor visitor;
@ -29,13 +27,22 @@ namespace ICSharpCode.Reporting.Exporter
public override void Run () { public override void Run () {
Console.WriteLine(" DebugExporter with {0} Pages ",Pages.Count); Console.WriteLine();
Console.WriteLine("Start DebugExporter with {0} Pages ",Pages.Count);
foreach (var page in Pages) { foreach (var page in Pages) {
ShowDebug("--",page); IAcceptor ac = page as IAcceptor;
if (ac != null) {
visitor.Visit(page);
}
// RunInternal("--",page);
Console.WriteLine("-----------PageBreak---------"); Console.WriteLine("-----------PageBreak---------");
} }
Console.WriteLine("Finish DebugVisitor");
Console.WriteLine();
} }
void ShowDebug(string header,IExportContainer container)
/*
void RunInternal(string header,IExportContainer container)
{ {
var leading = header; var leading = header;
Console.WriteLine(); Console.WriteLine();
@ -45,7 +52,7 @@ namespace ICSharpCode.Reporting.Exporter
var acceptor = item as IAcceptor; var acceptor = item as IAcceptor;
if (exportContainer != null) { if (exportContainer != null) {
if (exportContainer.ExportedItems.Count > 0) { if (exportContainer.ExportedItems.Count > 0) {
ShowDebug(leading = leading + "--",exportContainer); RunInternal(leading = leading + "--",exportContainer);
acceptor.Accept(visitor); acceptor.Accept(visitor);
// ShowDebug(leading = leading + "--",exportContainer); // ShowDebug(leading = leading + "--",exportContainer);
leading = leading.Substring(0,leading.Length -2); leading = leading.Substring(0,leading.Length -2);
@ -64,6 +71,6 @@ namespace ICSharpCode.Reporting.Exporter
leading = leading.Substring(0, leading.Length - 2); leading = leading.Substring(0, leading.Length - 2);
} }
} }
*/
} }
} }

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

@ -7,7 +7,6 @@
* 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 ICSharpCode.Reporting.BaseClasses;
using ICSharpCode.Reporting.PageBuilder.ExportColumns; using ICSharpCode.Reporting.PageBuilder.ExportColumns;
namespace ICSharpCode.Reporting.Exporter.Visitors namespace ICSharpCode.Reporting.Exporter.Visitors
@ -18,12 +17,18 @@ namespace ICSharpCode.Reporting.Exporter.Visitors
// http://www.remondo.net/strategy-pattern-example-csharp/ // http://www.remondo.net/strategy-pattern-example-csharp/
public class DebugVisitor : AbstractVisitor class DebugVisitor : AbstractVisitor
{ {
public override void Visit(ExportPage page) public override void Visit(ExportPage page)
{ {
Console.WriteLine("<Page> {0} - {1} Items {2}", Console.WriteLine("<Page> {0} - {1} Items {2}",
page.Name,page.Location,page.BackColor); page.Name,page.Location,page.BackColor);
foreach (var element in page.ExportedItems) {
var ac = element as IAcceptor;
ac.Accept(this);
}
} }
@ -33,22 +38,21 @@ namespace ICSharpCode.Reporting.Exporter.Visitors
} }
public override void Visit(ExportContainer exportColumn) public override void Visit(ExportContainer exportColumn)
{ {
Console.WriteLine(); Console.WriteLine();
// Console.WriteLine("<ExportContainer> {0} - {1} Items {2}", Console.WriteLine("\t{0} - {1} Items {2}",
// exportColumn.Name,exportColumn.Location,exportColumn.BackColor);
Console.WriteLine("{0} - {1} Items {2}",
exportColumn.Name,exportColumn.Location,exportColumn.BackColor); exportColumn.Name,exportColumn.Location,exportColumn.BackColor);
foreach (var element in exportColumn.ExportedItems) {
var ac = element as IAcceptor;
ac.Accept(this);
}
} }
public override void Visit(ExportText exportColumn) public override void Visit(ExportText exportColumn)
{ {
Console.WriteLine("<ExportText> {0} - {1}", exportColumn.Text,exportColumn.Location); Console.WriteLine("\t\t<ExportText> {0} - {1}", exportColumn.Text,exportColumn.Location);
} }
} }
} }

32
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/ExpressionVisitor.cs

@ -3,39 +3,63 @@
using System; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using ICSharpCode.Reporting.PageBuilder.ExportColumns; using ICSharpCode.Reporting.PageBuilder.ExportColumns;
using Irony.Interpreter.Evaluator;
namespace ICSharpCode.Reporting.Exporter.Visitors namespace ICSharpCode.Reporting.Exporter.Visitors
{ {
/// <summary> /// <summary>
/// Description of ExpressionVisitor. /// Description of ExpressionVisitor.
/// </summary> /// </summary>
internal class ExpressionVisitor: AbstractVisitor class ExpressionVisitor: AbstractVisitor
{ {
private readonly Collection<ExportPage> pages; private readonly Collection<ExportPage> pages;
private readonly ExpressionEvaluatorGrammar grammar;
private readonly ExpressionEvaluator evaluator;
public ExpressionVisitor(Collection<ExportPage> pages) public ExpressionVisitor(Collection<ExportPage> pages)
{ {
this.pages = pages; this.pages = pages;
grammar = new ExpressionEvaluatorGrammar();
evaluator = new ExpressionEvaluator(grammar);
} }
public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportColumn exportColumn) public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportColumn exportColumn)
{ {
Console.WriteLine("Visit Page "); Console.WriteLine("Visit Page ");
} }
public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportText exportColumn) public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportText exportColumn)
{ {
Console.WriteLine("ExpressionVisitor <{0}>",exportColumn.Name); Console.WriteLine("\t\t<ExportText> {0} - {1}", exportColumn.Text,exportColumn.Location);
var result = evaluator.Evaluate("2 + 3");
Console.WriteLine("ExpressionVisitor <{0}> - {1}",exportColumn.Name,result);
} }
public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportContainer exportColumn) public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportContainer exportColumn)
{ {
Console.WriteLine("ExpressionVisitor <{0}>",exportColumn.Name); Console.WriteLine("\t{0} - {1} Items {2}",
exportColumn.Name,exportColumn.Location,exportColumn.BackColor);
foreach (var element in exportColumn.ExportedItems) {
var ac = element as IAcceptor;
ac.Accept(this);
}
var result = evaluator.Evaluate("2 * 10");
Console.WriteLine("ExpressionVisitor <{0}> - {1}",exportColumn.Name,result);
} }
public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportPage page) public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportPage page)
{ {
Console.WriteLine("ExpressionVisitor page <{0}>",page.PageInfo.PageNumber); foreach (var element in page.ExportedItems) {
var ac = element as IAcceptor;
ac.Accept(this);
}
var result = evaluator.Evaluate("5 * 10");
// Console.WriteLine("ExpressionVisitor <{0} - {1}>",exportColumn.Name,result);
Console.WriteLine("ExpressionVisitor page <{0}> {1}",page.PageInfo.PageNumber,result);
} }
} }
} }

99
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionRunner.cs

@ -27,13 +27,109 @@ namespace ICSharpCode.Reporting.Expressions
public override void Run() public override void Run()
{ {
Console.WriteLine();
Console.WriteLine("Start ExpressionVisitor"); Console.WriteLine("Start ExpressionVisitor");
foreach (var page in Pages) { foreach (var page in Pages) {
InternalRun(page); var acceptor = page as IAcceptor;
acceptor.Accept(visitor);
// RunInternal(page);
} }
Console.WriteLine("Finish ExpressionVisitor"); Console.WriteLine("Finish ExpressionVisitor");
Console.WriteLine();
}
// "Visitor"
// http://irony.codeplex.com/discussions/213938
//
// http://irony.codeplex.com/discussions/35310
/*
void RunInternal(IExportContainer container)
{
// Console.WriteLine();
// Console.WriteLine("{0}{1}",leading,container.Name);
foreach (var item in container.ExportedItems) {
var exportContainer = item as IExportContainer;
var acceptor = item as IAcceptor;
if (exportContainer != null) {
if (exportContainer.ExportedItems.Count > 0) {
// acceptor.Accept(visitor);
bRunInternal(exportContainer.ExportedItems);
acceptor.Accept(visitor);
// ShowDebug(leading = leading + "--",exportContainer);
}
}
// acceptor.Accept(visitor);
}
}
*/
/*
void bRunInternal(List<IExportColumn> list)
{
// Console.WriteLine();
// Console.WriteLine("{0}{1}",leading,container.Name);
foreach (var item in list) {
var exportContainer = item as IExportContainer;
var acceptor = item as IAcceptor;
if (exportContainer != null) {
if (exportContainer.ExportedItems.Count > 0) {
acceptor.Accept(visitor);
RunInternal(exportContainer);
// ShowDebug(leading = leading + "--",exportContainer);
}
}
acceptor.Accept(visitor);
}
}
*/
/*
void bRunInternal(IExportContainer container)
{
// Console.WriteLine();
// Console.WriteLine("{0}{1}",leading,container.Name);
foreach (var item in container.ExportedItems) {
var exportContainer = item as IExportContainer;
var acceptor = item as IAcceptor;
if (exportContainer != null) {
if (exportContainer.ExportedItems.Count > 0) {
acceptor.Accept(visitor);
RunInternal(exportContainer);
// ShowDebug(leading = leading + "--",exportContainer);
}
}
acceptor.Accept(visitor);
}
} }
*/
/*
//Items first, then container
void aRunInternal(IExportContainer container)
{
// Console.WriteLine();
// Console.WriteLine("{0}{1}",leading,container.Name);
foreach (var item in container.ExportedItems) {
var exportContainer = item as IExportContainer;
var acceptor = item as IAcceptor;
if (exportContainer != null) {
if (exportContainer.ExportedItems.Count > 0) {
RunInternal(exportContainer);
acceptor.Accept(visitor);
// ShowDebug(leading = leading + "--",exportContainer);
}
}
acceptor.Accept(visitor);
}
}
*/
/*
void InternalRun(ExportPage page) void InternalRun(ExportPage page)
{ {
page.Accept(visitor); page.Accept(visitor);
@ -43,5 +139,6 @@ namespace ICSharpCode.Reporting.Expressions
acceptor.Accept(visitor); acceptor.Accept(visitor);
} }
} }
*/
} }
} }

3
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/FormPageBuilder.cs

@ -8,6 +8,7 @@
*/ */
using System; using System;
using System.Linq; using System.Linq;
using ICSharpCode.Reporting.Exporter;
using ICSharpCode.Reporting.Expressions; using ICSharpCode.Reporting.Expressions;
using ICSharpCode.Reporting.Interfaces; using ICSharpCode.Reporting.Interfaces;
@ -29,6 +30,8 @@ namespace ICSharpCode.Reporting.PageBuilder
base.BuildExportList(); base.BuildExportList();
BuildDetail(); BuildDetail();
base.AddPage(CurrentPage); base.AddPage(CurrentPage);
var d = new DebugExporter(Pages);
d.Run();
var er = new ExpressionRunner(Pages); var er = new ExpressionRunner(Pages);
er.Run(); er.Run();
} }

1
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/PageLayoutFixture.cs

@ -13,7 +13,6 @@ using System.Reflection;
using ICSharpCode.Reporting.Exporter; using ICSharpCode.Reporting.Exporter;
using ICSharpCode.Reporting.Interfaces; using ICSharpCode.Reporting.Interfaces;
using ICSharpCode.Reporting.Interfaces.Export;
using ICSharpCode.Reporting.PageBuilder.ExportColumns; using ICSharpCode.Reporting.PageBuilder.ExportColumns;
using NUnit.Framework; using NUnit.Framework;

Loading…
Cancel
Save