|
@@ -0,0 +1,228 @@
|
|
|
+using ComPDFKit.PDFDocument;
|
|
|
+using PDF_Office.Model.BOTA;
|
|
|
+using PDF_Office.Views.BOTA;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Diagnostics;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Text.RegularExpressions;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Windows;
|
|
|
+using System.Windows.Controls;
|
|
|
+using System.Windows.Documents;
|
|
|
+using System.Windows.Media;
|
|
|
+using System.Windows.Media.TextFormatting;
|
|
|
+
|
|
|
+namespace PDF_Office.Helper
|
|
|
+{
|
|
|
+ public class OutlineSerach {
|
|
|
+ public string Title { get; set; }
|
|
|
+ }
|
|
|
+ public class RichTextBoxHelper : DependencyObject
|
|
|
+ {
|
|
|
+ public static FlowDocument GetDocumentBind(DependencyObject obj)
|
|
|
+ {
|
|
|
+ return (FlowDocument)obj.GetValue(DocumentBindProperty);
|
|
|
+ }
|
|
|
+ public static void SetDocumentBind(DependencyObject obj, FlowDocument value)
|
|
|
+ {
|
|
|
+ obj.SetValue(DocumentBindProperty, value);
|
|
|
+ }
|
|
|
+ public static FlowDocument GetOutlineSearchDocumentBind(DependencyObject obj)
|
|
|
+ {
|
|
|
+ return (FlowDocument)obj.GetValue(OutlineSearchDocumentBindProperty);
|
|
|
+ }
|
|
|
+ public static string searchWord = "";
|
|
|
+ public static void SetOutlineSearchDocumentBind(DependencyObject obj, FlowDocument value)
|
|
|
+ {
|
|
|
+ obj.SetValue(OutlineSearchDocumentBindProperty, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static readonly DependencyProperty DocumentBindProperty =
|
|
|
+ DependencyProperty.RegisterAttached("DocumentBind",
|
|
|
+ typeof(TextBindProperty),
|
|
|
+ typeof(RichTextBoxHelper),
|
|
|
+ new FrameworkPropertyMetadata
|
|
|
+ {
|
|
|
+ BindsTwoWayByDefault = true,
|
|
|
+ PropertyChangedCallback = (obj, e) =>
|
|
|
+ {
|
|
|
+ RichTextBox richTextBox = obj as RichTextBox;
|
|
|
+ TextBindProperty bindItem = e.NewValue as TextBindProperty;
|
|
|
+ if (richTextBox != null && bindItem != null)
|
|
|
+ {
|
|
|
+ richTextBox.Document = GetFlowDocument(bindItem.TextContent.Trim(), bindItem.SearchWord, bindItem.HighLightColor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ public static readonly DependencyProperty OutlineSearchDocumentBindProperty =
|
|
|
+ DependencyProperty.RegisterAttached("OutlineSearchDocumentBind",
|
|
|
+ typeof(OutlineNode),
|
|
|
+ typeof(RichTextBoxHelper),
|
|
|
+ new FrameworkPropertyMetadata
|
|
|
+ {
|
|
|
+ BindsTwoWayByDefault = false,
|
|
|
+ PropertyChangedCallback = (obj, e) =>
|
|
|
+ {
|
|
|
+ RichTextBox richTextBox = obj as RichTextBox;
|
|
|
+ OutlineNode bindItem = e.NewValue as OutlineNode;
|
|
|
+
|
|
|
+ if (richTextBox != null )
|
|
|
+ {
|
|
|
+ // richTextBox.Document = GetOutlineFlowDocument(bindItem.outline.Title, searchWord, Color.FromArgb(0x99, 0xFF, 0xF7, 0x00));
|
|
|
+ /* if (richTextBox.Document.Name!="nodata") {
|
|
|
+ richTextBox.Visibility = Visibility.Collapsed;
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ public static FlowDocument GetOutlineFlowDocument(string content, string keyword, Color textColor)
|
|
|
+ {
|
|
|
+ FlowDocument Document = new FlowDocument();
|
|
|
+ Paragraph textPara = new Paragraph();
|
|
|
+ Document.Blocks.Add(textPara);
|
|
|
+ List<int> indexList = new List<int>();
|
|
|
+ content = Regex.Replace(content, "[\r\n]", " ");
|
|
|
+ if (keyword.Length > 0)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < content.Length && i >= 0;)
|
|
|
+ {
|
|
|
+ i = content.IndexOf(keyword, i, StringComparison.OrdinalIgnoreCase);
|
|
|
+ if (i == -1)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (indexList.Contains(i) == false)
|
|
|
+ {
|
|
|
+ indexList.Add(i);
|
|
|
+ }
|
|
|
+ i += keyword.Length;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<string> splitList = new List<string>();
|
|
|
+ int lastIndex = -1;
|
|
|
+ foreach (int index in indexList)
|
|
|
+ {
|
|
|
+ string prevStr = string.Empty;
|
|
|
+ if (lastIndex == -1)
|
|
|
+ {
|
|
|
+ prevStr = content.Substring(0, index);
|
|
|
+ //Document.Name = "nodata";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ prevStr = content.Substring(lastIndex + keyword.Length, index - lastIndex - 1);
|
|
|
+ }
|
|
|
+ if (prevStr != string.Empty)
|
|
|
+ {
|
|
|
+ splitList.Add(prevStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ splitList.Add(content.Substring(index, keyword.Length));
|
|
|
+ lastIndex = index;
|
|
|
+ }
|
|
|
+ if (indexList.Count > 0)
|
|
|
+ {
|
|
|
+ lastIndex = indexList[indexList.Count - 1];
|
|
|
+ if (content.Length > lastIndex + keyword.Length)
|
|
|
+ {
|
|
|
+ splitList.Add(content.Substring(lastIndex + keyword.Length));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ TextBlock addBlock = new TextBlock();
|
|
|
+ if (splitList.Count == 0)
|
|
|
+ {
|
|
|
+ Run textRun = new Run(content);
|
|
|
+ addBlock.Inlines.Add(textRun);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ foreach (string textappend in splitList)
|
|
|
+ {
|
|
|
+ Run textRun = new Run(textappend);
|
|
|
+ if (textappend.Equals(keyword, StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ textRun.Background = new SolidColorBrush(textColor);
|
|
|
+ }
|
|
|
+ addBlock.Inlines.Add(textRun);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ addBlock.TextTrimming = TextTrimming.CharacterEllipsis;
|
|
|
+ textPara.Inlines.Add(addBlock);
|
|
|
+
|
|
|
+ return Document;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static FlowDocument GetFlowDocument(string content, string keyword, Color textColor)
|
|
|
+ {
|
|
|
+ FlowDocument Document = new FlowDocument();
|
|
|
+ Paragraph textPara = new Paragraph();
|
|
|
+ Document.Blocks.Add(textPara);
|
|
|
+ List<int> indexList = new List<int>();
|
|
|
+ content = Regex.Replace(content, "[\r\n]", " ");
|
|
|
+ if (keyword.Length > 0)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < content.Length && i >= 0;)
|
|
|
+ {
|
|
|
+ i = content.IndexOf(keyword, i, StringComparison.OrdinalIgnoreCase);
|
|
|
+ if (i == -1)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (indexList.Contains(i) == false)
|
|
|
+ {
|
|
|
+ indexList.Add(i);
|
|
|
+ }
|
|
|
+ i += keyword.Length;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<string> splitList = new List<string>();
|
|
|
+ int lastIndex = -1;
|
|
|
+ foreach (int index in indexList)
|
|
|
+ {
|
|
|
+ string prevStr = string.Empty;
|
|
|
+ if (lastIndex == -1)
|
|
|
+ {
|
|
|
+ prevStr = content.Substring(0, index);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ prevStr = content.Substring(lastIndex + keyword.Length, index - lastIndex - 1);
|
|
|
+ }
|
|
|
+ if (prevStr != string.Empty)
|
|
|
+ {
|
|
|
+ splitList.Add(prevStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ splitList.Add(content.Substring(index, keyword.Length));
|
|
|
+ lastIndex = index;
|
|
|
+ }
|
|
|
+ if (indexList.Count > 0)
|
|
|
+ {
|
|
|
+ lastIndex = indexList[indexList.Count - 1];
|
|
|
+ if (content.Length > lastIndex + keyword.Length)
|
|
|
+ {
|
|
|
+ splitList.Add(content.Substring(lastIndex + keyword.Length));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ TextBlock addBlock = new TextBlock();
|
|
|
+ foreach (string textappend in splitList)
|
|
|
+ {
|
|
|
+ Run textRun = new Run(textappend);
|
|
|
+ if (textappend.Equals(keyword, StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ textRun.Background = new SolidColorBrush(textColor);
|
|
|
+ }
|
|
|
+ addBlock.Inlines.Add(textRun);
|
|
|
+ }
|
|
|
+ addBlock.TextTrimming = TextTrimming.CharacterEllipsis;
|
|
|
+ textPara.Inlines.Add(addBlock);
|
|
|
+
|
|
|
+ return Document;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|