From 57b144d7c2b55aee0ca4516169d87b4c40c2fcf7 Mon Sep 17 00:00:00 2001 From: Peter Forstmeier Date: Mon, 23 Sep 2013 20:41:19 +0200 Subject: [PATCH] Better implementation of Visitor Pattern (Debug and Expression) --- .../Src/Exporter/DebugExporter.cs | 23 +++-- .../Src/Exporter/Visitors/DebugVisitor.cs | 24 +++-- .../Exporter/Visitors/ExpressionVisitor.cs | 32 +++++- .../Src/Expressions/ExpressionRunner.cs | 99 ++++++++++++++++++- .../Src/PageBuilder/FormPageBuilder.cs | 3 + .../src/PageBuilder/PageLayoutFixture.cs | 1 - 6 files changed, 158 insertions(+), 24 deletions(-) diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/DebugExporter.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/DebugExporter.cs index 377ae2dbfd..aa0621b93a 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/DebugExporter.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/DebugExporter.cs @@ -8,9 +8,7 @@ */ using System; using System.Collections.ObjectModel; - using ICSharpCode.Reporting.Exporter.Visitors; -using ICSharpCode.Reporting.Interfaces.Export; using ICSharpCode.Reporting.PageBuilder.ExportColumns; namespace ICSharpCode.Reporting.Exporter @@ -18,7 +16,7 @@ namespace ICSharpCode.Reporting.Exporter /// /// Description of DebugExporter. /// - public class DebugExporter:BaseExporter + class DebugExporter:BaseExporter { private DebugVisitor visitor; @@ -29,13 +27,22 @@ namespace ICSharpCode.Reporting.Exporter 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) { - ShowDebug("--",page); + IAcceptor ac = page as IAcceptor; + if (ac != null) { + visitor.Visit(page); + } +// RunInternal("--",page); Console.WriteLine("-----------PageBreak---------"); } + Console.WriteLine("Finish DebugVisitor"); + Console.WriteLine(); } - void ShowDebug(string header,IExportContainer container) + + /* + void RunInternal(string header,IExportContainer container) { var leading = header; Console.WriteLine(); @@ -45,7 +52,7 @@ namespace ICSharpCode.Reporting.Exporter var acceptor = item as IAcceptor; if (exportContainer != null) { if (exportContainer.ExportedItems.Count > 0) { - ShowDebug(leading = leading + "--",exportContainer); + RunInternal(leading = leading + "--",exportContainer); acceptor.Accept(visitor); // ShowDebug(leading = leading + "--",exportContainer); leading = leading.Substring(0,leading.Length -2); @@ -64,6 +71,6 @@ namespace ICSharpCode.Reporting.Exporter leading = leading.Substring(0, leading.Length - 2); } } - + */ } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/DebugVisitor.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/DebugVisitor.cs index 8a08d8ebd0..e9cd9e9e78 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/DebugVisitor.cs +++ b/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. */ using System; -using ICSharpCode.Reporting.BaseClasses; using ICSharpCode.Reporting.PageBuilder.ExportColumns; namespace ICSharpCode.Reporting.Exporter.Visitors @@ -18,12 +17,18 @@ namespace ICSharpCode.Reporting.Exporter.Visitors // http://www.remondo.net/strategy-pattern-example-csharp/ - public class DebugVisitor : AbstractVisitor + class DebugVisitor : AbstractVisitor { + + public override void Visit(ExportPage page) { Console.WriteLine(" {0} - {1} Items {2}", 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) { Console.WriteLine(); -// Console.WriteLine(" {0} - {1} Items {2}", -// exportColumn.Name,exportColumn.Location,exportColumn.BackColor); - Console.WriteLine("{0} - {1} Items {2}", + 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); + } } + public override void Visit(ExportText exportColumn) { - Console.WriteLine(" {0} - {1}", exportColumn.Text,exportColumn.Location); + Console.WriteLine("\t\t {0} - {1}", exportColumn.Text,exportColumn.Location); } - - } - } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/ExpressionVisitor.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/ExpressionVisitor.cs index 530cc3025c..15eaba993b 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/ExpressionVisitor.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/ExpressionVisitor.cs @@ -3,39 +3,63 @@ using System; using System.Collections.ObjectModel; using ICSharpCode.Reporting.PageBuilder.ExportColumns; +using Irony.Interpreter.Evaluator; namespace ICSharpCode.Reporting.Exporter.Visitors { /// /// Description of ExpressionVisitor. /// - internal class ExpressionVisitor: AbstractVisitor + class ExpressionVisitor: AbstractVisitor { private readonly Collection pages; + private readonly ExpressionEvaluatorGrammar grammar; + private readonly ExpressionEvaluator evaluator; public ExpressionVisitor(Collection pages) { this.pages = pages; + grammar = new ExpressionEvaluatorGrammar(); + evaluator = new ExpressionEvaluator(grammar); } public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportColumn exportColumn) { Console.WriteLine("Visit Page "); + } public override void Visit(ICSharpCode.Reporting.PageBuilder.ExportColumns.ExportText exportColumn) { - Console.WriteLine("ExpressionVisitor <{0}>",exportColumn.Name); + Console.WriteLine("\t\t {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) { - 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) { - 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); } } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionRunner.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionRunner.cs index 852638af95..c2dcdf0b1c 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionRunner.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionRunner.cs @@ -27,13 +27,109 @@ namespace ICSharpCode.Reporting.Expressions public override void Run() { + Console.WriteLine(); Console.WriteLine("Start ExpressionVisitor"); foreach (var page in Pages) { - InternalRun(page); + var acceptor = page as IAcceptor; + acceptor.Accept(visitor); +// RunInternal(page); } 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 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) { page.Accept(visitor); @@ -43,5 +139,6 @@ namespace ICSharpCode.Reporting.Expressions acceptor.Accept(visitor); } } + */ } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/FormPageBuilder.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/FormPageBuilder.cs index 580842bdfc..8eb6f2befe 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/FormPageBuilder.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/FormPageBuilder.cs @@ -8,6 +8,7 @@ */ using System; using System.Linq; +using ICSharpCode.Reporting.Exporter; using ICSharpCode.Reporting.Expressions; using ICSharpCode.Reporting.Interfaces; @@ -29,6 +30,8 @@ namespace ICSharpCode.Reporting.PageBuilder base.BuildExportList(); BuildDetail(); base.AddPage(CurrentPage); + var d = new DebugExporter(Pages); + d.Run(); var er = new ExpressionRunner(Pages); er.Run(); } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/PageLayoutFixture.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/PageLayoutFixture.cs index cd6ef117cd..5dcba6e194 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/PageBuilder/PageLayoutFixture.cs +++ b/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.Interfaces; -using ICSharpCode.Reporting.Interfaces.Export; using ICSharpCode.Reporting.PageBuilder.ExportColumns; using NUnit.Framework;