Add formatter and initial tests.

This commit is contained in:
Daniel Kraus
2015-07-13 23:57:35 +02:00
parent a847c1f8ba
commit e36fee52ad
25 changed files with 1038 additions and 17 deletions

View File

@ -0,0 +1,47 @@
/* ElementBase.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;
using zaaReloaded2.LabModel;
namespace zaaReloaded2.Formatter.Elements
{
/// <summary>
/// Base class for formatting elements.
/// </summary>
[Serializable]
abstract class ElementBase
{
/// <summary>
/// Returns the label for this formatting element.
/// </summary>
abstract public string Label { get; }
/// <summary>
/// Writes the formatting element to a Word document.
/// </summary>
/// <param name="document">Word document to write to.</param>
/// <param name="timePoints">Laboratory time points to work with.</param>
abstract public void WriteToDocument(
Document document,
ITimePointFormatterDictionary workingTimePoints);
}
}

View File

@ -0,0 +1,29 @@
/* ElementsList.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.Formatter.Elements
{
[Serializable]
class ElementsList : List<ElementBase>
{
}
}

View File

@ -0,0 +1,164 @@
/* Items.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 System.Text.RegularExpressions;
using Microsoft.Office.Interop.Word;
using zaaReloaded2.LabModel;
using System.Diagnostics;
namespace zaaReloaded2.Formatter.Elements
{
/// <summary>
/// This formatting element is concerned with writing <see cref="LabItem"/>s
/// to a Word document.
/// </summary>
class Items : ElementBase
{
#region ElementBase implementation
public override string Label
{
get { return Line; }
}
public override void WriteToDocument(
Document document,
ITimePointFormatterDictionary workingTimePoints)
{
_document = document;
bool _needComma = false;
// Find out if we have any items that we can write
// to the document
List<ItemFormatter> items = new List<ItemFormatter>();
if (_items != null && _items.Count > 0)
{
foreach (string itemName in _items)
{
TimePointFormatter tpf = workingTimePoints
.FirstOrDefault(tp => tp.Value.ContainsItem(itemName))
.Value;
if (tpf != null)
{
// If tpf is not null, this means that it contains an
// item with itemName.
items.Add(tpf.ItemFormatters[itemName]);
}
}
}
// If there are items, write the caption (if any), then the items
if (items.Count > 0)
{
if (!String.IsNullOrEmpty(_caption))
{
document.Range().InsertAfter(
String.Format("{0}: ", _caption)
);
};
foreach (ItemFormatter i in items)
{
if (_needComma)
{
document.Range().InsertAfter(", ");
}
else
{
_needComma = true;
}
i.WriteToDocument(document);
}
}
}
#endregion
#region Properties
/// <summary>
/// Gets or sets a text line that contains a comma-separated list of
/// parsable laboratory item names. The list may optionally be preceded
/// with a caption followed by a colon.
/// </summary>
public string Line
{
[DebuggerStepThrough]
get
{
return _line;
}
set
{
_line = value;
ParseLine();
}
}
#endregion
#region Constructors
public Items() : base() { }
public Items(string line)
: this()
{
Line = line;
}
#endregion
#region Private methods
/// <summary>
/// Parses the Line and splits it into an optional caption and individual
/// items.
/// </summary>
void ParseLine()
{
_items = null;
_caption = null;
Regex r = new Regex(@"((?<caption>[^:]+):\s*)?((?<items>[^,]+),\s*)+");
Match m = r.Match(Line);
if (m.Success)
{
if (m.Groups["caption"].Success)
{
_caption = m.Groups["caption"].Value;
}
_items = m.Groups["items"].Captures
.Cast<Capture>()
.Select<Capture, string>(c => c.Value).ToList<string>();
}
}
#endregion
#region Fields
Document _document;
string _line;
string _caption;
List<string> _items;
#endregion
}
}

View File

@ -0,0 +1,101 @@
/* Formatter.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;
using zaaReloaded2.Formatter.Elements;
using zaaReloaded2.LabModel;
using System.Diagnostics;
namespace zaaReloaded2.Formatter
{
/// <summary>
/// Formats and writes a <see cref="Laboratory"/> to a Word document.
/// </summary>
[Serializable]
class Formatter
{
#region Properties
/// <summary>
/// Gets a list of formatting elements (derived from
/// <see cref="ElementBase"/>).
/// </summary>
public ElementsList Elements { get; private set; }
/// <summary>
/// Gets or sets the style of the normal range reference.
/// </summary>
public ReferenceStyle ReferenceStyle { get; set; }
/// <summary>
/// Gets or sets the <see cref="Laboratory"/> that shall be
/// formatted.
/// </summary>
public Laboratory Laboratory
{
[DebuggerStepThrough]
get
{
return _laboratory;
}
set
{
_laboratory = value;
_timePointFormatters = new TimePointFormatterDictionary();
foreach (TimePoint tp in _laboratory.TimePoints.Values)
{
_timePointFormatters[tp.TimeStamp] = new TimePointFormatter(tp, ReferenceStyle);
}
}
}
#endregion
#region Constructor
public Formatter()
{
Elements = new ElementsList();
}
#endregion
#region Public methods
/// <summary>
/// Formats the laboratory and writes it to a Word document.
/// </summary>
/// <param name="document">Word document to write to (at the
/// current position of the cursor).</param>
public void WriteToDocument(Document document)
{
}
#endregion
#region Fields
ITimePointFormatterDictionary _timePointFormatters;
Laboratory _laboratory;
#endregion
}
}

View File

@ -0,0 +1,28 @@
/* IItemFormatterDictionary.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.Formatter
{
public interface IItemFormatterDictionary : IDictionary<string, ItemFormatter>
{
}
}

View File

@ -0,0 +1,28 @@
/* ITimePointFormatterDictionary.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.Formatter
{
public interface ITimePointFormatterDictionary : IDictionary<DateTime, TimePointFormatter>
{
}
}

View File

@ -0,0 +1,127 @@
/* ItemFormatter.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;
using zaaReloaded2.LabModel;
namespace zaaReloaded2.Formatter
{
/// <summary>
/// Wraps a <see cref="LabItem"/> and provides methods to format it.
/// </summary>
public class ItemFormatter
{
#region Properties
/// <summary>
/// Gets or sets the LabItem wrapped by this ItemFormatter.
/// </summary>
public LabItem LabItem { get; set; }
/// <summary>
/// Gets or sets the ReferenceStyle to use in formatting.
/// </summary>
public ReferenceStyle ReferenceStyle { get; set; }
/// <summary>
/// Gets or sets a flag that indicates whether this ItemFormatter
/// has been used, i.e. whether the LabItem was written to a
/// document.
/// </summary>
public bool HasBeenUsed { get; set; }
#endregion
#region Constructor
/// <summary>
/// Creates a new ItemFormatter that wraps a <paramref name="labItem"/>.
/// </summary>
/// <param name="labItem">LabItem to wrap in this ItemFormatter.</param>
public ItemFormatter(LabItem labItem, ReferenceStyle referenceStyle)
{
LabItem = labItem;
ReferenceStyle = referenceStyle;
}
#endregion
#region Methods
/// <summary>
/// Formats and writes the LabItem details to a word <paramref name="document"/>.
/// </summary>
/// <param name="document">Word document to write to.</param>
public void WriteToDocument(Document document)
{
string reference;
if (
LabItem.HasLimitsOrNormal &&
(
ReferenceStyle == ReferenceStyle.Always ||
(ReferenceStyle == ReferenceStyle.IfAbnormal && !LabItem.IsNormal) ||
(ReferenceStyle == ReferenceStyle.IfSpecialItem && LabItem.AlwaysPrintLimits) ||
(ReferenceStyle == ReferenceStyle.IfSpecialOrAbnormal &&
(!LabItem.IsNormal || LabItem.AlwaysPrintLimits))
)
)
{
string normal;
if (LabItem.HasLowerLimit && LabItem.HasUpperLimit)
{
normal = String.Format("{0}-{1}", LabItem.LowerLimit, LabItem.UpperLimit);
}
else
{
if (LabItem.HasLowerLimit)
{
normal = String.Format("> {0}", LabItem.LowerLimit);
}
else if (LabItem.HasUpperLimit)
{
normal = String.Format("< {0}", LabItem.UpperLimit);
}
else
{
normal = LabItem.Normal;
}
}
reference = String.Format(" ({0})", normal);
}
else
{
reference = String.Empty;
}
// Insert the formatted text into the document.
document.Range().InsertAfter(
String.Format(
"{0} {1}{2}",
LabItem.QualifiedName,
LabItem.Value,
reference
));
HasBeenUsed = true;
}
#endregion
}
}

View File

@ -0,0 +1,30 @@
/* ItemFormatterDictionary.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.Formatter
{
class ItemFormatterDictionary
: Dictionary<string, ItemFormatter>,
IItemFormatterDictionary
{
}
}

View File

@ -0,0 +1,62 @@
/* ReferenceStyle.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.ComponentModel;
using System.Linq;
using System.Text;
namespace zaaReloaded2.Formatter
{
/// <summary>
/// Describes the style of normal range references.
/// </summary>
[Serializable]
public enum ReferenceStyle
{
/// <summary>
/// Never write normal ranges
/// </summary>
[Description("Referenzbereich nie ausgeben")]
Never,
/// <summary>
/// Write normal range if item is marked in dictionary
/// </summary>
[Description("Referenzbereich ausgeben, falls Parameter so markiert ist")]
IfSpecialItem,
/// <summary>
/// Write normal range if value is abnormal
/// </summary>
[Description("Referenzbereich ausgeben, falls Wert nicht normal ist")]
IfAbnormal,
/// <summary>
/// Write normal range if item is marked in dictionary, or if value is abnormal
/// </summary>
[Description("Referenzbereich ausgeben, falls Parameter so markiert ist oder falls Wert nicht normal ist")]
IfSpecialOrAbnormal,
/// <summary>
/// Always write normal range reference
/// </summary>
[Description("Referenzbereich immer ausgeben")]
Always
}
}

View File

@ -0,0 +1,76 @@
/* TimePointFormatter.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 zaaReloaded2.LabModel;
namespace zaaReloaded2.Formatter
{
/// <summary>
/// Creates a list of ItemFormatter objects from a TimePoint.
/// </summary>
public class TimePointFormatter
{
#region Properties
/// <summary>
/// Gets the time stamp of the <see cref="TimePoint"/> from which this
/// TimePointFormatter was built.
/// </summary>
public DateTime TimeStamp { get; private set; }
/// <summary>
/// Gets a dictionary of ItemFormatter objects that wrap LabItems.
/// The QualifiedName of each LabItem is used as key.
/// </summary>
public IItemFormatterDictionary ItemFormatters { get; private set; }
#endregion
#region Constructor
/// <summary>
/// Creates a new TimePointFormatter object using a given
/// <paramref name="timePoint"/>.
/// </summary>
/// <param name="timePoint">TimePoint whose LabItems will be
/// used to create ItemFormatter objects.</param>
public TimePointFormatter(TimePoint timePoint, ReferenceStyle referenceStyle)
{
TimeStamp = timePoint.TimeStamp;
ItemFormatters = new ItemFormatterDictionary();
foreach (LabItem item in timePoint.Items.Values)
{
ItemFormatters[item.QualifiedName] = new ItemFormatter(item, referenceStyle);
}
}
#endregion
#region Methods
public bool ContainsItem(string itemName)
{
return ItemFormatters.ContainsKey(itemName);
}
#endregion
}
}

View File

@ -0,0 +1,30 @@
/* TimePointFormatterDictionary.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.Formatter
{
public class TimePointFormatterDictionary
: Dictionary<DateTime, TimePointFormatter>,
ITimePointFormatterDictionary
{
}
}

View File

@ -155,7 +155,6 @@ namespace zaaReloaded2.Importer.ZaaImporter
/// and contains <see cref="LabItem"/>s in the others.</returns>
bool ParseParagraphs()
{
Items = new ItemDictionary();
if (Paragraphs.Length > 0)
{
if (!ParseTimeStamp()) return false;

View File

@ -20,7 +20,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace zaaReloaded2.Dictionaries
namespace zaaReloaded2.LabModel
{
/// <summary>
/// A dictionary of <see cref="LabItem"/>s.

View File

@ -0,0 +1,28 @@
/* ITimePointsDictionary.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.LabModel
{
public interface ITimePointsDictionary : IDictionary<DateTime, TimePoint>
{
}
}

View File

@ -21,7 +21,7 @@ using System.Linq;
using System.Text;
using zaaReloaded2.LabModel;
namespace zaaReloaded2.Dictionaries
namespace zaaReloaded2.LabModel
{
public class ItemDictionary : SortedDictionary<string, LabItem>, IItemDictionary
{

View File

@ -161,6 +161,18 @@ namespace zaaReloaded2.LabModel
get { return (HasLowerLimit || HasUpperLimit); }
}
/// <summary>
/// Is true if the item has numerical limits or a categorical normal
/// value.
/// </summary>
public bool HasLimitsOrNormal
{
get
{
return HasLimits || !String.IsNullOrEmpty(Normal);
}
}
/// <summary>
/// Returns the canonical name prefixed with the abbreviation
/// for the material, e.g. "U-Na" for sodium in the spot urine,
@ -187,10 +199,23 @@ namespace zaaReloaded2.LabModel
#endregion
#region Constructor
#region Constructors
public LabItem() { }
/// <summary>
/// Creates a new LabItem object that has a normal value, but
/// no upper or lower limits. This is constructor is used for
/// testing purposes.
/// </summary>
public LabItem(string name, string value, string normal)
: this()
{
Name = name;
Value = value;
Normal = normal;
}
#endregion
#region Fields

View File

@ -29,7 +29,7 @@ namespace zaaReloaded2.LabModel
{
#region Properties
public SortedDictionary<DateTime, TimePoint> TimePoints { get; set; }
public ITimePointsDictionary TimePoints { get; private set; }
#endregion
@ -37,7 +37,7 @@ namespace zaaReloaded2.LabModel
public Laboratory()
{
TimePoints = new SortedDictionary<DateTime, TimePoint>();
TimePoints = new TimePointsDictionary();
}
#endregion

View File

@ -45,12 +45,34 @@ namespace zaaReloaded2.LabModel
/// the <see cref="LaurisText"/>. If a laboratory parameter occurs more
/// than once, only the last occurrence is saved.
/// </summary>
public IItemDictionary Items { get; set; }
public IItemDictionary Items { get; private set; }
#endregion
#region Constructor
public TimePoint()
{
Items = new ItemDictionary();
}
#endregion
#region Methods
/// <summary>
/// Adds an item to the TimePoint.
/// </summary>
/// <param name="item">LabItem to add.</param>
public void AddItem(LabItem item)
{
if (String.IsNullOrEmpty(item.QualifiedName))
{
throw new ArgumentException("Cannot add item that has no qualified name.");
}
Items.Add(item.QualifiedName, item);
}
/// <summary>
/// Adds the items from another time point to this
/// time point. There is no check for plausibility,
@ -67,6 +89,18 @@ namespace zaaReloaded2.LabModel
Items.Merge(otherTimePoint.Items);
}
/// <summary>
/// Returns true if <see cref="Items"/> contains a given
/// item.
/// </summary>
/// <param name="item">Item string to look for.</param>
/// <returns>True if <see cref="Items"/> contains <paramref name="item."/>
/// </returns>
public bool ContainsItem(string item)
{
return Items.ContainsKey(item);
}
#endregion
}
}

View File

@ -0,0 +1,28 @@
/* TimePointsDictionary.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.LabModel
{
class TimePointsDictionary : SortedDictionary<DateTime, TimePoint>, ITimePointsDictionary
{
}
}

View File

@ -164,20 +164,33 @@
-->
<ItemGroup>
<Compile Include="Dictionaries\DictionaryBase.cs" />
<Compile Include="Dictionaries\IItemDictionary.cs" />
<Compile Include="Dictionaries\ItemDictionary.cs" />
<Compile Include="Formatter\Elements\ElementsList.cs" />
<Compile Include="Formatter\IItemFormatterDictionary.cs" />
<Compile Include="Formatter\ItemFormatter.cs" />
<Compile Include="Formatter\ItemFormatterDictionary.cs" />
<Compile Include="Formatter\ITimePointFormatterDictionary.cs" />
<Compile Include="Formatter\TimePointFormatter.cs" />
<Compile Include="Formatter\TimePointFormatterDictionary.cs" />
<Compile Include="LabModel\IItemDictionary.cs" />
<Compile Include="LabModel\ItemDictionary.cs" />
<Compile Include="Dictionaries\LineParser.cs" />
<Compile Include="Dictionaries\ParameterDictionary.cs" />
<Compile Include="Dictionaries\UnitDictionary.cs" />
<Compile Include="Formatter\Elements\ElementBase.cs" />
<Compile Include="Formatter\Elements\Items.cs" />
<Compile Include="Formatter\Formatter.cs" />
<Compile Include="Formatter\ReferenceStyle.cs" />
<Compile Include="Importer\IImporter.cs" />
<Compile Include="Importer\ZaaImporter\LaurisItem.cs" />
<Compile Include="Importer\ZaaImporter\LaurisTimePoint.cs" />
<Compile Include="Importer\ZaaImporter\ZaaImporter.cs" />
<Compile Include="LabModel\ITimePointsDictionary.cs" />
<Compile Include="LabModel\LabItem.cs" />
<Compile Include="LabModel\Laboratory.cs" />
<Compile Include="Importer\ZaaImporter\LaurisParagraph.cs" />
<Compile Include="LabModel\Material.cs" />
<Compile Include="LabModel\TimePoint.cs" />
<Compile Include="LabModel\TimePointsDictionary.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
@ -216,9 +229,7 @@
<EmbeddedResource Include="Defaults\parameters.txt" />
<EmbeddedResource Include="Defaults\units.txt" />
</ItemGroup>
<ItemGroup>
<Folder Include="Formatter\" />
</ItemGroup>
<ItemGroup />
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>