CPDFViewerTool.MultiSelectedRect.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. using ComPDFKit.Tool.DrawTool;
  2. using ComPDFKit.Tool.Help;
  3. using ComPDFKit.Viewer.Layer;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Windows;
  7. using System.Windows.Input;
  8. namespace ComPDFKit.Tool
  9. {
  10. public class MultiSelectedData
  11. {
  12. public int PageIndex { get; set; }
  13. public List<int> MultiObjectIndex { get; set; }
  14. /// <summary>
  15. /// Current multi-select type
  16. /// </summary>
  17. public SelectedType ObjectType { get; set; }
  18. /// <summary>
  19. /// Move offset value of the whole
  20. /// </summary>
  21. public Point MoveOffset { get; set; }
  22. public float ZoomX { get; set; }
  23. public float ZoomY { get; set; }
  24. }
  25. public partial class CPDFViewerTool
  26. {
  27. public event EventHandler<MultiSelectedData> MultiDataChanging;
  28. public event EventHandler<MultiSelectedData> MultiDataChanged;
  29. public int MultiSelectedRectViewTag { get; set; } = -1;
  30. private List<int> editAreaMultiIndex = new List<int>();
  31. private int multiPage = -1;
  32. private bool isOpen = false;
  33. private Key multiKey = Key.LeftCtrl;
  34. private void InsertMultiSelectedRectView()
  35. {
  36. int selectedRectViewIndex = PDFViewer.GetMaxViewIndex();
  37. CustomizeLayer customizeLayer = new CustomizeLayer();
  38. MultiSelectedRect multiSelectedRect = new MultiSelectedRect(GetDefaultDrawParam(), SelectedType.None);
  39. multiSelectedRect.SetDrawMoveType(DrawMoveType.kReferenceLine);
  40. customizeLayer.Children.Add(multiSelectedRect);
  41. multiSelectedRect.DataChanged += MultiSelectedRect_DataChanged;
  42. multiSelectedRect.DataChanging += MultiSelectedRect_DataChanging;
  43. PDFViewer.InsertView(selectedRectViewIndex, customizeLayer);
  44. MultiSelectedRectViewTag = customizeLayer.GetResTag();
  45. //multiSelectedRect.Children.Add(multiSelectedRect);
  46. }
  47. private void MultiSelectedRect_DataChanging(object sender, Point e)
  48. {
  49. MultiSelectedData multiSelectedAnnotData = new MultiSelectedData();
  50. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  51. if (isOpen && multiSelectedRect != null)
  52. {
  53. multiSelectedAnnotData.ZoomX = multiSelectedRect.GetZoomX();
  54. multiSelectedAnnotData.ZoomY = multiSelectedRect.GetZoomY();
  55. multiSelectedAnnotData.MoveOffset = e;
  56. multiSelectedAnnotData.ObjectType = multiSelectedRect.GetSelectedType();
  57. multiSelectedAnnotData.MultiObjectIndex = new List<int>();
  58. multiSelectedAnnotData.MultiObjectIndex.AddRange(editAreaMultiIndex);
  59. multiSelectedAnnotData.PageIndex = multiPage;
  60. MultiDataChanging?.Invoke(this, multiSelectedAnnotData);
  61. }
  62. }
  63. private void MultiSelectedRect_DataChanged(object sender, Point e)
  64. {
  65. MultiSelectedData multiSelectedAnnotData = new MultiSelectedData();
  66. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  67. if (isOpen && multiSelectedRect != null)
  68. {
  69. multiSelectedAnnotData.ZoomX = multiSelectedRect.GetZoomX();
  70. multiSelectedAnnotData.ZoomY = multiSelectedRect.GetZoomY();
  71. multiSelectedAnnotData.MoveOffset = e;
  72. multiSelectedAnnotData.ObjectType = multiSelectedRect.GetSelectedType();
  73. multiSelectedAnnotData.MultiObjectIndex = new List<int>();
  74. multiSelectedAnnotData.MultiObjectIndex.AddRange(editAreaMultiIndex);
  75. multiSelectedAnnotData.PageIndex = multiPage;
  76. MultiDataChanged?.Invoke(this, multiSelectedAnnotData);
  77. }
  78. }
  79. /// <summary>
  80. /// Set multiple selection shortcut keys
  81. /// </summary>
  82. /// <param name="multikey"></param>
  83. public void SetMultiSelectKey(Key multikey)
  84. {
  85. multiKey = multikey;
  86. }
  87. private void OpenSelectedMulti(bool open)
  88. {
  89. isOpen = open;
  90. }
  91. public bool HitTestMultiSelectedRect()
  92. {
  93. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  94. if (isOpen && multiSelectedRect != null)
  95. {
  96. if (multiSelectedRect.GetHitControlIndex(Mouse.GetPosition(this)) != PointControlType.None)
  97. {
  98. return true;
  99. }
  100. }
  101. return false;
  102. }
  103. public void SelectedMultiRect(Rect selectedRects, Rect MaxRect, SelectedType type)
  104. {
  105. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  106. bool open = isOpen;
  107. if (!Keyboard.IsKeyDown(multiKey))
  108. {
  109. open = false;
  110. }
  111. if (open && multiSelectedRect != null)
  112. {
  113. lastSelectedRect.ClearDraw();
  114. lastSelectedRect.HideDraw();
  115. GetSelectedEditAreaForIndex(out int pageIndex, out int editAreaIndex);
  116. if (multiPage != pageIndex && editAreaMultiIndex.Count > 0)
  117. {
  118. foreach (int item in editAreaMultiIndex)
  119. {
  120. SelectedRect OldRect = GetEditAreaForIndex(multiPage, item);
  121. if (OldRect != null)
  122. {
  123. OldRect.Draw();
  124. }
  125. }
  126. editAreaMultiIndex.Clear();
  127. multiSelectedRect.ClearDraw();
  128. multiSelectedRect.CleanMulitSelectedRect();
  129. multiPage = pageIndex;
  130. }
  131. multiPage = pageIndex;
  132. if (startSelectedRect != null && startSelectedPageIndex == multiPage && !editAreaMultiIndex.Contains(startSelectedIndex))
  133. {
  134. //Add the first selected object
  135. editAreaMultiIndex.Add(startSelectedIndex);
  136. SelectedRect startselectedrect = new SelectedRect(GetDefaultDrawParam(), type);
  137. startselectedrect.SetEditPen(editPen, editHoverPen);
  138. startselectedrect.SetDrawMoveType(DrawMoveType.kReferenceLine);
  139. startselectedrect.SetRect(startSelectedRect.GetRect(), currentZoom);
  140. startselectedrect.SetMaxRect(MaxRect);
  141. editAreaList.Add(startselectedrect, startSelectedEditAreaObject);
  142. multiSelectedRect.Children.Add(startselectedrect);
  143. multiSelectedRect.SetMulitSelectedRect(startselectedrect, startSelectedEditAreaObject.PageIndex, startSelectedEditAreaObject.EditAreaIndex);
  144. multiSelectedRect.SetRect(startselectedrect.GetRect());
  145. multiSelectedRect.SetMaxRect(startselectedrect.GetMaxRect());
  146. multiSelectedRect.Draw();
  147. }
  148. startSelectedRect = null;
  149. startSelectedIndex = -1;
  150. startSelectedPageIndex = -1;
  151. startSelectedEditAreaObject = null;
  152. editAreaMultiIndex.Add(editAreaIndex);
  153. multiSelectedRect.SetSelectedType(type);
  154. SelectedRect selectedRect = new SelectedRect(GetDefaultDrawParam(), type);
  155. selectedRect.SetEditPen(editPen, editHoverPen);
  156. selectedRect.SetDrawMoveType(DrawMoveType.kReferenceLine);
  157. selectedRect.SetRect(selectedRects, currentZoom);
  158. selectedRect.SetMaxRect(MaxRect);
  159. EditAreaObject editAreaObject = GetEditAreaObjectForRect(lastSelectedRect);
  160. editAreaList.Add(selectedRect, editAreaObject);
  161. multiSelectedRect.Children.Add(selectedRect);
  162. multiSelectedRect.SetMulitSelectedRect(selectedRect, editAreaObject.PageIndex, editAreaObject.EditAreaIndex);
  163. multiSelectedRect.SetRect(selectedRects);
  164. multiSelectedRect.SetMaxRect(MaxRect);
  165. multiSelectedRect.Draw();
  166. }
  167. else
  168. {
  169. //Remember the first selected object
  170. isOpen = false;
  171. GetSelectedEditAreaForIndex(out int pageIndex, out int editAreaIndex);
  172. SelectedRect selectedRect = new SelectedRect(GetDefaultDrawParam(), type);
  173. selectedRect.SetEditPen(editPen, editHoverPen);
  174. selectedRect.SetDrawMoveType(DrawMoveType.kReferenceLine);
  175. selectedRect.SetRect(selectedRects, currentZoom);
  176. selectedRect.SetMaxRect(MaxRect);
  177. EditAreaObject editAreaObject = GetEditAreaObjectForRect(lastSelectedRect);
  178. if (startSelectedIndex != editAreaIndex || startSelectedPageIndex != pageIndex)
  179. {
  180. startSelectedIndex = editAreaIndex;
  181. startSelectedPageIndex = pageIndex;
  182. startSelectedEditAreaObject = editAreaObject;
  183. startSelectedRect = selectedRect;
  184. editAreaList.Add(startSelectedRect, editAreaObject);
  185. }
  186. }
  187. }
  188. public void HideDrawSelectedMultiRect()
  189. {
  190. foreach (int item in editAreaMultiIndex)
  191. {
  192. SelectedRect OldRect = GetEditAreaForIndex(multiPage, item);
  193. if (OldRect != null)
  194. {
  195. OldRect.HideDraw();
  196. }
  197. }
  198. }
  199. public void CleanSelectedMultiRect()
  200. {
  201. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  202. if (multiSelectedRect != null)
  203. {
  204. multiSelectedRect.Children.Clear();
  205. multiSelectedRect.CleanMulitSelectedRect();
  206. editAreaMultiIndex.Clear();
  207. //Delete Multiple Selection Record List
  208. editAreaList.Clear();
  209. }
  210. }
  211. public void DrawStartSelectedMultiRect()
  212. {
  213. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  214. if (multiSelectedRect != null)
  215. {
  216. Point point = Mouse.GetPosition(this);
  217. multiSelectedRect.Draw();
  218. multiSelectedRect.OnMouseLeftButtonDown(point);
  219. }
  220. }
  221. public void DrawMoveSelectedMultiRect()
  222. {
  223. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  224. if (multiSelectedRect != null&& multiSelectedRect.Children.Count>0)
  225. {
  226. Point point = Mouse.GetPosition(this);
  227. multiSelectedRect.OnMouseMove(point, out bool Tag, PDFViewer.ActualWidth, PDFViewer.ActualHeight);
  228. }
  229. }
  230. public void DrawEndSelectedMultiRect()
  231. {
  232. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  233. if (multiSelectedRect != null)
  234. {
  235. Point point = Mouse.GetPosition(this);
  236. multiSelectedRect.OnMouseLeftButtonUp(point);
  237. }
  238. }
  239. public void ReDrawSelectedMultiRect()
  240. {
  241. MultiSelectedRect multiSelectedRect = CommonHelper.FindVisualChild<MultiSelectedRect>(PDFViewer.GetViewForTag(MultiSelectedRectViewTag));
  242. if (multiSelectedRect != null)
  243. {
  244. multiSelectedRect.ClearDraw();
  245. multiSelectedRect.CleanMulitSelectedRect();
  246. Point point = Mouse.GetPosition(this);
  247. switch (multiSelectedRect.GetSelectedType())
  248. {
  249. case SelectedType.Annot:
  250. SelectAnnot();
  251. break;
  252. case SelectedType.PDFEdit:
  253. SelectPDFEdit(multiSelectedRect);
  254. break;
  255. default:
  256. break;
  257. }
  258. multiSelectedRect.Draw();
  259. }
  260. }
  261. private void SelectAnnot()
  262. {
  263. CleanSelectedRect();
  264. }
  265. private void SelectPDFEdit(MultiSelectedRect multiSelectedRect)
  266. {
  267. //Delete Multiple Selection Box
  268. DrawEndFrameSelect();
  269. foreach (int item in editAreaMultiIndex)
  270. {
  271. SelectedRect OldRect = GetEditAreaForIndex(multiPage, item);
  272. if (OldRect != null)
  273. {
  274. multiSelectedRect.SetSelectedType(SelectedType.PDFEdit);
  275. //Optimize logic to prevent overlapping of multiple selected objects
  276. //SelectedRect selectedRect = new SelectedRect(GetDefaultDrawParam(), SelectedType.PDFEdit);
  277. //selectedRect.SetDrawMoveType(DrawMoveType.kReferenceLine);
  278. //selectedRect.SetRect(OldRect.GetRect(), currentZoom);
  279. //selectedRect.SetMaxRect(OldRect.GetMaxRect());
  280. //multiSelectedRect.Children.Add(selectedRect);
  281. multiSelectedRect.SetMulitSelectedRect(OldRect, multiPage,item);
  282. multiSelectedRect.SetRect(OldRect.GetRect());
  283. multiSelectedRect.SetMaxRect(OldRect.GetMaxRect());
  284. OldRect.HideDraw();
  285. }
  286. }
  287. }
  288. }
  289. }