From e366226a6455141037f5cfc3389d30790a3723dd Mon Sep 17 00:00:00 2001 From: Daniel Kraus Date: Wed, 2 Sep 2015 05:51:50 +0200 Subject: [PATCH 1/2] Draft concept. --- zaaReloaded2/AutoDetect.cs | 65 ++++++++++++++++++++++++++++++++ zaaReloaded2/zaaReloaded2.csproj | 1 + 2 files changed, 66 insertions(+) create mode 100755 zaaReloaded2/AutoDetect.cs diff --git a/zaaReloaded2/AutoDetect.cs b/zaaReloaded2/AutoDetect.cs new file mode 100755 index 0000000..d7a1b53 --- /dev/null +++ b/zaaReloaded2/AutoDetect.cs @@ -0,0 +1,65 @@ +/* AutoDetect.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 +{ + class AutoDetect + { + + /// + /// Attempts to automatically detect laboratory data in the Word + /// document. + /// + public void AutoDetect() + { + if (Document == null) + { + throw new InvalidOperationException( + "Automatic laboratory detection requires a document."); + } + + // If the 'Labor' bookmark exists, go to it. + if (Document.Bookmarks.Exists("Labor")) + { + Document.Bookmarks["Labor"].Range.Collapse(WdCollapseDirection.wdCollapseStart); + } + + // If the current paragraph looks like a Lauris paragraph, fine. + // If it does not look like a Lauris paragraph, move the cursor + // up until we find one. + string s = Document.ActiveWindow.Selection.Paragraphs[1].Range.Text; + + // If we found a Lauris paragraph by moving up, start extending the + // selection upwards until we encounter a paragraph that is not a + // Lauris paragraph. + + // If we have previously reached the start of the document without finding + // a Lauris paragraph, go back to where we started and move the + // cursor down paragraph by paragraph until we find a Lauris + // paragraph. + + // If we found a Lauris paragraph by moving down, start extending the + // selection downwards until we encounter a paragraph that is not a + // Lauris paragraph. + } + } +} diff --git a/zaaReloaded2/zaaReloaded2.csproj b/zaaReloaded2/zaaReloaded2.csproj index 6d33e56..bfdc26d 100755 --- a/zaaReloaded2/zaaReloaded2.csproj +++ b/zaaReloaded2/zaaReloaded2.csproj @@ -192,6 +192,7 @@ can be found. --> + From 2ca7f4211d0fb928d7ff9178ba55620fa3d838fb Mon Sep 17 00:00:00 2001 From: Daniel Kraus Date: Thu, 3 Sep 2015 21:47:21 +0200 Subject: [PATCH 2/2] Implement lab data autodetection. - NEU: Wenn kein Text markiert ist, wird ein Versuch unternommen, die Labordaten im Arztbrief automatisch zu erkennen; dabei wird der erste erkannte Lauris-Laborblock formatiert. --- zaaReloaded2/AutoDetect.cs | 65 ------------- .../Importer/ZaaImporter/AutoDetect.cs | 91 +++++++++++++++++++ zaaReloaded2/Ribbon.cs | 29 ++++-- zaaReloaded2/zaaReloaded2.csproj | 2 +- 4 files changed, 114 insertions(+), 73 deletions(-) delete mode 100755 zaaReloaded2/AutoDetect.cs create mode 100755 zaaReloaded2/Importer/ZaaImporter/AutoDetect.cs diff --git a/zaaReloaded2/AutoDetect.cs b/zaaReloaded2/AutoDetect.cs deleted file mode 100755 index d7a1b53..0000000 --- a/zaaReloaded2/AutoDetect.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* AutoDetect.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 -{ - class AutoDetect - { - - /// - /// Attempts to automatically detect laboratory data in the Word - /// document. - /// - public void AutoDetect() - { - if (Document == null) - { - throw new InvalidOperationException( - "Automatic laboratory detection requires a document."); - } - - // If the 'Labor' bookmark exists, go to it. - if (Document.Bookmarks.Exists("Labor")) - { - Document.Bookmarks["Labor"].Range.Collapse(WdCollapseDirection.wdCollapseStart); - } - - // If the current paragraph looks like a Lauris paragraph, fine. - // If it does not look like a Lauris paragraph, move the cursor - // up until we find one. - string s = Document.ActiveWindow.Selection.Paragraphs[1].Range.Text; - - // If we found a Lauris paragraph by moving up, start extending the - // selection upwards until we encounter a paragraph that is not a - // Lauris paragraph. - - // If we have previously reached the start of the document without finding - // a Lauris paragraph, go back to where we started and move the - // cursor down paragraph by paragraph until we find a Lauris - // paragraph. - - // If we found a Lauris paragraph by moving down, start extending the - // selection downwards until we encounter a paragraph that is not a - // Lauris paragraph. - } - } -} diff --git a/zaaReloaded2/Importer/ZaaImporter/AutoDetect.cs b/zaaReloaded2/Importer/ZaaImporter/AutoDetect.cs new file mode 100755 index 0000000..ac9a129 --- /dev/null +++ b/zaaReloaded2/Importer/ZaaImporter/AutoDetect.cs @@ -0,0 +1,91 @@ +using Microsoft.Office.Interop.Word; +/* AutoDetect.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.Importer.ZaaImporter +{ + static class AutoDetect + { + /// + /// Attempts to automatically detect laboratory data in the Word + /// document. + /// + /// Document which to parse for laboratory + /// data. + /// True if laboratory data was detected, false if not. + /// if + /// is null. + public static bool Detect(Document document) + { + if (document == null) + { + throw new ArgumentNullException( + "Automatic laboratory detection requires a document."); + } + + // TODO: Try to make this algorithm more elegant. + Paragraph start = null; + Paragraph end = null; + int i = 1; + while (i <= document.Paragraphs.Count) + { + if (IsLabParagraph(document.Paragraphs[i])) + { + start = document.Paragraphs[i]; + break; + } + i++; + } + + if (start != null) + { + end = start; + while (i <= document.Paragraphs.Count - 1) + { + if (!IsLabParagraph(document.Paragraphs[i+1])) + { + end = document.Paragraphs[i]; + break; + } + i++; + } + + document.Range(start.Range.Start, end.Range.End).Select(); + return true; + } + return false; + } + + /// + /// Returns true if a paragraph is either a time stamp line + /// or a paragraph with laboratory items. + /// + /// + /// + private static bool IsLabParagraph(Paragraph paragraph) + { + string text = paragraph.Range.Text; + return (LaurisParagraph.ResemblesLaurisParagraph(text) + || LaurisTimePoint.IsTimeStampLine(text)); + } + } +} diff --git a/zaaReloaded2/Ribbon.cs b/zaaReloaded2/Ribbon.cs index a556054..7408777 100755 --- a/zaaReloaded2/Ribbon.cs +++ b/zaaReloaded2/Ribbon.cs @@ -16,12 +16,9 @@ * limitations under the License. */ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Reflection; using System.Runtime.InteropServices; -using System.Text; using System.Windows; using System.Drawing; using System.Windows.Resources; @@ -33,7 +30,6 @@ using zaaReloaded2.Formatter; using zaaReloaded2.Controller; using Word = Microsoft.Office.Interop.Word; using Bovender.Mvvm.Actions; -using Bovender.Mvvm.Messaging; // TODO: Follow these steps to enable the Ribbon (XML) item: @@ -166,9 +162,10 @@ namespace zaaReloaded2 /// public bool CanFormat(Office.IRibbonControl control) { - Word.Selection s = Globals.ThisAddIn.Application.ActiveWindow.Selection; - return s.Paragraphs.Count > 1 || - (s.Text.Length > 1 && s.Text.EndsWith("\r")); + return Globals.ThisAddIn.Application.ActiveDocument != null; + //Word.Selection s = Globals.ThisAddIn.Application.ActiveWindow.Selection; + //return s.Paragraphs.Count > 1 || + // (s.Text.Length > 1 && s.Text.EndsWith("\r")); } #endregion @@ -177,6 +174,24 @@ namespace zaaReloaded2 void DoFormat() { + // 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")))) + { + if (!AutoDetect.Detect(activeWindow.Document)) + { + 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.Invoke(); + return; + } + } + if (CanFormat(null)) { SettingsRepository repository = SettingsRepository.Load(); diff --git a/zaaReloaded2/zaaReloaded2.csproj b/zaaReloaded2/zaaReloaded2.csproj index bfdc26d..66f0c5c 100755 --- a/zaaReloaded2/zaaReloaded2.csproj +++ b/zaaReloaded2/zaaReloaded2.csproj @@ -192,7 +192,7 @@ can be found. --> - +