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 fb27e25..58bed47 100755 --- a/zaaReloaded2/Ribbon.cs +++ b/zaaReloaded2/Ribbon.cs @@ -162,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 @@ -173,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 6d33e56..66f0c5c 100755 --- a/zaaReloaded2/zaaReloaded2.csproj +++ b/zaaReloaded2/zaaReloaded2.csproj @@ -192,6 +192,7 @@ can be found. --> +