Merge branch 'release-2.2.5'

This commit is contained in:
daniel 2016-10-03 17:16:45 +02:00
commit 3267bd9d5a
38 changed files with 858 additions and 382 deletions

View File

@ -44,6 +44,7 @@ namespace Tests.Controller.Elements
public void TearDown()
{
((_Document)_document).Close(WdSaveOptions.wdDoNotSaveChanges);
Bovender.ComHelpers.ReleaseComObject(_document);
}
[Test]

View File

@ -32,14 +32,14 @@ namespace Tests.Controller
[SetUp]
public void SetUp()
{
_savedSettings = zaaReloaded2.Properties.Settings.Default.SettingsRepository;
_savedSettings = zaaReloaded2.UserSettings.Default.SettingsRepository;
}
[TearDown]
public void TearDown()
{
zaaReloaded2.Properties.Settings.Default.SettingsRepository = _savedSettings;
zaaReloaded2.Properties.Settings.Default.Save();
zaaReloaded2.UserSettings.Default.SettingsRepository = _savedSettings;
zaaReloaded2.UserSettings.Default.Save();
}
[Test]

View File

@ -153,7 +153,7 @@ namespace Tests.Importer.ZaaImporter
[TestCase("Albumin (SU)/die: 149.9 [<= 30] mg/d; ", Material.SU)]
[TestCase("Gesamt-Eiweiss/Creatinin (PU): 281 [<= 70] mg/g Crea;", Material.U)]
[TestCase("Cystatin C (N Latex): 2.37 [0.57 - 0.96] mg/l; ", Material.B)]
[TestCase("Cystatin C (N Latex): 2.37 [0.57 - 0.96] mg/l; ", Material.S)]
public void ParseLaurisMaterial(string laurisString, Material expectedMaterial)
{
LaurisItem i = new LaurisItem(laurisString);

View File

@ -41,16 +41,20 @@
<AssemblyOriginatorKeyFile>zaaReloaded2.pfx</AssemblyOriginatorKeyFile>
</PropertyGroup>
<ItemGroup>
<Reference Include="Bovender, Version=0.5.0.0, Culture=neutral, PublicKeyToken=df1c15557d8b6df8, processorArchitecture=MSIL">
<HintPath>..\packages\Bovender.0.5.0.0\lib\net40\Bovender.dll</HintPath>
<Reference Include="Bovender, Version=0.14.5.0, Culture=neutral, PublicKeyToken=df1c15557d8b6df8, processorArchitecture=MSIL">
<HintPath>..\packages\Bovender.0.14.5.0\lib\net40\Bovender.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Office.Interop.Word, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="nunit.framework, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.7\lib\net40\NLog.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="nunit.framework, Version=3.4.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.4.1\lib\net40\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
@ -66,6 +70,10 @@
<Reference Include="System.Xaml" />
<Reference Include="System.XML" />
<Reference Include="WindowsBase" />
<Reference Include="YamlDotNet, Version=3.9.0.0, Culture=neutral, PublicKeyToken=ec19458f3c15af5e, processorArchitecture=MSIL">
<HintPath>..\packages\YamlDotNet.Signed.3.9.0\lib\net35\YamlDotNet.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
@ -107,6 +115,7 @@
<Compile Include="ViewModels\SettingsViewModelTest.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Tests.licenseheader" />
<None Include="zaaReloaded2.pfx" />

29
Tests/app.config Executable file
View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
app.config
part of zaaReloaded2
Copyright 2016 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.
-->
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="YamlDotNet" publicKeyToken="ec19458f3c15af5e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.9.0.0" newVersion="3.9.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Bovender" version="0.5.0.0" targetFramework="net40" />
<package id="Bovender" version="0.14.5.0" targetFramework="net40" />
<package id="Expression.Blend.Sdk" version="1.0.2" targetFramework="net40" />
<package id="NUnit" version="2.6.4" targetFramework="net40" />
<package id="NLog" version="4.3.7" targetFramework="net40" />
<package id="NUnit" version="3.4.1" targetFramework="net40" />
<package id="YamlDotNet.Signed" version="3.9.0" targetFramework="net40" />
</packages>

@ -1 +1 @@
Subproject commit 26f2dda3892341a7eaf93df75b765edcf910ca71
Subproject commit fba57212590cafd9cc650b0602dccb8b0dc39e5b

2
deploy/make-installer.iss Normal file → Executable file
View File

@ -8,7 +8,7 @@
#define ADDIN_NAME "zaaReloaded"
#define COMPANY "Daniel Kraus (bovender)"
#define DESCRIPTION "Word-Addin, das Lauris-Laborwerte in der Zentralen Arztbriefablage formatiert."
#define HOMEPAGE "http://zaa.nephrowiki.de"
#define HOMEPAGE "https://doktorkraus.de/zaareloaded"
#define REGKEY "zaaReloaded2"
#define SOURCEDIR "..\zaaReloaded2\bin\Release\"

View File

@ -1,4 +1,4 @@
2.2.3
http://zaa.nephrowiki.de/downloads/zaaReloaded-$VERSION.exe
077df8d43cf97ef4082cda988393734a825b51cf0e023527cdc5752502c83f03 deploy/releases/zaaReloaded-2.2.3.exe
2.2.5
https://doktorkraus.de/zaareloaded/downloads/zaaReloaded-$VERSION.exe
f5f348b5ffdc532240b63af8fbfd1983219adeee338b9decb3ac3df5f23965ca deploy/releases/zaaReloaded-2.2.5.exe

View File

@ -42,7 +42,7 @@ namespace zaaReloaded2
if (CanFormat())
{
SettingsRepository repository = SettingsRepository.Load();
Guid lastSettingsUid = Properties.Settings.Default.LastSettings;
Guid lastSettingsUid = UserSettings.Default.LastSettings;
Settings lastSettings = repository.FindByGuid(lastSettingsUid);
if (lastSettings != null)
{
@ -72,8 +72,7 @@ namespace zaaReloaded2
SettingsViewModel settingsVM = args.Content.ViewModel as SettingsViewModel;
Settings settings = settingsVM.RevealModelObject() as Settings;
DoFormat(settings);
Properties.Settings.Default.LastSettings = settings.Uid;
Properties.Settings.Default.Save();
UserSettings.Default.LastSettings = settings.Uid;
};
vm.InjectInto<SettingsRepositoryView>().ShowDialog();
}
@ -108,7 +107,7 @@ namespace zaaReloaded2
+ "wenn Word in der Zentralen Arztbriefablage ausgeführt wird.\r"
+ "Bitte Word als eigenständige Anwendung starten und dann "
+ "noch einmal versuchen.";
a.OkButtonLabel = "Schließen";
a.OkButtonText = "Schließen";
a.Invoke();
}
else
@ -127,8 +126,8 @@ namespace zaaReloaded2
public static void ShowPreferences()
{
ViewModels.PreferencesViewModel.Default.InjectInto<Views.PreferencesView>()
.ShowDialog();
ViewModels.PreferencesViewModel vm = new PreferencesViewModel();
vm.InjectInto<Views.PreferencesView>().ShowDialog();
}
public static void ApplyDanielsStyle()
@ -149,34 +148,45 @@ namespace zaaReloaded2
// (NB Technically, there is never _no_ selection in a document.)
Word.Window activeWindow = Globals.ThisAddIn.Application.ActiveWindow;
Word.Selection sel = activeWindow.Selection;
if (!(sel.Paragraphs.Count > 1
Word.Paragraphs paragraphs = sel.Paragraphs;
Word.Document document = activeWindow.Document;
if (!(paragraphs.Count > 1
|| (sel.Text.Length > 1 && sel.Text.EndsWith("\r"))))
{
if (!Medication.Importer.AutoDetect(activeWindow.Document))
Logger.Info("FormatDrugs: Attempting to auto-detect");
if (!Medication.Importer.AutoDetect(document))
{
Logger.Info("FormatDrugs: Failed to auto-detect");
NotificationAction a = new NotificationAction();
a.Caption = "Formatieren nicht möglich";
a.Message = "Das Dokument scheint keine Medikationsliste zu enthalten.";
a.OkButtonLabel = "Schließen";
a.OkButtonText = "Schließen";
a.Invoke();
return;
}
}
Medication.Importer importer = new Medication.Importer(activeWindow.Selection.Text);
Logger.Info("FormatDrugs: Importing");
Medication.Importer importer = new Medication.Importer(sel.Text);
Medication.Formatter formatter = new Medication.Formatter(importer.Prescriptions);
Logger.Info("FormatDrugs: Formatting");
switch (columns)
{
case 1:
formatter.FormatOneColumn(activeWindow.Document);
formatter.FormatOneColumn(document);
break;
case 2:
formatter.FormatTwoColumns(activeWindow.Document);
formatter.FormatTwoColumns(document);
break;
default:
break;
}
Logger.Info("FormatDrugs: Cleaning up");
Bovender.ComHelpers.ReleaseComObject(document);
Bovender.ComHelpers.ReleaseComObject(paragraphs);
Bovender.ComHelpers.ReleaseComObject(sel);
Bovender.ComHelpers.ReleaseComObject(activeWindow);
}
#endregion
@ -187,57 +197,84 @@ namespace zaaReloaded2
{
// If no "real" selection exists, attempt to auto-detect the lab data.
// (NB Technically, there is never _no_ selection in a document.)
Word.Window activeWindow = Globals.ThisAddIn.Application.ActiveWindow;
Word.Selection sel = activeWindow.Selection;
if (!(sel.Paragraphs.Count > 1
|| (sel.Text.Length > 1 && sel.Text.EndsWith("\r"))))
Word.Application word = Globals.ThisAddIn.Application;
Word.Document activeDocument = word.ActiveDocument;
Word.Window activeWindow = word.ActiveWindow;
Word.Selection selection = activeWindow.Selection;
Word.Paragraphs paragraphs = selection.Paragraphs;
if (!(paragraphs.Count > 1
|| (selection.Text.Length > 1 && selection.Text.EndsWith("\r"))))
{
if (!AutoDetect.Detect(activeWindow.Document))
Logger.Info("DoFormat: Attempting to auto-detect");
Word.Document doc = activeWindow.Document;
if (!AutoDetect.Detect(doc))
{
Logger.Info("DoFormat: Automatic detection failed");
NotificationAction a = new NotificationAction();
a.Caption = "Formatieren nicht möglich";
a.Message = "Das Dokument scheint keine Lauris-Labordaten zu enthalten.";
a.OkButtonLabel = "Schließen";
a.OkButtonText = "Schließen";
a.Invoke();
return;
}
// Don't release the COM object here
// Bovender.ComHelpers.ReleaseComObject(doc);
}
Logger.Info("DoFormat: Importing");
ZaaImporter importer = new ZaaImporter();
importer.Import(Globals.ThisAddIn.Application.ActiveWindow.Selection.Text);
Formatter.Formatter formatter = new Formatter.Formatter(
Globals.ThisAddIn.Application.ActiveDocument);
importer.Import(selection.Text);
Formatter.Formatter formatter = new Formatter.Formatter(activeDocument);
formatter.Settings = settings;
formatter.Laboratory = importer.Laboratory;
CommentPool.Default.Reset();
CommentPool.Default.FillInComment += CommentPool_FillInComment;
try
{
Logger.Info("DoFormat: Formatting");
formatter.Run();
}
catch (NoLaboratoryDataException)
catch (NoLaboratoryDataException e)
{
Logger.Warn("DoFormat: No lab data?!");
Logger.Warn(e);
NotificationAction a = new NotificationAction();
a.Caption = "Formatieren nicht möglich";
a.Message = "Die aktuelle Markierung scheint keine Labordaten zu enthalten.";
a.OkButtonLabel = "Schließen";
a.OkButtonText = "Schließen";
a.Invoke();
}
Bovender.ComHelpers.ReleaseComObject(paragraphs);
Bovender.ComHelpers.ReleaseComObject(selection);
Bovender.ComHelpers.ReleaseComObject(activeWindow);
Bovender.ComHelpers.ReleaseComObject(activeDocument);
Logger.Info("DoFormat: Finished");
}
private static void CommentPool_FillInComment(object sender, ItemCommentEventArgs e)
{
if (Preferences.Default.SuppressItemCommentInteraction)
if (UserSettings.Default.SuppressItemCommentInteraction)
{
Logger.Info("CommentPool_FillInComment: Comment interaction is suppressed by user settings");
e.Comment.IsCancelled = true;
}
else
{
Logger.Info("CommentPool_FillInComment: Requesting user interaction");
ItemCommentViewModel vm = new ItemCommentViewModel(e.Comment);
vm.InjectInto<ItemCommentView>().ShowDialog();
}
}
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -59,7 +59,7 @@ namespace zaaReloaded2.Controller
/// </remarks>
public static SettingsRepository Load()
{
string s = Properties.Settings.Default.SettingsRepository;
string s = UserSettings.Default.SettingsRepository;
if (String.IsNullOrEmpty(s))
{
return new SettingsRepository();
@ -67,7 +67,7 @@ namespace zaaReloaded2.Controller
else
{
MemoryStream stream = new MemoryStream();
string encoded = Properties.Settings.Default.SettingsRepository;
string encoded = UserSettings.Default.SettingsRepository;
byte[] bytes = Convert.FromBase64String(encoded);
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0;
@ -94,8 +94,7 @@ namespace zaaReloaded2.Controller
serializer.Serialize(stream, this);
stream.Position = 0;
string encoded = Convert.ToBase64String(stream.ToArray());
Properties.Settings.Default.SettingsRepository = encoded;
Properties.Settings.Default.Save();
UserSettings.Default.SettingsRepository = encoded;
}
#endregion

View File

@ -48,7 +48,7 @@ namespace zaaReloaded2.ExceptionHandler
{
get
{
return zaaReloaded2.Updater.Version.CurrentVersion().ToString();
return zaaReloaded2.Updater.Version.Current.ToString();
}
}
@ -86,6 +86,11 @@ namespace zaaReloaded2.ExceptionHandler
return @"x:\Code\zaaReloaded2\zaaReloaded2\";
}
protected override Bovender.UserSettings.UserSettingsBase UserSettings
{
get { return zaaReloaded2.UserSettings.Default; }
}
#endregion
}
}

View File

@ -272,15 +272,18 @@ namespace zaaReloaded2.Formatter
{
if (Document != null)
{
Logger.Info("CreateStyles");
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.StyleParagraph];
Logger.Info("CreateStyles: Found paragraph style in document");
}
catch
{
Logger.Info("CreateStyles: Need to create paragraph style");
// Add default paragraph style for laboratory
style = Document.Styles.Add(Properties.Settings.Default.StyleParagraph);
style.Font.Size = 10; // pt
@ -293,13 +296,16 @@ namespace zaaReloaded2.Formatter
style.ParagraphFormat.FirstLineIndent = -36; // pt
style.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
}
Bovender.ComHelpers.ReleaseComObject(style);
try
{
style = Document.Styles[Properties.Settings.Default.StyleHeader];
Logger.Info("CreateStyles: Found header style in document");
}
catch
{
Logger.Info("CreateStyles: Need to create header style");
// Add header paragraph style for laboratory
style = Document.Styles.Add(Properties.Settings.Default.StyleHeader);
style.Font.Size = 10; // pt
@ -313,6 +319,7 @@ namespace zaaReloaded2.Formatter
style.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
style.set_NextParagraphStyle(Document.Styles[Properties.Settings.Default.StyleParagraph]);
}
Bovender.ComHelpers.ReleaseComObject(style);
/*
try
@ -422,5 +429,13 @@ namespace zaaReloaded2.Formatter
Table _table;
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -103,14 +103,17 @@ namespace zaaReloaded2.Importer.ZaaImporter
// "HBs-Antigen: neg. ;"
// "Erythrozyten (U): + [negativ]"
Match match;
Logger.Debug("ParseLauris: {0}", LaurisText);
if (_numericalRegex.IsMatch(LaurisText))
{
Logger.Debug("ParseLauris: Numerical match");
match = _numericalRegex.Match(LaurisText);
ParseLimits(match);
Value = match.Groups["value"].Value.Trim().Replace(',', '.');
}
else
{
Logger.Debug("ParseLauris: Not a numerical match");
match = _categoricalRegex.Match(LaurisText);
Normal = match.Groups["normal"].Value.Trim();
Value = match.Groups["value"].Value.Trim();
@ -120,6 +123,11 @@ namespace zaaReloaded2.Importer.ZaaImporter
OriginalName = match.Groups["name"].Value.Trim();
Name = OriginalName;
Unit = match.Groups["unit"].Value.Trim();
Logger.Debug("ParseLauris: Match: {0}, {1}", Name, Unit);
}
else
{
Logger.Debug("ParseLauris: No match: \"{0}\"", LaurisText);
}
}
@ -132,9 +140,11 @@ namespace zaaReloaded2.Importer.ZaaImporter
{
if (match.Groups["limits"].Success)
{
Logger.Debug("ParseLimits: Has limits: {0}", match.Groups["limits"].Value);
Match limitMatch = _limitRegex.Match(match.Groups["limits"].Value);
if (limitMatch.Groups["limit1"].Success && limitMatch.Groups["limit2"].Success)
{
Logger.Debug("ParseLimits: Upper and lower limit detected");
// Use InvariantCulture because Lauris always outputs dots as decimal separator
// Only in rare cases, a comma sneaks in...
LowerLimit = Double.Parse(limitMatch.Groups["limit1"].Value.Replace(',', '.'),
@ -144,6 +154,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
}
else
{
Logger.Debug("ParseLimits: Single limit detected");
switch (limitMatch.Groups["operator"].Value.Trim())
{
case "<=":
@ -159,9 +170,9 @@ namespace zaaReloaded2.Importer.ZaaImporter
// Fixes exception ID 65ca8575.
break;
default:
throw new InvalidOperationException(
String.Format("Unknown operator in {0}",
match.Groups["limits"].Value));
string unknown = match.Groups["limits"].Value;
Logger.Fatal("ParseLimits: Unknown operator \"{0}\"", unknown);
throw new InvalidOperationException(String.Format("Unknown operator in {0}",unknown));
}
}
}
@ -210,5 +221,13 @@ namespace zaaReloaded2.Importer.ZaaImporter
static readonly Regex _materialRegex = new Regex(@"\((?<material>(SU|PU))\)");
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -23,6 +23,7 @@ using System.Text;
using System.Text.RegularExpressions;
using zaaReloaded2.Thesaurus;
using zaaReloaded2.LabModel;
using Bovender.Extensions;
namespace zaaReloaded2.Importer.ZaaImporter
{
@ -109,9 +110,11 @@ namespace zaaReloaded2.Importer.ZaaImporter
/// </summary>
void Parse()
{
Logger.Info("Parse: \"{0}\"", OriginalParagraph.TruncateWithEllipsis(40));
Match m = _expectedFormat.Match(OriginalParagraph);
if (m.Success)
{
Logger.Info("Parse: Matches Lauris paragraph format");
Items = new ItemDictionary();
if (m.Groups["caption"].Success)
{
@ -127,6 +130,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
}
else
{
Logger.Info("Parse: Does not match Lauris paragraph format");
IsLaurisParagraph = false;
}
}
@ -140,5 +144,13 @@ namespace zaaReloaded2.Importer.ZaaImporter
Thesaurus.Units _unitDictionary;
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -199,6 +199,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
Match m = _timeStampRegex.Match(paragraph);
if (m.Success)
{
Logger.Info("ParseParagraph: Matches time stamp");
DateTime dt;
if (DateTime.TryParseExact(
m.Groups["datetime"].Value,
@ -218,22 +219,25 @@ namespace zaaReloaded2.Importer.ZaaImporter
// the normal format of a paragraph generated from Lauris.
if (m.Groups["tail"].Success)
{
Logger.Info("ParseParagraph: Time stamp has a tail -- putting it back with a dummy caption");
paragraph = "DUMMY CAPTION: " + m.Groups["tail"].Value;
}
else
{
paragraph = String.Empty;
paragraph = null;
}
}
if (!String.IsNullOrEmpty(paragraph))
{
Logger.Info("ParseParagraph: Not a time stamp");
LaurisParagraph lp = new LaurisParagraph(
paragraph,
_parameterDictionary,
_unitDictionary);
if (lp.IsLaurisParagraph)
{
Logger.Debug("ParseParagraph: Merging Lauris paragraph");
Items.Merge(lp.Items);
}
}
@ -259,5 +263,13 @@ namespace zaaReloaded2.Importer.ZaaImporter
Units _unitDictionary;
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -67,15 +67,19 @@ namespace zaaReloaded2.Importer.ZaaImporter
/// <param name="text">ZAA-formatted Lauris output to import.</param>
public void Import(string text)
{
Logger.Info("Import: \"{0}\"", text.TruncateWithEllipsis(120));
string[] paragraphs = Helpers.SplitParagraphs(text);
Logger.Info("Import: {0} paragraph(s)", paragraphs.Length);
LaurisTimePoint timePoint = null;
foreach (string paragraph in paragraphs)
{
Logger.Info("Import: \"{0}\"", paragraph.TruncateWithEllipsis(40));
// If the current paragraph looks like a Lauris time stamp,
// create a new time point.
if (LaurisTimePoint.IsTimeStampLine(paragraph))
{
Logger.Info("Import: Time stamp detected", paragraph);
timePoint = new LaurisTimePoint(paragraph, _parameters, _units);
// Add the time point to the laboratory only if none
// with the same time stamp exists yet.
@ -94,6 +98,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
// if no time point exists yet, create one.
else if (LaurisParagraph.ResemblesLaurisParagraph(paragraph))
{
Logger.Info("Import: Lauris paragraph detected");
if (timePoint == null)
{
timePoint = new LaurisTimePoint(_parameters, _units);
@ -101,6 +106,10 @@ namespace zaaReloaded2.Importer.ZaaImporter
}
timePoint.AddParagraph(paragraph);
}
else
{
Logger.Debug("Import: Neither time stamp, nor Lauris paragraph");
}
}
}
@ -123,5 +132,13 @@ namespace zaaReloaded2.Importer.ZaaImporter
Units _units;
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -206,13 +206,14 @@ namespace zaaReloaded2.LabModel
{
get
{
if (Material == LabModel.Material.B)
switch (Material)
{
return Name;
}
else
{
return String.Format("{0}-{1}", Material.ToString(), Name);
case Material.S:
case Material.E:
case Material.B:
return Name;
default:
return String.Format("{0}-{1}", Material.ToString(), Name);
}
}
}

View File

@ -28,6 +28,12 @@ namespace zaaReloaded2.LabModel
/// </summary>
public enum Material
{
[Description("Serum")]
/// Serum (default -- first declared)
S,
[Description("EDTA-Blut")]
/// EDTA blood
E,
[Description("Blut")]
/// Blood
B,

109
zaaReloaded2/LogFile.cs Executable file
View File

@ -0,0 +1,109 @@
/* LogFile.cs
* part of zaaReloaded2
*
* Copyright 2016 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 NLog;
using NLog.Config;
using NLog.Targets;
using NLog.Targets.Wrappers;
namespace zaaReloaded2
{
/// <summary>
/// Provides logging to file and to the debug console; wraps
/// NLog configuration and targets.
/// </summary>
public class LogFile : Bovender.Logging.LogFile
{
#region Singleton
new public static LogFile Default { get { return _lazy.Value; } }
private static readonly Lazy<LogFile> _lazy = new Lazy<LogFile>(
() =>
{
LogFile logFile = new LogFile();
Bovender.Logging.LogFile.LogFileProvider = new Func<Bovender.Logging.LogFile>(() => logFile);
return logFile;
});
#endregion
#region Static properties
/// <summary>
/// Gets whether file logging is enabled, without initializing
/// the singleton instance if it isn't.
/// </summary>
new public static bool IsInitializedAndEnabled
{
get
{
return _lazy.IsValueCreated && Default.IsFileLoggingEnabled;
}
}
#endregion
#region Properties
/// <summary>
/// Gets the folder where log files are stored.
/// </summary>
public override string LogFolder
{
get
{
if (_logFolder == null)
{
_logFolder = System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
Properties.Settings.Default.AppDataFolder,
Properties.Settings.Default.UserFolder);
}
return _logFolder;
}
}
#endregion
#region Constructor
private LogFile()
: base()
{ }
#endregion
#region Private fields
string _logFolder;
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -1,73 +0,0 @@
/* Preferences.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace zaaReloaded2
{
/// <summary>
/// Holds user preferences.
/// </summary>
public class Preferences
{
#region Singleton
public static Preferences Default
{
get
{
return _instance;
}
}
static readonly Preferences _instance = new Preferences();
static Preferences() { }
#endregion
#region Properties
/// <summary>
/// Gets or sets whether the add-in should not ask for
/// item comments (i.e. typist mode).
/// </summary>
public bool SuppressItemCommentInteraction
{
get
{
return Properties.Settings.Default.SuppressItemCommentInteraction;
}
set
{
Properties.Settings.Default.SuppressItemCommentInteraction = value;
Properties.Settings.Default.Save();
}
}
#endregion
#region Constructors
protected Preferences() { }
#endregion
}
}

View File

@ -23,18 +23,6 @@ namespace zaaReloaded2.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string SettingsRepository {
get {
return ((string)(this["SettingsRepository"]));
}
set {
this["SettingsRepository"] = value;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("zaaReloaded2")]
@ -64,7 +52,7 @@ namespace zaaReloaded2.Properties {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("http://zaa.nephrowiki.de")]
[global::System.Configuration.DefaultSettingValueAttribute("https://doktorkraus.de/zaareloaded")]
public global::System.Uri Homepage {
get {
return ((global::System.Uri)(this["Homepage"]));
@ -73,7 +61,7 @@ namespace zaaReloaded2.Properties {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("http://zaa.nephrowiki.de/versioninfo.txt")]
[global::System.Configuration.DefaultSettingValueAttribute("https://doktorkraus.de/zaareloaded/versioninfo.txt")]
public string VersionInfoFile {
get {
return ((string)(this["VersionInfoFile"]));
@ -82,24 +70,13 @@ namespace zaaReloaded2.Properties {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("http://zaa.nephrowiki.de/postreport.php")]
[global::System.Configuration.DefaultSettingValueAttribute("https://doktorkraus.de/zaareloaded/postreport.php")]
public string ExceptionPostUrl {
get {
return ((string)(this["ExceptionPostUrl"]));
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::System.DateTime LastUpdateCheck {
get {
return ((global::System.DateTime)(this["LastUpdateCheck"]));
}
set {
this["LastUpdateCheck"] = value;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("http://www.apache.org/licenses/LICENSE-2.0")]
@ -127,18 +104,6 @@ namespace zaaReloaded2.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("00000000-0000-0000-0000-000000000000")]
public global::System.Guid LastSettings {
get {
return ((global::System.Guid)(this["LastSettings"]));
}
set {
this["LastSettings"] = value;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("zaaReloaded2-Laborwerte")]
@ -184,18 +149,6 @@ namespace zaaReloaded2.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ImportExportPath {
get {
return ((string)(this["ImportExportPath"]));
}
set {
this["ImportExportPath"] = value;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("zaaReloaded2-Überschrift")]
@ -223,30 +176,6 @@ namespace zaaReloaded2.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool SuppressItemCommentInteraction {
get {
return ((bool)(this["SuppressItemCommentInteraction"]));
}
set {
this["SuppressItemCommentInteraction"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool FirstRunWizardShown {
get {
return ((bool)(this["FirstRunWizardShown"]));
}
set {
this["FirstRunWizardShown"] = value;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("BITTE_ERGÄNZEN")]
@ -258,25 +187,13 @@ namespace zaaReloaded2.Properties {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("http://git.bovender.de")]
[global::System.Configuration.DefaultSettingValueAttribute("https://git.bovender.de")]
public string Repository {
get {
return ((string)(this["Repository"]));
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool NeedUpgrade {
get {
return ((bool)(this["NeedUpgrade"]));
}
set {
this["NeedUpgrade"] = value;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("zaaReloaded2-Medikamente")]
@ -285,5 +202,32 @@ namespace zaaReloaded2.Properties {
return ((string)(this["DrugsParagraph"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("user")]
public string UserFolder {
get {
return ((string)(this["UserFolder"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("zaaReloaded2")]
public string AppDataFolder {
get {
return ((string)(this["AppDataFolder"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("settings.yml")]
public string UserSettingsFile {
get {
return ((string)(this["UserSettingsFile"]));
}
}
}
}

View File

@ -2,9 +2,6 @@
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="zaaReloaded2.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="SettingsRepository" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="AddinName" Type="System.String" Scope="Application">
<Value Profile="(Default)">zaaReloaded2</Value>
</Setting>
@ -15,16 +12,13 @@
<Value Profile="(Default)">Daniel Kraus</Value>
</Setting>
<Setting Name="Homepage" Type="System.Uri" Scope="Application">
<Value Profile="(Default)">http://zaa.nephrowiki.de</Value>
<Value Profile="(Default)">https://doktorkraus.de/zaareloaded</Value>
</Setting>
<Setting Name="VersionInfoFile" Type="System.String" Scope="Application">
<Value Profile="(Default)">http://zaa.nephrowiki.de/versioninfo.txt</Value>
<Value Profile="(Default)">https://doktorkraus.de/zaareloaded/versioninfo.txt</Value>
</Setting>
<Setting Name="ExceptionPostUrl" Type="System.String" Scope="Application">
<Value Profile="(Default)">http://zaa.nephrowiki.de/postreport.php</Value>
</Setting>
<Setting Name="LastUpdateCheck" Type="System.DateTime" Scope="User">
<Value Profile="(Default)" />
<Value Profile="(Default)">https://doktorkraus.de/zaareloaded/postreport.php</Value>
</Setting>
<Setting Name="LicenseUrl" Type="System.Uri" Scope="Application">
<Value Profile="(Default)">http://www.apache.org/licenses/LICENSE-2.0</Value>
@ -35,9 +29,6 @@
<Setting Name="SettingsNameClinic" Type="System.String" Scope="Application">
<Value Profile="(Default)">Standard für NepA</Value>
</Setting>
<Setting Name="LastSettings" Type="System.Guid" Scope="User">
<Value Profile="(Default)">00000000-0000-0000-0000-000000000000</Value>
</Setting>
<Setting Name="StyleParagraph" Type="System.String" Scope="Application">
<Value Profile="(Default)">zaaReloaded2-Laborwerte</Value>
</Setting>
@ -53,9 +44,6 @@
<Setting Name="SerializationVersion" Type="System.Int32" Scope="Application">
<Value Profile="(Default)">2</Value>
</Setting>
<Setting Name="ImportExportPath" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="StyleHeader" Type="System.String" Scope="Application">
<Value Profile="(Default)">zaaReloaded2-Überschrift</Value>
</Setting>
@ -65,23 +53,23 @@
<Setting Name="AbnormalStyle" Type="zaaReloaded2.Formatter.AbnormalStyle" Scope="Application">
<Value Profile="(Default)">None</Value>
</Setting>
<Setting Name="SuppressItemCommentInteraction" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="FirstRunWizardShown" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ManualCommentPrompt" Type="System.String" Scope="Application">
<Value Profile="(Default)">BITTE_ERGÄNZEN</Value>
</Setting>
<Setting Name="Repository" Type="System.String" Scope="Application">
<Value Profile="(Default)">http://git.bovender.de</Value>
</Setting>
<Setting Name="NeedUpgrade" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
<Value Profile="(Default)">https://git.bovender.de</Value>
</Setting>
<Setting Name="DrugsParagraph" Type="System.String" Scope="Application">
<Value Profile="(Default)">zaaReloaded2-Medikamente</Value>
</Setting>
<Setting Name="UserFolder" Type="System.String" Scope="Application">
<Value Profile="(Default)">user</Value>
</Setting>
<Setting Name="AppDataFolder" Type="System.String" Scope="Application">
<Value Profile="(Default)">zaaReloaded2</Value>
</Setting>
<Setting Name="UserSettingsFile" Type="System.String" Scope="Application">
<Value Profile="(Default)">settings.yml</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -24,11 +24,14 @@ using System.Windows;
using System.Windows.Input;
using System.Windows.Controls;
using System.Windows.Media;
using System.Configuration;
namespace zaaReloaded2
{
public partial class ThisAddIn
{
#region Static property
/// <summary>
/// Gets the subdirectory for addin data in the user profile directory.
/// </summary>
@ -42,44 +45,77 @@ namespace zaaReloaded2
}
}
#endregion
#region Start up and shut down
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Bovender.ExceptionHandler.CentralHandler.ManageExceptionCallback += CentralHandler_ManageExceptionCallback;
Bovender.WpfHelpers.RegisterTextBoxSelectAll();
if (Properties.Settings.Default.NeedUpgrade)
#if DEBUG
Bovender.Logging.LogFile.Default.EnableDebugLogging();
#endif
try
{
Properties.Settings.Default.Upgrade();
Properties.Settings.Default.NeedUpgrade = false;
Properties.Settings.Default.Save();
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
if (System.IO.File.Exists(config.FilePath))
{
System.IO.File.Delete(config.FilePath);
}
}
catch (Exception ex)
{
Logger.Warn("ThisAddIn_Startup: Unable to delete user config file");
Logger.Warn(ex);
}
Bovender.ExceptionHandler.CentralHandler.ManageExceptionCallback += CentralHandler_ManageExceptionCallback;
Bovender.Win32Window.MainWindowHandleProvider = () =>
{
return IntPtr.Zero;
};
Bovender.WpfHelpers.RegisterTextBoxSelectAll();
UserSettings userSettings = UserSettings.Default;
CheckForUpdates();
_oldCaption = Globals.ThisAddIn.Application.Caption;
Globals.ThisAddIn.Application.Caption =
Microsoft.Office.Interop.Word.Application word = Globals.ThisAddIn.Application;
_oldCaption = word.Caption;
word.Caption =
String.Format(
"{0} ({1} {2})",
_oldCaption,
Properties.Settings.Default.AddinName,
Updater.Version.CurrentVersion().ToString()
Updater.Version.Current.ToString()
);
ViewModels.FirstRunViewModel.InjectIntoIfNeeded<Views.FirstRunView>();
Logger.Info("ThisAddIn_Startup: Finished startup");
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
if (_updaterVM != null && _updaterVM.IsUpdatePending)
UserSettings.Default.LastVersionSeen = Updater.Version.Current.ToString();
UserSettings.Default.Save();
if (_updaterVM != null && _updaterVM.InstallCommand.CanExecute(null))
{
if (_updaterVM.InstallUpdateCommand.CanExecute(null))
_updaterVM.InstallUpdateCommand.Execute(null);
Logger.Info("ThisAddIn_Shutdown: Installing update");
_updaterVM.InstallCommand.Execute(null);
}
try
{
Logger.Info("ThisAddIn_Shutdown: Resetting application caption");
Globals.ThisAddIn.Application.Caption = _oldCaption;
}
catch { }
catch (Exception ex)
{
Logger.Warn("ThisAddIn_Shutdown: Failed to reset application caption");
Logger.Warn(ex);
}
Logger.Info("ThisAddIn_Shutdown: Finished shutdown");
}
#endregion
#region Properties
public Ribbon Ribbon
@ -109,24 +145,23 @@ namespace zaaReloaded2
void CheckForUpdates()
{
if (DateTime.Today == Properties.Settings.Default.LastUpdateCheck.Date)
// Check only once per day
if (DateTime.Today == UserSettings.Default.LastUpdateCheck.Date)
return;
Properties.Settings.Default.LastUpdateCheck = DateTime.Today;
Properties.Settings.Default.Save();
_updaterVM = new UpdaterViewModel(new Updater.Updater());
if (!_updaterVM.CanCheckForUpdate) return;
_updaterVM.UpdateAvailableMessage.Sent += UpdateAvailableMessage_Sent;
_updaterVM.CheckForUpdateCommand.Execute(null);
}
void UpdateAvailableMessage_Sent(object sender, MessageArgs<ViewModelMessageContent> e)
{
UpdaterViewModel uvm = e.Content.ViewModel as UpdaterViewModel;
uvm.DestinationFolder = System.IO.Path.GetTempPath();
uvm.DownloadUpdateCommand.Execute(null);
Logger.Info("CheckForUpdates");
UserSettings.Default.LastUpdateCheck = DateTime.Today;
ReleaseInfo releaseInfo = new ReleaseInfo(new Uri(Properties.Settings.Default.VersionInfoFile));
ReleaseInfoViewModel releaseInfoVM = new ReleaseInfoViewModel(releaseInfo, Updater.Version.Current);
releaseInfoVM.UpdateAvailableMessage.Sent += (sender, args) =>
{
Logger.Info("CheckForUpdates: Received update-available message");
Updater.Updater updater = Updater.Updater.CreateDefault(releaseInfo);
updater.DestinationFolder = System.IO.Path.GetTempPath();
_updaterVM = new UpdaterViewModel(updater);
_updaterVM.StartProcess();
};
releaseInfoVM.StartProcess();
}
#endregion
@ -145,8 +180,8 @@ namespace zaaReloaded2
#region Private fields
Ribbon _ribbon;
UpdaterViewModel _updaterVM;
string _oldCaption;
UpdaterViewModel _updaterVM;
#endregion
@ -163,5 +198,13 @@ namespace zaaReloaded2
}
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -1,4 +1,5 @@
/* Updater.cs
using Bovender.Versioning;
/* Updater.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
@ -24,23 +25,38 @@ namespace zaaReloaded2.Updater
{
class Updater : Bovender.Versioning.Updater
{
protected override Bovender.Versioning.SemanticVersion GetCurrentVersion()
#region Static properties
public static Updater Default { get; set; }
#endregion
#region Public static methods
public static Updater CreateDefault(IReleaseInfo releaseInfo)
{
return Version.CurrentVersion();
Default = new Updater(releaseInfo);
return Default;
}
protected override Uri GetVersionInfoUri()
#endregion
#region Constructor
public Updater(Bovender.Versioning.IReleaseInfo releaseInfo)
: base(releaseInfo)
{
return new Uri(Properties.Settings.Default.VersionInfoFile);
CurrentVersion = Version.Current;
}
protected override string BuildDestinationFileName()
{
return System.IO.Path.Combine(
DestinationFolder,
DownloadUri.ToString().Split('/').Last()
);
}
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -26,18 +26,41 @@ namespace zaaReloaded2.Updater
{
class Version : SemanticVersion
{
#region Static 'overrides'
#region Current version singleton
public static SemanticVersion Current
{
get
{
return _lazy.Value;
}
}
private static readonly Lazy<SemanticVersion> _lazy =
new Lazy<SemanticVersion>(() => new Version());
#endregion
#region Public method
public string BrandName
{
get
{
return Properties.Settings.Default.AddinName + " " + ToString();
}
}
#endregion
#region Constructors
/// <summary>
/// Returns the current version of the XL Toolbox addin.
/// Creates an instance with the current zaaReloaded2 version
/// </summary>
/// <returns></returns>
new public static SemanticVersion CurrentVersion()
{
return Bovender.Versioning.SemanticVersion.CurrentVersion(
Assembly.GetExecutingAssembly()
);
}
private Version() : base(Assembly.GetExecutingAssembly()) { }
public Version(string version) : base(version) { }
#endregion
}

198
zaaReloaded2/UserSettings.cs Executable file
View File

@ -0,0 +1,198 @@
/* UserSettings.cs
* part of zaaReloaded2
*
* Copyright 2016 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;
namespace zaaReloaded2
{
[Serializable]
class UserSettings : Bovender.UserSettings.UserSettingsBase
{
#region Static property
public static string UserSettingsFile
{
get
{
return Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
Properties.Settings.Default.AppDataFolder,
Properties.Settings.Default.UserFolder,
Properties.Settings.Default.UserSettingsFile);
}
}
#endregion
#region Singleton factory
new public static UserSettings Default
{
get
{
return _lazy.Value;
}
}
private static Lazy<UserSettings> _lazy = new Lazy<UserSettings>(() =>
{
// Logger.Info("Initializing singleton instance");
UserSettings s = FromFileOrDefault<UserSettings>(UserSettingsFile);
Bovender.UserSettings.UserSettingsBase.Default = s;
return s;
});
#endregion
#region User settings
public DateTime LastUpdateCheck
{
get
{
if (_lastUpdateCheck == null)
{
_lastUpdateCheck = new DateTime(2016, 1, 1);
}
return _lastUpdateCheck;
}
set
{
_lastUpdateCheck = value;
}
}
public string LastVersionSeen
{
get
{
if (_lastVersionSeen == null)
{
_lastVersionSeen = DEFAULT_VERSION;
}
return _lastVersionSeen;
}
set
{
_lastVersionSeen = value;
}
}
public int UpdateCheckInterval
{
get
{
if (_updateCheckInterval <= 0)
{
_updateCheckInterval = 7;
}
return _updateCheckInterval;
}
set
{
_updateCheckInterval = value;
}
}
public bool EnableLogging
{
get
{
return LogFile.IsInitializedAndEnabled;
}
set
{
if (value)
{
LogFile.Default.IsFileLoggingEnabled = true;
}
else if (LogFile.IsInitializedAndEnabled)
{
LogFile.Default.IsFileLoggingEnabled = true;
}
}
}
public string ImportExportPath { get; set; }
public bool SuppressItemCommentInteraction { get; set; }
public Guid LastSettings
{
get
{
if (_lastSettings == null)
{
_lastSettings = new Guid("00000000-0000-0000-0000-000000000000");
}
return _lastSettings;
}
set
{
_lastSettings = value;
}
}
public string SettingsRepository { get; set; }
[YamlDotNet.Serialization.YamlIgnore]
public bool FirstRun { get { return LastVersionSeen == DEFAULT_VERSION; } }
#endregion
#region Private fields
private DateTime _lastUpdateCheck;
private int _updateCheckInterval;
private string _lastVersionSeen;
private Guid _lastSettings;
private const string DEFAULT_VERSION = "0.0.0";
#endregion
#region Overrides
public override string GetSettingsFilePath()
{
return UserSettingsFile;
}
#endregion
#region Constructor
/// <summary>
/// Creates a new instance. This should never be called directly, use
/// the singleton factory instead. The constructor must be public to
/// enable deserialization.
/// </summary>
public UserSettings() { }
#endregion
#region Class logger
private static NLog.Logger Logger { get { return _logger.Value; } }
private static readonly Lazy<NLog.Logger> _logger = new Lazy<NLog.Logger>(() => NLog.LogManager.GetCurrentClassLogger());
#endregion
}
}

View File

@ -1,2 +1,2 @@
2.2.4
2.2.4.0
2.2.5
2.2.5.0

View File

@ -67,7 +67,7 @@ namespace zaaReloaded2.ViewModels
{
get
{
return zaaReloaded2.Updater.Version.CurrentVersion().ToString();
return zaaReloaded2.Updater.Version.Current.ToString();
}
}

View File

@ -40,7 +40,7 @@ namespace zaaReloaded2.ViewModels
public static void InjectIntoIfNeeded<T>()
where T: System.Windows.Window, new()
{
if (!Properties.Settings.Default.FirstRunWizardShown)
if (UserSettings.Default.FirstRun)
{
FirstRunViewModel vm = new FirstRunViewModel();
vm.InjectInto<T>().Show();
@ -93,34 +93,19 @@ namespace zaaReloaded2.ViewModels
void DoSelectDoctorsMode()
{
// Properties will be saved by the DoCloseView override.
Properties.Settings.Default.SuppressItemCommentInteraction = false;
UserSettings.Default.SuppressItemCommentInteraction = false;
CloseViewCommand.Execute(null);
}
void DoSelectTypistsMode()
{
// Properties will be saved by the DoCloseView override.
Properties.Settings.Default.SuppressItemCommentInteraction = true;
UserSettings.Default.SuppressItemCommentInteraction = true;
CloseViewCommand.Execute(null);
}
#endregion
#region Overrides
/// <summary>
/// Sets the FirstRunWizardShown property of the assembly properties
/// to true and calls the base function to close the associated view.
/// </summary>
protected override void DoCloseView()
{
Properties.Settings.Default.FirstRunWizardShown = true;
Properties.Settings.Default.Save();
base.DoCloseView();
}
#endregion
#region Implementation of ViewModelBase
public override object RevealModelObject()

View File

@ -29,25 +29,47 @@ namespace zaaReloaded2.ViewModels
/// </summary>
public class PreferencesViewModel : ViewModelBase
{
#region Singleton
#region Properties
public static PreferencesViewModel Default
public bool SuppressItemCommentInteraction
{
get
{
return _instance;
return _suppressCommentInteraction;
}
set
{
if (value != _suppressCommentInteraction)
{
_suppressCommentInteraction = value;
OnPropertyChanged("SuppressItemCommentInteraction");
}
}
}
static PreferencesViewModel() { }
public bool EnableLogging
{
get
{
return _enableLogging;
}
set
{
if (value != _enableLogging)
{
_enableLogging = value;
OnPropertyChanged("EnableLogging");
}
}
}
static readonly PreferencesViewModel _instance = new PreferencesViewModel();
#endregion
#region Properties
public bool SuppressItemCommentInteraction { get; set; }
public string LogFolder
{
get
{
return LogFile.Default.LogFolder;
}
}
#endregion
@ -67,13 +89,32 @@ namespace zaaReloaded2.ViewModels
}
}
public DelegatingCommand OpenLogFolderCommand
{
get
{
if (_openLogFolderCommand == null)
{
_openLogFolderCommand = new DelegatingCommand(
param => DoOpenLogFolder(),
param => CanOpenLogFolder());
}
return _openLogFolderCommand;
}
}
#endregion
#region Constructor
public PreferencesViewModel()
{
SuppressItemCommentInteraction = Preferences.Default.SuppressItemCommentInteraction;
_suppressCommentInteraction = UserSettings.Default.SuppressItemCommentInteraction;
_enableLogging = UserSettings.Default.EnableLogging;
PropertyChanged += (sender, args) =>
{
_dirty = true;
};
}
#endregion
@ -82,20 +123,45 @@ namespace zaaReloaded2.ViewModels
void DoSave()
{
Preferences.Default.SuppressItemCommentInteraction = SuppressItemCommentInteraction;
if (_dirty)
{
UserSettings.Default.SuppressItemCommentInteraction = SuppressItemCommentInteraction;
UserSettings.Default.EnableLogging = EnableLogging;
}
DoCloseView();
}
bool CanSave()
{
return true;
return _dirty;
}
void DoOpenLogFolder()
{
if (CanOpenLogFolder())
{
System.Diagnostics.Process.Start(LogFolder);
if (!_dirty)
{
CloseViewCommand.Execute(null);
}
}
}
bool CanOpenLogFolder()
{
return !String.IsNullOrEmpty(LogFolder);
}
#endregion
#region Field
#region Fields
DelegatingCommand _saveCommand;
DelegatingCommand _openLogFolderCommand;
bool _dirty;
bool _enableLogging;
bool _suppressCommentInteraction;
#endregion
@ -103,7 +169,7 @@ namespace zaaReloaded2.ViewModels
public override object RevealModelObject()
{
throw new NotImplementedException();
return UserSettings.Default;
}
#endregion

View File

@ -445,8 +445,7 @@ namespace zaaReloaded2.ViewModels
{
if (message.Confirmed)
{
Properties.Settings.Default.ImportExportPath = message.Value;
Properties.Settings.Default.Save();
UserSettings.Default.ImportExportPath = message.Value;
Settings settings = LastSelected.RevealModelObject() as Settings;
try
{
@ -477,8 +476,7 @@ namespace zaaReloaded2.ViewModels
{
if (message.Confirmed)
{
Properties.Settings.Default.ImportExportPath = message.Value;
Properties.Settings.Default.Save();
UserSettings.Default.ImportExportPath = message.Value;
try
{
Settings settings = Settings.LoadFromFile(message.Value);
@ -495,7 +493,7 @@ namespace zaaReloaded2.ViewModels
string SuggestImportExportPath()
{
string path = Properties.Settings.Default.ImportExportPath;
string path = UserSettings.Default.ImportExportPath;
if (String.IsNullOrEmpty(path))
{
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

View File

@ -38,7 +38,7 @@
<TextBlock TextAlignment="Center" Margin="0, 10, 0, 10">
Homepage:
<Hyperlink Command="{Binding GotoHomepageCommand}">
<TextBlock Text="zaa.nephrowiki.de" />
<TextBlock Text="doktorkraus.de/zaareloaded" />
</Hyperlink>
<LineBreak />
Quellcode:

View File

@ -23,22 +23,36 @@
xmlns:b="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:action="clr-namespace:Bovender.Mvvm.Actions;assembly=Bovender"
SizeToContent="WidthAndHeight" ResizeMode="NoResize" ShowInTaskbar="False"
SizeToContent="WidthAndHeight" ResizeMode="NoResize"
ShowInTaskbar="False" Topmost="True"
b:WindowState.CenterScreen="True" b:WindowState.Save="True"
Title="Einstellungen"
>
<Window.Resources>
<ResourceDictionary Source="/Bovender;component/Style.xaml" />
</Window.Resources>
<DockPanel Margin="10">
<DockPanel Margin="20">
<UniformGrid DockPanel.Dock="Bottom" Columns="2" Rows="1"
HorizontalAlignment="Right" Margin="0 10 0 0">
HorizontalAlignment="Right" Margin="0 20 0 0">
<Button Command="{Binding SaveCommand}" Content="OK" IsDefault="True" Margin="0 0 5 0" />
<Button Command="{Binding CloseViewCommand}" Content="Abbrechen" IsCancel="True" Margin="5 0 0 0" />
</UniformGrid>
<GroupBox Header="Sekretariatsmodus" Padding="10">
<CheckBox IsChecked="{Binding SuppressItemCommentInteraction}" Content="Keine Interaktion für _Kommentare">
</CheckBox>
</GroupBox>
<StackPanel>
<GroupBox Header="Sekretariatsmodus" Margin="0 0 0 5" Padding="10">
<StackPanel>
<CheckBox IsChecked="{Binding SuppressItemCommentInteraction}" Content="Keine Interaktion für _Kommentare" />
</StackPanel>
</GroupBox>
<GroupBox Header="Debugging" Margin="0 5 0 0" Padding="10">
<StackPanel>
<CheckBox IsChecked="{Binding EnableLogging}" Content="_Logfile aktivieren" />
<TextBlock Margin="0 10 0 0">
<Hyperlink Command="{Binding OpenLogFolderCommand}">
<TextBlock Text="{Binding LogFolder}" />
</Hyperlink>
</TextBlock>
</StackPanel>
</GroupBox>
</StackPanel>
</DockPanel>
</Window>

View File

@ -38,11 +38,11 @@
<action:ShowViewAction View="zaaReloaded2.Views.SettingsView" Assembly="zaaReloaded2" />
</i:EventTrigger>
<i:EventTrigger SourceObject="{Binding ConfirmDeleteSettingsMessage}" EventName="Sent">
<action:ConfirmationAction Caption="Stil entfernen" OkButtonLabel="Ja" CancelButtonLabel="Nein"
<action:ConfirmationAction Caption="Stil entfernen" OkButtonText="Ja" CancelButtonText="Nein"
Message="Soll dieser Stil wirklich unwiederbringlich entfernt werden?" />
</i:EventTrigger>
<i:EventTrigger SourceObject="{Binding ConfirmResetSettingsMessage}" EventName="Sent">
<action:ConfirmationAction Caption="Stile zurücksetzen" OkButtonLabel="Ja" CancelButtonLabel="Nein"
<action:ConfirmationAction Caption="Stile zurücksetzen" OkButtonText="Ja" CancelButtonText="Nein"
Message="Sollen alle Stile gelöscht und die eingebauten Stile geladen werden?" />
</i:EventTrigger>
<i:EventTrigger SourceObject="{Binding ChooseExportFileNameMessage}" EventName="Sent">

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<!--
app.config
@ -20,12 +20,9 @@
-->
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="zaaReloaded2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="zaaReloaded2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<zaaReloaded2.Properties.Settings>
@ -39,13 +36,13 @@
<value>Daniel Kraus</value>
</setting>
<setting name="Homepage" serializeAs="String">
<value>http://zaa.nephrowiki.de</value>
<value>https://doktorkraus.de/zaareloaded</value>
</setting>
<setting name="VersionInfoFile" serializeAs="String">
<value>http://zaa.nephrowiki.de/versioninfo.txt</value>
<value>https://doktorkraus.de/zaareloaded/versioninfo.txt</value>
</setting>
<setting name="ExceptionPostUrl" serializeAs="String">
<value>http://zaa.nephrowiki.de/postreport.php</value>
<value>https://doktorkraus.de/zaareloaded/postreport.php</value>
</setting>
<setting name="LicenseUrl" serializeAs="String">
<value>http://www.apache.org/licenses/LICENSE-2.0</value>
@ -84,36 +81,28 @@
<value>BITTE_ERGÄNZEN</value>
</setting>
<setting name="Repository" serializeAs="String">
<value>http://git.bovender.de</value>
<value>https://git.bovender.de</value>
</setting>
<setting name="DrugsParagraph" serializeAs="String">
<value>zaaReloaded2-Medikamente</value>
</setting>
<setting name="UserFolder" serializeAs="String">
<value>user</value>
</setting>
<setting name="AppDataFolder" serializeAs="String">
<value>zaaReloaded2</value>
</setting>
<setting name="UserSettingsFile" serializeAs="String">
<value>settings.yml</value>
</setting>
</zaaReloaded2.Properties.Settings>
</applicationSettings>
<userSettings>
<zaaReloaded2.Properties.Settings>
<setting name="SettingsRepository" serializeAs="String">
<value />
</setting>
<setting name="LastUpdateCheck" serializeAs="String">
<value />
</setting>
<setting name="LastSettings" serializeAs="String">
<value>00000000-0000-0000-0000-000000000000</value>
</setting>
<setting name="ImportExportPath" serializeAs="String">
<value />
</setting>
<setting name="SuppressItemCommentInteraction" serializeAs="String">
<value>False</value>
</setting>
<setting name="FirstRunWizardShown" serializeAs="String">
<value>False</value>
</setting>
<setting name="NeedUpgrade" serializeAs="String">
<value>True</value>
</setting>
</zaaReloaded2.Properties.Settings>
</userSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="YamlDotNet" publicKeyToken="ec19458f3c15af5e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.9.0.0" newVersion="3.9.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -19,6 +19,8 @@
limitations under the License.
-->
<packages>
<package id="Bovender" version="0.5.0.0" targetFramework="net40" />
<package id="Bovender" version="0.14.5.0" targetFramework="net40" />
<package id="Expression.Blend.Sdk" version="1.0.2" targetFramework="net40" />
<package id="NLog" version="4.3.7" targetFramework="net40" />
<package id="YamlDotNet.Signed" version="3.9.0" targetFramework="net40" />
</packages>

View File

@ -134,14 +134,19 @@
-->
<ItemGroup>
<Reference Include="Accessibility" />
<Reference Include="Bovender, Version=0.5.0.0, Culture=neutral, PublicKeyToken=df1c15557d8b6df8, processorArchitecture=MSIL">
<HintPath>..\packages\Bovender.0.5.0.0\lib\net40\Bovender.dll</HintPath>
<Reference Include="Bovender, Version=0.14.5.0, Culture=neutral, PublicKeyToken=df1c15557d8b6df8, processorArchitecture=MSIL">
<HintPath>..\packages\Bovender.0.14.5.0\lib\net40\Bovender.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Expression.Interactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.7\lib\net40\NLog.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Runtime.Serialization.Formatters.Soap" />
@ -156,6 +161,10 @@
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="WindowsBase" />
<Reference Include="YamlDotNet, Version=3.9.0.0, Culture=neutral, PublicKeyToken=ec19458f3c15af5e, processorArchitecture=MSIL">
<HintPath>..\packages\YamlDotNet.Signed.3.9.0\lib\net35\YamlDotNet.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.Office.Tools.v4.0.Framework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
@ -222,10 +231,10 @@
<Compile Include="Formatter\DanielsStyle.cs" />
<Compile Include="Formatter\DocumentWriter.cs" />
<Compile Include="Formatter\NoLaboratoryDataException.cs" />
<Compile Include="LogFile.cs" />
<Compile Include="Medication\Formatter.cs" />
<Compile Include="Medication\Importer.cs" />
<Compile Include="Medication\Prescription.cs" />
<Compile Include="Preferences.cs" />
<Compile Include="Ribbon.cs" />
<Compile Include="Thesaurus\ThesaurusBase.cs" />
<Compile Include="Formatter\IItemFormatterDictionary.cs" />
@ -258,6 +267,7 @@
<SubType>Code</SubType>
</Compile>
<Compile Include="Updater\Updater.cs" />
<Compile Include="UserSettings.cs" />
<Compile Include="ViewModels\AboutViewModel.cs" />
<Compile Include="ViewModels\CategoryViewModel.cs" />
<Compile Include="ViewModels\ElementPickerViewModel.cs" />