Implement DocumentWriter, control elements, and tests.
This commit is contained in:
parent
659713abe3
commit
9df937138d
@ -30,19 +30,21 @@ namespace Tests.Controller.Elements
|
||||
[TestFixture]
|
||||
class ItemsTest
|
||||
{
|
||||
Document _document;
|
||||
zaaReloaded2.Formatter.Formatter _formatter;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_formatter = new zaaReloaded2.Formatter.Formatter(new Document());
|
||||
_document = new Document();
|
||||
_formatter = new zaaReloaded2.Formatter.Formatter(_document);
|
||||
_formatter.Settings.ReferenceStyle = ReferenceStyle.IfAbnormal;
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
((_Document)_formatter.Document).Close(WdSaveOptions.wdDoNotSaveChanges);
|
||||
((_Document)_document).Close(WdSaveOptions.wdDoNotSaveChanges);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -57,10 +59,9 @@ namespace Tests.Controller.Elements
|
||||
lab.AddTimePoint(tp);
|
||||
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.SelectFirstDay();
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Na, K, Cl"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Na 133, K 6 (5)\r", _formatter.Document.Range().Text);
|
||||
Assert.AreEqual("Na 133, K 6 (5)\r", _document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -75,10 +76,9 @@ namespace Tests.Controller.Elements
|
||||
lab.AddTimePoint(tp);
|
||||
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.SelectFirstDay();
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, K, Cl"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, K 6 (5)\r", _formatter.Document.Range().Text);
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, K 6 (5)\r", _document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -93,10 +93,9 @@ namespace Tests.Controller.Elements
|
||||
lab.AddTimePoint(tp);
|
||||
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.SelectFirstDay();
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: this, does, not, exist"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("\r", _formatter.Document.Range().Text);
|
||||
Assert.AreEqual("\r", _document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -112,11 +111,10 @@ namespace Tests.Controller.Elements
|
||||
|
||||
_formatter.Settings.ReferenceStyle = ReferenceStyle.Never;
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.SelectFirstDay();
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, *"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, Cl 110, K 6\r",
|
||||
_formatter.Document.Range().Text);
|
||||
_document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -133,11 +131,10 @@ namespace Tests.Controller.Elements
|
||||
|
||||
_formatter.Settings.ReferenceStyle = ReferenceStyle.Never;
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.SelectFirstDay();
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, SU-*"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, SU-Protein 2,8\r",
|
||||
_formatter.Document.Range().Text);
|
||||
_document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -154,11 +151,10 @@ namespace Tests.Controller.Elements
|
||||
|
||||
_formatter.Settings.ReferenceStyle = ReferenceStyle.Never;
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.SelectFirstDay();
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, SU-*, *"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, SU-Protein 2,8, Cl 110, U-Na 99\r",
|
||||
_formatter.Document.Range().Text);
|
||||
_document.Range().Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,45 +0,0 @@
|
||||
/* SelectFirstDayTest.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using f = zaaReloaded2.Formatter;
|
||||
using zaaReloaded2.Importer.ZaaImporter;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
|
||||
namespace Tests.Controller.Elements
|
||||
{
|
||||
[TestFixture]
|
||||
class SelectFirstDayTest
|
||||
{
|
||||
[Test]
|
||||
public void SelectFirstDay()
|
||||
{
|
||||
SelectFirstDay element = new SelectFirstDay();
|
||||
ZaaImporter importer = TestHelpers.ZaaImporterFromResource();
|
||||
f.Formatter formatter = new f.Formatter();
|
||||
formatter.Laboratory = importer.Laboratory;
|
||||
element.Run(formatter);
|
||||
Assert.AreEqual(5, formatter.WorkingTimePoints.Count);
|
||||
DateTime firstDay = new DateTime(2015, 07, 04);
|
||||
Assert.AreEqual(firstDay.Date, formatter.WorkingTimePoints.First().Key.Date);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
/* SelectFirstDayTest - Copy.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using f = zaaReloaded2.Formatter;
|
||||
using zaaReloaded2.Importer.ZaaImporter;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
|
||||
namespace Tests.Controller.Elements
|
||||
{
|
||||
[TestFixture]
|
||||
class SelectLastDayTest
|
||||
{
|
||||
[Test]
|
||||
public void SelectLastDay()
|
||||
{
|
||||
SelectLastDay element = new SelectLastDay();
|
||||
ZaaImporter importer = TestHelpers.ZaaImporterFromResource();
|
||||
f.Formatter formatter = new f.Formatter();
|
||||
formatter.Laboratory = importer.Laboratory;
|
||||
element.Run(formatter);
|
||||
// There are two time points of 6-July-2015 in the demo output file,
|
||||
// but since they have the exact same time stamps, they are merged
|
||||
// into one!
|
||||
Assert.AreEqual(1, formatter.WorkingTimePoints.Count);
|
||||
DateTime firstDay = new DateTime(2015, 07, 06);
|
||||
Assert.AreEqual(firstDay.Date, formatter.WorkingTimePoints.First().Key.Date);
|
||||
}
|
||||
}
|
||||
}
|
99
Tests/Formatter/DocumentWriterTest.cs
Executable file
99
Tests/Formatter/DocumentWriterTest.cs
Executable file
@ -0,0 +1,99 @@
|
||||
/* DocumentWriterClass.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using zaaReloaded2.Formatter;
|
||||
|
||||
namespace Tests.Formatter
|
||||
{
|
||||
[TestFixture]
|
||||
class DocumentWriterTest
|
||||
{
|
||||
DocumentWriter _docWriter;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_docWriter = new DocumentWriter();
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddText()
|
||||
{
|
||||
string s = "hello world";
|
||||
_docWriter.Write(s);
|
||||
Assert.AreEqual(s, _docWriter.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddLine()
|
||||
{
|
||||
string s = "hello world";
|
||||
_docWriter.WriteLine(s);
|
||||
Assert.AreEqual(s + Environment.NewLine, _docWriter.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PrependText()
|
||||
{
|
||||
string first = "first";
|
||||
string second = "second";
|
||||
_docWriter.Write(first);
|
||||
_docWriter.Prepend(second);
|
||||
Assert.AreEqual(second + first, _docWriter.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FlushingThrowsWithoutTarget()
|
||||
{
|
||||
_docWriter.Write("asdf");
|
||||
Assert.Throws<InvalidOperationException>(_docWriter.Flush);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FlushBuffer()
|
||||
{
|
||||
DocumentWriter parent = new DocumentWriter();
|
||||
_docWriter.Parent = parent;
|
||||
string s = "hello world";
|
||||
_docWriter.Write(s);
|
||||
_docWriter.Flush();
|
||||
Assert.AreEqual(s, parent.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BufferIsEmptyAfterFlush()
|
||||
{
|
||||
DocumentWriter parent = new DocumentWriter();
|
||||
_docWriter.Parent = parent;
|
||||
string s = "hello world";
|
||||
_docWriter.Write(s);
|
||||
_docWriter.Flush();
|
||||
Assert.IsFalse(_docWriter.HasBufferedText);
|
||||
Assert.AreEqual(String.Empty, _docWriter.ToString());
|
||||
}
|
||||
}
|
||||
}
|
7
Tests/Formatter/FormatterTest-all.txt
Executable file
7
Tests/Formatter/FormatterTest-all.txt
Executable file
@ -0,0 +1,7 @@
|
||||
|
||||
04.07.2015 12:31:00:
|
||||
Klinische Chemie: Na 144 mM, K 4,3 mM
|
||||
|
||||
06.07.2015 10:28:00:
|
||||
Klinische Chemie: Na 138 mM, K 4,6 mM
|
||||
|
7
Tests/Formatter/FormatterTest-eachday.txt
Executable file
7
Tests/Formatter/FormatterTest-eachday.txt
Executable file
@ -0,0 +1,7 @@
|
||||
|
||||
04.07.2015:
|
||||
Klinische Chemie: Na 144 mM, K 4,3 mM
|
||||
|
||||
06.07.2015:
|
||||
Klinische Chemie: Na 138 mM, K 4,6 mM
|
||||
|
4
Tests/Formatter/FormatterTest-firstday.txt
Executable file
4
Tests/Formatter/FormatterTest-firstday.txt
Executable file
@ -0,0 +1,4 @@
|
||||
|
||||
04.07.2015:
|
||||
Klinische Chemie: Na 144 mM, K 4,3 mM
|
||||
|
4
Tests/Formatter/FormatterTest-lastday.txt
Executable file
4
Tests/Formatter/FormatterTest-lastday.txt
Executable file
@ -0,0 +1,4 @@
|
||||
|
||||
06.07.2015:
|
||||
Klinische Chemie: Na 138 mM, K 4,6 mM
|
||||
|
@ -25,23 +25,95 @@ using zaaReloaded2.LabModel;
|
||||
using zaaReloaded2.Importer.ZaaImporter;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
using Microsoft.Office.Interop.Word;
|
||||
using System.IO;
|
||||
|
||||
namespace Tests.Formatter
|
||||
{
|
||||
[TestFixture]
|
||||
class FormatterTest
|
||||
{
|
||||
Document _document;
|
||||
f.Formatter _formatter;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_document = new Document();
|
||||
ZaaImporter importer = TestHelpers.ZaaImporterFromResource();
|
||||
_formatter = new f.Formatter(_document);
|
||||
_formatter.Laboratory = importer.Laboratory;
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
((_Document)_document).Close(WdSaveOptions.wdDoNotSaveChanges);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FormatLaboratory()
|
||||
{
|
||||
Document document = new Document();
|
||||
ZaaImporter importer = TestHelpers.ZaaImporterFromResource();
|
||||
f.Formatter formatter = new f.Formatter(document);
|
||||
formatter.Laboratory = importer.Laboratory;
|
||||
formatter.Settings.Elements.Add(new Items("Klinische Chemie: Na, K, Cl"));
|
||||
formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 144 mM, K 4,3 mM\r", document.Range().Text);
|
||||
((_Document)document).Close(WdSaveOptions.wdDoNotSaveChanges);
|
||||
_formatter.Settings.Elements.Add(new Items("Klinische Chemie: Na, K, Cl"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual(
|
||||
GetResourceText("Tests.Formatter.FormatterTest-all.txt"),
|
||||
_document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SelectEachDay()
|
||||
{
|
||||
_formatter.Settings.Elements.Add(
|
||||
new SelectEachDay(
|
||||
new Items("Klinische Chemie: Na, K, Cl"))
|
||||
);
|
||||
_formatter.Run();
|
||||
Assert.AreEqual(
|
||||
GetResourceText("Tests.Formatter.FormatterTest-eachday.txt"),
|
||||
_document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SelectFirstDay()
|
||||
{
|
||||
_formatter.Settings.Elements.Add(
|
||||
new SelectFirstDay(
|
||||
new Items("Klinische Chemie: Na, K, Cl"))
|
||||
);
|
||||
_formatter.Run();
|
||||
Assert.AreEqual(
|
||||
GetResourceText("Tests.Formatter.FormatterTest-firstday.txt"),
|
||||
_document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SelectLastDay()
|
||||
{
|
||||
_formatter.Settings.Elements.Add(
|
||||
new SelectLastDay(
|
||||
new Items("Klinische Chemie: Na, K, Cl"))
|
||||
);
|
||||
_formatter.Run();
|
||||
Assert.AreEqual(
|
||||
GetResourceText("Tests.Formatter.FormatterTest-lastday.txt"),
|
||||
_document.Range().Text);
|
||||
}
|
||||
|
||||
string GetResourceText(string resource)
|
||||
{
|
||||
try
|
||||
{
|
||||
Stream s = this.GetType().Assembly
|
||||
.GetManifestResourceStream(resource);
|
||||
StreamReader sr = new StreamReader(s);
|
||||
// Need to replace \r\n with \r because this is the newline character
|
||||
// that Word uses.
|
||||
return sr.ReadToEnd().Replace("\r\n", "\r");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new IOException("Unable to read " + resource, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -66,9 +66,8 @@
|
||||
</Otherwise>
|
||||
</Choose>
|
||||
<ItemGroup>
|
||||
<Compile Include="Controller\Elements\SelectLastDayTest.cs" />
|
||||
<Compile Include="Controller\Elements\SelectFirstDayTest.cs" />
|
||||
<Compile Include="Controller\SettingsRepositoryTest.cs" />
|
||||
<Compile Include="Formatter\DocumentWriterTest.cs" />
|
||||
<Compile Include="Thesaurus\ThesaurusTest.cs" />
|
||||
<Compile Include="Controller\Elements\ItemsTest.cs" />
|
||||
<Compile Include="Formatter\FormatterTest.cs" />
|
||||
@ -98,7 +97,18 @@
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="demo-output.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Formatter\FormatterTest-eachday.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Formatter\FormatterTest-firstday.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Formatter\FormatterTest-lastday.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Formatter\FormatterTest-all.txt" />
|
||||
</ItemGroup>
|
||||
<Choose>
|
||||
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
|
||||
<ItemGroup>
|
||||
|
45
zaaReloaded2/Controller/Elements/ControlElementBase.cs
Executable file
45
zaaReloaded2/Controller/Elements/ControlElementBase.cs
Executable file
@ -0,0 +1,45 @@
|
||||
/* ControlElementBase.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
/// <summary>
|
||||
/// Base class for control elements that control e.g. the working
|
||||
/// set of time points in a Formatter object.
|
||||
/// </summary>
|
||||
public abstract class ControlElementBase : ElementBase
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets a list of child elements, all of which must be derived
|
||||
/// from FormatElementBase.
|
||||
/// </summary>
|
||||
public IList<FormatElementBase> FormatElements { get; private set; }
|
||||
|
||||
public ControlElementBase() { }
|
||||
|
||||
public ControlElementBase(IList<FormatElementBase> formatElements)
|
||||
{
|
||||
FormatElements = formatElements;
|
||||
}
|
||||
|
||||
public ControlElementBase(FormatElementBase formatElement)
|
||||
: this(new List<FormatElementBase>() { formatElement })
|
||||
{ }
|
||||
}
|
||||
}
|
@ -34,7 +34,7 @@ namespace zaaReloaded2.Controller.Elements
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
{
|
||||
formatter.WriteToDocument(Text);
|
||||
formatter.Write(Text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
27
zaaReloaded2/Controller/Elements/FormatElementBase.cs
Executable file
27
zaaReloaded2/Controller/Elements/FormatElementBase.cs
Executable file
@ -0,0 +1,27 @@
|
||||
/* FormatElementBase.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
/// <summary>
|
||||
/// Base class for elements that perform actual formatting.
|
||||
/// </summary>
|
||||
public abstract class FormatElementBase : ElementBase
|
||||
{
|
||||
}
|
||||
}
|
@ -31,7 +31,7 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// to a Word document.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
class Items : ElementBase
|
||||
class Items : FormatElementBase
|
||||
{
|
||||
#region ElementBase implementation
|
||||
|
||||
@ -55,15 +55,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
if (!String.IsNullOrEmpty(_caption))
|
||||
{
|
||||
formatter.Document.Range().InsertAfter(
|
||||
String.Format("{0}: ", _caption)
|
||||
);
|
||||
formatter.Write(String.Format("{0}: ", _caption));
|
||||
};
|
||||
foreach (ItemFormatter i in items)
|
||||
{
|
||||
if (_needComma)
|
||||
{
|
||||
formatter.Document.Range().InsertAfter(", ");
|
||||
formatter.Write(", ");
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -71,6 +69,7 @@ namespace zaaReloaded2.Controller.Elements
|
||||
}
|
||||
i.WriteToDocument(formatter);
|
||||
}
|
||||
formatter.Write("\r");
|
||||
}
|
||||
}
|
||||
|
||||
|
43
zaaReloaded2/Controller/Elements/SelectEachDay.cs
Executable file
43
zaaReloaded2/Controller/Elements/SelectEachDay.cs
Executable file
@ -0,0 +1,43 @@
|
||||
/* SelectEachDay.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
class SelectEachDay : ControlElementBase
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
get { return "Jeden Tag auswählen"; }
|
||||
}
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
{
|
||||
formatter.ProcessEachDay(this);
|
||||
}
|
||||
|
||||
public SelectEachDay() : base() { }
|
||||
|
||||
public SelectEachDay(FormatElementBase formatElement)
|
||||
: base(formatElement)
|
||||
{ }
|
||||
}
|
||||
}
|
@ -26,7 +26,7 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// Selects the time points of the first day in a given Formatter
|
||||
/// object.
|
||||
/// </summary>
|
||||
class SelectFirstDay : ElementBase
|
||||
class SelectFirstDay : ControlElementBase
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
@ -35,7 +35,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
{
|
||||
formatter.SelectFirstDay();
|
||||
}
|
||||
formatter.ProcessFirstDay(this);
|
||||
}
|
||||
|
||||
public SelectFirstDay() : base() { }
|
||||
|
||||
public SelectFirstDay(FormatElementBase formatElement)
|
||||
: base(formatElement)
|
||||
{ }
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// Selects the time points of the last day in a given Formatter
|
||||
/// object.
|
||||
/// </summary>
|
||||
class SelectLastDay : ElementBase
|
||||
class SelectLastDay : ControlElementBase
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
@ -36,7 +36,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
{
|
||||
formatter.SelectLastDay();
|
||||
}
|
||||
formatter.ProcessLastDay(this);
|
||||
}
|
||||
|
||||
public SelectLastDay() : base() { }
|
||||
|
||||
public SelectLastDay(FormatElementBase formatElement)
|
||||
: base(formatElement)
|
||||
{ }
|
||||
}
|
||||
}
|
||||
|
162
zaaReloaded2/Formatter/DocumentWriter.cs
Executable file
162
zaaReloaded2/Formatter/DocumentWriter.cs
Executable file
@ -0,0 +1,162 @@
|
||||
/* DocumentWriter.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Office.Interop.Word;
|
||||
|
||||
namespace zaaReloaded2.Formatter
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper class that serves to write text to a Word document or
|
||||
/// to a linked DocumentWriter. Provides a buffer that can be
|
||||
/// appended or prepended to, which facilitates conditional output
|
||||
/// depending on whether there is text in the buffer or not.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Linking several DocumentWriters permits a cascading work flow
|
||||
/// with several buffers.
|
||||
/// </remarks>
|
||||
class DocumentWriter
|
||||
{
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets the Document associated with this DocumentWriter,
|
||||
/// or null if there is no associated Document.
|
||||
/// </summary>
|
||||
public Document Document { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parent DocumentWriter (if any).
|
||||
/// </summary>
|
||||
public DocumentWriter Parent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if there is text in the buffer.
|
||||
/// </summary>
|
||||
public bool HasBufferedText { get { return _buffer.Length > 0; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public DocumentWriter()
|
||||
{
|
||||
_buffer = new StringBuilder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new DocumentWriter instance that is associated
|
||||
/// with a Word Document.
|
||||
/// </summary>
|
||||
/// <param name="document"></param>
|
||||
public DocumentWriter(Document document)
|
||||
: this()
|
||||
{
|
||||
Document = document;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new DocumentWriter instance that is associated
|
||||
/// with a parent DocumentWriter.
|
||||
/// </summary>
|
||||
/// <param name="parent"></param>
|
||||
public DocumentWriter(DocumentWriter parent)
|
||||
: this()
|
||||
{
|
||||
Parent = parent;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Overrides
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return _buffer.ToString();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public methods
|
||||
|
||||
/// <summary>
|
||||
/// Flushes the buffer to the associated Word document and/or the
|
||||
/// parent DocumentWriter.
|
||||
/// </summary>
|
||||
public void Flush()
|
||||
{
|
||||
if (!HasBufferedText) return;
|
||||
|
||||
if (Document == null && Parent == null)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"No document and no parent buffer to flush into.");
|
||||
}
|
||||
|
||||
if (Document != null)
|
||||
{
|
||||
Document.Range().Text = _buffer.ToString();
|
||||
}
|
||||
if (Parent != null)
|
||||
{
|
||||
Parent.Write(_buffer.ToString());
|
||||
}
|
||||
|
||||
_buffer.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes text to the buffer.
|
||||
/// </summary>
|
||||
/// <param name="text">Text to write to the buffer.</param>
|
||||
public void Write(string text)
|
||||
{
|
||||
_buffer.Append(text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Appends a line of text to the buffer.
|
||||
/// </summary>
|
||||
/// <param name="text">Text to append.</param>
|
||||
public void WriteLine(string text)
|
||||
{
|
||||
_buffer.AppendLine(text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserts text at the start of the buffer.
|
||||
/// </summary>
|
||||
/// <param name="text">Text to insert at the start of the
|
||||
/// buffer.</param>
|
||||
public void Prepend(string text)
|
||||
{
|
||||
_buffer.Insert(0, text);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
|
||||
StringBuilder _buffer;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -36,11 +36,6 @@ namespace zaaReloaded2.Formatter
|
||||
|
||||
public Settings Settings { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the working Word document.
|
||||
/// </summary>
|
||||
public Document Document { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the <see cref="Laboratory"/> that shall be
|
||||
/// formatted.
|
||||
@ -76,12 +71,15 @@ namespace zaaReloaded2.Formatter
|
||||
public Formatter()
|
||||
{
|
||||
Settings = new Settings();
|
||||
_secondaryBuffer = new DocumentWriter();
|
||||
_primaryBuffer = new DocumentWriter(_secondaryBuffer);
|
||||
}
|
||||
|
||||
public Formatter(Document document)
|
||||
: this()
|
||||
{
|
||||
Document = document;
|
||||
_secondaryBuffer.Document = document;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -94,12 +92,18 @@ namespace zaaReloaded2.Formatter
|
||||
/// </summary>
|
||||
/// <param name="text">Text to write to the current document.
|
||||
/// </param>
|
||||
public void WriteToDocument(string text)
|
||||
public void Write(string text)
|
||||
{
|
||||
if (Document != null)
|
||||
{
|
||||
Document.Range().InsertAfter(text);
|
||||
_primaryBuffer.Write(text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a paragraph to the document.
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
public void WriteParagraph(string text)
|
||||
{
|
||||
_primaryBuffer.WriteLine(text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -109,35 +113,170 @@ namespace zaaReloaded2.Formatter
|
||||
/// current position of the cursor).</param>
|
||||
public void Run()
|
||||
{
|
||||
foreach (ElementBase element in Settings.Elements)
|
||||
int current = 0;
|
||||
while (current < Settings.Elements.Count)
|
||||
{
|
||||
// If there are FormatElements in the first level of the
|
||||
// elements list, collect all consecutive ones and process
|
||||
// them for each individual time point.
|
||||
if (Settings.Elements[current] is FormatElementBase)
|
||||
{
|
||||
int notAFormatElement = CollectFormatElements(current);
|
||||
IList<FormatElementBase> list = Settings.Elements
|
||||
.Skip(current)
|
||||
.Take(notAFormatElement - current)
|
||||
.Cast<FormatElementBase>().ToList();
|
||||
ProcessAllTimePoints(list);
|
||||
current = notAFormatElement;
|
||||
}
|
||||
else
|
||||
{
|
||||
// The current element is not derived from FormatElementBase;
|
||||
// so go ahead and 'run' it.
|
||||
Settings.Elements[current].Run(this);
|
||||
current++;
|
||||
}
|
||||
}
|
||||
_secondaryBuffer.Flush();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Selects one time point per day in the laboratory.
|
||||
/// </summary>
|
||||
public void ProcessEachDay(ControlElementBase controlElement)
|
||||
{
|
||||
IEnumerable<DateTime> days = _timePointFormatters.Keys.Select(k => k.Date).Distinct();
|
||||
foreach (DateTime day in days)
|
||||
{
|
||||
ProcessDay(
|
||||
controlElement,
|
||||
_timePointFormatters
|
||||
.Where(kv => kv.Key.Date == day.Date)
|
||||
.ToDictionary(kv => kv.Key, kv => kv.Value)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Selects all time points for the first day in the
|
||||
/// laboratory.
|
||||
/// </summary>
|
||||
public void ProcessFirstDay(ControlElementBase controlElement)
|
||||
{
|
||||
DateTime first = _timePointFormatters.First().Key;
|
||||
ProcessDay(
|
||||
controlElement,
|
||||
_timePointFormatters
|
||||
.Where(kv => kv.Key.Date == first.Date)
|
||||
.ToDictionary(kv => kv.Key, kv => kv.Value)
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Selects all time points for the first day in the
|
||||
/// laboratory.
|
||||
/// </summary>
|
||||
public void ProcessLastDay(ControlElementBase controlElement)
|
||||
{
|
||||
DateTime last = _timePointFormatters.Last().Key;
|
||||
ProcessDay(
|
||||
controlElement,
|
||||
_timePointFormatters
|
||||
.Where(kv => kv.Key.Date == last.Date)
|
||||
.ToDictionary(kv => kv.Key, kv => kv.Value)
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes the FormatElementBase children of <paramref name="controlElement"/>
|
||||
/// for each individual time point.
|
||||
/// </summary>
|
||||
/// <param name="controlElement">ControlElementBase descendant whose
|
||||
/// FormatElementBase children to process.</param>
|
||||
public void ProcessAllTimePoints(ControlElementBase controlElement)
|
||||
{
|
||||
ProcessAllTimePoints(controlElement.FormatElements);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Protected methods
|
||||
|
||||
/// <summary>
|
||||
/// Collects all consecutive FormatElements from Settings.Elements.
|
||||
/// </summary>
|
||||
/// <returns>Index of the first element that is not a FormatElement.
|
||||
/// </returns>
|
||||
protected int CollectFormatElements(int startIndex)
|
||||
{
|
||||
int i = startIndex;
|
||||
while (i < Settings.Elements.Count)
|
||||
{
|
||||
if (!(Settings.Elements[i] is FormatElementBase))
|
||||
{
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
protected void ProcessElements(IList<FormatElementBase> formatElements)
|
||||
{
|
||||
if (formatElements != null)
|
||||
{
|
||||
foreach (ElementBase element in formatElements)
|
||||
{
|
||||
element.Run(this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Selects all time points for the first day in the
|
||||
/// laboratory.
|
||||
/// </summary>
|
||||
public void SelectFirstDay()
|
||||
{
|
||||
DateTime first = _timePointFormatters.First().Key;
|
||||
WorkingTimePoints = _timePointFormatters
|
||||
.Where(kv => kv.Key.Date == first.Date)
|
||||
.ToDictionary(kv => kv.Key, kv => kv.Value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Selects all time points for the first day in the
|
||||
/// laboratory.
|
||||
/// </summary>
|
||||
public void SelectLastDay()
|
||||
protected void ProcessAllTimePoints(IList<FormatElementBase> formatElements)
|
||||
{
|
||||
for (int i = 0; i < _timePointFormatters.Count; i++)
|
||||
{
|
||||
DateTime last = _timePointFormatters.Last().Key;
|
||||
WorkingTimePoints = _timePointFormatters
|
||||
.Where(kv => kv.Key.Date == last.Date)
|
||||
.Skip(i)
|
||||
.Take(1)
|
||||
.ToDictionary(kv => kv.Key, kv => kv.Value);
|
||||
ProcessElements(formatElements);
|
||||
if (_primaryBuffer.HasBufferedText)
|
||||
{
|
||||
_primaryBuffer.Prepend(
|
||||
WorkingTimePoints.First().Value.GetDateAndTimeHeader()
|
||||
);
|
||||
}
|
||||
_primaryBuffer.Flush();
|
||||
}
|
||||
}
|
||||
|
||||
protected void ProcessDay(
|
||||
ControlElementBase controlElement,
|
||||
Dictionary<DateTime, TimePointFormatter> workingTimePoints)
|
||||
{
|
||||
if (workingTimePoints == null)
|
||||
throw new ArgumentNullException("workingTimePoints");
|
||||
|
||||
WorkingTimePoints = workingTimePoints;
|
||||
ProcessElements(controlElement.FormatElements);
|
||||
if (_primaryBuffer.HasBufferedText)
|
||||
{
|
||||
_primaryBuffer.Prepend(
|
||||
WorkingTimePoints.First().Value.GetDateHeader());
|
||||
}
|
||||
_primaryBuffer.Flush();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Protected properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets the working Word document.
|
||||
/// </summary>
|
||||
protected Document Document { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
@ -145,6 +284,8 @@ namespace zaaReloaded2.Formatter
|
||||
|
||||
TimePointFormatterDictionary _timePointFormatters;
|
||||
Laboratory _laboratory;
|
||||
DocumentWriter _primaryBuffer;
|
||||
DocumentWriter _secondaryBuffer;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ namespace zaaReloaded2.Formatter
|
||||
}
|
||||
|
||||
// Insert the formatted text into the document.
|
||||
formatter.WriteToDocument(
|
||||
formatter.Write(
|
||||
String.Format(
|
||||
"{0} {1}{2}{3}",
|
||||
LabItem.QualifiedName,
|
||||
|
@ -71,6 +71,39 @@ namespace zaaReloaded2.Formatter
|
||||
return ItemFormatters.ContainsKey(itemName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a header text line with the time point's date.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetDateHeader()
|
||||
{
|
||||
return FormatHeader(TimeStamp.ToShortDateString());
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a header text line with the time point's date
|
||||
/// and time.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetDateAndTimeHeader()
|
||||
{
|
||||
return FormatHeader(TimeStamp.ToString());
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
|
||||
string FormatHeader(string text)
|
||||
{
|
||||
return String.Format("{0}{1}:{2}",
|
||||
Environment.NewLine,
|
||||
text,
|
||||
Environment.NewLine
|
||||
);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -163,11 +163,15 @@
|
||||
can be found.
|
||||
-->
|
||||
<ItemGroup>
|
||||
<Compile Include="Controller\Elements\ControlElementBase.cs" />
|
||||
<Compile Include="Controller\Elements\FormatElementBase.cs" />
|
||||
<Compile Include="Controller\Elements\SelectEachDay.cs" />
|
||||
<Compile Include="Controller\Elements\SelectLastDay.cs" />
|
||||
<Compile Include="Controller\Elements\SelectFirstDay.cs" />
|
||||
<Compile Include="Controller\Elements\CustomText.cs" />
|
||||
<Compile Include="Controller\Settings.cs" />
|
||||
<Compile Include="Controller\SettingsRepository.cs" />
|
||||
<Compile Include="Formatter\DocumentWriter.cs" />
|
||||
<Compile Include="Thesaurus\ThesaurusBase.cs" />
|
||||
<Compile Include="Formatter\IItemFormatterDictionary.cs" />
|
||||
<Compile Include="Formatter\ItemFormatter.cs" />
|
||||
|
Loading…
Reference in New Issue
Block a user