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.
This commit is contained in:
		@@ -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
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Attempts to automatically detect laboratory data in the Word
 | 
					 | 
				
			||||||
        /// document.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        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.
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										91
									
								
								zaaReloaded2/Importer/ZaaImporter/AutoDetect.cs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										91
									
								
								zaaReloaded2/Importer/ZaaImporter/AutoDetect.cs
									
									
									
									
									
										Executable file
									
								
							@@ -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
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Attempts to automatically detect laboratory data in the Word
 | 
				
			||||||
 | 
					        /// document.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="document">Document which to parse for laboratory
 | 
				
			||||||
 | 
					        /// data.</param>
 | 
				
			||||||
 | 
					        /// <returns>True if laboratory data was detected, false if not.</returns>
 | 
				
			||||||
 | 
					        /// <exception cref="ArgumentNullException">if <paramref name="document"/>
 | 
				
			||||||
 | 
					        /// is null.</exception>
 | 
				
			||||||
 | 
					        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;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Returns true if a paragraph is either a time stamp line
 | 
				
			||||||
 | 
					        /// or a paragraph with laboratory items.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="paragraph"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        private static bool IsLabParagraph(Paragraph paragraph)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            string text = paragraph.Range.Text;
 | 
				
			||||||
 | 
					            return (LaurisParagraph.ResemblesLaurisParagraph(text)
 | 
				
			||||||
 | 
					                || LaurisTimePoint.IsTimeStampLine(text));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -16,12 +16,9 @@
 | 
				
			|||||||
 * limitations under the License.
 | 
					 * limitations under the License.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
using System.IO;
 | 
					using System.IO;
 | 
				
			||||||
using System.Linq;
 | 
					 | 
				
			||||||
using System.Reflection;
 | 
					using System.Reflection;
 | 
				
			||||||
using System.Runtime.InteropServices;
 | 
					using System.Runtime.InteropServices;
 | 
				
			||||||
using System.Text;
 | 
					 | 
				
			||||||
using System.Windows;
 | 
					using System.Windows;
 | 
				
			||||||
using System.Drawing;
 | 
					using System.Drawing;
 | 
				
			||||||
using System.Windows.Resources;
 | 
					using System.Windows.Resources;
 | 
				
			||||||
@@ -33,7 +30,6 @@ using zaaReloaded2.Formatter;
 | 
				
			|||||||
using zaaReloaded2.Controller;
 | 
					using zaaReloaded2.Controller;
 | 
				
			||||||
using Word = Microsoft.Office.Interop.Word;
 | 
					using Word = Microsoft.Office.Interop.Word;
 | 
				
			||||||
using Bovender.Mvvm.Actions;
 | 
					using Bovender.Mvvm.Actions;
 | 
				
			||||||
using Bovender.Mvvm.Messaging;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO:  Follow these steps to enable the Ribbon (XML) item:
 | 
					// TODO:  Follow these steps to enable the Ribbon (XML) item:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -166,9 +162,10 @@ namespace zaaReloaded2
 | 
				
			|||||||
        /// </remarks>
 | 
					        /// </remarks>
 | 
				
			||||||
        public bool CanFormat(Office.IRibbonControl control)
 | 
					        public bool CanFormat(Office.IRibbonControl control)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Word.Selection s = Globals.ThisAddIn.Application.ActiveWindow.Selection;
 | 
					            return Globals.ThisAddIn.Application.ActiveDocument != null;
 | 
				
			||||||
            return s.Paragraphs.Count > 1 || 
 | 
					            //Word.Selection s = Globals.ThisAddIn.Application.ActiveWindow.Selection;
 | 
				
			||||||
                (s.Text.Length > 1 && s.Text.EndsWith("\r"));
 | 
					            //return s.Paragraphs.Count > 1 || 
 | 
				
			||||||
 | 
					            //    (s.Text.Length > 1 && s.Text.EndsWith("\r"));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
@@ -177,6 +174,24 @@ namespace zaaReloaded2
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        void DoFormat()
 | 
					        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))
 | 
					            if (CanFormat(null))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                SettingsRepository repository = SettingsRepository.Load();
 | 
					                SettingsRepository repository = SettingsRepository.Load();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -192,7 +192,7 @@
 | 
				
			|||||||
    can be found.
 | 
					    can be found.
 | 
				
			||||||
  -->
 | 
					  -->
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <Compile Include="AutoDetect.cs" />
 | 
					    <Compile Include="Importer\ZaaImporter\AutoDetect.cs" />
 | 
				
			||||||
    <Compile Include="Controller\Elements\ControlElementBase.cs" />
 | 
					    <Compile Include="Controller\Elements\ControlElementBase.cs" />
 | 
				
			||||||
    <Compile Include="Controller\Elements\FormatElementBase.cs" />
 | 
					    <Compile Include="Controller\Elements\FormatElementBase.cs" />
 | 
				
			||||||
    <Compile Include="Controller\Elements\NextColumn.cs" />
 | 
					    <Compile Include="Controller\Elements\NextColumn.cs" />
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user