CPDFOutlineControl.xaml.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using ComPDFKit.PDFDocument;
  2. using ComPDFKit.PDFDocument.Action;
  3. using Compdfkit_Tools.PDFControlUI;
  4. using ComPDFKitViewer.PdfViewer;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.ObjectModel;
  8. using System.Windows;
  9. using System.Windows.Controls;
  10. namespace Compdfkit_Tools.PDFControl
  11. {
  12. public partial class CPDFOutlineControl : UserControl
  13. {
  14. CPDFViewer pdfViewer;
  15. public ObservableCollection<CPDFOutlineNode> OutlineList
  16. {
  17. set; get;
  18. }
  19. public CPDFOutlineControl()
  20. {
  21. InitializeComponent();
  22. Loaded += CPDFOutlineControl_Loaded;
  23. }
  24. private void CPDFOutlineControl_Loaded(object sender, RoutedEventArgs e)
  25. {
  26. CPDFOutlineUI.OutlineSelectionChanged -= CPDFOutlineUI_OutlineSelectionChanged;
  27. CPDFOutlineUI.OutlineSelectionChanged += CPDFOutlineUI_OutlineSelectionChanged;
  28. }
  29. private void CPDFOutlineUI_OutlineSelectionChanged(object sender, object e)
  30. {
  31. try
  32. {
  33. TreeViewItem new_item = (TreeViewItem)e;
  34. CPDFOutline outline = (CPDFOutline)new_item.Tag;
  35. CPDFAction action = outline.GetAction();
  36. if (action != null && action.ActionType != C_ACTION_TYPE.ACTION_TYPE_UNKNOWN)
  37. {
  38. pdfViewer.ProcessAction(action);
  39. }
  40. else
  41. {
  42. CPDFDestination dest = outline.GetDestination(pdfViewer.Document);
  43. if (dest != null)
  44. {
  45. pdfViewer.GoToPage(dest.PageIndex);
  46. }
  47. }
  48. }
  49. catch(Exception ex)
  50. {
  51. }
  52. }
  53. private int GetIndexFromParent(List<CPDFOutline> parentlist, CPDFOutline outline)
  54. {
  55. for (int i = 0; i < parentlist.Count; i++)
  56. {
  57. if (parentlist[i] == outline)
  58. {
  59. return i;
  60. }
  61. }
  62. return -1;
  63. }
  64. public CPDFOutlineNode FindOutlineFromDto(ObservableCollection<CPDFOutlineNode> list, CPDFOutline outline)
  65. {
  66. foreach (CPDFOutlineNode item in list)
  67. {
  68. CPDFOutline parent = outline.GetParent();
  69. CPDFOutline PARENT = item.PDFOutline.GetParent();
  70. item.CurrentNodeName = outline.Title;
  71. int i = GetIndexFromParent(parent.ChildList, outline);
  72. int I = GetIndexFromParent(PARENT.ChildList, item.PDFOutline);
  73. if (item.PDFOutline.Title == outline.Title && i == I && outline.Level == item.PDFOutline.Level && ((parent.Title == PARENT.Title) || (parent.Title == null && PARENT.Title == null)))
  74. {
  75. return item;
  76. }
  77. else if (item.ChildrenNodeList.Count > 0)
  78. {
  79. CPDFOutlineNode retdto = FindOutlineFromDto(item.ChildrenNodeList, outline);
  80. if (retdto != null)
  81. {
  82. return retdto;
  83. }
  84. }
  85. }
  86. return null;
  87. }
  88. private CPDFOutlineNode ConvertCPDFToOutlineNode(CPDFOutline outline, CPDFOutlineNode parent)
  89. {
  90. CPDFOutlineNode node = new CPDFOutlineNode();
  91. if (outline != null)
  92. {
  93. node.PDFOutline = outline;
  94. if (parent != null)
  95. {
  96. node.ParentNode = parent;
  97. }
  98. if (OutlineList != null && OutlineList.Count > 0)
  99. {
  100. CPDFOutlineNode oldnode = FindOutlineFromDto(OutlineList, node.PDFOutline);
  101. }
  102. node.ChildrenNodeList = new ObservableCollection<CPDFOutlineNode>();
  103. if (outline.ChildList.Count > 0)
  104. {
  105. foreach (CPDFOutline item in outline.ChildList)
  106. {
  107. node.ChildrenNodeList.Add(ConvertCPDFToOutlineNode(item, node));
  108. }
  109. }
  110. }
  111. return node;
  112. }
  113. public ObservableCollection<CPDFOutlineNode> GetOutlineViewDataSource()
  114. {
  115. ObservableCollection<CPDFOutlineNode> data = new ObservableCollection<CPDFOutlineNode>();
  116. List<CPDFOutline> datasource = pdfViewer.Document.GetOutlineList();
  117. foreach (CPDFOutline item in datasource)
  118. {
  119. CPDFOutlineNode dto = ConvertCPDFToOutlineNode(item, null);
  120. if (dto != null)
  121. {
  122. data.Add(dto);
  123. }
  124. }
  125. return data;
  126. }
  127. public void InitWithPDFViewer(CPDFViewer pdfViewer)
  128. {
  129. this.pdfViewer = pdfViewer;
  130. List<CPDFOutline> outlineList = pdfViewer.Document.GetOutlineList();
  131. CPDFOutlineUI.SetOutlineTree(outlineList);
  132. }
  133. }
  134. }