Browse Source

Add DataSource to ExpressionRunner.cs,

modify some test's
reports
Peter Forstmeier 12 years ago
parent
commit
baf1fc51bc
  1. 2
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/DataManager/Listhandling/CollectionSource.cs
  2. 11
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Exporter/Visitors/ExpressionVisitor.cs
  3. 8
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionRunner.cs
  4. 22
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/AstExtensions.cs
  5. 10
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Imports/ImportAggregates.cs
  6. 7
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/BasePageBuilder.cs
  7. 2
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/DataPageBuilder.cs
  8. 2
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/FormPageBuilder.cs
  9. 19
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/Aggregates/SumAggregate.cs
  10. 24
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/FieldsFixture.cs
  11. 13
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/GlobalsFixture.cs
  12. 9
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/ParametersFixture.cs
  13. 2
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/StandardTests.cs
  14. 2
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Model/Report_FromListFixture.cs
  15. 37
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/TestReports/FromList.srd
  16. 14
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/TestReports/TestForGlobals.srd

2
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/DataManager/Listhandling/CollectionSource.cs

@ -28,7 +28,7 @@ namespace ICSharpCode.Reporting.DataManager.Listhandling @@ -28,7 +28,7 @@ namespace ICSharpCode.Reporting.DataManager.Listhandling
/// <summary>
/// Description of CollectionHandling.
/// </summary>
internal class CollectionSource:IDataViewHandling
public class CollectionSource:IDataViewHandling
{
private PropertyDescriptorCollection listProperties;

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

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.ObjectModel;
using ICSharpCode.Reporting.DataManager.Listhandling;
using ICSharpCode.Reporting.Expressions;
using ICSharpCode.Reporting.Expressions.Irony;
using ICSharpCode.Reporting.Expressions.Irony.Ast;
@ -20,16 +21,22 @@ namespace ICSharpCode.Reporting.Exporter.Visitors @@ -20,16 +21,22 @@ namespace ICSharpCode.Reporting.Exporter.Visitors
readonly ReportingExpressionEvaluator evaluator;
public ExpressionVisitor(Collection<ExportPage> pages,ReportSettings reportSettings):this(reportSettings)
public ExpressionVisitor(Collection<ExportPage> pages,
ReportSettings reportSettings,
CollectionSource dataSource):this(reportSettings,dataSource)
{
this.pages = pages;
}
internal ExpressionVisitor(ReportSettings reportSettings) {
internal ExpressionVisitor(ReportSettings reportSettings,CollectionSource dataSource) {
grammar = new ReportingLanguageGrammer();
evaluator = new ReportingExpressionEvaluator(grammar);
evaluator.AddReportSettings(reportSettings);
if (dataSource != null) {
evaluator.AddDataSource(dataSource);
}
}

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

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.ObjectModel;
using ICSharpCode.Reporting.DataManager.Listhandling;
using ICSharpCode.Reporting.Exporter;
using ICSharpCode.Reporting.Exporter.Visitors;
using ICSharpCode.Reporting.Items;
@ -19,10 +20,13 @@ namespace ICSharpCode.Reporting.Expressions @@ -19,10 +20,13 @@ namespace ICSharpCode.Reporting.Expressions
// http://blog.miraclespain.com/archive/2009/Oct-07.html
//
private readonly ExpressionVisitor visitor;
private readonly CollectionSource dataSource;
public ExpressionRunner(Collection<ExportPage> pages,ReportSettings reportSettings):base(pages)
public ExpressionRunner(Collection<ExportPage> pages,ReportSettings reportSettings,CollectionSource dataSource):base(pages)
{
visitor = new ExpressionVisitor (Pages,reportSettings);
this.dataSource = dataSource;
visitor = new ExpressionVisitor (Pages,reportSettings,dataSource);
visitor.Evaluator.Globals.Add("DataSource",dataSource);
}

22
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/AstExtensions.cs

@ -1,10 +1,11 @@ @@ -1,10 +1,11 @@
// 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 Irony.Interpreter;
using ICSharpCode.Reporting.DataManager.Listhandling;
using ICSharpCode.Reporting.Interfaces.Export;
using ICSharpCode.Reporting.Items;
using ICSharpCode.Reporting.PageBuilder.ExportColumns;
using Irony.Interpreter;
namespace ICSharpCode.Reporting.Expressions.Irony.Ast
{
@ -63,6 +64,25 @@ namespace ICSharpCode.Reporting.Expressions.Irony.Ast @@ -63,6 +64,25 @@ namespace ICSharpCode.Reporting.Expressions.Irony.Ast
public static ExportContainer GetCurrentContainer (this ScriptThread thread){
return (ExportContainer)thread.App.Globals["CurrentContainer"];
}
#endregion
#region DataSource
public static void AddDataSource (this ReportingExpressionEvaluator app,CollectionSource dataSource){
if (dataSource == null)
throw new ArgumentNullException("dataSource");
if (!app.Globals.ContainsKey("DataSource")) {
app.Globals.Add("DataSource",dataSource);
} else {
app.Globals["DataSource"] = dataSource;
}
}
// public static CollectionSource GetDataSource (this ScriptThread thread){
// return (CollectionSource)thread.App.Globals["DataSource"];
// }
#endregion
}
}

10
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Imports/ImportAggregates.cs

@ -18,14 +18,20 @@ namespace ICSharpCode.Reporting.Expressions.Irony.Imports @@ -18,14 +18,20 @@ namespace ICSharpCode.Reporting.Expressions.Irony.Imports
/// <summary>
/// Description of ImportAggregates.
/// </summary>
public static class ImportExtensions
{
public static CollectionSource GetDataSource (this ScriptThread thread){
return (CollectionSource)thread.App.Globals["DataSource"];
}
}
public static class ImportAggregates
{
public static object Sum(ScriptThread thread, AstNode[] childNodes) {
double sum = 0;
var fieldName = childNodes[0].Evaluate(thread).ToString();
var dataSource = (CollectionSource)thread.App.Globals["Current"];
var dataSource = thread.GetDataSource();
var curpos = dataSource.CurrentPosition;
dataSource.CurrentPosition = 0;

7
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/PageBuilder/BasePageBuilder.cs

@ -13,6 +13,7 @@ using System.Drawing; @@ -13,6 +13,7 @@ using System.Drawing;
using System.Linq;
using ICSharpCode.Reporting.BaseClasses;
using ICSharpCode.Reporting.DataManager.Listhandling;
using ICSharpCode.Reporting.Exporter;
using ICSharpCode.Reporting.Exporter.Visitors;
using ICSharpCode.Reporting.Expressions;
@ -39,7 +40,7 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -39,7 +40,7 @@ namespace ICSharpCode.Reporting.PageBuilder
ReportModel = reportModel;
Pages = new Collection<ExportPage>();
Graphics = CreateGraphics.FromSize(reportModel.ReportSettings.PageSize);
ExpressionVisitor = new ExpressionVisitor(ReportModel.ReportSettings);
ExpressionVisitor = new ExpressionVisitor(ReportModel.ReportSettings,null);
}
#region create Report Sections
@ -191,9 +192,9 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -191,9 +192,9 @@ namespace ICSharpCode.Reporting.PageBuilder
#region Visitors
protected void RunExpressions(ReportSettings reportsettings)
protected void RunExpressions(ReportSettings reportsettings,CollectionSource dataSource)
{
var er = new ExpressionRunner(Pages,reportsettings);
var er = new ExpressionRunner(Pages,reportsettings,dataSource);
er.Run();
}

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

@ -41,7 +41,7 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -41,7 +41,7 @@ namespace ICSharpCode.Reporting.PageBuilder
base.BuildReportFooter();
base.AddPage(CurrentPage);
UpdatePageInfo();
RunExpressions(ReportModel.ReportSettings);
RunExpressions(ReportModel.ReportSettings,DataSource);
}

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

@ -32,7 +32,7 @@ namespace ICSharpCode.Reporting.PageBuilder @@ -32,7 +32,7 @@ namespace ICSharpCode.Reporting.PageBuilder
base.AddPage(CurrentPage);
UpdatePageInfo();
// RunDebugVisitor();
RunExpressions(ReportModel.ReportSettings);
// RunExpressions(ReportModel.ReportSettings);
}

19
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/Aggregates/SumAggregate.cs

@ -15,19 +15,18 @@ namespace ICSharpCode.Reporting.Test.Expressions.Aggregates @@ -15,19 +15,18 @@ namespace ICSharpCode.Reporting.Test.Expressions.Aggregates
{
Collection<ExportText> collection;
ExpressionVisitor expressionVisitor;
AggregateCollection agc;
AggregateFuctionHelper helper;
CollectionSource cs;
CollectionSource dataSource;
[Test]
public void CanSum_Int_WholeCollection()
{
var reportSettings = new ReportSettings();
var visitor = new ExpressionVisitor(reportSettings);
var visitor = new ExpressionVisitor(reportSettings,dataSource);
var script = "= sum('intValue')";
collection[0].Text = script;
visitor.Evaluator.Globals.Add("Current",cs);
visitor.Visit(collection[0]);
Assert.That (collection[0].Text,Is.EqualTo("406"));
Assert.That(Convert.ToInt32(collection[0].Text),Is.TypeOf(typeof(int)));
@ -38,10 +37,9 @@ namespace ICSharpCode.Reporting.Test.Expressions.Aggregates @@ -38,10 +37,9 @@ namespace ICSharpCode.Reporting.Test.Expressions.Aggregates
public void CanSum_Double_WholeCollection()
{
var reportSettings = new ReportSettings();
var visitor = new ExpressionVisitor(reportSettings);
var visitor = new ExpressionVisitor(reportSettings,dataSource);
var script = "= sum('doubleValue')";
collection[0].Text = script;
visitor.Evaluator.Globals.Add("Current",cs);
visitor.Visit(collection[0]);
Assert.That (collection[0].Text,Is.EqualTo("408,25"));
Assert.That(Convert.ToDouble(collection[0].Text),Is.TypeOf(typeof(double)));
@ -59,14 +57,9 @@ namespace ICSharpCode.Reporting.Test.Expressions.Aggregates @@ -59,14 +57,9 @@ namespace ICSharpCode.Reporting.Test.Expressions.Aggregates
helper = new AggregateFuctionHelper();
agc = helper.AggregateCollection;
cs = new CollectionSource(agc,typeof(Aggregate),new ReportSettings());
cs.Bind();
dataSource = new CollectionSource(agc,typeof(Aggregate),new ReportSettings());
dataSource.Bind();
}
[TestFixtureSetUp]
public void Setup() {
expressionVisitor = new ExpressionVisitor(new ReportSettings());
}
}
}

24
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/FieldsFixture.cs

@ -13,9 +13,8 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -13,9 +13,8 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
public class FieldsFixture
{
Collection<ExportText> collection;
ExpressionVisitor expressionVisitor;
ExpressionVisitor visitor;
[Test]
public void FieldsInContainer() {
var script = "=Fields!myfield1 + Fields!myfield2";
@ -30,11 +29,12 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -30,11 +29,12 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
Text = " is great",
Name = "myfield2"
});
var visitor = new ExpressionVisitor(new ReportSettings());
var exportContainer = new ExportContainer();
exportContainer.ExportedItems.Add(collection[0]);
exportContainer.ExportedItems.Add(collection[1]);
exportContainer.ExportedItems.Add(collection[2]);
visitor.Visit(exportContainer);
Assert.That (collection[0].Text,Is.EqualTo("Sharpdevelop is great"));
}
@ -49,10 +49,11 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -49,10 +49,11 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
Text = "Sharpdevelop",
Name = "myfield1"
});
var visitor = new ExpressionVisitor(new ReportSettings());
var exportContainer = new ExportContainer();
exportContainer.ExportedItems.Add(collection[0]);
exportContainer.ExportedItems.Add(collection[1]);
visitor.Visit(exportContainer);
Assert.That (collection[0].Text.StartsWith("Missing"));
Assert.That (collection[0].Text.Contains("myfieldNotExist"));
@ -61,16 +62,13 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -61,16 +62,13 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
[SetUp]
public void CreateExportlist() {
collection = new Collection<ExportText>();
collection = new Collection<ExportText>();
collection.Add(new ExportText()
{
Text = "myExporttextColumn"
});
{
Text = "myExporttextColumn"
});
visitor = new ExpressionVisitor (new ReportSettings(),null);
}
[TestFixtureSetUp]
public void Setup() {
expressionVisitor = new ExpressionVisitor(new ReportSettings());
}
}
}

13
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/GlobalsFixture.cs

@ -13,12 +13,11 @@ using NUnit.Framework; @@ -13,12 +13,11 @@ using NUnit.Framework;
namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
{
[TestFixture]
[Ignore]
public class GlobalsFixture
{
IReportCreator reportCreator;
Collection<ExportText> collection;
ExpressionVisitor expressionVisitor;
[Test]
public void CanReadPageNumber()
@ -108,10 +107,10 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -108,10 +107,10 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
}
[TestFixtureSetUp]
public void Setup() {
expressionVisitor = new ExpressionVisitor(new ReportSettings());
}
// [TestFixtureSetUp]
// public void Setup() {
//
// expressionVisitor = new ExpressionVisitor(new ReportSettings());
// }
}
}

9
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/ParametersFixture.cs

@ -14,7 +14,6 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -14,7 +14,6 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
public class ParametersFixture
{
Collection<ExportText> collection;
ExpressionVisitor expressionVisitor;
[Test]
@ -39,7 +38,7 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -39,7 +38,7 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
);
var reportSettings = CreateReportSettings(parameters);
var visitor = new ExpressionVisitor(reportSettings);
var visitor = new ExpressionVisitor(reportSettings,null);
var script = "=Parameters!param1 + Parameters!param2 + Parameters!param3";
collection[0].Text = script;
@ -57,7 +56,7 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -57,7 +56,7 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
}
);
var reportSettings = CreateReportSettings(parameters);
var visitor = new ExpressionVisitor(reportSettings);
var visitor = new ExpressionVisitor(reportSettings,null);
var script = "=Parameters!paramNotExist";
collection[0].Text = script;
@ -84,9 +83,5 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests @@ -84,9 +83,5 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests
});
}
[TestFixtureSetUp]
public void Setup() {
expressionVisitor = new ExpressionVisitor(new ReportSettings());
}
}
}

2
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/IntegrationTests/StandardTests.cs

@ -87,7 +87,7 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests { @@ -87,7 +87,7 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests {
[TestFixtureSetUp]
public void Setup() {
expressionVisitor = new ExpressionVisitor(new ReportSettings());
expressionVisitor = new ExpressionVisitor(new ReportSettings(),null);
}
}

2
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Model/Report_FromListFixture.cs

@ -32,7 +32,7 @@ namespace ICSharpCode.Reporting.Test.Model @@ -32,7 +32,7 @@ namespace ICSharpCode.Reporting.Test.Model
[Test]
public void DetailContainsOneDataItem() {
var section = model.DetailSection;
Assert.That(section.Items.Count,Is.EqualTo(1));
Assert.That(section.Items.Count,Is.EqualTo(2));
}

37
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/TestReports/FromList.srd

@ -78,6 +78,24 @@ @@ -78,6 +78,24 @@
<DrawBorder>False</DrawBorder>
<PageBreakAfter>False</PageBreakAfter>
<Items>
<BaseDataItem>
<Location>384, 13</Location>
<Size>100, 20</Size>
<BackColor>White</BackColor>
<Font>Segoe UI, 9pt</Font>
<StringTrimming>None</StringTrimming>
<ContentAlignment>TopLeft</ContentAlignment>
<CanGrow>False</CanGrow>
<CanShrink>False</CanShrink>
<DataType>System.Int</DataType>
<RTL>No</RTL>
<Text>BaseDataItem2</Text>
<DrawBorder>False</DrawBorder>
<FrameColor>Black</FrameColor>
<ForeColor>ControlText</ForeColor>
<ColumnName>RandomInt</ColumnName>
<Name>BaseDataItem2</Name>
</BaseDataItem>
<BaseDataItem>
<Location>29, 14</Location>
<Size>100, 20</Size>
@ -138,7 +156,24 @@ @@ -138,7 +156,24 @@
<SectionMargin>0</SectionMargin>
<DrawBorder>False</DrawBorder>
<PageBreakAfter>False</PageBreakAfter>
<Items />
<Items>
<BaseTextItem>
<Location>298, 4</Location>
<Size>100, 20</Size>
<BackColor>White</BackColor>
<Font>Segoe UI, 9pt</Font>
<StringTrimming>None</StringTrimming>
<ContentAlignment>TopLeft</ContentAlignment>
<CanGrow>False</CanGrow>
<CanShrink>False</CanShrink>
<RTL>No</RTL>
<Text>= sum('RandomInt')</Text>
<DrawBorder>False</DrawBorder>
<FrameColor>Black</FrameColor>
<ForeColor>ControlText</ForeColor>
<Name>BaseTextItem2147483646</Name>
</BaseTextItem>
</Items>
<FrameColor>Black</FrameColor>
<Name>ReportFooter</Name>
</BaseSection>

14
src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/TestReports/TestForGlobals.srd

@ -37,8 +37,8 @@ @@ -37,8 +37,8 @@
<PageBreakAfter>False</PageBreakAfter>
<Items>
<BaseTextItem>
<Location>247, 17</Location>
<Size>179, 20</Size>
<Location>383, 17</Location>
<Size>277, 20</Size>
<BackColor>White</BackColor>
<Font>Segoe UI, 9pt</Font>
<StringTrimming>None</StringTrimming>
@ -54,7 +54,7 @@ @@ -54,7 +54,7 @@
</BaseTextItem>
<BaseTextItem>
<Location>16, 17</Location>
<Size>130, 20</Size>
<Size>264, 20</Size>
<BackColor>White</BackColor>
<Font>Microsoft Sans Serif, 10pt</Font>
<StringTrimming>None</StringTrimming>
@ -84,7 +84,7 @@ @@ -84,7 +84,7 @@
<Items>
<BaseTextItem>
<Location>16, 4</Location>
<Size>100, 20</Size>
<Size>264, 20</Size>
<BackColor>White</BackColor>
<Font>Segoe UI, 9pt</Font>
<StringTrimming>None</StringTrimming>
@ -142,7 +142,7 @@ @@ -142,7 +142,7 @@
<Items>
<BaseTextItem>
<Location>16, 4</Location>
<Size>100, 20</Size>
<Size>176, 20</Size>
<BackColor>White</BackColor>
<Font>Segoe UI, 9pt</Font>
<StringTrimming>None</StringTrimming>
@ -157,8 +157,8 @@ @@ -157,8 +157,8 @@
<Name>BaseTextItem2147483646</Name>
</BaseTextItem>
<BaseTextItem>
<Location>622, 5</Location>
<Size>100, 20</Size>
<Location>499, 5</Location>
<Size>223, 20</Size>
<BackColor>White</BackColor>
<Font>Microsoft Sans Serif, 10pt</Font>
<StringTrimming>None</StringTrimming>

Loading…
Cancel
Save