Merge branch 'release-2.0.0-beta.1'
19
HISTORY.md
@ -1,4 +1,21 @@
|
||||
Version 2.0.0-alpha.5 (2015-08-04)
|
||||
Version 2.0.0-beta.1 (2015-08-13)
|
||||
========================================================================
|
||||
|
||||
- FIX: Datenimport funktioniert jetzt auch mit Word-Text und nicht nur in den Tests.
|
||||
- FIX: Mehrere Thesaurus-Fehler behoben.
|
||||
- FIX: Stile werden jetzt gespeichert.
|
||||
- NEU: Auf Werkseinstellungen zurücksetzen.
|
||||
- NEU: Datumsangaben werden in eine Zeile "Laborwerte vom ..." eingebettet.
|
||||
- NEU: Elemente können verschoben werden.
|
||||
- NEU: Formatierung der Ausgabe mit Absatzvorlage.
|
||||
- NEU: Parameter können im Thesaurus als "blacklisted" markiert werden und werden dann bei Verwendung einer Wildcard ("*") nicht berücksichtigt.
|
||||
- NEU: Steuer-Elemente für Spalten.
|
||||
- NEU: Stile können importiert und exportiert werden.
|
||||
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
|
||||
|
||||
Version 2.0.0-alpha.5. (2015-08-04)
|
||||
========================================================================
|
||||
|
||||
- FIX: Daniels Spezial löscht nicht mehr die Unterschriften.
|
||||
|
50
README.md
@ -52,6 +52,11 @@ folgende Teile aufgeteilt:
|
||||
existieren verschiedene Klassen, die die Klassen des Labor-Modells
|
||||
(`zaaReloaded2.LabModel`) umschließen und um entsprechende
|
||||
Funktionalitäten erweitern.
|
||||
- __Kontrolle der Formatierung:__ Der Namensraum
|
||||
`zaaReloaded2.Controller` umfaßt Klassen, mit denen ein
|
||||
`zaaReloaded2.Formatter.Formatter` gesteuert werden kann. Diese
|
||||
Klassen spielen eine große Rolle bei den benutzerdefinierten
|
||||
Anpassungen von Stilen.
|
||||
|
||||
|
||||
## Parsen der Lauris-Ausgabe
|
||||
@ -174,4 +179,49 @@ oder nicht-normalen Parametern oder immer mit ausgegeben werden:
|
||||
Die Markierung besonderer Parameter erfolgt in der Textdatei, aus der
|
||||
das `zaaReloaded2.Thesaurus.Parameters` generiert wird (s.o.).
|
||||
|
||||
|
||||
## User Interface
|
||||
|
||||
Das User Interface wurde mit der Windows Presentation Foundation nach
|
||||
dem [MVVM][]-Muster implementiert. Dabei wurde auf das Hilfs-Framework
|
||||
[Bovender][bovender-framework] zurückgegriffen.
|
||||
|
||||
|
||||
## Updates
|
||||
|
||||
Das Add-in sucht täglich nach einem Update; dabei wird die Datei
|
||||
<http://zaa.nephrowiki.de/versioninfo.txt> heruntergeladen. Updates
|
||||
werden automatisch im Hintergrund geladen und beim Schließen von Word
|
||||
(bzw. der Zentralen Arztbriefablage) installiert und stehen dann beim
|
||||
nächsten Starten der Anwendung zur Verfügung.
|
||||
|
||||
|
||||
## Serialisierung
|
||||
|
||||
Um das Stil-Repositorium (`zaaReloaded2.Controller.SettingsRepository`)
|
||||
in den Assembly-Properties speichern zu können und für den Im- und
|
||||
Export von Stilen werden die in .NET eingebauten
|
||||
Serialisierungs-Strukturen genutzt. Weil es mit der Verwendung eines
|
||||
`XmlSerializer`s Probleme gab, weil der `XmlSerializer` nicht mit
|
||||
Interface-Eigenschaften umgehen kann, wurde zunächst für alle Klassen,
|
||||
die serialisiert werden müssen (`SettingsRepository`,
|
||||
`zaaReloaded2.Controller.Settings` und die von
|
||||
`zaaReloaded2.Controller.Elements.ElementBase` abgeleiteten Klassen) das
|
||||
Interface `ISerializable` implementiert. Das hat aber auch nicht dazu
|
||||
geführt, daß der `XmlSerializer` die Klassen serialisierte, so daß
|
||||
jetzt der `SoapFormatter` verwendet wird. Der stört sich nicht an
|
||||
Interface-Eigenschaften und produziert auch XML, wenngleich im etwas
|
||||
komplizierten [SOAP][]-Format.
|
||||
|
||||
Um das `SettingsRepository` in den Assembly-Properties zu persistieren,
|
||||
muß das serialisierte XML noch in einen Base64-kodierten String
|
||||
umgewandelt werden, damit das SOAP-XML nicht mit dem XML der
|
||||
Assembly-Properties ins Gehege kommt (siehe
|
||||
`zaaReloaded2.Controller.SettingsRepository.Load()` und
|
||||
`zaaReloaded2.Controller.SettingsRepository.Store()`).
|
||||
|
||||
[SOAP]: http://de.wikipedia.org/wiki/SOAP
|
||||
[MVVM]: http://de.wikipedia.org/wiki/MVVM
|
||||
[bovender-framework]: https://github.com/bovender/bovender
|
||||
|
||||
<!-- vim: set tw=72 sw=2 ts=2 sts=-1 : -->
|
||||
|
@ -61,7 +61,10 @@ namespace Tests.Controller.Elements
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Na, K, Cl"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Na 133, K 6 (5)\r", _document.Range().Text);
|
||||
string expected = (
|
||||
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00)) +
|
||||
"Na 133, K 6 (5)\r\r").Replace(Environment.NewLine, "\r");
|
||||
Assert.AreEqual(expected, _document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -78,7 +81,10 @@ namespace Tests.Controller.Elements
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, K, Cl"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, K 6 (5)\r", _document.Range().Text);
|
||||
string expected = (
|
||||
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00)) +
|
||||
"Klinische Chemie: Na 133, K 6 (5)\r\r").Replace(Environment.NewLine, "\r");
|
||||
Assert.AreEqual(expected, _document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -113,8 +119,10 @@ namespace Tests.Controller.Elements
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, *"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, Cl 110, K 6\r",
|
||||
_document.Range().Text);
|
||||
string expected = (
|
||||
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00)) +
|
||||
"Klinische Chemie: Na 133, Cl 110, K 6\r\r").Replace(Environment.NewLine, "\r");
|
||||
Assert.AreEqual(expected, _document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -133,8 +141,10 @@ namespace Tests.Controller.Elements
|
||||
_formatter.Laboratory = lab;
|
||||
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, SU-*"));
|
||||
_formatter.Run();
|
||||
Assert.AreEqual("Klinische Chemie: Na 133, SU-Protein 2,8\r",
|
||||
_document.Range().Text);
|
||||
string expected = (
|
||||
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00)) +
|
||||
"Klinische Chemie: Na 133, SU-Protein 2,8\r\r").Replace(Environment.NewLine, "\r");
|
||||
Assert.AreEqual(expected, _document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -153,8 +163,11 @@ namespace Tests.Controller.Elements
|
||||
_formatter.Laboratory = lab;
|
||||
_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",
|
||||
_document.Range().Text);
|
||||
string expected = (
|
||||
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00)) +
|
||||
"Klinische Chemie: Na 133, SU-Protein 2,8, Cl 110, U-Na 99\r\r")
|
||||
.Replace(Environment.NewLine, "\r");
|
||||
Assert.AreEqual(expected, _document.Range().Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ namespace Tests.Controller
|
||||
[TestFixture]
|
||||
class SettingsRepositoryTest
|
||||
{
|
||||
SettingsRepository _savedSettings;
|
||||
string _savedSettings;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
@ -50,11 +50,13 @@ namespace Tests.Controller
|
||||
string testName = "test";
|
||||
s.Name = testName;
|
||||
sr.SettingsList.Add(s);
|
||||
int expected = sr.SettingsList.Count;
|
||||
int index = sr.SettingsList.IndexOf(s);
|
||||
sr.Store();
|
||||
sr = null;
|
||||
sr = SettingsRepository.Load();
|
||||
Assert.AreEqual(1, sr.SettingsList.Count);
|
||||
Assert.AreEqual(testName, sr.SettingsList[0].Name);
|
||||
Assert.AreEqual(expected, sr.SettingsList.Count);
|
||||
Assert.AreEqual(testName, sr.SettingsList[index].Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
54
Tests/Controller/SettingsTest.cs
Executable file
@ -0,0 +1,54 @@
|
||||
/* SettingsTest.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.Controller;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
using System.IO;
|
||||
|
||||
namespace Tests.Controller
|
||||
{
|
||||
[TestFixture]
|
||||
class SettingsTest
|
||||
{
|
||||
[Test]
|
||||
public void CloneSettings()
|
||||
{
|
||||
SelectEachDay selectEachDay = new SelectEachDay();
|
||||
Items items = new Items("some text");
|
||||
Settings source = new Settings(
|
||||
"hello world",
|
||||
new List<ElementBase>() { selectEachDay, items });
|
||||
source.ReferenceStyle = zaaReloaded2.Formatter.ReferenceStyle.IfSpecialOrAbnormal;
|
||||
Settings clone = source.Clone() as Settings;
|
||||
Assert.AreNotSame(source, clone);
|
||||
Assert.AreEqual("Kopie von " + source.Name, clone.Name,
|
||||
"Name");
|
||||
Assert.AreNotSame(source.Elements, clone.Elements);
|
||||
Assert.AreEqual(source.ReferenceStyle, clone.ReferenceStyle,
|
||||
"ReferenceStyle");
|
||||
Assert.AreEqual(
|
||||
((Items)source.Elements[1]).Content,
|
||||
((Items)clone.Elements[1]).Content,
|
||||
"Items content");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
|
||||
04.07.2015 12:31:00:
|
||||
Laborwerte vom 04.07.2015 12:31:00:
|
||||
Klinische Chemie: Na 144 mM, K 4,3 mM
|
||||
|
||||
06.07.2015 10:28:00:
|
||||
Laborwerte vom 06.07.2015 10:28:00:
|
||||
Klinische Chemie: Na 138 mM, K 4,6 mM
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
04.07.2015:
|
||||
Laborwerte vom 04.07.2015:
|
||||
Klinische Chemie: Na 144 mM, K 4,3 mM
|
||||
|
||||
06.07.2015:
|
||||
Laborwerte vom 06.07.2015:
|
||||
Klinische Chemie: Na 138 mM, K 4,6 mM
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
|
||||
04.07.2015:
|
||||
Laborwerte vom 04.07.2015:
|
||||
Klinische Chemie: Na 144 mM, K 4,3 mM
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
|
||||
06.07.2015:
|
||||
Laborwerte vom 06.07.2015:
|
||||
Klinische Chemie: Na 138 mM, K 4,6 mM
|
||||
|
||||
|
@ -99,6 +99,25 @@ namespace Tests.Formatter
|
||||
_document.Range().Text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FormatSpecialItems()
|
||||
{
|
||||
ZaaImporter importer = new ZaaImporter();
|
||||
importer.Import(
|
||||
"Klinische Chemie: glomerul. Filtrationsr. CKD-EP: 36 ml/min /1,73qm; " +
|
||||
"Sammelmenge (U): 12300 ml; "
|
||||
);
|
||||
Document document = new Document();
|
||||
f.Formatter formatter = new f.Formatter(document);
|
||||
formatter.Laboratory = importer.Laboratory;
|
||||
formatter.Settings = new zaaReloaded2.Controller.Settings(
|
||||
new List<ElementBase>() { new Items("*") } );
|
||||
formatter.Run();
|
||||
Assert.AreEqual(
|
||||
"eGFR (CKD-EPI) 36 ml/min/1,73 m², SU-Volumen 12300 ml\r\r",
|
||||
document.Range().Text);
|
||||
}
|
||||
|
||||
string GetResourceText(string resource)
|
||||
{
|
||||
try
|
||||
|
@ -40,7 +40,7 @@ namespace Tests.Importer.ZaaImporter
|
||||
[Test]
|
||||
public void ParseInvalidLaurisTimePoints()
|
||||
{
|
||||
LaurisTimePoint tp = new LaurisTimePoint("Aerobe Kultur: Enterokokken ; Wachstum: 10 ;");
|
||||
LaurisTimePoint tp = new LaurisTimePoint("Mit freundlichen Grüßen");
|
||||
Assert.IsFalse(tp.IsValidTimePoint,
|
||||
"Bogus paragraph should be invalid LaurisTimePoint");
|
||||
|
||||
|
@ -41,5 +41,15 @@ namespace Tests.Importer.ZaaImporter
|
||||
// Only 6 distinct time points (see method documentation above).
|
||||
Assert.AreEqual(6, importer.Laboratory.TimePoints.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParseInvalidInput()
|
||||
{
|
||||
zaa.ZaaImporter importer = new zaa.ZaaImporter();
|
||||
importer.Import("some arbitrary text\r\nthat does not represent\r\na valid lab");
|
||||
Assert.IsFalse(importer.Success);
|
||||
importer.Import("(03.03.1930 13:30:00)\r\nKlinische Chemie: Natrium 135 [135 - 145] mmol/l;");
|
||||
Assert.IsTrue(importer.Success);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
169
Tests/SerializationTest.cs
Executable file
@ -0,0 +1,169 @@
|
||||
/* 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.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
using NUnit.Framework;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.Runtime.Serialization.Formatters.Soap;
|
||||
using zaaReloaded2.Controller;
|
||||
|
||||
namespace Tests.Controller
|
||||
{
|
||||
[TestFixture]
|
||||
class SerializationTest
|
||||
{
|
||||
[Test]
|
||||
public void SerializeControlElement()
|
||||
{
|
||||
SelectFirstDay element = new SelectFirstDay(
|
||||
new List<FormatElementBase>()
|
||||
{
|
||||
new Items("hello"),
|
||||
new Items("world")
|
||||
}
|
||||
);
|
||||
MemoryStream stream = new MemoryStream();
|
||||
// XmlSerializer does not work with interface properties...
|
||||
// XmlSerializer serializer = new XmlSerializer(typeof(SelectFirstDay));
|
||||
// BinaryFormatter serializer = new BinaryFormatter();
|
||||
SoapFormatter serializer = new SoapFormatter();
|
||||
serializer.Serialize(stream, element);
|
||||
stream.Position = 0;
|
||||
StreamReader sr = new StreamReader(stream);
|
||||
Console.WriteLine(sr.ReadToEnd());
|
||||
stream.Position = 0;
|
||||
SelectFirstDay deserialized = serializer.Deserialize(stream) as SelectFirstDay;
|
||||
Assert.IsNotNull(deserialized);
|
||||
Assert.AreEqual(element.Children.Count, deserialized.Children.Count);
|
||||
Assert.AreEqual(element.Children[0].Content, deserialized.Children[0].Content);
|
||||
Assert.AreEqual(element.Children[1].Content, deserialized.Children[1].Content);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeFormatElement()
|
||||
{
|
||||
string testString = "Hello World";
|
||||
CustomText element = new CustomText();
|
||||
element.Content = testString;
|
||||
MemoryStream stream = new MemoryStream();
|
||||
SoapFormatter serializer = new SoapFormatter();
|
||||
serializer.Serialize(stream, element);
|
||||
stream.Position = 0;
|
||||
CustomText deserialized = serializer.Deserialize(stream) as CustomText;
|
||||
Assert.IsNotNull(deserialized);
|
||||
Assert.AreEqual(element.Content, deserialized.Content);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeSettings()
|
||||
{
|
||||
Settings settings = CreateTestSettings1();
|
||||
MemoryStream stream = new MemoryStream();
|
||||
SoapFormatter serializer = new SoapFormatter();
|
||||
serializer.Serialize(stream, settings);
|
||||
stream.Position = 0;
|
||||
Settings deserialized = serializer.Deserialize(stream) as Settings;
|
||||
Assert.IsNotNull(deserialized);
|
||||
Assert.AreEqual(settings.Name, deserialized.Name);
|
||||
Assert.AreEqual(settings.ReferenceStyle, deserialized.ReferenceStyle);
|
||||
Assert.AreEqual(settings.Elements.Count, deserialized.Elements.Count);
|
||||
Assert.AreEqual(settings.Elements[0].GetType(), deserialized.Elements[0].GetType());
|
||||
Assert.AreEqual(settings.Elements[1].GetType(), deserialized.Elements[1].GetType());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeSettingsRepository()
|
||||
{
|
||||
SettingsRepository repository = new SettingsRepository();
|
||||
repository.SettingsList.Add(CreateTestSettings1());
|
||||
repository.SettingsList.Add(CreateTestSettings2());
|
||||
MemoryStream stream = new MemoryStream();
|
||||
SoapFormatter serializer = new SoapFormatter();
|
||||
serializer.Serialize(stream, repository);
|
||||
stream.Position = 0;
|
||||
SettingsRepository deserialized = serializer.Deserialize(stream) as SettingsRepository;
|
||||
Assert.IsNotNull(deserialized);
|
||||
Assert.AreEqual(repository.SettingsList.Count, deserialized.SettingsList.Count);
|
||||
Assert.AreEqual(
|
||||
repository.SettingsList[1].Elements.Count,
|
||||
deserialized.SettingsList[1].Elements.Count
|
||||
);
|
||||
Assert.AreEqual(
|
||||
repository.SettingsList[0].Name,
|
||||
deserialized.SettingsList[0].Name
|
||||
);
|
||||
Assert.AreEqual(
|
||||
repository.SettingsList[0].ReferenceStyle,
|
||||
deserialized.SettingsList[0].ReferenceStyle
|
||||
);
|
||||
}
|
||||
|
||||
Settings CreateTestSettings1()
|
||||
{
|
||||
string testName = "test name...";
|
||||
string testString = "Hello World";
|
||||
SelectFirstDay controlElement = new SelectFirstDay(
|
||||
new List<FormatElementBase>()
|
||||
{
|
||||
new Items("hello"),
|
||||
new Items("world")
|
||||
}
|
||||
);
|
||||
CustomText formatElement = new CustomText();
|
||||
formatElement.Content = testString;
|
||||
Settings settings = new Settings(testName, new List<ElementBase>()
|
||||
{
|
||||
controlElement,
|
||||
formatElement
|
||||
}
|
||||
);
|
||||
settings.ReferenceStyle = zaaReloaded2.Formatter.ReferenceStyle.IfSpecialItem;
|
||||
return settings;
|
||||
}
|
||||
|
||||
Settings CreateTestSettings2()
|
||||
{
|
||||
string testName = "another test name";
|
||||
SelectFirstDay controlElement1 = new SelectFirstDay(
|
||||
new List<FormatElementBase>()
|
||||
{
|
||||
new CustomText(),
|
||||
}
|
||||
);
|
||||
SelectLastDay controlElement2 = new SelectLastDay(
|
||||
new List<FormatElementBase>()
|
||||
{
|
||||
new Items("Items content"),
|
||||
}
|
||||
);
|
||||
Settings settings = new Settings(testName, new List<ElementBase>()
|
||||
{
|
||||
controlElement1,
|
||||
controlElement2
|
||||
}
|
||||
);
|
||||
settings.ReferenceStyle = zaaReloaded2.Formatter.ReferenceStyle.IfSpecialOrAbnormal;
|
||||
return settings;
|
||||
}
|
||||
}
|
||||
}
|
@ -58,11 +58,13 @@
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.Serialization.Formatters.Soap" />
|
||||
<Reference Include="System.Windows.Interactivity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Expression.Blend.Sdk.1.0.2\lib\net40-client\System.Windows.Interactivity.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Xaml" />
|
||||
<Reference Include="System.XML" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<Choose>
|
||||
@ -78,7 +80,9 @@
|
||||
</Otherwise>
|
||||
</Choose>
|
||||
<ItemGroup>
|
||||
<Compile Include="SerializationTest.cs" />
|
||||
<Compile Include="Controller\SettingsRepositoryTest.cs" />
|
||||
<Compile Include="Controller\SettingsTest.cs" />
|
||||
<Compile Include="Formatter\DocumentWriterTest.cs" />
|
||||
<Compile Include="Thesaurus\ThesaurusTest.cs" />
|
||||
<Compile Include="Controller\Elements\ItemsTest.cs" />
|
||||
|
@ -69,7 +69,7 @@ namespace Tests.ViewModels
|
||||
_settingsVM.AddElementViewModel(viewModel);
|
||||
viewModel.IsSelected = true;
|
||||
int oldViewModelChildrenCount = viewModel.Elements.Count;
|
||||
int oldModelChildrenCount = model.FormatElements.Count;
|
||||
int oldModelChildrenCount = model.Children.Count;
|
||||
_settingsVM.AddChildElementMessage.Sent += (sender, args) =>
|
||||
{
|
||||
messageSent = true;
|
||||
@ -84,7 +84,7 @@ namespace Tests.ViewModels
|
||||
Assert.IsTrue(messageSent, "Message was not sent");
|
||||
Assert.AreEqual(oldViewModelChildrenCount + 1, viewModel.Elements.Count,
|
||||
"Count of children in ViewModel was not increased by 1");
|
||||
Assert.AreEqual(oldModelChildrenCount + 1, model.FormatElements.Count,
|
||||
Assert.AreEqual(oldModelChildrenCount + 1, model.Children.Count,
|
||||
"Count of children in Model was not increased by 1");
|
||||
}
|
||||
|
||||
@ -106,13 +106,83 @@ namespace Tests.ViewModels
|
||||
[Test]
|
||||
public void DeleteElement()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
Settings settings = new Settings();
|
||||
settings.AddElement(new SelectFirstDay());
|
||||
settings.AddElement(new SelectEachDay());
|
||||
settings.AddElement(new SelectLastDay());
|
||||
SettingsViewModel settingsVM = new SettingsViewModel(settings);
|
||||
int oldCount = settingsVM.Elements.Count;
|
||||
ElementViewModel elementVM = settingsVM.Elements.First();
|
||||
ElementBase element = elementVM.RevealModelObject() as ElementBase;
|
||||
Assert.IsTrue(settings.Elements.Contains(element),
|
||||
"Settings object does not contain the model that the VM revealed?!");
|
||||
elementVM.IsSelected = true;
|
||||
Assert.IsTrue(settingsVM.DeleteElementCommand.CanExecute(null),
|
||||
"DeleteElementCommand should be enabled.");
|
||||
settingsVM.DeleteElementCommand.Execute(null);
|
||||
Assert.AreEqual(oldCount - 1, settingsVM.Elements.Count);
|
||||
Assert.IsFalse(settingsVM.Elements.Contains(elementVM),
|
||||
"Elements collection still contains the deleted element view model.");
|
||||
Assert.IsFalse(settings.Elements.Contains(element),
|
||||
"Settings' Element collection still contains the element model.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DeleteChildElement()
|
||||
{
|
||||
Settings settings = new Settings();
|
||||
settings.AddElement(new SelectFirstDay(new Items()));
|
||||
settings.AddElement(new SelectEachDay());
|
||||
settings.AddElement(new SelectLastDay());
|
||||
SettingsViewModel settingsVM = new SettingsViewModel(settings);
|
||||
ControlElementViewModel parent = ((ControlElementViewModel)settingsVM.Elements.First());
|
||||
int oldCount = parent.Elements.Count;
|
||||
ElementViewModel elementVM = ((ControlElementViewModel)settingsVM.Elements.First())
|
||||
.Elements.First();
|
||||
ElementBase element = elementVM.RevealModelObject() as ElementBase;
|
||||
Assert.IsTrue(((ControlElementBase)settings.Elements[0]).Children.Contains(element),
|
||||
"Settings object does not contain the model that the VM revealed?!");
|
||||
elementVM.IsSelected = true;
|
||||
Assert.IsTrue(settingsVM.DeleteElementCommand.CanExecute(null),
|
||||
"DeleteElementCommand should be enabled.");
|
||||
settingsVM.DeleteElementCommand.Execute(null);
|
||||
Assert.AreEqual(oldCount - 1, parent.Elements.Count);
|
||||
Assert.IsFalse(parent.Elements.Contains(elementVM),
|
||||
"Elements collection still contains the deleted element view model.");
|
||||
Assert.IsFalse(((ControlElementBase)settings.Elements[0]).Children.Contains(element),
|
||||
"Settings' collection of FormatElement children still contains the element model.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyElement()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
string testString = "this text should be duplicated";
|
||||
_settingsVM.AddElementViewModel(
|
||||
new ControlElementViewModel(new SelectEachDay(new Items(testString))));
|
||||
int oldCount = _settingsVM.Elements.Count;
|
||||
_settingsVM.Elements.First().IsSelected = true;
|
||||
Assert.IsTrue(_settingsVM.CopyElementCommand.CanExecute(null),
|
||||
"CopyElementCommand should be enabled.");
|
||||
_settingsVM.CopyElementCommand.Execute(null);
|
||||
Assert.AreEqual(oldCount + 1, _settingsVM.Elements.Count);
|
||||
|
||||
// Access the first element
|
||||
ControlElementViewModel controlVM = _settingsVM.Elements.First() as ControlElementViewModel;
|
||||
FormatElementViewModel formatVM = controlVM.Elements.First() as FormatElementViewModel;
|
||||
Items items = formatVM.RevealModelObject() as Items;
|
||||
Assert.IsNotNull(items,
|
||||
"Child ViewModel of first ControlElementViewModel does not wrap Items object.");
|
||||
Assert.AreEqual(testString, items.Content,
|
||||
"First control element's child element has incorrect Content string.");
|
||||
|
||||
// Access the second element
|
||||
controlVM = _settingsVM.Elements.Last() as ControlElementViewModel;
|
||||
formatVM = controlVM.Elements.First() as FormatElementViewModel;
|
||||
items = formatVM.RevealModelObject() as Items;
|
||||
Assert.IsNotNull(items,
|
||||
"Child ViewModel of last ControlElementViewModel does not wrap Items object.");
|
||||
Assert.AreEqual(testString, items.Content,
|
||||
"First control element's child element has incorrect Content string.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
BIN
gimp/down.xcf
Normal file
BIN
gimp/duplicate.xcf
Normal file
BIN
gimp/exit.xcf
Normal file
BIN
gimp/export.xcf
Normal file
BIN
gimp/gear.xcf
Normal file
BIN
gimp/import.xcf
Normal file
BIN
gimp/minus.xcf
Normal file
BIN
gimp/pen.xcf
Normal file
BIN
gimp/plus-child.xcf
Normal file
BIN
gimp/plus.xcf
Normal file
BIN
gimp/reset.xcf
Normal file
BIN
gimp/up.xcf
Normal file
BIN
www/img/elementbearbeiten.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
www/img/elementpicker.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
www/img/nachher.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
www/img/ribbon.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
www/img/stilauswahl.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
www/img/stilbearbeiten.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
www/img/vorher.png
Normal file
After Width: | Height: | Size: 78 KiB |
162
www/index.html
@ -1,20 +1,178 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>zaaReloaded2 by Daniel Kraus</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="author" content="Daniel Kraus">
|
||||
<style type="text/css"><!--
|
||||
* {
|
||||
font-family: Arial; font-size: 16px; line-height: 125%;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
body { margin: 16px 24px; max-width: 800px; }
|
||||
|
||||
h1 { font-size: 150%; margin: 48px 0 24px 0; }
|
||||
h2 { font-size: 120%; margin: 32px 0 16px 0; }
|
||||
|
||||
p { text-align: justify; }
|
||||
|
||||
img {
|
||||
box-shadow: 2px 2px 8px #444;
|
||||
}
|
||||
|
||||
.download {
|
||||
width: 500px; margin: 16px auto;
|
||||
padding: 8px; border: 1px solid #888;
|
||||
box-shadow: 2px 2px 8px #444;
|
||||
background-color: #eef;
|
||||
}
|
||||
|
||||
.float-right {
|
||||
float: right;
|
||||
margin: 8px 0 8px 16px;
|
||||
}
|
||||
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear: both;
|
||||
}
|
||||
--></style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>zaaReloaded2</h1>
|
||||
<p>
|
||||
<p style="font-weight: bold;">
|
||||
Erweiterung für Microsoft® Word 2010-2013, das die <a
|
||||
href="http://www.smi.ukw.de/sap-klinische-verfahren/archivsysteme/zentrale-arztbriefablage.html">
|
||||
Zentrale Arztbriefablage (ZAA)</a> um Funktionen für das Formatieren
|
||||
von Laborwerten erweitert.
|
||||
</p>
|
||||
|
||||
<div class="download">
|
||||
<h2 style="margin-top:0">Download</h2>
|
||||
<p><a href="downloads/">zaa.nephrowiki.de/downloads</a></p>
|
||||
</div>
|
||||
|
||||
<h2>Anleitung</h2>
|
||||
|
||||
<p class="center">
|
||||
<img src="img/ribbon.png" alt="zaaReloaded2-Ribbon" />
|
||||
</p>
|
||||
|
||||
<ol>
|
||||
<li>Laborwerte auf üblichem Wege in einen Arztbrief einfügen
|
||||
(alternativ kann der Befehl "Demo" ausgeführt werden, dann wird
|
||||
ein Beispieldokument mit Laborwerten geöffnet).</li>
|
||||
<li>Im zaaReloaded-Tab (s.o.) den linken Knopf "Formatieren"
|
||||
klicken.</li>
|
||||
<p class="center">
|
||||
<img src="img/stilauswahl.png" alt="Stil auswählen" />
|
||||
</p>
|
||||
<li>
|
||||
Beim ersten Mal erscheint eine Liste mit Stilen, aus der man den
|
||||
gewünschten Stil auswählt (siehe Abbildung). Beim nächsten Mal,
|
||||
wenn man auf diesen Knopf drückt, wird der zuletzt verwendete Stil
|
||||
genommen.</li>
|
||||
<li>Einen Moment warten... Voilà.</li>
|
||||
</ol>
|
||||
|
||||
|
||||
<h2 class="clear">Anpassen</h2>
|
||||
<p>
|
||||
Das Addin enthält einen Stil-Editor, mit dem die eingebauten Stile
|
||||
bearbeitet und neue Stile entworfen werden können:
|
||||
</p>
|
||||
<p class="center">
|
||||
<img src="img/stilbearbeiten.png" alt="Stil bearbeiten" />
|
||||
</p>
|
||||
|
||||
<p class="clear">
|
||||
<img src="img/elementpicker.png" alt="Elemente" class="float-right" />
|
||||
Jeder Stil setzt sich aus sog. <i>Elementen</i> zusammen. Es gibt
|
||||
<i>Steuerelemente</i>, die zum Beispiel für die Auswahl eines Tages
|
||||
(erster Tag/letzter Tag) zuständig sind, und es gibt
|
||||
<i>Ausgabeelemente</i>, die die eigentliche Formatierung und Ausgabe
|
||||
der Laborwerte übernehmen.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Steuerelemente:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Ersten Tag auswählen</li>
|
||||
<li>Letzten Tag auswählen</li>
|
||||
<li>Jeden Tag nacheinander auswählen</li>
|
||||
<li>Zwei Spalten einfügen/zur nächsten Spalte wechseln</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Ausgabeelemente:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Laborparameter</li>
|
||||
<li>Beliebiger Text</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
"Beliebiger Text" kann, wie der Name schon sagt, beliebigen Text
|
||||
enthalten, der nicht weiter bearbeitet wird. Auf diese Weise kann
|
||||
man z.B. Platzhalter für Urinsedimente ausgeben lassen, die dann
|
||||
noch händisch vervollständigt werden.
|
||||
</p>
|
||||
<p>
|
||||
"Laborparameter" enthalten eine durch Kommata getrennte Auflistung
|
||||
von Parametern, die ausgegeben werden sollen. Jedes Element
|
||||
"Laborparameter" kann optional einen Titel enthalten:
|
||||
</p>
|
||||
<p>
|
||||
Beispiel:
|
||||
</p>
|
||||
<blockquote>
|
||||
<p>
|
||||
<img src="img/elementbearbeiten.png" alt="Element bearbeiten" />
|
||||
</p>
|
||||
<p>
|
||||
Klinische Chemie: Na, K, Cl, (usw.)
|
||||
</p>
|
||||
</blockquote>
|
||||
<p>
|
||||
In diesem Fall ist "Klinische Chemie:" der optionale Titel.
|
||||
</p>
|
||||
<p>
|
||||
Die Bezeichnungen der einzelnen Parameter sind fest einprogrammiert.
|
||||
Teils decken sie sich mit den Bezeichnungen, wie sie in der
|
||||
Zentralen Arztbriefablage erscheinen; teils sind sie aber auch
|
||||
Surrogate (z.B. "eGFR (CKD-EPI)" anstatt "glomerul. Filtrationsr.
|
||||
CKD-EP").
|
||||
</p>
|
||||
<p>
|
||||
Die Platzhalter "SU-*", "U-*" und "*" geben die noch nicht
|
||||
verwendeten Werte für Sammelurin, Spontanurin und alles weitere aus.
|
||||
"*" sollte daher als letztes verwendet werden.
|
||||
<p>
|
||||
Die Liste der möglichen Parameternamen ist momentan fest
|
||||
einprogrammiert und kann auch noch nicht angezeigt werden. Man kann
|
||||
beim Entwickeln eines Stils aber probehalber den Platzhalter "*"
|
||||
verwenden und sieht dann, welche Parameternamen noch verwendet
|
||||
werden könnten.
|
||||
</p>
|
||||
|
||||
<h2>Updates</h2>
|
||||
<p>
|
||||
Das Addin sucht täglich nach Updates und lädt und installiert diese
|
||||
bei Bedarf im Hintergrund.
|
||||
</p>
|
||||
|
||||
<h2>Weitere Informationen</h2>
|
||||
<p><a href="doc/md_history.html">Versionsgeschichte</a></p>
|
||||
<p><a href="doc/index.html">Quellcode-Dokumentation</a></p>
|
||||
|
||||
<hr />
|
||||
<p>© 2015 Daniel Kraus</p>
|
||||
<p>© 2015 <a href="http://www.bovender.de">Daniel Kraus</a></p>
|
||||
</body>
|
||||
<!-- vim: set tw=72 ai sts=2 ts=2 sw=2 : -->
|
||||
</html>
|
||||
|
@ -1,4 +1,4 @@
|
||||
2.0.0-alpha.5
|
||||
http://zaa.nephrowiki.de/downloads/zaaReloaded-2.0.0-alpha.5.exe
|
||||
423cbe81b42ddfc293cf5b387c1d8d269dce3f61 publish/release/zaaReloaded-2.0.0-alpha.5.exe
|
||||
2.0.0-beta.1
|
||||
http://zaa.nephrowiki.de/downloads/zaaReloaded-2.0.0-beta.1.exe
|
||||
4fe0f2bd8ba1c3852c02c6220bddf53b5fd98ef8 publish/release/zaaReloaded-2.0.0-beta.1.exe
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* ControlElementBase.cs
|
||||
using System;
|
||||
/* ControlElementBase.cs
|
||||
* part of zaaReloaded2
|
||||
*
|
||||
* Copyright 2015 Daniel Kraus
|
||||
@ -16,6 +17,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
@ -23,25 +26,90 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// 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
|
||||
[Serializable]
|
||||
public abstract class ControlElementBase : ElementBase, ISerializable
|
||||
{
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets a list of child elements, all of which must be derived
|
||||
/// from FormatElementBase.
|
||||
/// </summary>
|
||||
public IList<FormatElementBase> FormatElements { get; private set; }
|
||||
public IList<FormatElementBase> Children { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// Informs whether this control element can have child elements.
|
||||
/// </summary>
|
||||
public virtual bool CanHaveChildren { get { return true; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public ControlElementBase()
|
||||
: this(new List<FormatElementBase>())
|
||||
{ }
|
||||
|
||||
public ControlElementBase(IList<FormatElementBase> formatElements)
|
||||
public ControlElementBase(IList<FormatElementBase> children)
|
||||
{
|
||||
FormatElements = formatElements;
|
||||
Children = children;
|
||||
}
|
||||
|
||||
public ControlElementBase(FormatElementBase formatElement)
|
||||
: this(new List<FormatElementBase>() { formatElement })
|
||||
public ControlElementBase(FormatElementBase children)
|
||||
: this(new List<FormatElementBase>() { children })
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Serialization
|
||||
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected ControlElementBase(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
int version = info.GetInt32("Version");
|
||||
int childrenCount = info.GetInt32("ChildrenCount");
|
||||
Children = new List<FormatElementBase>();
|
||||
for (int i = 0; i < childrenCount; i++)
|
||||
{
|
||||
Type typeOfChild = info.GetValue(SerializedChildName(i, "Type"), typeof(Type)) as Type;
|
||||
Children.Add(info.GetValue(SerializedChildName(i, "Object"), typeOfChild) as FormatElementBase);
|
||||
}
|
||||
}
|
||||
|
||||
public void GetObjectData(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
|
||||
info.AddValue("ChildrenCount", Children.Count);
|
||||
int i = 0;
|
||||
foreach (FormatElementBase child in Children)
|
||||
{
|
||||
info.AddValue(SerializedChildName(i, "Type"), child.GetType());
|
||||
info.AddValue(SerializedChildName(i, "Object"), child);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
private string SerializedChildName(int index, string info)
|
||||
{
|
||||
return String.Format("Child{0}{1}", index, info);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Protected methods
|
||||
|
||||
/// <summary>
|
||||
/// Creates a clone of the Children list (for use in cloning
|
||||
/// derived classes).
|
||||
/// </summary>
|
||||
/// <returns>Clone of the Children list.</returns>
|
||||
protected IList<FormatElementBase> CloneChildren()
|
||||
{
|
||||
return Children.Select(child => child.Clone() as FormatElementBase).ToList();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
@ -25,11 +26,22 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// <summary>
|
||||
/// Controller element that writes arbitrary text to the document.
|
||||
/// </summary>
|
||||
class CustomText : FormatElementBase
|
||||
[Serializable]
|
||||
public class CustomText : FormatElementBase, ISerializable
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
get { return String.Format("\"{0}\"", Content); }
|
||||
get
|
||||
{
|
||||
if (String.IsNullOrEmpty(Content))
|
||||
{
|
||||
return "Beliebiger Text";
|
||||
}
|
||||
else
|
||||
{
|
||||
return String.Format("\"{0}\"", Content);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
@ -43,5 +55,20 @@ namespace zaaReloaded2.Controller.Elements
|
||||
clone.Content = Content;
|
||||
return clone;
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
|
||||
public CustomText () { }
|
||||
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected CustomText(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
int version = info.GetInt32("Version");
|
||||
Content = info.GetString("Content");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -21,13 +21,13 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Office.Interop.Word;
|
||||
using zaaReloaded2.LabModel;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
/// <summary>
|
||||
/// Base class for formatting elements.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public abstract class ElementBase : ICloneable
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -16,12 +16,14 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
/// <summary>
|
||||
/// Base class for elements that perform actual formatting.
|
||||
/// </summary>
|
||||
public abstract class FormatElementBase : ElementBase
|
||||
public abstract class FormatElementBase : ElementBase, ISerializable
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the content of this format element.
|
||||
@ -32,7 +34,6 @@ namespace zaaReloaded2.Controller.Elements
|
||||
set
|
||||
{
|
||||
_content = value;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,5 +43,15 @@ namespace zaaReloaded2.Controller.Elements
|
||||
protected virtual void OnContentChanged() {}
|
||||
|
||||
private string _content;
|
||||
|
||||
#region Serialization
|
||||
|
||||
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
|
||||
info.AddValue("Content", Content);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ using System.Diagnostics;
|
||||
using Microsoft.Office.Interop.Word;
|
||||
using zaaReloaded2.LabModel;
|
||||
using zaaReloaded2.Formatter;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
@ -31,13 +32,23 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// to a Word document.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
class Items : CustomText
|
||||
public class Items : CustomText
|
||||
{
|
||||
#region ElementBase implementation
|
||||
|
||||
public override string Label
|
||||
{
|
||||
get { return Content; }
|
||||
get
|
||||
{
|
||||
if (String.IsNullOrEmpty(Content))
|
||||
{
|
||||
return "Laborparameter";
|
||||
}
|
||||
else
|
||||
{
|
||||
return Content;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void Run(zaaReloaded2.Formatter.Formatter formatter)
|
||||
@ -74,6 +85,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
}
|
||||
}
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
Items clone = new Items();
|
||||
clone.Content = Content;
|
||||
return clone;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@ -86,6 +104,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
Content = content;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected Items(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
@ -132,7 +157,6 @@ namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
items.AddRange(CollectByName(formatter, itemName));
|
||||
}
|
||||
|
||||
}
|
||||
return items;
|
||||
}
|
||||
@ -148,9 +172,12 @@ namespace zaaReloaded2.Controller.Elements
|
||||
foreach (TimePointFormatter tpf in formatter.WorkingTimePoints.Values)
|
||||
{
|
||||
List<ItemFormatter> newItems = tpf.ItemFormatters.Values
|
||||
.Where(i => !i.HasBeenUsed && i.LabItem.QualifiedName.StartsWith(material))
|
||||
.Where(i => !i.HasBeenUsed && !i.IsBlacklisted && i.LabItem.QualifiedName.StartsWith(material))
|
||||
.ToList();
|
||||
newItems.ForEach(i => i.HasBeenUsed = true);
|
||||
// Include the material prefix only if this item was collected by a
|
||||
// general wildcard ("*" rather than "SU-*" etc.).
|
||||
newItems.ForEach(i => i.IncludeMaterial = String.IsNullOrEmpty(material));
|
||||
items.AddRange(newItems);
|
||||
}
|
||||
return items;
|
||||
|
69
zaaReloaded2/Controller/Elements/NextColumn.cs
Executable file
@ -0,0 +1,69 @@
|
||||
/* NextColumn.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.Runtime.Serialization;
|
||||
using System.Text;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
/// <summary>
|
||||
/// Format element that causes a Formatter object to move the
|
||||
/// insertion point to the next colum in a layout table.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class NextColumn : ControlElementBase, ISerializable
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
get { return "Nächste Spalte"; }
|
||||
}
|
||||
|
||||
public override bool CanHaveChildren
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
{
|
||||
formatter.NextColumn();
|
||||
}
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new NextColumn();
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
|
||||
public NextColumn() : base() { }
|
||||
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected NextColumn(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -18,15 +18,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
class SelectEachDay : ControlElementBase
|
||||
[Serializable]
|
||||
public class SelectEachDay : ControlElementBase
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
get { return "Jeden Tag auswählen"; }
|
||||
get { return "Jeder Tag"; }
|
||||
}
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
@ -34,6 +36,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
formatter.ProcessEachDay(this);
|
||||
}
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new SelectEachDay(CloneChildren());
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
|
||||
public SelectEachDay() : base() { }
|
||||
|
||||
public SelectEachDay(FormatElementBase formatElement)
|
||||
@ -44,9 +53,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
: base(formatElements)
|
||||
{ }
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new SelectEachDay();
|
||||
}
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected SelectEachDay(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
@ -26,11 +27,12 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// Selects the time points of the first day in a given Formatter
|
||||
/// object.
|
||||
/// </summary>
|
||||
class SelectFirstDay : ControlElementBase
|
||||
[Serializable]
|
||||
public class SelectFirstDay : ControlElementBase, ISerializable
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
get { return "Ersten Tag auswählen"; }
|
||||
get { return "Erster Tag"; }
|
||||
}
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
@ -38,6 +40,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
formatter.ProcessFirstDay(this);
|
||||
}
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new SelectFirstDay(CloneChildren());
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
|
||||
public SelectFirstDay() : base() { }
|
||||
|
||||
public SelectFirstDay(FormatElementBase formatElement)
|
||||
@ -48,9 +57,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
: base(formatElements)
|
||||
{ }
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new SelectFirstDay();
|
||||
}
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected SelectFirstDay(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
@ -27,11 +28,12 @@ namespace zaaReloaded2.Controller.Elements
|
||||
/// Selects the time points of the last day in a given Formatter
|
||||
/// object.
|
||||
/// </summary>
|
||||
class SelectLastDay : ControlElementBase
|
||||
[Serializable]
|
||||
public class SelectLastDay : ControlElementBase, ISerializable
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
get { return "Letzten Tag auswählen"; }
|
||||
get { return "Letzter Tag"; }
|
||||
}
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
@ -39,6 +41,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
formatter.ProcessLastDay(this);
|
||||
}
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new SelectLastDay(CloneChildren());
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
|
||||
public SelectLastDay() : base() { }
|
||||
|
||||
public SelectLastDay(FormatElementBase formatElement)
|
||||
@ -49,9 +58,13 @@ namespace zaaReloaded2.Controller.Elements
|
||||
: base(formatElements)
|
||||
{ }
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new SelectLastDay();
|
||||
}
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected SelectLastDay(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
69
zaaReloaded2/Controller/Elements/TwoColumns.cs
Executable file
@ -0,0 +1,69 @@
|
||||
/* TwoColumns.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.Runtime.Serialization;
|
||||
using System.Text;
|
||||
|
||||
namespace zaaReloaded2.Controller.Elements
|
||||
{
|
||||
/// <summary>
|
||||
/// Format element that causes a Formatter object to insert a table with
|
||||
/// two columns and one row into the documents.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class TwoColumns : ControlElementBase, ISerializable
|
||||
{
|
||||
public override string Label
|
||||
{
|
||||
get { return "Zwei Spalten einfügen"; }
|
||||
}
|
||||
|
||||
public override bool CanHaveChildren
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Run(Formatter.Formatter formatter)
|
||||
{
|
||||
formatter.InsertTwoColumns();
|
||||
}
|
||||
|
||||
protected override ElementBase CreateInstance()
|
||||
{
|
||||
return new TwoColumns();
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
|
||||
public TwoColumns() : base() { }
|
||||
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected TwoColumns(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -21,6 +21,10 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using zaaReloaded2.Formatter;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Runtime.Serialization.Formatters.Soap;
|
||||
|
||||
namespace zaaReloaded2.Controller
|
||||
{
|
||||
@ -28,8 +32,43 @@ namespace zaaReloaded2.Controller
|
||||
/// Holds settings related to controlling laboratory output.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class Settings : ICloneable
|
||||
public class Settings : ICloneable, ISerializable
|
||||
{
|
||||
#region Persistence
|
||||
|
||||
/// <summary>
|
||||
/// Deserializes a Settings object from SOAP XML that is read from a file.
|
||||
/// </summary>
|
||||
/// <param name="fileName">File to read.</param>
|
||||
/// <returns>Deserialized Settings object with new unique ID.</returns>
|
||||
/// <exception cref="InvalidDataException">if the file does not contain
|
||||
/// SOAP XML that can be deserialized to a Settings object.</exception>
|
||||
public static Settings LoadFromFile(string fileName)
|
||||
{
|
||||
StreamReader reader = new StreamReader(fileName);
|
||||
SoapFormatter formatter = new SoapFormatter();
|
||||
Settings settings = formatter.Deserialize(reader.BaseStream) as Settings;
|
||||
if (settings == null)
|
||||
{
|
||||
throw new InvalidDataException("Datei enthält keine Stil-Daten oder ist beschädigt.");
|
||||
}
|
||||
settings.Uid = Guid.NewGuid();
|
||||
return settings;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Serializes a Settings object to SOAP XML that is written to a file.
|
||||
/// </summary>
|
||||
/// <param name="fileName">File to write to.</param>
|
||||
public void SaveToFile(string fileName)
|
||||
{
|
||||
StreamWriter writer = new StreamWriter(fileName);
|
||||
SoapFormatter formatter = new SoapFormatter();
|
||||
formatter.Serialize(writer.BaseStream, this);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
@ -51,14 +90,14 @@ namespace zaaReloaded2.Controller
|
||||
/// Gets the unique ID of this Settings object. The unique
|
||||
/// ID is not included in deep-copying (cloning).
|
||||
/// </summary>
|
||||
public Guid Uid { get; private set; }
|
||||
public Guid Uid { get; internal set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public Settings()
|
||||
: this(string.Empty, new List<ElementBase>())
|
||||
: this(string.Empty, null)
|
||||
{ }
|
||||
|
||||
public Settings(string name)
|
||||
@ -87,6 +126,44 @@ namespace zaaReloaded2.Controller
|
||||
Uid = Guid.NewGuid();
|
||||
Name = name;
|
||||
Elements = initialElements;
|
||||
ReferenceStyle = Properties.Settings.Default.ReferenceStyle;
|
||||
if (Elements == null)
|
||||
{
|
||||
Elements = new List<ElementBase>();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new Settings object with an initial
|
||||
/// set of elements, a name, and a unique ID.
|
||||
/// </summary>
|
||||
/// <param name="initialElements">Set of ElementBase
|
||||
/// object (or derived ones).</param>
|
||||
/// <param name="name">Name of these settings.</param>
|
||||
/// <param name="Uid">Unique ID for this Settings object.</param>
|
||||
public Settings(string name, IList<ElementBase> initialElements, Guid uid)
|
||||
: this(name, initialElements)
|
||||
{
|
||||
Uid = uid;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deserialization constructor.
|
||||
/// </summary>
|
||||
protected Settings(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
int version = info.GetInt32("Version");
|
||||
Uid = (Guid)info.GetValue("Uid", typeof(Guid));
|
||||
Name = info.GetString("Name");
|
||||
ReferenceStyle = (ReferenceStyle)info.GetValue("ReferenceStyle", typeof(ReferenceStyle));
|
||||
int elementsCount = info.GetInt32("ElementsCount");
|
||||
Elements = new List<ElementBase>();
|
||||
for (int i = 0; i < elementsCount; i++)
|
||||
{
|
||||
Type type = info.GetValue(SerializationElementName(i, "Type"), typeof(Type)) as Type;
|
||||
ElementBase element = info.GetValue(SerializationElementName(i, "Object"), type) as ElementBase;
|
||||
Elements.Add(element);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -117,5 +194,37 @@ namespace zaaReloaded2.Controller
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Implementation of ISerializable
|
||||
|
||||
public void GetObjectData(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
|
||||
info.AddValue("Uid", Uid);
|
||||
info.AddValue("Name", Name);
|
||||
info.AddValue("ReferenceStyle", ReferenceStyle);
|
||||
info.AddValue("ElementsCount", Elements.Count);
|
||||
int i = 0;
|
||||
foreach (ElementBase e in Elements)
|
||||
{
|
||||
info.AddValue(SerializationElementName(i, "Type"), e.GetType());
|
||||
info.AddValue(SerializationElementName(i, "Object"), e);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
string SerializationElementName(int index, string info)
|
||||
{
|
||||
return String.Format("Element{0}{1}", index, info);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
|
||||
// Defines header lines for the persistence file: "[My name]" and so on.
|
||||
static readonly Regex _persistenceHeaderRegex = new Regex(@"^\[(?<name>.+?)]$");
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -18,10 +18,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Configuration;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
using System.Reflection;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
using System.Runtime.Serialization.Formatters.Soap;
|
||||
using System.Web;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace zaaReloaded2.Controller
|
||||
{
|
||||
@ -35,30 +40,67 @@ namespace zaaReloaded2.Controller
|
||||
/// different from zaaReloaded's Settings.
|
||||
/// </remarks>
|
||||
[Serializable]
|
||||
public class SettingsRepository : ApplicationSettingsBase
|
||||
public class SettingsRepository : ISerializable
|
||||
{
|
||||
#region Persistence
|
||||
#region Properties persistence
|
||||
|
||||
/// <summary>
|
||||
/// Loads the SettingsRepository instance that was persisted in
|
||||
/// the assembly properties.
|
||||
/// </summary>
|
||||
/// <returns>SettingsRepository that was last stored in the
|
||||
/// assembly properties, or a newly created SettingsRepository
|
||||
/// if no previously stored exists.</returns>
|
||||
/// <remarks>
|
||||
/// The SettingsRepository is serialized using a SoapFormatter, which
|
||||
/// creates SOAP XML. Since the assembly properties are stored as
|
||||
/// XML as well, the serialized SettingsRepository is converted to
|
||||
/// a base-64 string, which does not mess with the properties XML.
|
||||
/// </remarks>
|
||||
public static SettingsRepository Load()
|
||||
{
|
||||
return
|
||||
zaaReloaded2.Properties.Settings.Default.SettingsRepository ??
|
||||
new SettingsRepository();
|
||||
string s = Properties.Settings.Default.SettingsRepository;
|
||||
if (String.IsNullOrEmpty(s))
|
||||
{
|
||||
return new SettingsRepository();
|
||||
}
|
||||
else
|
||||
{
|
||||
MemoryStream stream = new MemoryStream();
|
||||
string encoded = Properties.Settings.Default.SettingsRepository;
|
||||
byte[] bytes = Convert.FromBase64String(encoded);
|
||||
stream.Write(bytes, 0, bytes.Length);
|
||||
stream.Position = 0;
|
||||
SoapFormatter serializer = new SoapFormatter();
|
||||
return serializer.Deserialize(stream) as SettingsRepository;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stores the SettingsRepository in the assembly properties.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The SettingsRepository is serialized using a SoapFormatter, which
|
||||
/// creates SOAP XML. Since the assembly properties are stored as
|
||||
/// XML as well, the serialized SettingsRepository is converted to
|
||||
/// a base-64 string, which does not mess with the properties XML.
|
||||
/// </remarks>
|
||||
public void Store()
|
||||
{
|
||||
zaaReloaded2.Properties.Settings.Default.SettingsRepository = this;
|
||||
zaaReloaded2.Properties.Settings.Default.Save();
|
||||
MemoryStream stream = new MemoryStream();
|
||||
SoapFormatter serializer = new SoapFormatter();
|
||||
serializer.Serialize(stream, this);
|
||||
stream.Position = 0;
|
||||
string encoded = Convert.ToBase64String(stream.ToArray());
|
||||
Properties.Settings.Default.SettingsRepository = encoded;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
[UserScopedSetting()]
|
||||
[SettingsSerializeAs(SettingsSerializeAs.Xml)]
|
||||
public IList<Settings> SettingsList { get; private set; }
|
||||
public IList<Settings> SettingsList { get; protected set; }
|
||||
|
||||
#endregion
|
||||
|
||||
@ -76,6 +118,41 @@ namespace zaaReloaded2.Controller
|
||||
|
||||
#endregion
|
||||
|
||||
#region Serialization
|
||||
|
||||
protected SettingsRepository(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
int version = info.GetInt32("Version");
|
||||
int settingsCount = info.GetInt32("SettingsCount");
|
||||
SettingsList = new List<Settings>();
|
||||
for (int i = 0; i < settingsCount; i++)
|
||||
{
|
||||
Type type = info.GetValue(SerializationSettingsName(i, "Type"), typeof(Type)) as Type;
|
||||
Settings s = info.GetValue(SerializationSettingsName(i, "Object"), typeof(Settings)) as Settings;
|
||||
SettingsList.Add(s);
|
||||
}
|
||||
}
|
||||
|
||||
public void GetObjectData(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
|
||||
info.AddValue("SettingsCount", SettingsList.Count);
|
||||
int i = 0;
|
||||
foreach (Settings s in SettingsList)
|
||||
{
|
||||
info.AddValue(SerializationSettingsName(i, "Type"), s.GetType());
|
||||
info.AddValue(SerializationSettingsName(i, "Object"), s);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
string SerializationSettingsName(int index, string info)
|
||||
{
|
||||
return String.Format("Settings{0}{1}", index, info);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public methods
|
||||
|
||||
/// <summary>
|
||||
@ -89,6 +166,13 @@ namespace zaaReloaded2.Controller
|
||||
{
|
||||
return SettingsList.FirstOrDefault(s => s.Uid == uid);
|
||||
}
|
||||
|
||||
public static bool IsDefaultSettings(Settings settings)
|
||||
{
|
||||
return (settings.Name == Properties.Settings.Default.SettingsNameClinic + BUILTIN_LABEL ||
|
||||
settings.Name == Properties.Settings.Default.SettingsNameWard + BUILTIN_LABEL);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
@ -101,50 +185,40 @@ namespace zaaReloaded2.Controller
|
||||
{
|
||||
SettingsList.Clear();
|
||||
|
||||
// Shortcut to assembly properties
|
||||
zaaReloaded2.Properties.Settings def = zaaReloaded2.Properties.Settings.Default;
|
||||
Assembly myAssembly = this.GetType().Assembly;
|
||||
SoapFormatter deserializer = new SoapFormatter();
|
||||
Stream stream = myAssembly.GetManifestResourceStream("zaaReloaded2.Defaults.ward.zaaReloaded");
|
||||
Settings settings = deserializer.Deserialize(stream) as Settings;
|
||||
settings.Name = Properties.Settings.Default.SettingsNameWard + BUILTIN_LABEL;
|
||||
settings.Uid = Guid.Parse(DEFAULT_SETTINGS_1_UID);
|
||||
SettingsList.Add(settings);
|
||||
|
||||
// TODO: May want to create deep copies of this list below
|
||||
List<FormatElementBase> defaultItems = new List<FormatElementBase>()
|
||||
{
|
||||
new Items(def.DefaultItemsClinicalChem),
|
||||
new Items(def.DefaultItemsInflammation),
|
||||
new Items(def.DefaultItemsCardio),
|
||||
new Items(def.DefaultItemsKidney),
|
||||
new Items(def.DefaultItemsLiver),
|
||||
new Items(def.DefaultItemsLipids),
|
||||
new Items(def.DefaultItemsHematology),
|
||||
new Items(def.DefaultItemsCoagulation),
|
||||
new Items(def.DefaultItemsDrugs),
|
||||
new Items(def.DefaultItemsCollectedUrine),
|
||||
new Items(def.DefaultItemsSpotUrine),
|
||||
new Items(def.DefaultItemsOther),
|
||||
};
|
||||
|
||||
// Configure the settings for the ward
|
||||
SettingsList.Add(
|
||||
new Settings(
|
||||
def.SettingsNameWard,
|
||||
new List<ElementBase>()
|
||||
{
|
||||
new SelectFirstDay(defaultItems),
|
||||
new SelectLastDay(defaultItems)
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
// Configure the settings for the outpatient clinic
|
||||
SettingsList.Add(
|
||||
new Settings(
|
||||
def.SettingsNameClinic,
|
||||
new List<ElementBase>()
|
||||
{
|
||||
new SelectEachDay(defaultItems),
|
||||
}
|
||||
)
|
||||
);
|
||||
stream = myAssembly.GetManifestResourceStream("zaaReloaded2.Defaults.clinic.zaaReloaded");
|
||||
settings = deserializer.Deserialize(stream) as Settings;
|
||||
settings.Name = Properties.Settings.Default.SettingsNameClinic + BUILTIN_LABEL;
|
||||
settings.Uid = Guid.Parse(DEFAULT_SETTINGS_2_UID);
|
||||
SettingsList.Add(settings);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constants
|
||||
|
||||
/// <summary>
|
||||
/// Label that is appended to the default Settings' names.
|
||||
/// </summary>
|
||||
public const string BUILTIN_LABEL = " (eingebaut)";
|
||||
|
||||
/// <summary>
|
||||
/// Constant GUID for the first default Settings.
|
||||
/// </summary>
|
||||
const string DEFAULT_SETTINGS_1_UID = "EA79DE6C-E999-44F1-9122-929A8AA404CB";
|
||||
|
||||
/// <summary>
|
||||
/// Constant GUID for the second default Settings.
|
||||
/// </summary>
|
||||
const string DEFAULT_SETTINGS_2_UID = "783C63B5-A964-4368-B2D0-D4595DCCB952";
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
158
zaaReloaded2/Defaults/clinic.zaaReloaded
Executable file
@ -0,0 +1,158 @@
|
||||
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
|
||||
<SOAP-ENV:Body>
|
||||
<a1:Settings id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Uid xsi:type="a2:Guid" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<_a>-97947944</_a>
|
||||
<_b>-28017</_b>
|
||||
<_c>17434</_c>
|
||||
<_d>191</_d>
|
||||
<_e>72</_e>
|
||||
<_f>82</_f>
|
||||
<_g>56</_g>
|
||||
<_h>48</_h>
|
||||
<_i>158</_i>
|
||||
<_j>105</_j>
|
||||
<_k>95</_k>
|
||||
</Uid>
|
||||
<Name id="ref-3">NepA neu</Name>
|
||||
<ReferenceStyle xsi:type="a3:ReferenceStyle" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Formatter/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">IfSpecialItem</ReferenceStyle>
|
||||
<ElementsCount>1</ElementsCount>
|
||||
<Element0Type href="#ref-4"/>
|
||||
<Element0Object href="#ref-5"/>
|
||||
</a1:Settings>
|
||||
<a2:UnitySerializationHolder id="ref-4" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-6">zaaReloaded2.Controller.Elements.SelectEachDay</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName id="ref-7">zaaReloaded2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6ec8d075a1ab1383</AssemblyName>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:SelectEachDay id="ref-5" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<ChildrenCount>19</ChildrenCount>
|
||||
<Child0Type href="#ref-8"/>
|
||||
<Child0Object href="#ref-9"/>
|
||||
<Child1Type href="#ref-8"/>
|
||||
<Child1Object href="#ref-10"/>
|
||||
<Child2Type href="#ref-8"/>
|
||||
<Child2Object href="#ref-11"/>
|
||||
<Child3Type href="#ref-8"/>
|
||||
<Child3Object href="#ref-12"/>
|
||||
<Child4Type href="#ref-8"/>
|
||||
<Child4Object href="#ref-13"/>
|
||||
<Child5Type href="#ref-8"/>
|
||||
<Child5Object href="#ref-14"/>
|
||||
<Child6Type href="#ref-8"/>
|
||||
<Child6Object href="#ref-15"/>
|
||||
<Child7Type href="#ref-8"/>
|
||||
<Child7Object href="#ref-16"/>
|
||||
<Child8Type href="#ref-8"/>
|
||||
<Child8Object href="#ref-17"/>
|
||||
<Child9Type href="#ref-8"/>
|
||||
<Child9Object href="#ref-18"/>
|
||||
<Child10Type href="#ref-8"/>
|
||||
<Child10Object href="#ref-19"/>
|
||||
<Child11Type href="#ref-8"/>
|
||||
<Child11Object href="#ref-20"/>
|
||||
<Child12Type href="#ref-8"/>
|
||||
<Child12Object href="#ref-21"/>
|
||||
<Child13Type href="#ref-8"/>
|
||||
<Child13Object href="#ref-22"/>
|
||||
<Child14Type href="#ref-8"/>
|
||||
<Child14Object href="#ref-23"/>
|
||||
<Child15Type href="#ref-24"/>
|
||||
<Child15Object href="#ref-25"/>
|
||||
<Child16Type href="#ref-24"/>
|
||||
<Child16Object href="#ref-26"/>
|
||||
<Child17Type href="#ref-24"/>
|
||||
<Child17Object href="#ref-27"/>
|
||||
<Child18Type href="#ref-8"/>
|
||||
<Child18Object href="#ref-28"/>
|
||||
</a4:SelectEachDay>
|
||||
<a2:UnitySerializationHolder id="ref-8" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-29">zaaReloaded2.Controller.Elements.Items</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName href="#ref-7"/>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:Items id="ref-9" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-30">Klinische Chemie: Na, K, Cl, Mg, Ca, P, CaxP, Alb, Prot, Haptoglobin, LDH, Glukose, Harnsäure</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-10" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-31">Entzündung/Immunsystem: CRP, Pct, C3c, C4, Anti-DNAse B, ASL</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-11" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-32">Kardiale Marker: CK, CKMB, Trop, NTproBNP</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-12" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-33">Niere: Krea, Hst, eGFR (CKD-EPI)</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-13" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-34">Sammelurin: SU-Proteinurie, SU-Alb, SU-CrCl, SU-HstCl, SU-GFR, SU-Natrium, SU-Zeit, SU-Volumen</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-14" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-35">Spot-Urin: U-*</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-15" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-36">Leber: GOT, GGT, GPT, AP, Bilirubin, CHE</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-16" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-37">Blutfette: TG, Chol, LDL, HDL, Lp(a)</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-17" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-38">Hämatologie: Hb, Hkt, Reti, Leu, Thr, MCV, HbA1c, Retikulozyten, Fragmentozyten</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-18" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-39">Gerinnung: Quick, INR, PTT, Fibrinogen, ATIII, Anti-Xa</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-19" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-40">Diff.-BB: Ery, Neu, Lym, Mon, Baso, Eos</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-20" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-41">Hormone: iPTH, TSH</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-21" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-42">Medikamente: TAC, CSA, SIR, Vancomycin, Gentamicin, Tobramicin</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-22" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-43">Eisenhaushalt: Eisen, Ferritin, Transferrin, Tf.-Sätt.</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-23" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-44">BGA: pH, Std.-Bic., BE</Content>
|
||||
</a4:Items>
|
||||
<a2:UnitySerializationHolder id="ref-24" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-45">zaaReloaded2.Controller.Elements.CustomText</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName href="#ref-7"/>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:CustomText id="ref-25" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-46">Virologie (EDTA-Blut): CMV-PCR, BKV-PCR</Content>
|
||||
</a4:CustomText>
|
||||
<a4:CustomText id="ref-26" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-47">Nephrolog. Sediment: pH, Proteinurie, Ery /µl, Leu /µl, Plattenep. /µl, Bakt., Schleimfäden</Content>
|
||||
</a4:CustomText>
|
||||
<a4:CustomText id="ref-27" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-48">Autoantikörper: ANCA (IF), MPO-ANCA (ELISA), PR3-ANCA (ELISA), ANA (IF), AnDNA (ELISA), AnDNA (RIA)</Content>
|
||||
</a4:CustomText>
|
||||
<a4:Items id="ref-28" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-49">Hepatitis-Serologie: Anti-HBs, Anti-HBc</Content>
|
||||
</a4:Items>
|
||||
</SOAP-ENV:Body>
|
||||
</SOAP-ENV:Envelope>
|
117
zaaReloaded2/Defaults/parameters.txt
Executable file
@ -0,0 +1,117 @@
|
||||
# LAURIS-NAME "KANONISCHER NAME" MATERIAL "IMMER REFERENZBEREICH" "BLACKLIST"
|
||||
# =========== ================== ======== ======================= ===========
|
||||
"Übergangsepithelien (U)" Übergangsep. U
|
||||
"a1-Microglobulin (SU)" a1-Microglobulin SU
|
||||
"a1-Microglobulin (SU)/die" a1-Microglobulin SU
|
||||
"aktuelles Bicarbonat" Bic BGA
|
||||
"Albumin (PU)" Alb U
|
||||
"Albumin (SU)" Alb SU
|
||||
"Albumin (SU)/die" Alb SU
|
||||
Albumin Alb S
|
||||
Albumin/Creatinin (PU)" ACR U
|
||||
"Alk. Phosphatase" AP S
|
||||
Amylase Amylase S
|
||||
"anorg. Phosphat" P S
|
||||
"Bakterien (U)" Bakt U
|
||||
Basenabweichung BE BGA
|
||||
Basophile Baso E
|
||||
"Bilirubin (U)" Bilirubin U
|
||||
"C-reaktives Protein" CRP S
|
||||
"Calcium (SU)" Ca SU
|
||||
"Calcium (SU)/die" Ca SU
|
||||
Calcium Ca S
|
||||
Calcium-Phosphat-Produkt CaxP S
|
||||
Cholesterin Chol S
|
||||
CK gesamt" CK S
|
||||
"CK MB" CK-MB S
|
||||
"Creatinin (PU)" Krea U
|
||||
"Creatinin (SU)" Krea SU
|
||||
Creatinin Krea S
|
||||
"Creatinin-Clearance (SU)/min" CrCl SU
|
||||
"Cyclosporin-A vor Gabe" "CsA (C0)" S X
|
||||
"Cystatin C (N Latex)" "Cystatin C" S X
|
||||
Eisen Fe S
|
||||
Eosinophile Eos E
|
||||
"Erythrozyten (U)" Ery U
|
||||
Erythrozyten Ery E
|
||||
Ferritin Ferr S
|
||||
Gesamt-Bilirubin Bilirubin S
|
||||
"Gesamt-Eiweiss (PU)" Protein U
|
||||
"Gesamt-Eiweiss (SU)" Protein SU
|
||||
"Gesamt-Eiweiss (SU)/die" Proteinurie SU
|
||||
Gesamt-Eiweiss Protein S
|
||||
"Gesamt-Eiweiss/Creatinin (PU)" TPCR U
|
||||
GGT GGT S
|
||||
"glomeruläre Filtrationsrate" GFR SU
|
||||
"glomerul. Filtrationsr. (MDRD)" "eGFR (MDRD)" S --- X
|
||||
"glomerul. Filtrationsr. CKD-EP" "eGFR (CKD-EPI)" S
|
||||
"Glucose (U)" Glukose U
|
||||
Glucose Glukose S
|
||||
"GOT (ASAT)" GOT S
|
||||
"GPT (ALAT)" GPT S
|
||||
Hämatokrit Hkt E
|
||||
Hämoglobin Hb E
|
||||
Haptoglobin Haptoglobin S X
|
||||
Harnsäure Harnsäure S
|
||||
"Harnstoff (SU)" Hst SU
|
||||
"Harnstoff (SU)/die" Hst/Tag SU
|
||||
Harnstoff" Hst S
|
||||
"Harnstoff-Clearance (SU)/min" HstCl SU
|
||||
"HbA1c (NGSP)" HbA1c E
|
||||
"HDL - Cholesterin" HDL S
|
||||
"hyaline Zylinder (U)" "hyal. Zyl." U
|
||||
"Kalium (SU)" K U
|
||||
"Kalium (SU)/die" K SU
|
||||
Kalium K S
|
||||
"Ketonkörper (U)" KK U
|
||||
"Lactat Dehydrogenase" LDH S
|
||||
"LDL - Cholesterin" LDL S
|
||||
"Leukozyten (U)" Leu U
|
||||
Leukozyten Leu E
|
||||
Lymphozyten Lym E
|
||||
Magnesium Mg S X
|
||||
"MCH (HbE)" MCH E
|
||||
MCHC MCHC E
|
||||
MCV MCV E
|
||||
"Mittleres Plättchenvolumen" MPV E
|
||||
Monozyten Mon E
|
||||
"Natrium (SU)" Na SU
|
||||
"Natrium (SU)/die" Na SU
|
||||
Natrium Na S
|
||||
Neutrophile Neu E
|
||||
"Nitrit (U)" Nitrit U
|
||||
NT-proBNP NT-proBNP S
|
||||
"PCO2 (art.)" pCO2 BGA
|
||||
"pH (U)" pH U
|
||||
pH pH BGA
|
||||
"Plattenepithelien (U)" Plattenep U
|
||||
"PO2 (art.)" pO2 BGA
|
||||
"Protein (U)" Protein U
|
||||
"Sammelmenge (U)" Volumen SU
|
||||
"Sammelzeit (U)" Zeit SU
|
||||
"Sauerstoffsättigung (art.)" SO2 BGA
|
||||
Sirolimus SIR S
|
||||
"spezifisches Gewicht (U)" "spez. Gew." U
|
||||
"Standard Bicarbonat" "Std.-Bic." BGA
|
||||
"Tacrolimus (FK506)" TAC S
|
||||
Thrombozyten Thr E
|
||||
Transferrin Transferrin S
|
||||
"Transferrinsättigung" Tf.-Sätt. S
|
||||
"Triglyceride" TG S
|
||||
"Troponin T (high sensitive)" hsTnT S
|
||||
Unreife Granulozyten" Gran E
|
||||
"Urobilinogen (U)" Urobilinogen U
|
||||
"Niedermol. Heparin (Anti-Xa)" Anti-Xa Z
|
||||
"Thromboplastinzeit n. Quick" Quick Z
|
||||
PTT PTT Z
|
||||
"Ratio int. norm." INR Z
|
||||
"Komplementfaktor C3c" C3c S X
|
||||
"Komplementfaktor C4" C4 S X
|
||||
"Anti-DNAse B" "Anti-DNAse B" S
|
||||
Anti-Streptolysin ASL S
|
||||
"PTH intakt" iPTH S
|
||||
TSH TSH S
|
||||
HAPTOGLOBIN Haptoglobin S
|
||||
FRAGMENTOZYTEN Fragmentozyten E
|
||||
"HBc-Antikörper (gesamt)" Anti-HBc S
|
||||
HBs-Antikörper Anti-HBs S
|
@ -2,6 +2,9 @@
|
||||
# ============== ====================
|
||||
# WICHTIG: Nur direkt austauschbare Einheiten verwenden,
|
||||
# weil (bislang) keine Umrechnung der Werte vorgesehen ist!
|
||||
"ml/min/ 1,73qm" "ml/min/1,73 m²"
|
||||
"ml/min /1,73qm" "ml/min/1,73 m²"
|
||||
ng/ml µg/l
|
||||
mmol/l mM
|
||||
n*1000/µl /nl
|
||||
n*10E6/µl /fl
|
||||
Bak/µl /µl
|
208
zaaReloaded2/Defaults/ward.zaaReloaded
Executable file
@ -0,0 +1,208 @@
|
||||
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
|
||||
<SOAP-ENV:Body>
|
||||
<a1:Settings id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Uid xsi:type="a2:Guid" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<_a>-1732917544</_a>
|
||||
<_b>21822</_b>
|
||||
<_c>16721</_c>
|
||||
<_d>134</_d>
|
||||
<_e>250</_e>
|
||||
<_f>231</_f>
|
||||
<_g>106</_g>
|
||||
<_h>44</_h>
|
||||
<_i>93</_i>
|
||||
<_j>252</_j>
|
||||
<_k>234</_k>
|
||||
</Uid>
|
||||
<Name id="ref-3">Station neu</Name>
|
||||
<ReferenceStyle xsi:type="a3:ReferenceStyle" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Formatter/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">IfSpecialOrAbnormal</ReferenceStyle>
|
||||
<ElementsCount>4</ElementsCount>
|
||||
<Element0Type href="#ref-4"/>
|
||||
<Element0Object href="#ref-5"/>
|
||||
<Element1Type href="#ref-6"/>
|
||||
<Element1Object href="#ref-7"/>
|
||||
<Element2Type href="#ref-8"/>
|
||||
<Element2Object href="#ref-9"/>
|
||||
<Element3Type href="#ref-10"/>
|
||||
<Element3Object href="#ref-11"/>
|
||||
</a1:Settings>
|
||||
<a2:UnitySerializationHolder id="ref-4" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-12">zaaReloaded2.Controller.Elements.TwoColumns</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName id="ref-13">zaaReloaded2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6ec8d075a1ab1383</AssemblyName>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:TwoColumns id="ref-5" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<ChildrenCount>0</ChildrenCount>
|
||||
</a4:TwoColumns>
|
||||
<a2:UnitySerializationHolder id="ref-6" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-14">zaaReloaded2.Controller.Elements.SelectFirstDay</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName href="#ref-13"/>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:SelectFirstDay id="ref-7" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<ChildrenCount>17</ChildrenCount>
|
||||
<Child0Type href="#ref-15"/>
|
||||
<Child0Object href="#ref-16"/>
|
||||
<Child1Type href="#ref-15"/>
|
||||
<Child1Object href="#ref-17"/>
|
||||
<Child2Type href="#ref-15"/>
|
||||
<Child2Object href="#ref-18"/>
|
||||
<Child3Type href="#ref-15"/>
|
||||
<Child3Object href="#ref-19"/>
|
||||
<Child4Type href="#ref-15"/>
|
||||
<Child4Object href="#ref-20"/>
|
||||
<Child5Type href="#ref-15"/>
|
||||
<Child5Object href="#ref-21"/>
|
||||
<Child6Type href="#ref-15"/>
|
||||
<Child6Object href="#ref-22"/>
|
||||
<Child7Type href="#ref-15"/>
|
||||
<Child7Object href="#ref-23"/>
|
||||
<Child8Type href="#ref-15"/>
|
||||
<Child8Object href="#ref-24"/>
|
||||
<Child9Type href="#ref-15"/>
|
||||
<Child9Object href="#ref-25"/>
|
||||
<Child10Type href="#ref-15"/>
|
||||
<Child10Object href="#ref-26"/>
|
||||
<Child11Type href="#ref-15"/>
|
||||
<Child11Object href="#ref-27"/>
|
||||
<Child12Type href="#ref-15"/>
|
||||
<Child12Object href="#ref-28"/>
|
||||
<Child13Type href="#ref-15"/>
|
||||
<Child13Object href="#ref-29"/>
|
||||
<Child14Type href="#ref-15"/>
|
||||
<Child14Object href="#ref-30"/>
|
||||
<Child15Type href="#ref-15"/>
|
||||
<Child15Object href="#ref-31"/>
|
||||
<Child16Type href="#ref-15"/>
|
||||
<Child16Object href="#ref-32"/>
|
||||
</a4:SelectFirstDay>
|
||||
<a2:UnitySerializationHolder id="ref-8" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-33">zaaReloaded2.Controller.Elements.NextColumn</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName href="#ref-13"/>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:NextColumn id="ref-9" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<ChildrenCount>0</ChildrenCount>
|
||||
</a4:NextColumn>
|
||||
<a2:UnitySerializationHolder id="ref-10" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-34">zaaReloaded2.Controller.Elements.SelectLastDay</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName href="#ref-13"/>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:SelectLastDay id="ref-11" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<ChildrenCount>17</ChildrenCount>
|
||||
<Child0Type href="#ref-15"/>
|
||||
<Child0Object href="#ref-16"/>
|
||||
<Child1Type href="#ref-15"/>
|
||||
<Child1Object href="#ref-17"/>
|
||||
<Child2Type href="#ref-15"/>
|
||||
<Child2Object href="#ref-18"/>
|
||||
<Child3Type href="#ref-15"/>
|
||||
<Child3Object href="#ref-19"/>
|
||||
<Child4Type href="#ref-15"/>
|
||||
<Child4Object href="#ref-20"/>
|
||||
<Child5Type href="#ref-15"/>
|
||||
<Child5Object href="#ref-21"/>
|
||||
<Child6Type href="#ref-15"/>
|
||||
<Child6Object href="#ref-22"/>
|
||||
<Child7Type href="#ref-15"/>
|
||||
<Child7Object href="#ref-23"/>
|
||||
<Child8Type href="#ref-15"/>
|
||||
<Child8Object href="#ref-24"/>
|
||||
<Child9Type href="#ref-15"/>
|
||||
<Child9Object href="#ref-25"/>
|
||||
<Child10Type href="#ref-15"/>
|
||||
<Child10Object href="#ref-26"/>
|
||||
<Child11Type href="#ref-15"/>
|
||||
<Child11Object href="#ref-27"/>
|
||||
<Child12Type href="#ref-15"/>
|
||||
<Child12Object href="#ref-28"/>
|
||||
<Child13Type href="#ref-15"/>
|
||||
<Child13Object href="#ref-29"/>
|
||||
<Child14Type href="#ref-15"/>
|
||||
<Child14Object href="#ref-30"/>
|
||||
<Child15Type href="#ref-15"/>
|
||||
<Child15Object href="#ref-31"/>
|
||||
<Child16Type href="#ref-15"/>
|
||||
<Child16Object href="#ref-32"/>
|
||||
</a4:SelectLastDay>
|
||||
<a2:UnitySerializationHolder id="ref-15" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||
<Data id="ref-35">zaaReloaded2.Controller.Elements.Items</Data>
|
||||
<UnityType>4</UnityType>
|
||||
<AssemblyName href="#ref-13"/>
|
||||
</a2:UnitySerializationHolder>
|
||||
<a4:Items id="ref-16" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-36">Klinische Chemie: Na, K, Cl, Mg, Ca, P, CaxP, Alb, Prot, Haptoglobin, LDH, Glukose, Harnsäure</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-17" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-37">Entzündung/Immunsystem: CRP, Pct, C3c, C4, Anti-DNAse B, ASL</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-18" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-38">Kardiale Marker: CK, CKMB, Trop, NTproBNP</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-19" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-39">Niere: Krea, Hst, eGFR (CKD-EPI)</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-20" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-40">Sammelurin: SU-Proteinurie, SU-Alb, SU-CrCl, SU-HstCl, SU-GFR, SU-Natrium, SU-Zeit, SU-Volumen</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-21" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-41">Spot-Urin: U-*</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-22" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-42">Leber: GOT, GGT, GPT, AP, Bilirubin, CHE</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-23" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-43">Blutfette: TG, Chol, LDL, HDL, Lp(a)</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-24" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-44">Hämatologie: Hb, Hkt, Reti, Leu, Thr, MCV, HbA1c, Retikulozyten, Fragmentozyten</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-25" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-45">Gerinnung: Quick, INR, PTT, Fibrinogen, ATIII, Anti-Xa</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-26" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-46">Diff.-BB: Ery, Neu, Lym, Mon, Baso, Eos</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-27" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-47">Hormone: iPTH, TSH</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-28" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-48">Medikamente: TAC, CSA, SIR, Vancomycin, Gentamicin, Tobramicin</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-29" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-49">Eisenhaushalt: Eisen, Ferritin, Transferrin, Tf.-Sätt.</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-30" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-50">BGA: pH, Std.-Bic., BE</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-31" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-51">Hepatitis-Serologie: Anti-HBs, Anti-HBc</Content>
|
||||
</a4:Items>
|
||||
<a4:Items id="ref-32" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||
<Version>1</Version>
|
||||
<Content id="ref-52">Weitere Werte: *</Content>
|
||||
</a4:Items>
|
||||
</SOAP-ENV:Body>
|
||||
</SOAP-ENV:Envelope>
|
@ -25,7 +25,8 @@
|
||||
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
|
||||
xmlns:settings="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
|
||||
xmlns:converter="clr-namespace:Bovender.Mvvm.Converters;assembly=Bovender"
|
||||
SizeToContent="Height" Width="700"
|
||||
SizeToContent="Height" Width="700" ShowInTaskbar="False"
|
||||
WindowStyle="ToolWindow" Topmost="True" ResizeMode="CanResizeWithGrip"
|
||||
x:Name="exceptionDetailView"
|
||||
Title="Technische Fehlerdetails"
|
||||
settings:WindowState.Save="True"
|
||||
|
@ -27,6 +27,7 @@
|
||||
xmlns:actions="clr-namespace:Bovender.Mvvm.Actions;assembly=Bovender"
|
||||
xmlns:settings="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
|
||||
SizeToContent="WidthAndHeight" ResizeMode="CanResizeWithGrip"
|
||||
WindowStyle="ToolWindow" ShowInTaskbar="False" Topmost="True"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
Title="zaaReloaded2: Fehler!"
|
||||
settings:WindowState.Save="True"
|
||||
|
@ -32,8 +32,7 @@ namespace zaaReloaded2.ExceptionHandler
|
||||
{
|
||||
get
|
||||
{
|
||||
// TODO: Get Word version
|
||||
return "n/a";
|
||||
return Globals.ThisAddIn.Application.Build;
|
||||
}
|
||||
}
|
||||
|
||||
@ -84,7 +83,7 @@ namespace zaaReloaded2.ExceptionHandler
|
||||
|
||||
protected override string DevPath()
|
||||
{
|
||||
return @"x:\Code\zaaReloaded2\";
|
||||
return @"x:\Code\zaaReloaded2\zaaReloaded2\";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -53,6 +53,12 @@ namespace zaaReloaded2.Formatter
|
||||
/// </summary>
|
||||
public bool HasBufferedText { get { return _buffer.Length > 0; } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the desired paragraph style when flushing into
|
||||
/// a Document.
|
||||
/// </summary>
|
||||
public string ParagraphStyle { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@ -113,7 +119,14 @@ namespace zaaReloaded2.Formatter
|
||||
|
||||
if (Document != null)
|
||||
{
|
||||
Document.Range().Text = _buffer.ToString();
|
||||
Selection s = Document.ActiveWindow.Selection;
|
||||
s.ClearCharacterDirectFormatting();
|
||||
s.ClearParagraphDirectFormatting();
|
||||
if (!string.IsNullOrEmpty(ParagraphStyle))
|
||||
{
|
||||
s.set_Style(ParagraphStyle);
|
||||
}
|
||||
s.Range.Text = _buffer.ToString();
|
||||
}
|
||||
if (Parent != null)
|
||||
{
|
||||
|
@ -64,6 +64,12 @@ namespace zaaReloaded2.Formatter
|
||||
/// </summary>
|
||||
public Dictionary<DateTime, TimePointFormatter> WorkingTimePoints { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Is true if this Formatter object carries a Laboratory with
|
||||
/// at least one time point.
|
||||
/// </summary>
|
||||
public bool CanRun { get { return Laboratory.TimePoints.Count > 0; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@ -113,6 +119,10 @@ namespace zaaReloaded2.Formatter
|
||||
/// current position of the cursor).</param>
|
||||
public void Run()
|
||||
{
|
||||
if (!CanRun) throw new InvalidOperationException("No laboratory data to format.");
|
||||
|
||||
CreateParagraphStyle();
|
||||
_secondaryBuffer.ParagraphStyle = zaaReloaded2.Properties.Settings.Default.ParagraphStyleName;
|
||||
int current = 0;
|
||||
while (current < Settings.Elements.Count)
|
||||
{
|
||||
@ -195,7 +205,68 @@ namespace zaaReloaded2.Formatter
|
||||
/// FormatElementBase children to process.</param>
|
||||
public void ProcessAllTimePoints(ControlElementBase controlElement)
|
||||
{
|
||||
ProcessAllTimePoints(controlElement.FormatElements);
|
||||
ProcessAllTimePoints(controlElement.Children);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserts a table with two columns into the document.
|
||||
/// </summary>
|
||||
public void InsertTwoColumns()
|
||||
{
|
||||
_secondaryBuffer.Flush();
|
||||
if (Document != null)
|
||||
{
|
||||
Range r = Document.ActiveWindow.Selection.Range;
|
||||
_table = Document.Tables.Add(r, NumRows: 1, NumColumns: 2);
|
||||
_table.AllowAutoFit = true;
|
||||
_table.AutoFitBehavior(WdAutoFitBehavior.wdAutoFitWindow);
|
||||
_table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
|
||||
_table.PreferredWidth = 100;
|
||||
_table.Borders.Enable = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Moves the insertion point to the next column in a layout
|
||||
/// table.
|
||||
/// </summary>
|
||||
public void NextColumn()
|
||||
{
|
||||
if (_table == null)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Kann nicht zur nächsten Spalte wechseln, da bislang keine Tabelle eingefügt wurde.");
|
||||
}
|
||||
_secondaryBuffer.Flush();
|
||||
Document.ActiveWindow.Selection.MoveRight(WdUnits.wdCell);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a zaaReloaded2 paragraph style in the document.
|
||||
/// </summary>
|
||||
public void CreateParagraphStyle()
|
||||
{
|
||||
if (Document != null)
|
||||
{
|
||||
Style style;
|
||||
// Don't see a better way to check for the existence of a particular
|
||||
// paragraph style than by using a try...catch construction.
|
||||
try
|
||||
{
|
||||
style = Document.Styles[Properties.Settings.Default.ParagraphStyleName];
|
||||
}
|
||||
catch
|
||||
{
|
||||
style = Document.Styles.Add(Properties.Settings.Default.ParagraphStyleName);
|
||||
style.Font.Size = 10; // pt
|
||||
style.Font.Bold = 0;
|
||||
style.Font.Italic = 0;
|
||||
style.Font.Underline = 0;
|
||||
style.ParagraphFormat.LeftIndent = 36; // pt
|
||||
style.ParagraphFormat.FirstLineIndent = -36; // pt
|
||||
style.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -259,7 +330,7 @@ namespace zaaReloaded2.Formatter
|
||||
throw new ArgumentNullException("workingTimePoints");
|
||||
|
||||
WorkingTimePoints = workingTimePoints;
|
||||
ProcessElements(controlElement.FormatElements);
|
||||
ProcessElements(controlElement.Children);
|
||||
if (_primaryBuffer.HasBufferedText)
|
||||
{
|
||||
_primaryBuffer.Prepend(
|
||||
@ -286,6 +357,7 @@ namespace zaaReloaded2.Formatter
|
||||
Laboratory _laboratory;
|
||||
DocumentWriter _primaryBuffer;
|
||||
DocumentWriter _secondaryBuffer;
|
||||
Table _table;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -48,6 +48,23 @@ namespace zaaReloaded2.Formatter
|
||||
/// </summary>
|
||||
public bool HasBeenUsed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a flag that tells the formatter to include or
|
||||
/// not include the material indicator in the formatted output.
|
||||
/// Default is true.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For example, items that are selected with a wildcard may
|
||||
/// contain the material info, while expressly chosen items
|
||||
/// may not.
|
||||
/// </remarks>
|
||||
public bool IncludeMaterial { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether the Item is marked as blacklisted in the thesaurus.
|
||||
/// </summary>
|
||||
public bool IsBlacklisted { get { return LabItem.IsBlacklisted; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
@ -58,6 +75,7 @@ namespace zaaReloaded2.Formatter
|
||||
/// <param name="labItem">LabItem to wrap in this ItemFormatter.</param>
|
||||
public ItemFormatter(LabItem labItem, ReferenceStyle referenceStyle)
|
||||
{
|
||||
IncludeMaterial = true;
|
||||
LabItem = labItem;
|
||||
ReferenceStyle = referenceStyle;
|
||||
}
|
||||
@ -133,11 +151,13 @@ namespace zaaReloaded2.Formatter
|
||||
value = LabItem.Value;
|
||||
}
|
||||
|
||||
string name = IncludeMaterial ? LabItem.QualifiedName : LabItem.Name;
|
||||
|
||||
// Insert the formatted text into the document.
|
||||
formatter.Write(
|
||||
String.Format(
|
||||
"{0} {1}{2}{3}",
|
||||
LabItem.QualifiedName,
|
||||
name,
|
||||
value,
|
||||
unit,
|
||||
reference
|
||||
|
@ -26,37 +26,36 @@ 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")]
|
||||
[Description("Niemals")]
|
||||
Never,
|
||||
|
||||
/// <summary>
|
||||
/// Write normal range if item is marked in dictionary
|
||||
/// </summary>
|
||||
[Description("Referenzbereich ausgeben, falls Parameter so markiert ist")]
|
||||
[Description("Bei speziellen Parametern immer")]
|
||||
IfSpecialItem,
|
||||
|
||||
/// <summary>
|
||||
/// Write normal range if value is abnormal
|
||||
/// </summary>
|
||||
[Description("Referenzbereich ausgeben, falls Wert nicht normal ist")]
|
||||
[Description("Bei pathologischem Wert")]
|
||||
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")]
|
||||
[Description("Bei pathologischem Wert oder speziellem Parameter")]
|
||||
IfSpecialOrAbnormal,
|
||||
|
||||
/// <summary>
|
||||
/// Always write normal range reference
|
||||
/// </summary>
|
||||
[Description("Referenzbereich immer ausgeben")]
|
||||
[Description("Immer")]
|
||||
Always
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,55 @@ namespace zaaReloaded2.Formatter
|
||||
/// </summary>
|
||||
public class TimePointFormatter
|
||||
{
|
||||
#region Static methods
|
||||
|
||||
/// <summary>
|
||||
/// Builds a header paragraph from a Date,
|
||||
/// but only if the Date structure has a value.
|
||||
/// </summary>
|
||||
public static string DateHeader(DateTime date)
|
||||
{
|
||||
if (date != _nullTimeStamp.Date)
|
||||
{
|
||||
return FormatHeader(date.ToShortDateString());
|
||||
}
|
||||
else
|
||||
{
|
||||
return String.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builds a header paragraph from a DateTime structure,
|
||||
/// but only if the DateTime structure has a value.
|
||||
/// </summary>
|
||||
public static string DateAndTimeHeader(DateTime dateTime)
|
||||
{
|
||||
if (dateTime != _nullTimeStamp)
|
||||
{
|
||||
return FormatHeader(dateTime.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
return String.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private static methods
|
||||
|
||||
static string FormatHeader(string text)
|
||||
{
|
||||
return String.Format("{0}Laborwerte vom {1}:{2}",
|
||||
Environment.NewLine,
|
||||
text,
|
||||
Environment.NewLine
|
||||
);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
@ -77,7 +126,7 @@ namespace zaaReloaded2.Formatter
|
||||
/// <returns></returns>
|
||||
public string GetDateHeader()
|
||||
{
|
||||
return FormatHeader(TimeStamp.ToShortDateString());
|
||||
return DateHeader(TimeStamp);
|
||||
}
|
||||
|
||||
|
||||
@ -88,21 +137,14 @@ namespace zaaReloaded2.Formatter
|
||||
/// <returns></returns>
|
||||
public string GetDateAndTimeHeader()
|
||||
{
|
||||
return FormatHeader(TimeStamp.ToString());
|
||||
return DateAndTimeHeader(TimeStamp);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
#region Fields
|
||||
|
||||
string FormatHeader(string text)
|
||||
{
|
||||
return String.Format("{0}{1}:{2}",
|
||||
Environment.NewLine,
|
||||
text,
|
||||
Environment.NewLine
|
||||
);
|
||||
}
|
||||
static readonly DateTime _nullTimeStamp = new DateTime();
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
BIN
zaaReloaded2/Icons/down.png
Normal file
After Width: | Height: | Size: 545 B |
BIN
zaaReloaded2/Icons/duplicate.png
Normal file
After Width: | Height: | Size: 337 B |
BIN
zaaReloaded2/Icons/exit.png
Normal file
After Width: | Height: | Size: 751 B |
BIN
zaaReloaded2/Icons/export.png
Normal file
After Width: | Height: | Size: 365 B |
BIN
zaaReloaded2/Icons/gear.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
zaaReloaded2/Icons/import.png
Normal file
After Width: | Height: | Size: 470 B |
BIN
zaaReloaded2/Icons/minus.png
Normal file
After Width: | Height: | Size: 280 B |
BIN
zaaReloaded2/Icons/pen.png
Normal file
After Width: | Height: | Size: 739 B |
BIN
zaaReloaded2/Icons/plus-child.png
Normal file
After Width: | Height: | Size: 557 B |
BIN
zaaReloaded2/Icons/plus.png
Normal file
After Width: | Height: | Size: 393 B |
BIN
zaaReloaded2/Icons/reset.png
Normal file
After Width: | Height: | Size: 743 B |
BIN
zaaReloaded2/Icons/up.png
Normal file
After Width: | Height: | Size: 537 B |
@ -30,6 +30,11 @@ namespace zaaReloaded2.Importer
|
||||
/// </summary>
|
||||
Laboratory Laboratory { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whether the import was successful.
|
||||
/// </summary>
|
||||
bool Success { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Imports laboratory data contained in a string.
|
||||
/// </summary>
|
||||
|
@ -74,7 +74,9 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
if (parameterDictionary != null)
|
||||
{
|
||||
Name = parameterDictionary.GetCanonicalName(OriginalName);
|
||||
AlwaysPrintLimits = parameterDictionary.GetForceReferenceDisplay(Name);
|
||||
AlwaysPrintLimits = parameterDictionary.GetForceReferenceDisplay(OriginalName);
|
||||
IsBlacklisted = parameterDictionary.GetIsBlacklisted(OriginalName);
|
||||
Material = parameterDictionary.GetMaterial(OriginalName, Material);
|
||||
}
|
||||
if (unitDictionary != null)
|
||||
{
|
||||
@ -164,10 +166,12 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Analyses the Lauris name for a material abbreviation.
|
||||
/// If the parameter does not refer to blood (serum, whole
|
||||
/// blood, etc.), Lauris appends an abbreviation in parentheses
|
||||
/// to the parameter name.
|
||||
/// Parses the original Lauris name for a material abbreviation.
|
||||
/// This may be misleading in certain cases, e.g. "Sammelmenge (U)"
|
||||
/// appears to be spot urine ("U"), but is collected urine instead
|
||||
/// ("SU"). Therefore, in the constructor that takes the thesaurus
|
||||
/// parameters, the material is looked up in the Parameters thesaurus.
|
||||
/// ("Sammelmenge (U)" is contained in the Parameters thesaurus.)
|
||||
/// </summary>
|
||||
/// <example>
|
||||
/// Gesamt-Eiweiss (SU), Albumin (SU)/die, Gesamt-Eiweiss (PU)
|
||||
|
@ -32,6 +32,19 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
/// </summary>
|
||||
public class LaurisParagraph
|
||||
{
|
||||
#region Static methods
|
||||
|
||||
/// <summary>
|
||||
/// Investigates a paragraph and determines whether it looks
|
||||
/// like a Lauris laboratory items paragraph.
|
||||
/// </summary>
|
||||
public static bool ResemblesLaurisParagraph(string paragraph)
|
||||
{
|
||||
return _expectedFormat.IsMatch(paragraph);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public properties
|
||||
|
||||
/// <summary>
|
||||
@ -122,7 +135,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
|
||||
#region Fields
|
||||
|
||||
static readonly Regex _expectedFormat = new Regex(@"(?<caption>[^:]+:\s*)?(?<items>[^:]+:\s*[^;]+;)*");
|
||||
static readonly Regex _expectedFormat = new Regex(@"(?<caption>[^:]+:\s*)?(?<items>[^:]+:\s*[^;]+;)+");
|
||||
Thesaurus.Parameters _parameterDictionary;
|
||||
Thesaurus.Units _unitDictionary;
|
||||
|
||||
|
@ -65,11 +65,15 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
/// <summary>
|
||||
/// Gets an array of paragraphs in this LaurisText.
|
||||
/// </summary>
|
||||
public string[] Paragraphs
|
||||
public IList<String> Paragraphs
|
||||
{
|
||||
[DebuggerStepThrough]
|
||||
get
|
||||
{
|
||||
if (_paragraphs == null)
|
||||
{
|
||||
_paragraphs = new List<String>();
|
||||
}
|
||||
return _paragraphs;
|
||||
}
|
||||
set
|
||||
@ -83,7 +87,13 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
/// Is true if the LaurisText has time stamp in the first
|
||||
/// paragraph and <see cref="LabItem"/>s in the others.
|
||||
/// </summary>
|
||||
public bool IsValidTimePoint { get; private set; }
|
||||
public bool IsValidTimePoint
|
||||
{
|
||||
get
|
||||
{
|
||||
return Items.Count > 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the original Lauris text for this timepoint.
|
||||
@ -101,7 +111,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
{
|
||||
Paragraphs = value.Split(
|
||||
new string[] { Environment.NewLine },
|
||||
StringSplitOptions.None);
|
||||
StringSplitOptions.None).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -128,19 +138,41 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
{ }
|
||||
|
||||
public LaurisTimePoint(
|
||||
string[] paragraphs,
|
||||
IList<String> paragraphs,
|
||||
Parameters parameterDictionary,
|
||||
Units unitDictionary)
|
||||
: this(parameterDictionary, unitDictionary)
|
||||
{
|
||||
Paragraphs = paragraphs;
|
||||
}
|
||||
|
||||
public LaurisTimePoint(IList<String> paragraphs)
|
||||
: this(paragraphs, null, null)
|
||||
{
|
||||
}
|
||||
|
||||
public LaurisTimePoint(
|
||||
Parameters parameterDictionary,
|
||||
Units unitDictionary)
|
||||
: this()
|
||||
{
|
||||
_parameterDictionary = parameterDictionary;
|
||||
_unitDictionary = unitDictionary;
|
||||
Paragraphs = paragraphs;
|
||||
}
|
||||
|
||||
public LaurisTimePoint(string[] paragraphs)
|
||||
: this(paragraphs, null, null)
|
||||
#endregion
|
||||
|
||||
#region Public methods
|
||||
|
||||
/// <summary>
|
||||
/// Adds a new paragraph to this time point by parsing
|
||||
/// the paragraph for laboratory items.
|
||||
/// </summary>
|
||||
/// <param name="paragraph">Paragraph to add.</param>
|
||||
public void AddParagraph(string paragraph)
|
||||
{
|
||||
Paragraphs.Add(paragraph);
|
||||
ParseParagraph(paragraph);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -151,59 +183,43 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
/// Analyzes each Lauris paragraph in this time point, sets the date
|
||||
/// and time, and collects LabItem data.
|
||||
/// </summary>
|
||||
/// <returns>True if the LaurisText has time stamp in the first paragraphs
|
||||
/// and contains <see cref="LabItem"/>s in the others.</returns>
|
||||
bool ParseParagraphs()
|
||||
void ParseParagraphs()
|
||||
{
|
||||
if (Paragraphs.Length > 0)
|
||||
if (Paragraphs != null)
|
||||
{
|
||||
if (!ParseTimeStamp()) return false;
|
||||
LaurisParagraph lp;
|
||||
if (IsValidTimePoint)
|
||||
foreach (string paragraph in Paragraphs)
|
||||
{
|
||||
for (int i = 1; i < Paragraphs.Length; i++)
|
||||
{
|
||||
lp = new LaurisParagraph(
|
||||
Paragraphs[i],
|
||||
_parameterDictionary,
|
||||
_unitDictionary);
|
||||
if (lp.IsLaurisParagraph)
|
||||
{
|
||||
Items.Merge(lp.Items);
|
||||
}
|
||||
}
|
||||
ParseParagraph(paragraph);
|
||||
}
|
||||
IsValidTimePoint = Items.Count > 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Analyzes the date and time information that is expected to be
|
||||
/// in the first paragraph.
|
||||
/// </summary>
|
||||
/// <returns>True if the LaurisText contains a time stamp in the
|
||||
/// first paragraph.</returns>
|
||||
bool ParseTimeStamp()
|
||||
void ParseParagraph(string paragraph)
|
||||
{
|
||||
if (Paragraphs.Length == 0)
|
||||
throw new InvalidOperationException("The time point has no paragraphs.");
|
||||
|
||||
Match m = _timeStampRegex.Match(Paragraphs[0]);
|
||||
bool success = false;
|
||||
if (m.Success)
|
||||
if (_timeStampRegex.IsMatch(paragraph))
|
||||
{
|
||||
DateTime dt;
|
||||
success = DateTime.TryParseExact(
|
||||
m.Groups["datetime"].Value,
|
||||
if (DateTime.TryParseExact(
|
||||
_timeStampRegex.Match(paragraph).Groups["datetime"].Value,
|
||||
"dd.MM.yyyy HH:mm",
|
||||
CultureInfo.InvariantCulture,
|
||||
DateTimeStyles.AllowWhiteSpaces,
|
||||
out dt);
|
||||
TimeStamp = dt;
|
||||
out dt))
|
||||
{
|
||||
TimeStamp = dt;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LaurisParagraph lp = new LaurisParagraph(
|
||||
paragraph,
|
||||
_parameterDictionary,
|
||||
_unitDictionary);
|
||||
if (lp.IsLaurisParagraph)
|
||||
{
|
||||
Items.Merge(lp.Items);
|
||||
}
|
||||
}
|
||||
IsValidTimePoint = success;
|
||||
return success;
|
||||
}
|
||||
|
||||
void AddItems(IItemDictionary items)
|
||||
@ -221,7 +237,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
/// </summary>
|
||||
static readonly Regex _timeStampRegex = new Regex(
|
||||
@"^\s*\(?\s*(?<datetime>\d\d\.\d\d\.\d\d\d\d\s+\d\d:\d\d)");
|
||||
string[] _paragraphs;
|
||||
IList<String> _paragraphs;
|
||||
Parameters _parameterDictionary;
|
||||
Units _unitDictionary;
|
||||
|
||||
|
@ -52,6 +52,14 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
}
|
||||
}
|
||||
|
||||
public bool Success
|
||||
{
|
||||
get
|
||||
{
|
||||
return Laboratory.TimePoints.Count > 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Splits the <paramref name="text"/> into individual time points
|
||||
/// and creates <see cref="LaurisTimePoint"/> objects from them.
|
||||
@ -59,45 +67,45 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
||||
/// <param name="text">ZAA-formatted Lauris output to import.</param>
|
||||
public void Import(string text)
|
||||
{
|
||||
// Split the text into parargraphs. This implementation relies on the fact
|
||||
// that the order or splitting strings in C#'s String.Split() method is
|
||||
// important; see http://stackoverflow.com/a/8664639/270712
|
||||
string[] paragraphs = text.Split(
|
||||
new string[] { Environment.NewLine },
|
||||
new string[] { "\r\n", "\n\r", "\r", "\n" },
|
||||
StringSplitOptions.RemoveEmptyEntries);
|
||||
int i = 0;
|
||||
int start = 0;
|
||||
int numParagraphs = paragraphs.Length;
|
||||
LaurisTimePoint timePoint = null;
|
||||
|
||||
while (i < numParagraphs)
|
||||
foreach (string paragraph in paragraphs)
|
||||
{
|
||||
// Search for the next occurrence of a time stamp line
|
||||
while (i < numParagraphs
|
||||
&& !LaurisTimePoint.IsTimeStampLine(paragraphs[i]))
|
||||
// If the current paragraph looks like a Lauris time stamp,
|
||||
// create a new time point.
|
||||
if (LaurisTimePoint.IsTimeStampLine(paragraph))
|
||||
{
|
||||
i++;
|
||||
}
|
||||
|
||||
// TODO: Find an alternative to returning in the middle of the method.
|
||||
if (i >= numParagraphs) return;
|
||||
|
||||
if (LaurisTimePoint.IsTimeStampLine(paragraphs[i]))
|
||||
{
|
||||
// Remember the time stamp line's index
|
||||
start = i;
|
||||
|
||||
// Seek the next time stamp line
|
||||
while (i + 1 < numParagraphs
|
||||
&& !LaurisTimePoint.IsTimeStampLine(paragraphs[i + 1]))
|
||||
timePoint = new LaurisTimePoint(paragraph, _parameters, _units);
|
||||
// Add the time point to the laboratory only if none
|
||||
// with the same time stamp exists yet.
|
||||
TimePoint existing = null;
|
||||
if (Laboratory.TryGetTimePoint(timePoint.TimeStamp, ref existing))
|
||||
{
|
||||
i++;
|
||||
timePoint = existing as LaurisTimePoint;
|
||||
}
|
||||
else
|
||||
{
|
||||
Laboratory.AddTimePoint(timePoint);
|
||||
}
|
||||
}
|
||||
|
||||
Laboratory.AddTimePoint(
|
||||
new LaurisTimePoint(
|
||||
paragraphs.Slice(start, i - start + 1),
|
||||
_parameters,
|
||||
_units
|
||||
)
|
||||
);
|
||||
// If the current paragraph looks like a paragraph with
|
||||
// laboratory items, add it to the current time point;
|
||||
// if no time point exists yet, create one.
|
||||
else if (LaurisParagraph.ResemblesLaurisParagraph(paragraph))
|
||||
{
|
||||
if (timePoint == null)
|
||||
{
|
||||
timePoint = new LaurisTimePoint(_parameters, _units);
|
||||
Laboratory.AddTimePoint(timePoint);
|
||||
}
|
||||
timePoint.AddParagraph(paragraph);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,6 +205,12 @@ namespace zaaReloaded2.LabModel
|
||||
|
||||
public Material Material { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether the LabItem is marked as blacklisted
|
||||
/// in the thesaurus.
|
||||
/// </summary>
|
||||
public bool IsBlacklisted { get; protected set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
@ -66,6 +66,30 @@ namespace zaaReloaded2.LabModel
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the Laboratory contains a TimePoint with an identical
|
||||
/// time stamp to the one being queried.
|
||||
/// </summary>
|
||||
/// <param name="timePoint">TimePoint whose time stamp to look for.</param>
|
||||
/// <returns>True if a TimePoint with identical time stamp exists.</returns>
|
||||
public bool HasTimePoint(TimePoint timePoint)
|
||||
{
|
||||
return TimePoints.ContainsKey(timePoint.TimeStamp);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks for a TimePoint with a given timeStamp and returns
|
||||
/// it as a reference parameter.
|
||||
/// </summary>
|
||||
/// <param name="timeStamp">Time stamp to look for.</param>
|
||||
/// <param name="timePoint">Resulting TimePoint (if any).</param>
|
||||
/// <returns>True if TimePoints contains a TimePoint with
|
||||
/// the requested timeStamp.</returns>
|
||||
public bool TryGetTimePoint(DateTime timeStamp, ref TimePoint timePoint)
|
||||
{
|
||||
return TimePoints.TryGetValue(timeStamp, out timePoint);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -9,9 +9,9 @@ using System.Security;
|
||||
[assembly: AssemblyTitle("zaaReloaded2")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Microsoft")]
|
||||
[assembly: AssemblyCompany("Daniel Kraus")]
|
||||
[assembly: AssemblyProduct("zaaReloaded2")]
|
||||
[assembly: AssemblyCopyright("Copyright © Microsoft 2015")]
|
||||
[assembly: AssemblyCopyright("Copyright © Daniel Kraus 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
[assembly: InternalsVisibleTo("Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010061ecc0718277dee13e7dae2dad33787a981c9883ba80a659bebbdbec76563e201a7a3a6a5852e01bb5eb328d24d5889244b4626da9af9f93db663565441a3120e3985789e6f2a39289f4eed063725b84152cbef472d9dd2f7495f51dad6c91f4dc6fb7c72cb6bd9381335ac9878ec0a6369e880f35b8eca3063e16468d7704eb")]
|
||||
|
62
zaaReloaded2/Properties/Settings.Designer.cs
generated
@ -25,9 +25,10 @@ namespace zaaReloaded2.Properties {
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
public global::zaaReloaded2.Controller.SettingsRepository SettingsRepository {
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string SettingsRepository {
|
||||
get {
|
||||
return ((global::zaaReloaded2.Controller.SettingsRepository)(this["SettingsRepository"]));
|
||||
return ((string)(this["SettingsRepository"]));
|
||||
}
|
||||
set {
|
||||
this["SettingsRepository"] = value;
|
||||
@ -245,5 +246,62 @@ namespace zaaReloaded2.Properties {
|
||||
this["LastSettings"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("zaaReloaded2-Laborwerte")]
|
||||
public string ParagraphStyleName {
|
||||
get {
|
||||
return ((string)(this["ParagraphStyleName"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("IfSpecialOrAbnormal")]
|
||||
public global::zaaReloaded2.Formatter.ReferenceStyle ReferenceStyle {
|
||||
get {
|
||||
return ((global::zaaReloaded2.Formatter.ReferenceStyle)(this["ReferenceStyle"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("Ausgabe-Elemente")]
|
||||
public string FormatElementLabel {
|
||||
get {
|
||||
return ((string)(this["FormatElementLabel"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("Steuerungs-Elemente")]
|
||||
public string ControlElementLabel {
|
||||
get {
|
||||
return ((string)(this["ControlElementLabel"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("1")]
|
||||
public int SerializationVersion {
|
||||
get {
|
||||
return ((int)(this["SerializationVersion"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string ImportExportPath {
|
||||
get {
|
||||
return ((string)(this["ImportExportPath"]));
|
||||
}
|
||||
set {
|
||||
this["ImportExportPath"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="zaaReloaded2.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="SettingsRepository" Type="zaaReloaded2.Controller.SettingsRepository" Scope="User">
|
||||
<Setting Name="SettingsRepository" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="AddinName" Type="System.String" Scope="Application">
|
||||
@ -74,5 +74,23 @@
|
||||
<Setting Name="LastSettings" Type="System.Guid" Scope="User">
|
||||
<Value Profile="(Default)">00000000-0000-0000-0000-000000000000</Value>
|
||||
</Setting>
|
||||
<Setting Name="ParagraphStyleName" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">zaaReloaded2-Laborwerte</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReferenceStyle" Type="zaaReloaded2.Formatter.ReferenceStyle" Scope="Application">
|
||||
<Value Profile="(Default)">IfSpecialOrAbnormal</Value>
|
||||
</Setting>
|
||||
<Setting Name="FormatElementLabel" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">Ausgabe-Elemente</Value>
|
||||
</Setting>
|
||||
<Setting Name="ControlElementLabel" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">Steuerungs-Elemente</Value>
|
||||
</Setting>
|
||||
<Setting Name="SerializationVersion" Type="System.Int32" Scope="Application">
|
||||
<Value Profile="(Default)">1</Value>
|
||||
</Setting>
|
||||
<Setting Name="ImportExportPath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
@ -200,10 +200,7 @@ namespace zaaReloaded2
|
||||
Settings settings = settingsVM.RevealModelObject() as Settings;
|
||||
DoFormat(settings);
|
||||
Properties.Settings.Default.LastSettings = settings.Uid;
|
||||
};
|
||||
vm.RequestCloseView += (sender, args) =>
|
||||
{
|
||||
repository.Save();
|
||||
Properties.Settings.Default.Save();
|
||||
};
|
||||
vm.InjectInto<SettingsRepositoryView>().ShowDialog();
|
||||
}
|
||||
|
@ -49,6 +49,13 @@
|
||||
<Setter Property="Control.ToolTip" Value="{Binding Path=ToolTip, Mode=OneWay}" />
|
||||
<Setter Property="IsEnabled" Value="{Binding Path=IsEnabled, Mode=OneWay}" />
|
||||
</Style>
|
||||
<Style TargetType="Image">
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter Property="Opacity" Value="0.3" />
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
<conv:EnumBooleanConverter x:Key="enumBoolConv" />
|
||||
<conv:VisibilityBooleanConverter x:Key="visBoolConv" />
|
||||
<conv:BooleanNegationConverter x:Key="boolNegConv" />
|
||||
|
@ -1,114 +0,0 @@
|
||||
# LAURIS-NAME "KANONISCHER NAME" MATERIAL "IMMER REFERENZBEREICH"
|
||||
# =========== ================== ======== =======================
|
||||
"Übergangsepithelien (U)" Übergangsep. U
|
||||
"a1-Microglobulin (SU)" a1-Microglobulin SU
|
||||
"a1-Microglobulin (SU)/die" a1-Microglobulin SU
|
||||
"aktuelles Bicarbonat" Bic BGA
|
||||
"Albumin (PU)" Alb U
|
||||
"Albumin (SU)" Alb SU
|
||||
"Albumin (SU)/die" Alb SU
|
||||
Albumin Alb S
|
||||
Albumin/Creatinin (PU)" ACR U
|
||||
"Alk. Phosphatase" AP S
|
||||
Amylase Amylase S
|
||||
anorg. Phosphat" Phosphat S
|
||||
Bakterien (U)" Bakt U
|
||||
Basenabweichung BE BGA
|
||||
Basophile Baso E
|
||||
Bilirubin (U)" Bilirubin U
|
||||
C-reaktives Protein" CRP S
|
||||
Calcium (SU)" Ca SU
|
||||
Calcium (SU)/die" Ca SU
|
||||
Calcium Ca S
|
||||
Calcium-Phosphat-Produkt CaxP S
|
||||
Cholesterin Chol S
|
||||
CK gesamt" CK S
|
||||
CK MB" CK-MB S
|
||||
Creatinin (PU)" Krea U
|
||||
Creatinin (SU)" Krea SU
|
||||
Creatinin Krea S
|
||||
Creatinin-Clearance (SU)/min" CrCl SU
|
||||
Cyclosporin-A vor Gabe" "CsA (C0)" S X
|
||||
Cystatin C (N Latex)" "Cystatin C" S X
|
||||
Eisen Fe S
|
||||
Eosinophile Eos E
|
||||
Erythrozyten (U)" Ery U
|
||||
Erythrozyten Ery E
|
||||
Ferritin Ferr S
|
||||
Gesamt-Bilirubin Bilirubin S
|
||||
Gesamt-Eiweiss (PU)" Protein U
|
||||
Gesamt-Eiweiss (SU)" Protein SU
|
||||
Gesamt-Eiweiss (SU)/die" Proteinurie SU
|
||||
Gesamt-Eiweiss Protein S
|
||||
Gesamt-Eiweiss/Creatinin (PU)" TPCR U
|
||||
GGT GGT S
|
||||
glomeruläre Filtrationsrate" GFR SU
|
||||
glomerul. Filtrationsr. (MDRD)" "eGFR (MDRD)" S
|
||||
glomerul. Filtrationsr. CKD-EP" "eGFR (CKD-EPI)" S
|
||||
Glucose (U)" Glukose U
|
||||
Glucose Glukose S
|
||||
GOT (ASAT)" GOT S
|
||||
GPT (ALAT)" GPT S
|
||||
Hämatokrit Hkt E
|
||||
Hämoglobin Hb E
|
||||
Haptoglobin Haptoglobin S X
|
||||
Harnsäure Harnsäure S
|
||||
Harnstoff (SU)" Hst SU
|
||||
Harnstoff (SU)/die" Hst/Tag SU
|
||||
Harnstoff" Hst S
|
||||
Harnstoff-Clearance (SU)/min" HstCl SU
|
||||
HbA1c (NGSP)" HbA1c E
|
||||
HDL - Cholesterin" HDL S
|
||||
hyaline Zylinder (U)" "hyal. Zyl." U
|
||||
Kalium (SU)" K U
|
||||
Kalium (SU)/die" K SU
|
||||
Kalium K S
|
||||
Ketonkörper (U)" KK U
|
||||
Lactat Dehydrogenase" LDH S
|
||||
LDL - Cholesterin" LDL S
|
||||
Leukozyten (U)" Leu U
|
||||
Leukozyten Leu E
|
||||
Lymphozyten Lym E
|
||||
MCH (HbE) MCH E
|
||||
MCHC MCHC E
|
||||
MCV MCV E
|
||||
Mittleres Plättchenvolumen MPV E
|
||||
Monozyten Mon E
|
||||
Natrium (SU)" Na SU
|
||||
Natrium (SU)/die" Na SU
|
||||
Natrium Na S
|
||||
Neutrophile Neu E
|
||||
Nitrit (U)" Nitrit U
|
||||
NT-proBNP NT-proBNP S
|
||||
PCO2 (art.)" pCO2 BGA
|
||||
pH (U)" pH U
|
||||
pH" pH BGA
|
||||
Plattenepithelien (U)" Plattenep U
|
||||
PO2 (art.)" pO2 BGA
|
||||
Protein (U)" Protein U
|
||||
Sammelmenge (U)" Volumen SU
|
||||
Sammelzeit (U)" Zeit SU
|
||||
Sauerstoffsättigung (art.)" SO2 BGA
|
||||
Sirolimus SIR S
|
||||
spezifisches Gewicht (U)" "spez. Gew." U
|
||||
Standard Bicarbonat" "Std.-Bic." BGA
|
||||
Tacrolimus (FK506)" TAC S
|
||||
Thrombozyten Thr E
|
||||
Transferrin Transferrin S
|
||||
Transferrinsättigung" Tf.-Sätt. S
|
||||
Triglyceride" TG S
|
||||
Troponin T (high sensitive)" hsTnT S
|
||||
Unreife Granulozyten" Gran E
|
||||
Urobilinogen (U)" Urobilinogen U
|
||||
Niedermol. Heparin (Anti-Xa)" Anti-Xa Z
|
||||
Thromboplastinzeit n. Quick" Quick Z
|
||||
PTT aPTT Z
|
||||
Ratio int. norm." INR Z
|
||||
Komplementfaktor C3c C3c S X
|
||||
Komplementfaktor C4 C4 S X
|
||||
Anti-DNAse B "Anti-DNAse B" S
|
||||
Anti-Streptolysin ASL S
|
||||
PTH intakt" iPTH S
|
||||
TSH TSH S
|
||||
HAPTOGLOBIN Haptoglobin S
|
||||
FRAGMENTOZYTEN Fragmentozyten E
|
@ -69,16 +69,23 @@ namespace zaaReloaded2.Thesaurus
|
||||
/// <param name="laurisName">Lauris item name to look up.</param>
|
||||
/// <returns><see cref="zaaReloaded2.LabModel.Material"/> enum; if no material is
|
||||
/// found in the dictionary, the default material "S" (serum) is returned.</returns>
|
||||
public Material GetMaterial(string laurisName)
|
||||
public Material GetMaterial(string laurisName, Material def)
|
||||
{
|
||||
string textValue = LookUpValue(laurisName, 2);
|
||||
try
|
||||
if (String.IsNullOrEmpty(textValue))
|
||||
{
|
||||
return MaterialFactory.FromAbbreviation(textValue);
|
||||
return def;
|
||||
}
|
||||
catch
|
||||
else
|
||||
{
|
||||
return Material.B;
|
||||
try
|
||||
{
|
||||
return MaterialFactory.FromAbbreviation(textValue);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return Material.B;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -95,6 +102,18 @@ namespace zaaReloaded2.Thesaurus
|
||||
return LookUpValue(laurisName, 3, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether an item is marked as blacklisted in the
|
||||
/// thesaurus.
|
||||
/// </summary>
|
||||
/// <param name="laurisName">Laboratory item to lok up;
|
||||
/// this must be an original Lauris string.</param>
|
||||
/// <returns>True if the item is marked as blacklisted,
|
||||
/// false if not. Default is false.</returns>
|
||||
public bool GetIsBlacklisted(string laurisName)
|
||||
{
|
||||
return LookUpValue(laurisName, 4, false);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Overrides
|
||||
@ -105,7 +124,7 @@ namespace zaaReloaded2.Thesaurus
|
||||
protected override System.IO.Stream GetDefaultStream()
|
||||
{
|
||||
return Assembly.GetExecutingAssembly().GetManifestResourceStream(
|
||||
"zaaReloaded2.Thesaurus.Defaults.parameters.txt");
|
||||
"zaaReloaded2.Defaults.parameters.txt");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -118,6 +137,5 @@ namespace zaaReloaded2.Thesaurus
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -242,7 +242,7 @@ namespace zaaReloaded2.Thesaurus
|
||||
|
||||
#region Fields
|
||||
|
||||
private static readonly Regex _dashes = new Regex("-+");
|
||||
private static readonly Regex _dashes = new Regex("^-+$");
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ namespace zaaReloaded2.Thesaurus
|
||||
protected override System.IO.Stream GetDefaultStream()
|
||||
{
|
||||
return Assembly.GetExecutingAssembly().GetManifestResourceStream(
|
||||
"zaaReloaded2.Thesaurus.Defaults.units.txt");
|
||||
"zaaReloaded2.Defaults.units.txt");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1,2 +1,2 @@
|
||||
2.0.0-alpha.5
|
||||
2.0.0.5
|
||||
2.0.0-beta.1
|
||||
2.0.0.6
|
||||
|
@ -35,6 +35,20 @@ namespace zaaReloaded2.ViewModels
|
||||
/// </summary>
|
||||
public ObservableCollection<ElementViewModel> Elements { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets information whether this control element view model can
|
||||
/// have child elements;
|
||||
/// </summary>
|
||||
public virtual bool CanHaveChildren
|
||||
{
|
||||
get
|
||||
{
|
||||
return ((ControlElementBase)Element).CanHaveChildren;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToolTip { get { return Element.Label; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@ -47,7 +61,7 @@ namespace zaaReloaded2.ViewModels
|
||||
Elements = new ObservableCollection<ElementViewModel>();
|
||||
if (controlElement != null)
|
||||
{
|
||||
foreach (FormatElementBase childElement in controlElement.FormatElements)
|
||||
foreach (FormatElementBase childElement in controlElement.Children)
|
||||
{
|
||||
FormatElementViewModel childVM = new FormatElementViewModel(childElement);
|
||||
Elements.Add(childVM);
|
||||
@ -55,6 +69,22 @@ namespace zaaReloaded2.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance by copying the Elements property from another
|
||||
/// ControlElementViewModel and the Children property from the other
|
||||
/// view model's model.
|
||||
/// </summary>
|
||||
/// <param name="copyFrom">Other ControlElementViewModel to copy
|
||||
/// from.</param>
|
||||
public ControlElementViewModel(
|
||||
ControlElementBase controlElement,
|
||||
ControlElementViewModel copyFrom)
|
||||
: this(controlElement)
|
||||
{
|
||||
Elements = copyFrom.Elements;
|
||||
((ControlElementBase)Element).Children = controlElement.Children;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public methods
|
||||
@ -62,8 +92,39 @@ namespace zaaReloaded2.ViewModels
|
||||
public void AddChildElement(FormatElementViewModel viewModel)
|
||||
{
|
||||
Elements.Add(viewModel);
|
||||
viewModel.Parent = this;
|
||||
ControlElementBase e = Element as ControlElementBase;
|
||||
e.FormatElements.Add(viewModel.RevealModelObject() as FormatElementBase);
|
||||
e.Children.Add(viewModel.RevealModelObject() as FormatElementBase);
|
||||
}
|
||||
|
||||
public void RemoveChildElement(FormatElementViewModel viewModel)
|
||||
{
|
||||
if (!Elements.Contains(viewModel))
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Cannot remove child view model that is not in the collection.");
|
||||
}
|
||||
Elements.Remove(viewModel);
|
||||
((ControlElementBase)Element).Children
|
||||
.Remove(viewModel.RevealModelObject() as FormatElementBase);
|
||||
viewModel.Parent = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Overrides
|
||||
|
||||
public override object Clone()
|
||||
{
|
||||
ControlElementViewModel clone = new ControlElementViewModel();
|
||||
clone.Element = Element;
|
||||
clone.Elements = new ObservableCollection<ElementViewModel>(
|
||||
Elements.Select(evm => evm.Clone() as ElementViewModel));
|
||||
foreach (FormatElementViewModel evm in clone.Elements)
|
||||
{
|
||||
evm.Parent = clone;
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -29,7 +29,9 @@ namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// View model that presents a list of zaaReloaded2.Contorller.Elements.ElementBase
|
||||
/// classes to choose from.
|
||||
/// classes to choose from. Depending on which constructor is used, this view model
|
||||
/// presents either a list of ControlElementBase-derived classes, a list of
|
||||
/// FormatElementBase-derived classes, or both.
|
||||
/// </summary>
|
||||
class ElementPickerViewModel : ViewModelBase
|
||||
{
|
||||
@ -96,25 +98,43 @@ namespace zaaReloaded2.ViewModels
|
||||
Categories = new List<CategoryViewModel>();
|
||||
if (allowControlElements)
|
||||
{
|
||||
Categories.Add(
|
||||
AddCategory(
|
||||
new CategoryViewModel(
|
||||
"Kontroll-Elemente",
|
||||
Properties.Settings.Default.ControlElementLabel,
|
||||
new Collection<ViewModelBase>()
|
||||
{
|
||||
CreateControlElementViewModel(new SelectFirstDay()),
|
||||
CreateControlElementViewModel(new SelectLastDay()),
|
||||
CreateControlElementViewModel(new SelectEachDay())
|
||||
CreateControlElementViewModel(new SelectEachDay()),
|
||||
CreateControlElementViewModel(new TwoColumns()),
|
||||
CreateControlElementViewModel(new NextColumn()),
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
Categories.Add(
|
||||
CreateFormatElementViewModels();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new element picker for control elements only;
|
||||
/// the selected ControlElementVieModel will copy the Elements
|
||||
/// property from a source view model.
|
||||
/// </summary>
|
||||
/// <param name="copyFromViewModel">ControlElementViewModel
|
||||
/// whose Elements property to copy.</param>
|
||||
public ElementPickerViewModel(ControlElementViewModel copyFromViewModel)
|
||||
{
|
||||
Categories = new List<CategoryViewModel>();
|
||||
AddCategory(
|
||||
new CategoryViewModel(
|
||||
"Ausgabe-Elemente",
|
||||
Properties.Settings.Default.ControlElementLabel,
|
||||
new Collection<ViewModelBase>()
|
||||
{
|
||||
CreateFormatElementViewModel("Laborparameter", new Items()),
|
||||
CreateFormatElementViewModel("Beliebiger Text", new CustomText()),
|
||||
CreateControlElementViewModel(new SelectFirstDay(), copyFromViewModel),
|
||||
CreateControlElementViewModel(new SelectLastDay(), copyFromViewModel),
|
||||
CreateControlElementViewModel(new SelectEachDay(), copyFromViewModel),
|
||||
CreateControlElementViewModel(new TwoColumns()),
|
||||
CreateControlElementViewModel(new NextColumn()),
|
||||
}
|
||||
)
|
||||
);
|
||||
@ -124,6 +144,26 @@ namespace zaaReloaded2.ViewModels
|
||||
|
||||
#region Private methods
|
||||
|
||||
void CreateFormatElementViewModels()
|
||||
{
|
||||
AddCategory(
|
||||
new CategoryViewModel(
|
||||
Properties.Settings.Default.FormatElementLabel,
|
||||
new Collection<ViewModelBase>()
|
||||
{
|
||||
CreateFormatElementViewModel(new Items()),
|
||||
CreateFormatElementViewModel(new CustomText()),
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
void AddCategory(CategoryViewModel category)
|
||||
{
|
||||
category.PropertyChanged += ElementViewModel_PropertyChanged;
|
||||
Categories.Add(category);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new ControlElementViewModel that wraps a ControlElementBase
|
||||
/// object. The display string of the ControlElementViewModel is taken
|
||||
@ -137,28 +177,39 @@ namespace zaaReloaded2.ViewModels
|
||||
return vm;
|
||||
}
|
||||
|
||||
ViewModelBase CreateControlElementViewModel(
|
||||
ControlElementBase element, ControlElementViewModel copyFromViewModel)
|
||||
{
|
||||
ControlElementViewModel vm = new ControlElementViewModel(element, copyFromViewModel);
|
||||
vm.DisplayString = element.Label;
|
||||
vm.PropertyChanged += ElementViewModel_PropertyChanged;
|
||||
return vm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new FormatElementViewModel that wraps a FormatElementBase
|
||||
/// object and has a custom display string. The custom display string
|
||||
/// is necessary because format elements do not have a canonical label.
|
||||
/// </summary>
|
||||
ViewModelBase CreateFormatElementViewModel(string name, FormatElementBase element)
|
||||
ViewModelBase CreateFormatElementViewModel(FormatElementBase element)
|
||||
{
|
||||
FormatElementViewModel vm = new FormatElementViewModel(element);
|
||||
vm.DisplayString = name;
|
||||
vm.PropertyChanged += ElementViewModel_PropertyChanged;
|
||||
return vm;
|
||||
}
|
||||
|
||||
void ElementViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName == "IsSelected")
|
||||
// Casting sender as ElementViewModel may result in Null, but this
|
||||
// is a desired effect because category headings may be selected
|
||||
// in a view, but are not valid ElementViewModels that we could
|
||||
// 'choose'. In addition, when an element is selected, another one
|
||||
// is deselected, and the event triggers twice, once for the selected
|
||||
// element and once for the deselected one.
|
||||
ElementViewModel elementVM = sender as ElementViewModel;
|
||||
if (elementVM != null && elementVM.IsSelected && e.PropertyName == "IsSelected")
|
||||
{
|
||||
// Casting sender as ElementViewModel may result in Null, but this
|
||||
// is a desired effect because category headings may be selected
|
||||
// in a view, but are not valid ElementViewModels that we could
|
||||
// 'choose'.
|
||||
Selected = sender as ElementViewModel;
|
||||
Selected = elementVM;
|
||||
}
|
||||
}
|
||||
|
||||
@ -167,12 +218,13 @@ namespace zaaReloaded2.ViewModels
|
||||
if (CanChooseElement())
|
||||
{
|
||||
ElementChosenMessage.Send(new ViewModelMessageContent(Selected));
|
||||
DoCloseView();
|
||||
}
|
||||
}
|
||||
|
||||
bool CanChooseElement()
|
||||
{
|
||||
return Selected != null;
|
||||
return Selected != null && Selected.IsSelected == true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -26,19 +26,28 @@ using System.Collections.ObjectModel;
|
||||
|
||||
namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
public abstract class ElementViewModel : ViewModelBase
|
||||
public abstract class ElementViewModel : ViewModelBase, ICloneable
|
||||
{
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets the label of the wrapped element.
|
||||
/// Returns the wrapped Element's label or an explicitly
|
||||
/// set display string.
|
||||
/// </summary>
|
||||
public virtual string Label
|
||||
public override string DisplayString
|
||||
{
|
||||
[DebuggerStepThrough]
|
||||
get
|
||||
get { return Element.Label; }
|
||||
}
|
||||
|
||||
public abstract string ToolTip { get; }
|
||||
|
||||
public bool IsExpanded
|
||||
{
|
||||
get { return _isExpanded; }
|
||||
set
|
||||
{
|
||||
return Element.Label;
|
||||
_isExpanded = value;
|
||||
OnPropertyChanged("IsExpanded");
|
||||
}
|
||||
}
|
||||
|
||||
@ -69,5 +78,17 @@ namespace zaaReloaded2.ViewModels
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Implementation of ICloneable
|
||||
|
||||
public abstract object Clone();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
|
||||
bool _isExpanded;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Bovender.Mvvm;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
|
||||
namespace zaaReloaded2.ViewModels
|
||||
@ -31,14 +32,40 @@ namespace zaaReloaded2.ViewModels
|
||||
public string Content
|
||||
{
|
||||
[DebuggerStepThrough]
|
||||
get { return ((FormatElementBase)Element).Content; }
|
||||
get { return _content; }
|
||||
set
|
||||
{
|
||||
((FormatElementBase)Element).Content = value;
|
||||
_content = value;
|
||||
OnPropertyChanged("Content");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the parent ControlElementViewModel, if
|
||||
/// there is any.
|
||||
/// </summary>
|
||||
public ControlElementViewModel Parent { get; set; }
|
||||
|
||||
public override string ToolTip { get { return Element.Label; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
|
||||
public DelegatingCommand SaveCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_saveCommand == null)
|
||||
{
|
||||
_saveCommand = new DelegatingCommand(
|
||||
param => DoSave(),
|
||||
param => CanSave());
|
||||
}
|
||||
return _saveCommand;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@ -49,8 +76,46 @@ namespace zaaReloaded2.ViewModels
|
||||
: this()
|
||||
{
|
||||
Element = formatElement;
|
||||
Content = ((FormatElementBase)Element).Content;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Overrides
|
||||
|
||||
public override object Clone()
|
||||
{
|
||||
FormatElementViewModel clone = new FormatElementViewModel();
|
||||
clone.Parent = Parent;
|
||||
clone.Element = Element;
|
||||
return clone;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
|
||||
void DoSave()
|
||||
{
|
||||
((FormatElementBase)Element).Content = _content;
|
||||
// Writing the _content field to the model affects our
|
||||
// DisplayString property; this is a hack to make it known.
|
||||
OnPropertyChanged("DisplayString");
|
||||
CloseViewCommand.Execute(null);
|
||||
}
|
||||
|
||||
bool CanSave()
|
||||
{
|
||||
return !String.IsNullOrEmpty(Content);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
|
||||
DelegatingCommand _saveCommand;
|
||||
string _content;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
46
zaaReloaded2/ViewModels/IoErrorViewModel.cs
Executable file
@ -0,0 +1,46 @@
|
||||
/* IoErrorViewModel.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 Bovender.Mvvm.ViewModels;
|
||||
|
||||
namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// Simple view model for I/O error messages, for use in conjunction
|
||||
/// with Bovender's ShowViewDialogAction and zaaReloaded2.Views.IoErrorView.
|
||||
/// </summary>
|
||||
class IoErrorViewModel : ViewModelBase
|
||||
{
|
||||
public Exception Exception { get; private set; }
|
||||
|
||||
public string Message { get { return Exception.Message; } }
|
||||
|
||||
public IoErrorViewModel(Exception e)
|
||||
{
|
||||
Exception = e;
|
||||
}
|
||||
|
||||
public override object RevealModelObject()
|
||||
{
|
||||
return Exception;
|
||||
}
|
||||
}
|
||||
}
|
@ -24,6 +24,8 @@ using Bovender.Mvvm.ViewModels;
|
||||
using Bovender.Mvvm.Messaging;
|
||||
using zaaReloaded2.Controller;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Runtime.Serialization.Formatters.Soap;
|
||||
using System.IO;
|
||||
|
||||
namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
@ -33,7 +35,21 @@ namespace zaaReloaded2.ViewModels
|
||||
|
||||
public ObservableCollection<SettingsViewModel> SettingsList { get; private set; }
|
||||
|
||||
public SettingsViewModel Selected { get; private set; }
|
||||
/// <summary>
|
||||
/// Gets the SettingsViewModel that was most recently selected. Whether
|
||||
/// this view model is still selected can be found out be getting the
|
||||
/// view model's IsSelected property.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Due to the way the WPF ListBox (for example) is implemented, selecting
|
||||
/// a list item will trigger an PropertyChanged event twice: Once for the
|
||||
/// item being selected, and once for the item being deselected. Thus we
|
||||
/// can only capture the last item that actually was selected. We cannot
|
||||
/// howeve capture if an item was deselected without a new selection,
|
||||
/// because we cannot logicaly connect two occurrences of the same event
|
||||
/// from different objects.
|
||||
/// </remarks>
|
||||
public SettingsViewModel LastSelected { get; private set; }
|
||||
|
||||
#endregion
|
||||
|
||||
@ -120,6 +136,34 @@ namespace zaaReloaded2.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public DelegatingCommand ExportSettingsCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_exportSettingsCommand == null)
|
||||
{
|
||||
_exportSettingsCommand = new DelegatingCommand(
|
||||
param => DoExportSettings(),
|
||||
param => CanExportSettings());
|
||||
}
|
||||
return _exportSettingsCommand;
|
||||
}
|
||||
}
|
||||
|
||||
public DelegatingCommand ImportSettingsCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_importSettingsCommand == null)
|
||||
{
|
||||
_importSettingsCommand = new DelegatingCommand(
|
||||
param => DoImportSettings(),
|
||||
param => CanImportSettings());
|
||||
}
|
||||
return _importSettingsCommand;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Messages
|
||||
@ -172,6 +216,54 @@ namespace zaaReloaded2.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public Message<FileNameMessageContent> ChooseExportFileNameMessage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_chooseExportFileNameMessage == null)
|
||||
{
|
||||
_chooseExportFileNameMessage = new Message<FileNameMessageContent>();
|
||||
}
|
||||
return _chooseExportFileNameMessage;
|
||||
}
|
||||
}
|
||||
|
||||
public Message<FileNameMessageContent> ChooseImportFileNameMessage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_chooseImportFileNameMessage == null)
|
||||
{
|
||||
_chooseImportFileNameMessage = new Message<FileNameMessageContent>();
|
||||
}
|
||||
return _chooseImportFileNameMessage;
|
||||
}
|
||||
}
|
||||
|
||||
public Message<ViewModelMessageContent> ExportErrorMessage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_exportErrorMessage == null)
|
||||
{
|
||||
_exportErrorMessage = new Message<ViewModelMessageContent>();
|
||||
}
|
||||
return _exportErrorMessage;
|
||||
}
|
||||
}
|
||||
|
||||
public Message<ViewModelMessageContent> ImportErrorMessage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_importErrorMessage == null)
|
||||
{
|
||||
_importErrorMessage = new Message<ViewModelMessageContent>();
|
||||
}
|
||||
return _importErrorMessage;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@ -179,39 +271,50 @@ namespace zaaReloaded2.ViewModels
|
||||
public SettingsRepositoryViewModel(SettingsRepository repository)
|
||||
{
|
||||
_repository = repository;
|
||||
SettingsList = new ObservableCollection<SettingsViewModel>();
|
||||
foreach (Settings s in repository.SettingsList)
|
||||
BuildSettingsList();
|
||||
RequestCloseView += (sender, args) =>
|
||||
{
|
||||
SettingsViewModel vm = new SettingsViewModel(s);
|
||||
AddSettingsViewModel(vm);
|
||||
}
|
||||
_repository.Store();
|
||||
};
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
|
||||
void BuildSettingsList()
|
||||
{
|
||||
SettingsList = new ObservableCollection<SettingsViewModel>();
|
||||
foreach (Settings s in _repository.SettingsList)
|
||||
{
|
||||
SettingsViewModel vm = new SettingsViewModel(s);
|
||||
AddSettingsViewModel(vm);
|
||||
}
|
||||
OnPropertyChanged("SettingsList");
|
||||
}
|
||||
|
||||
void DoEditSettings()
|
||||
{
|
||||
if (CanEditSettings())
|
||||
{
|
||||
EditSettingsMessage.Send(new ViewModelMessageContent(Selected));
|
||||
EditSettingsMessage.Send(new ViewModelMessageContent(LastSelected));
|
||||
}
|
||||
}
|
||||
|
||||
bool CanEditSettings()
|
||||
{
|
||||
return Selected != null && !IsDefaultSettings();
|
||||
return LastSelected != null && LastSelected.IsSelected && !IsDefaultSettings();
|
||||
}
|
||||
|
||||
void DoUseSettings()
|
||||
{
|
||||
UseSettingsMessage.Send(new ViewModelMessageContent(Selected));
|
||||
UseSettingsMessage.Send(new ViewModelMessageContent(LastSelected));
|
||||
CloseViewCommand.Execute(null);
|
||||
}
|
||||
|
||||
bool CanUseSettings()
|
||||
{
|
||||
return Selected != null;
|
||||
return LastSelected != null && LastSelected.IsSelected;
|
||||
}
|
||||
|
||||
void DoAddSettings()
|
||||
@ -219,13 +322,14 @@ namespace zaaReloaded2.ViewModels
|
||||
Settings s = new Settings("Neu");
|
||||
SettingsViewModel vm = new SettingsViewModel(s);
|
||||
_repository.SettingsList.Add(s);
|
||||
SettingsList.Add(vm);
|
||||
AddSettingsViewModel(vm);
|
||||
vm.IsSelected = true;
|
||||
EditSettingsMessage.Send(new ViewModelMessageContent(vm));
|
||||
}
|
||||
|
||||
bool CanDeleteSettings()
|
||||
{
|
||||
return Selected != null && !IsDefaultSettings();
|
||||
return LastSelected != null && LastSelected.IsSelected && !IsDefaultSettings();
|
||||
}
|
||||
|
||||
void DoDeleteSettings()
|
||||
@ -233,7 +337,7 @@ namespace zaaReloaded2.ViewModels
|
||||
if (CanDeleteSettings())
|
||||
{
|
||||
ConfirmDeleteSettingsMessage.Send(
|
||||
new ViewModelMessageContent(Selected),
|
||||
new ViewModelMessageContent(LastSelected),
|
||||
param => ConfirmDeleteSettings(param));
|
||||
}
|
||||
}
|
||||
@ -259,19 +363,25 @@ namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
if (content.Confirmed)
|
||||
{
|
||||
|
||||
_repository = new SettingsRepository();
|
||||
BuildSettingsList();
|
||||
}
|
||||
}
|
||||
|
||||
void DoCopySettings()
|
||||
{
|
||||
if (Selected != null)
|
||||
if (LastSelected != null)
|
||||
{
|
||||
SettingsViewModel copy = Selected.Clone() as SettingsViewModel;
|
||||
SettingsViewModel copy = LastSelected.Clone() as SettingsViewModel;
|
||||
if (IsDefaultSettings())
|
||||
{
|
||||
copy.Name = copy.Name.Replace(SettingsRepository.BUILTIN_LABEL, String.Empty);
|
||||
}
|
||||
_repository.SettingsList.Add(copy.RevealModelObject() as Settings);
|
||||
AddSettingsViewModel(copy);
|
||||
Selected.IsSelected = false;
|
||||
LastSelected.IsSelected = false;
|
||||
copy.IsSelected = true;
|
||||
EditSettingsMessage.Send(new ViewModelMessageContent(copy));
|
||||
}
|
||||
}
|
||||
|
||||
@ -280,7 +390,7 @@ namespace zaaReloaded2.ViewModels
|
||||
SettingsViewModel vm = sender as SettingsViewModel;
|
||||
if (vm != null && e.PropertyName == "IsSelected")
|
||||
{
|
||||
Selected = vm.IsSelected ? vm : null;
|
||||
if (vm.IsSelected) LastSelected = vm;
|
||||
}
|
||||
}
|
||||
|
||||
@ -290,11 +400,9 @@ namespace zaaReloaded2.ViewModels
|
||||
/// </summary>
|
||||
bool IsDefaultSettings()
|
||||
{
|
||||
if (Selected != null)
|
||||
if (LastSelected != null)
|
||||
{
|
||||
return
|
||||
(Selected.Name == zaaReloaded2.Properties.Settings.Default.SettingsNameClinic
|
||||
|| Selected.Name == zaaReloaded2.Properties.Settings.Default.SettingsNameWard);
|
||||
return SettingsRepository.IsDefaultSettings(LastSelected.RevealModelObject() as Settings);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -313,6 +421,86 @@ namespace zaaReloaded2.ViewModels
|
||||
SettingsList.Add(settingsViewModel);
|
||||
}
|
||||
|
||||
void DoExportSettings()
|
||||
{
|
||||
if (CanExportSettings())
|
||||
{
|
||||
ChooseExportFileNameMessage.Send(
|
||||
new FileNameMessageContent(SuggestImportExportPath(), FILE_FILTER),
|
||||
msg => ConfirmExportSettings(msg));
|
||||
}
|
||||
}
|
||||
|
||||
bool CanExportSettings()
|
||||
{
|
||||
return LastSelected != null && LastSelected.IsSelected && !IsDefaultSettings();
|
||||
}
|
||||
|
||||
void ConfirmExportSettings(FileNameMessageContent message)
|
||||
{
|
||||
if (message.Confirmed)
|
||||
{
|
||||
Properties.Settings.Default.ImportExportPath = message.Value;
|
||||
Properties.Settings.Default.Save();
|
||||
Settings settings = LastSelected.RevealModelObject() as Settings;
|
||||
try
|
||||
{
|
||||
settings.SaveToFile(message.Value);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
ExportErrorMessage.Send(
|
||||
new ViewModelMessageContent(new IoErrorViewModel(e))
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoImportSettings()
|
||||
{
|
||||
ChooseImportFileNameMessage.Send(
|
||||
new FileNameMessageContent(SuggestImportExportPath(), FILE_FILTER),
|
||||
msg => ConfirmImportSettings(msg));
|
||||
}
|
||||
|
||||
bool CanImportSettings()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void ConfirmImportSettings(FileNameMessageContent message)
|
||||
{
|
||||
if (message.Confirmed)
|
||||
{
|
||||
Properties.Settings.Default.ImportExportPath = message.Value;
|
||||
Properties.Settings.Default.Save();
|
||||
try
|
||||
{
|
||||
Settings settings = Settings.LoadFromFile(message.Value);
|
||||
AddSettingsViewModel(new SettingsViewModel(settings));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
ImportErrorMessage.Send(
|
||||
new ViewModelMessageContent(new IoErrorViewModel(e))
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string SuggestImportExportPath()
|
||||
{
|
||||
string path = Properties.Settings.Default.ImportExportPath;
|
||||
if (String.IsNullOrEmpty(path))
|
||||
{
|
||||
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
|
||||
}
|
||||
else
|
||||
{
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Implementation of ViewModelBase
|
||||
@ -333,10 +521,26 @@ namespace zaaReloaded2.ViewModels
|
||||
DelegatingCommand _deleteSettingsCommand;
|
||||
DelegatingCommand _resetSettingsCommand;
|
||||
DelegatingCommand _copySettingsCommand;
|
||||
DelegatingCommand _exportSettingsCommand;
|
||||
DelegatingCommand _importSettingsCommand;
|
||||
Message<ViewModelMessageContent> _confirmDeleteSettingsMessage;
|
||||
Message<ViewModelMessageContent> _confirmResetSettingsMessage;
|
||||
Message<ViewModelMessageContent> _editSettingsMessage;
|
||||
Message<ViewModelMessageContent> _useSettingsMessage;
|
||||
Message<FileNameMessageContent> _chooseExportFileNameMessage;
|
||||
Message<FileNameMessageContent> _chooseImportFileNameMessage;
|
||||
Message<ViewModelMessageContent> _exportErrorMessage;
|
||||
Message<ViewModelMessageContent> _importErrorMessage;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constant
|
||||
|
||||
/// <summary>
|
||||
/// File filter that is used for the import and export
|
||||
/// of settings.
|
||||
/// </summary>
|
||||
const string FILE_FILTER = "zaaReloaded-Stildatei (*.zaaReloaded)|*.zaaReloaded";
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ using Bovender.Mvvm.Messaging;
|
||||
using zaaReloaded2.Controller;
|
||||
using zaaReloaded2.Controller.Elements;
|
||||
using zaaReloaded2.Formatter;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
@ -76,7 +77,16 @@ namespace zaaReloaded2.ViewModels
|
||||
/// <summary>
|
||||
/// Gets or sets the currently selected element.
|
||||
/// </summary>
|
||||
public ElementViewModel SelectedElement
|
||||
/// <remarks>
|
||||
/// Due to the way the WPF ListBox (for example) is implemented, selecting
|
||||
/// a list item will trigger an PropertyChanged event twice: Once for the
|
||||
/// item being selected, and once for the item being deselected. Thus we
|
||||
/// can only capture the last item that actually was selected. We cannot
|
||||
/// howeve capture if an item was deselected without a new selection,
|
||||
/// because we cannot logicaly connect two occurrences of the same event
|
||||
/// from different objects.
|
||||
/// </remarks>
|
||||
public ElementViewModel LastSelectedElement
|
||||
{
|
||||
get { return _selectedElement; }
|
||||
set
|
||||
@ -95,7 +105,12 @@ namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
if (_referenceStyle == null)
|
||||
{
|
||||
_referenceStyle = new EnumProvider<ReferenceStyle>(_settings.ReferenceStyle);
|
||||
_referenceStyle = new EnumProvider<ReferenceStyle>();
|
||||
_referenceStyle.AsEnum = _settings.ReferenceStyle;
|
||||
_referenceStyle.PropertyChanged += (sender, args) =>
|
||||
{
|
||||
_settings.ReferenceStyle = _referenceStyle.AsEnum;
|
||||
};
|
||||
}
|
||||
return _referenceStyle;
|
||||
}
|
||||
@ -113,7 +128,7 @@ namespace zaaReloaded2.ViewModels
|
||||
: base()
|
||||
{
|
||||
_settings = settings;
|
||||
Elements = new List<ElementViewModel>();
|
||||
Elements = new ObservableCollection<ElementViewModel>();
|
||||
foreach (ElementBase element in settings.Elements)
|
||||
{
|
||||
ElementViewModel vm;
|
||||
@ -126,6 +141,7 @@ namespace zaaReloaded2.ViewModels
|
||||
vm = new ControlElementViewModel(element as ControlElementBase);
|
||||
foreach (FormatElementViewModel childVM in ((ControlElementViewModel)vm).Elements)
|
||||
{
|
||||
childVM.Parent = vm as ControlElementViewModel;
|
||||
childVM.PropertyChanged += ElementViewModel_PropertyChanged;
|
||||
}
|
||||
}
|
||||
@ -167,6 +183,30 @@ namespace zaaReloaded2.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public Message<ViewModelMessageContent> EditElementMessage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_editElementMessage == null)
|
||||
{
|
||||
_editElementMessage = new Message<ViewModelMessageContent>();
|
||||
}
|
||||
return _editElementMessage;
|
||||
}
|
||||
}
|
||||
|
||||
public Message<ViewModelMessageContent> ChangeControlElementMessage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_changeControlElementMessage == null)
|
||||
{
|
||||
_changeControlElementMessage = new Message<ViewModelMessageContent>();
|
||||
}
|
||||
return _changeControlElementMessage;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
@ -198,6 +238,20 @@ namespace zaaReloaded2.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public DelegatingCommand EditElementCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_editElementCommand == null)
|
||||
{
|
||||
_editElementCommand = new DelegatingCommand(
|
||||
param => DoEditElement(),
|
||||
param => CanEditElement());
|
||||
}
|
||||
return _editElementCommand;
|
||||
}
|
||||
}
|
||||
|
||||
public DelegatingCommand DeleteElementCommand
|
||||
{
|
||||
get
|
||||
@ -226,6 +280,34 @@ namespace zaaReloaded2.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public DelegatingCommand MoveElementUpCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_moveElementUpCommand == null)
|
||||
{
|
||||
_moveElementUpCommand = new DelegatingCommand(
|
||||
param => DoMoveElementUp(),
|
||||
param => CanMoveElementUp());
|
||||
}
|
||||
return _moveElementUpCommand;
|
||||
}
|
||||
}
|
||||
|
||||
public DelegatingCommand MoveElementDownCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_moveElementDownCommand == null)
|
||||
{
|
||||
_moveElementDownCommand = new DelegatingCommand(
|
||||
param => DoMoveElementDown(),
|
||||
param => CanMoveElementDown());
|
||||
}
|
||||
return _moveElementDownCommand;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public methods
|
||||
@ -260,11 +342,24 @@ namespace zaaReloaded2.ViewModels
|
||||
{
|
||||
// Create a new element picker; it will automatically create and
|
||||
// send us a new element view model if one is chosen by the view.
|
||||
ElementPickerViewModel picker = new ElementPickerViewModel(true);
|
||||
ElementPickerViewModel picker = new ElementPickerViewModel(
|
||||
allowControlElements: IsTopLevelElement());
|
||||
picker.ElementChosenMessage.Sent += (sender, args) =>
|
||||
{
|
||||
ElementViewModel newVM = args.Content.ViewModel as ElementViewModel;
|
||||
AddElementViewModel(newVM);
|
||||
if (IsTopLevelElement())
|
||||
{
|
||||
AddElementViewModel(newVM);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the selected element is on the second level, it
|
||||
// must be a FormatElementViewModel.
|
||||
ControlElementViewModel parent = ((FormatElementViewModel)LastSelectedElement).Parent;
|
||||
AddChildElementViewModel(parent, newVM as FormatElementViewModel);
|
||||
}
|
||||
newVM.IsSelected = true;
|
||||
if (newVM is FormatElementViewModel) DoEditElement();
|
||||
};
|
||||
AddElementMessage.Send(new ViewModelMessageContent(picker));
|
||||
}
|
||||
@ -279,7 +374,9 @@ namespace zaaReloaded2.ViewModels
|
||||
picker.ElementChosenMessage.Sent += (sender, args) =>
|
||||
{
|
||||
FormatElementViewModel newVM = args.Content.ViewModel as FormatElementViewModel;
|
||||
AddChildElementViewModel(SelectedElement as ControlElementViewModel, newVM);
|
||||
AddChildElementViewModel(LastSelectedElement as ControlElementViewModel, newVM);
|
||||
newVM.IsSelected = true;
|
||||
DoEditElement();
|
||||
};
|
||||
AddChildElementMessage.Send(new ViewModelMessageContent(picker));
|
||||
}
|
||||
@ -287,30 +384,335 @@ namespace zaaReloaded2.ViewModels
|
||||
|
||||
bool CanAddChildElement()
|
||||
{
|
||||
return SelectedElement is ControlElementViewModel;
|
||||
return LastSelectedElement is ControlElementViewModel &&
|
||||
((ControlElementViewModel)LastSelectedElement).CanHaveChildren;
|
||||
}
|
||||
|
||||
void DoDeleteElement() { }
|
||||
void DoEditElement()
|
||||
{
|
||||
if (CanEditElement())
|
||||
{
|
||||
if (LastSelectedElement is ControlElementViewModel)
|
||||
{
|
||||
ElementPickerViewModel picker = new ElementPickerViewModel(
|
||||
LastSelectedElement as ControlElementViewModel);
|
||||
picker.ElementChosenMessage.Sent += (sender, args) =>
|
||||
{
|
||||
// Replace the previously selected element with the new
|
||||
// one that we get from the ElementPickerViewModel.
|
||||
int index = Elements.IndexOf(LastSelectedElement);
|
||||
ElementViewModel newVM = args.Content.ViewModel as ElementViewModel;
|
||||
ControlElementBase oldModel = LastSelectedElement.RevealModelObject() as ControlElementBase;
|
||||
ControlElementBase newModel = newVM.RevealModelObject() as ControlElementBase;
|
||||
// Caveat: once we modify the Elements collection, LastSelectedElement will change!
|
||||
Elements.RemoveAt(index);
|
||||
Elements.Insert(index, newVM);
|
||||
newModel.Children = oldModel.Children;
|
||||
_settings.Elements.RemoveAt(index);
|
||||
_settings.Elements.Insert(index, newModel);
|
||||
newVM.PropertyChanged += ElementViewModel_PropertyChanged;
|
||||
newVM.IsSelected = true;
|
||||
};
|
||||
ChangeControlElementMessage.Send(
|
||||
new ViewModelMessageContent(picker));
|
||||
}
|
||||
else
|
||||
{
|
||||
EditElementMessage.Send(new ViewModelMessageContent(LastSelectedElement));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CanDeleteElement() { return _selectedElement != null; }
|
||||
|
||||
void DoCopyElement() { }
|
||||
|
||||
bool CanCopyElement() { return _selectedElement != null; }
|
||||
bool CanEditElement()
|
||||
{
|
||||
return LastSelectedElement != null && LastSelectedElement.IsSelected;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets or unsets the SelectedElement property whenever the IsSelected
|
||||
/// property of an ElementViewModel changes.
|
||||
/// Deletes the selected element.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The following algorithm ist used to find out whether the selected
|
||||
/// element is at the first or the second level of the hierarchy:
|
||||
/// If the Element is a ControlElement, it must be at the first level.
|
||||
/// If the Element is a FormatElement, its Parent property will be
|
||||
/// Null if the Element is at the first level.
|
||||
/// </remarks>
|
||||
void DoDeleteElement()
|
||||
{
|
||||
if (CanDeleteElement())
|
||||
{
|
||||
if (IsTopLevelElement())
|
||||
{
|
||||
// First level of the hierarchy
|
||||
int index = Elements.IndexOf(LastSelectedElement);
|
||||
Elements.RemoveAt(index);
|
||||
_settings.Elements.RemoveAt(index);
|
||||
if (index == Elements.Count) index--;
|
||||
LastSelectedElement = null;
|
||||
if (Elements.Count > 0) Elements[index].IsSelected = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Second level of the hierarchy
|
||||
FormatElementViewModel formatVM = LastSelectedElement as FormatElementViewModel;
|
||||
ControlElementViewModel parent = formatVM.Parent;
|
||||
int index = parent.Elements.IndexOf(formatVM);
|
||||
parent.RemoveChildElement(formatVM);
|
||||
if (index == parent.Elements.Count) index--;
|
||||
LastSelectedElement = null;
|
||||
if (parent.Elements.Count > 0) parent.Elements[index].IsSelected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CanDeleteElement() { return LastSelectedElement != null && LastSelectedElement.IsSelected; }
|
||||
|
||||
void DoCopyElement()
|
||||
{
|
||||
if (CanCopyElement())
|
||||
{
|
||||
if (IsTopLevelElement())
|
||||
{
|
||||
ElementViewModel newControlVM = LastSelectedElement.Clone() as ElementViewModel;
|
||||
AddElementViewModel(newControlVM);
|
||||
newControlVM.IsSelected = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
FormatElementViewModel originalVM = LastSelectedElement as FormatElementViewModel;
|
||||
FormatElementViewModel newFormatVM = originalVM.Clone() as FormatElementViewModel;
|
||||
originalVM.Parent.AddChildElement(newFormatVM);
|
||||
newFormatVM.IsSelected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CanCopyElement() { return LastSelectedElement != null && LastSelectedElement.IsSelected; }
|
||||
|
||||
void DoMoveElementUp()
|
||||
{
|
||||
if (CanMoveElementUp())
|
||||
{
|
||||
// We need to get a hold of the LastSelectedElement because a TreeView
|
||||
// might reset the selection when we move elements around.
|
||||
ElementViewModel lastSelectedElement = LastSelectedElement;
|
||||
// Top-level elements are either control elements or format elements;
|
||||
// child elements on the second level however are always format elements
|
||||
// and must be treated differently.
|
||||
if (IsTopLevelElement())
|
||||
{
|
||||
int index = Elements.IndexOf(lastSelectedElement);
|
||||
if (lastSelectedElement is ControlElementViewModel ||
|
||||
Elements[index - 1] is FormatElementViewModel ||
|
||||
!((ControlElementViewModel)Elements[index - 1]).CanHaveChildren
|
||||
)
|
||||
{
|
||||
// Simple case: top-level control element -- just move it up;
|
||||
// if the selected element is a format element and the element
|
||||
// above it is a format element too, just move it up as well.
|
||||
// If the element above the selected element is a control element,
|
||||
// but cannot have children, move the selected element up as well.
|
||||
Elements.RemoveAt(index);
|
||||
Elements.Insert(index - 1, lastSelectedElement);
|
||||
_settings.Elements.RemoveAt(index);
|
||||
_settings.Elements.Insert(
|
||||
index - 1,
|
||||
lastSelectedElement.RevealModelObject() as ElementBase);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If we get here, the selected element is a format element
|
||||
// and the element above it is a control element that can
|
||||
// have child elements, i.e. the selected element is demoted
|
||||
// to a child element of the control element above it.
|
||||
ControlElementViewModel controlElementAbove =
|
||||
Elements[index - 1] as ControlElementViewModel;
|
||||
Elements.RemoveAt(index);
|
||||
controlElementAbove.IsExpanded = true;
|
||||
controlElementAbove.AddChildElement(
|
||||
lastSelectedElement as FormatElementViewModel);
|
||||
FormatElementBase model = lastSelectedElement.RevealModelObject() as FormatElementBase;
|
||||
ControlElementBase modelAbove = _settings.Elements[index - 1] as ControlElementBase;
|
||||
_settings.Elements.RemoveAt(index);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// The selected element is a child element.
|
||||
// If it is at the top of the child elements list, promote it
|
||||
// to a top-level element; if not, just move it up in the
|
||||
// child elements list.
|
||||
FormatElementViewModel selected = lastSelectedElement as FormatElementViewModel;
|
||||
int index = selected.Parent.Elements.IndexOf(selected);
|
||||
if (index == 0)
|
||||
{
|
||||
// Promote the element from the top of the children list
|
||||
// to a top-level element above its parent.
|
||||
int parentIndex = Elements.IndexOf(selected.Parent);
|
||||
selected.Parent.Elements.RemoveAt(0);
|
||||
Elements.Insert(parentIndex, selected);
|
||||
FormatElementBase model = selected.RevealModelObject() as FormatElementBase;
|
||||
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||
parentModel.Children.RemoveAt(0);
|
||||
_settings.Elements.Insert(parentIndex, model);
|
||||
selected.Parent = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected.Parent.Elements.Move(index, index - 1);
|
||||
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||
FormatElementBase selectedModel = parentModel.Children[index];
|
||||
parentModel.Children.RemoveAt(index);
|
||||
parentModel.Children.Insert(index - 1, selectedModel);
|
||||
}
|
||||
}
|
||||
// Select the last selected element again.
|
||||
lastSelectedElement.IsSelected = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool CanMoveElementUp()
|
||||
{
|
||||
if (IsTopLevelElement())
|
||||
{
|
||||
return Elements.IndexOf(LastSelectedElement) > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the selected element is a child element, it can always be moved
|
||||
// up before the parent element.
|
||||
return LastSelectedElement != null && LastSelectedElement.IsSelected;
|
||||
}
|
||||
}
|
||||
|
||||
void DoMoveElementDown()
|
||||
{
|
||||
if (CanMoveElementDown())
|
||||
{
|
||||
// We need to get a hold of the LastSelectedElement because a TreeView
|
||||
// might reset the selection when we move elements around.
|
||||
ElementViewModel lastSelectedElement = LastSelectedElement;
|
||||
// Top-level elements are either control elements or format elements;
|
||||
// child elements on the second level however are always format elements
|
||||
// and must be treated differently.
|
||||
if (IsTopLevelElement())
|
||||
{
|
||||
int index = Elements.IndexOf(lastSelectedElement);
|
||||
if (lastSelectedElement is ControlElementViewModel ||
|
||||
Elements[index + 1 ] is FormatElementViewModel ||
|
||||
!((ControlElementViewModel)Elements[index + 1]).CanHaveChildren
|
||||
)
|
||||
{
|
||||
// Simple case: top-level control element -- just move it down;
|
||||
// if the selected element is a format element and the element
|
||||
// below it is a format element too, just move it down as well.
|
||||
// If the element below the selected element is a control element,
|
||||
// but cannot have children, move the selected element down as well.
|
||||
Elements.RemoveAt(index);
|
||||
Elements.Insert(index + 1, lastSelectedElement);
|
||||
_settings.Elements.RemoveAt(index);
|
||||
_settings.Elements.Insert(
|
||||
index + 1,
|
||||
lastSelectedElement.RevealModelObject() as ElementBase);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If we get here, the selected element is a format element
|
||||
// and the element below it is a control element that can
|
||||
// have child elements, i.e. the selected element is demoted
|
||||
// to a child element of the control element below it.
|
||||
ControlElementViewModel controlElementBelow =
|
||||
Elements[index + 1] as ControlElementViewModel;
|
||||
Elements.RemoveAt(index);
|
||||
controlElementBelow.IsExpanded = true;
|
||||
controlElementBelow.Elements.Insert(
|
||||
0,
|
||||
lastSelectedElement as FormatElementViewModel);
|
||||
((FormatElementViewModel)lastSelectedElement).Parent = controlElementBelow;
|
||||
FormatElementBase model = lastSelectedElement.RevealModelObject() as FormatElementBase;
|
||||
ControlElementBase modelBelow = _settings.Elements[index + 1] as ControlElementBase;
|
||||
_settings.Elements.RemoveAt(index);
|
||||
modelBelow.Children.Insert(0, model);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// The selected element is a child element.
|
||||
// If it is at the bottom of the child elements list, promote it
|
||||
// to a top-level element; if not, just move it down in the
|
||||
// child elements list.
|
||||
FormatElementViewModel selected = lastSelectedElement as FormatElementViewModel;
|
||||
int index = selected.Parent.Elements.IndexOf(selected);
|
||||
if (index == selected.Parent.Elements.Count - 1)
|
||||
{
|
||||
// Promote the element from the bottom of the children list
|
||||
// to a top-level element below its parent.
|
||||
int parentIndex = Elements.IndexOf(selected.Parent);
|
||||
selected.Parent.Elements.RemoveAt(selected.Parent.Elements.Count - 1);
|
||||
Elements.Insert(parentIndex + 1, selected);
|
||||
FormatElementBase model = selected.RevealModelObject() as FormatElementBase;
|
||||
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||
parentModel.Children.RemoveAt(parentModel.Children.Count - 1);
|
||||
_settings.Elements.Insert(parentIndex + 1, model);
|
||||
selected.Parent = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected.Parent.Elements.Move(index, index + 1);
|
||||
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||
FormatElementBase selectedModel = parentModel.Children[index];
|
||||
parentModel.Children.RemoveAt(index);
|
||||
parentModel.Children.Insert(index + 1, selectedModel);
|
||||
}
|
||||
}
|
||||
// Select the last selected element again.
|
||||
lastSelectedElement.IsSelected = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool CanMoveElementDown()
|
||||
{
|
||||
if (IsTopLevelElement())
|
||||
{
|
||||
return Elements.IndexOf(LastSelectedElement) < Elements.Count - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the selected element is a child element, it can always be moved
|
||||
// down after the parent element.
|
||||
return LastSelectedElement != null && LastSelectedElement.IsSelected;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets LastSelectedElement property whenever the IsSelected
|
||||
/// property of an ElementViewModel changes
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Please see the remarks on the LastSelectedElement property.
|
||||
/// </remarks>
|
||||
void ElementViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
ElementViewModel vm = sender as ElementViewModel;
|
||||
if (vm != null && e.PropertyName == "IsSelected")
|
||||
{
|
||||
SelectedElement = vm.IsSelected ? vm : null;
|
||||
if (vm.IsSelected) LastSelectedElement = vm;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if the selected ElementViewModel is at the top
|
||||
/// level of the hierarchy.
|
||||
/// </summary>
|
||||
bool IsTopLevelElement()
|
||||
{
|
||||
return LastSelectedElement != null &&
|
||||
(LastSelectedElement is ControlElementViewModel ||
|
||||
((FormatElementViewModel)LastSelectedElement).Parent == null);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Implementation of ViewModelBase
|
||||
@ -336,10 +738,15 @@ namespace zaaReloaded2.ViewModels
|
||||
Settings _settings;
|
||||
DelegatingCommand _addElementCommand;
|
||||
DelegatingCommand _addChildElementCommand;
|
||||
DelegatingCommand _editElementCommand;
|
||||
DelegatingCommand _deleteElementCommand;
|
||||
DelegatingCommand _copyElementCommand;
|
||||
DelegatingCommand _moveElementUpCommand;
|
||||
DelegatingCommand _moveElementDownCommand;
|
||||
Message<ViewModelMessageContent> _addElementMessage;
|
||||
Message<ViewModelMessageContent> _addChildElementMessage;
|
||||
Message<ViewModelMessageContent> _editElementMessage;
|
||||
Message<ViewModelMessageContent> _changeControlElementMessage;
|
||||
ElementViewModel _selectedElement;
|
||||
EnumProvider<ReferenceStyle> _referenceStyle;
|
||||
|
||||
|
52
zaaReloaded2/Views/ElementPickerView.xaml
Executable file
@ -0,0 +1,52 @@
|
||||
<!--
|
||||
ElementPickerView.xaml
|
||||
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.
|
||||
-->
|
||||
|
||||
<Window x:Class="zaaReloaded2.Views.ElementPickerView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:b="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
|
||||
Width="280" Height="320" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False"
|
||||
WindowStyle="ToolWindow" Topmost="True"
|
||||
b:WindowState.CenterScreen="True" b:WindowState.Save="True"
|
||||
Title="Neues Element auswählen"
|
||||
>
|
||||
<Window.Resources>
|
||||
<ResourceDictionary Source="/zaaReloaded2;component/Style.xaml" />
|
||||
</Window.Resources>
|
||||
<DockPanel Margin="10">
|
||||
<Label DockPanel.Dock="Top" Content="Verfügbare Elemente:" Target="{Binding ElementName=ElementsTreeView}" />
|
||||
<UniformGrid DockPanel.Dock="Bottom" HorizontalAlignment="Right" Columns="2" Rows="1" Margin="0 10 0 0">
|
||||
<Button Content="OK" Command="{Binding ChooseElementCommand}" IsDefault="True" Margin="0 0 5 0" />
|
||||
<Button Content="Abbrechen" Command="{Binding CloseViewCommand}" IsCancel="True" Margin="5 0 0 0" />
|
||||
</UniformGrid>
|
||||
<TreeView ItemsSource="{Binding Categories}">
|
||||
<TreeView.ItemContainerStyle>
|
||||
<Style TargetType="{x:Type TreeViewItem}">
|
||||
<Setter Property="IsExpanded" Value="True" />
|
||||
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
|
||||
</Style>
|
||||
</TreeView.ItemContainerStyle>
|
||||
<TreeView.ItemTemplate>
|
||||
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
|
||||
<TextBlock Text="{Binding DisplayString}" />
|
||||
</HierarchicalDataTemplate>
|
||||
</TreeView.ItemTemplate>
|
||||
</TreeView>
|
||||
</DockPanel>
|
||||
</Window>
|
33
zaaReloaded2/Views/ElementPickerView.xaml.cs
Executable file
@ -0,0 +1,33 @@
|
||||
/* ElementPickerView.xaml.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.Windows;
|
||||
|
||||
namespace zaaReloaded2.Views
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for ElementPickerView.xaml
|
||||
/// </summary>
|
||||
public partial class ElementPickerView : Window
|
||||
{
|
||||
public ElementPickerView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
42
zaaReloaded2/Views/ElementView.xaml
Executable file
@ -0,0 +1,42 @@
|
||||
<!--
|
||||
ElementView.xaml
|
||||
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.
|
||||
-->
|
||||
|
||||
<Window x:Class="zaaReloaded2.Views.ElementView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:b="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
|
||||
SizeToContent="WidthAndHeight" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False"
|
||||
WindowStyle="ToolWindow" Topmost="True"
|
||||
b:WindowState.CenterScreen="True" b:WindowState.Save="True"
|
||||
Title="Element bearbeiten"
|
||||
>
|
||||
<Window.Resources>
|
||||
<ResourceDictionary Source="/zaaReloaded2;component/Style.xaml" />
|
||||
</Window.Resources>
|
||||
<StackPanel Margin="10">
|
||||
<Label Content="Inhalt:" Target="{Binding ElementName=ContentTextBox}" />
|
||||
<TextBox Text="{Binding Content,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
|
||||
x:Name="ContentTextBox" Margin="0 0 0 5"
|
||||
Width="300" Height="60" TextWrapping="Wrap" />
|
||||
<UniformGrid HorizontalAlignment="Right" Columns="2" Rows="1" Margin="0 10 0 0">
|
||||
<Button Content="OK" Command="{Binding SaveCommand}" IsDefault="True" Margin="0 0 5 0" />
|
||||
<Button Content="Abbrechen" Command="{Binding CloseViewCommand}" IsCancel="True" Margin="5 0 0 0" />
|
||||
</UniformGrid>
|
||||
</StackPanel>
|
||||
</Window>
|