CPDFSearchControl.xaml.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using ComPDFKit.PDFPage;
  2. using ComPDFKit.Tool;
  3. using Compdfkit_Tools.PDFControlUI;
  4. using ComPDFKitViewer;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Windows;
  8. using System.Windows.Controls;
  9. using System.Windows.Media;
  10. namespace Compdfkit_Tools.PDFControl
  11. {
  12. public partial class CPDFSearchControl : UserControl
  13. {
  14. /// <summary>
  15. /// PDFViewer
  16. /// </summary>
  17. private CPDFViewer pdfView;
  18. private int currentHighLightIndex { get; set; } = -1;
  19. private PDFTextSearch textSearch;
  20. private string keyWord;
  21. private SolidColorBrush highLightBrush = new SolidColorBrush(Color.FromArgb(0x99, 0xFF, 0xF7, 0x00));
  22. private int ResultCount = 0;
  23. private PDFViewControl ViewControl;
  24. public CPDFSearchControl()
  25. {
  26. InitializeComponent();
  27. Loaded += PDFSearch_Loaded;
  28. }
  29. public void InitWithPDFViewer(PDFViewControl newViewControl)
  30. {
  31. ViewControl = newViewControl;
  32. if (ViewControl != null)
  33. {
  34. CPDFViewerTool viewTool = ViewControl.PDFViewTool;
  35. if (viewTool != null)
  36. {
  37. CPDFViewer newPDFView = viewTool.GetCPDFViewer();
  38. if (pdfView != newPDFView)
  39. {
  40. ClearSearchResult();
  41. pdfView = newPDFView;
  42. }
  43. }
  44. }
  45. else
  46. {
  47. ClearSearchResult();
  48. }
  49. }
  50. private void PDFSearch_Loaded(object sender, RoutedEventArgs e)
  51. {
  52. textSearch = new PDFTextSearch();
  53. SearchInput.SearchEvent -= SearchInput_SearchEvent;
  54. SearchInput.ClearEvent -= SearchInput_ClearEvent;
  55. textSearch.SearchCompletedHandler -= TextSearch_SearchCompletedHandler;
  56. SearchResult.SelectionChanged -= SearchResult_SelectionChanged;
  57. SearchInput.SearchEvent += SearchInput_SearchEvent;
  58. SearchInput.ClearEvent += SearchInput_ClearEvent;
  59. textSearch.SearchCompletedHandler += TextSearch_SearchCompletedHandler;
  60. SearchResult.SelectionChanged += SearchResult_SelectionChanged;
  61. }
  62. private void SearchInput_ClearEvent(object sender, EventArgs e)
  63. {
  64. ClearSearchResult();
  65. }
  66. private void SearchInput_FindPreviousEvent(object sender, EventArgs e)
  67. {
  68. if (currentHighLightIndex > 0)
  69. {
  70. currentHighLightIndex--;
  71. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  72. HighLightSelectResult(result);
  73. }
  74. }
  75. private void SearchInput_FindNextEvent(object sender, EventArgs e)
  76. {
  77. currentHighLightIndex++;
  78. if (currentHighLightIndex >= 0)
  79. {
  80. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  81. HighLightSelectResult(result);
  82. }
  83. }
  84. private void SearchResult_SelectionChanged(object sender, int e)
  85. {
  86. currentHighLightIndex = e;
  87. BindSearchResult result = SearchResult.GetSelectItem();
  88. HighLightSelectResult(result);
  89. ResultText.Text = string.Format("Results:{0}/{1}", e+1,ResultCount);
  90. }
  91. private void TextSearch_SearchCompletedHandler(object sender, TextSearchResult e)
  92. {
  93. Dispatcher.Invoke(() =>
  94. {
  95. List<BindSearchResult> resultList = new List<BindSearchResult>();
  96. List<TextSearchItem> totalItems = new List<TextSearchItem>();
  97. foreach (int pageIndex in e.Items.Keys)
  98. {
  99. List<TextSearchItem> textSearchItems = e.Items[pageIndex];
  100. foreach (TextSearchItem item in textSearchItems)
  101. {
  102. resultList.Add(new BindSearchResult()
  103. {
  104. PageIndex = item.PageIndex,
  105. TextContent = item.TextContent,
  106. TextRect = item.TextRect,
  107. SearchWord = keyWord,
  108. HighLightColor = Color.FromArgb(0x99, 0xFF, 0xF7, 0x00),
  109. PageRotate = item.PageRotate,
  110. RefData=item
  111. });
  112. totalItems.Add(item);
  113. }
  114. }
  115. SearchResult.SetSearchResult(resultList);
  116. ResultCount=resultList.Count;
  117. ViewControl.PDFViewTool?.SetPageSelectText(totalItems);
  118. if (resultList==null || resultList.Count==0)
  119. {
  120. ResultText.Text= string.Empty;
  121. }
  122. else
  123. {
  124. ResultText.Text = string.Format("{0} results found", ResultCount);
  125. }
  126. });
  127. }
  128. private void SearchInput_SearchEvent(object sender, string e)
  129. {
  130. if (string.IsNullOrEmpty(e))
  131. {
  132. return;
  133. }
  134. if (pdfView == null || pdfView.GetDocument() == null)
  135. {
  136. return;
  137. }
  138. if (textSearch != null && textSearch.CanDoSearch)
  139. {
  140. keyWord = e;
  141. textSearch.TextSearchDocument = pdfView.GetDocument();
  142. textSearch.SearchText(e, C_Search_Options.Search_Case_Insensitive);
  143. }
  144. }
  145. private void HighLightSelectResult(BindSearchResult result)
  146. {
  147. if (result == null || result.RefData==null)
  148. {
  149. return;
  150. }
  151. List<TextSearchItem> selectList = new List<TextSearchItem>();
  152. TextSearchItem highlightItem=result.RefData as TextSearchItem;
  153. if(highlightItem != null)
  154. {
  155. highlightItem.CreatePaintBrush(highLightBrush.Color);
  156. selectList.Add(highlightItem);
  157. ViewControl.PDFToolManager?.HighLightSearchText(selectList);
  158. }
  159. }
  160. private void ClearSearchResult()
  161. {
  162. SearchResult?.SetSearchResult(null);
  163. ResultText.Text = string.Empty;
  164. SearchInput.SearchKeyWord=string.Empty;
  165. }
  166. }
  167. }