MeasureControl.xaml.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using ComPDFKit.Measure;
  2. using ComPDFKit.PDFAnnotation;
  3. using Compdfkit_Tools.Helper;
  4. using Compdfkit_Tools.PDFControl;
  5. using ComPDFKitViewer;
  6. using ComPDFKitViewer.AnnotEvent;
  7. using ComPDFKitViewer.PdfViewer;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Windows;
  15. using System.Windows.Controls;
  16. using System.Windows.Data;
  17. using System.Windows.Documents;
  18. using System.Windows.Input;
  19. using System.Windows.Media;
  20. using System.Windows.Media.Imaging;
  21. using System.Windows.Navigation;
  22. using System.Windows.Shapes;
  23. namespace Compdfkit_Tools.Measure
  24. {
  25. /// <summary>
  26. /// MeasureControl.xaml 的交互逻辑
  27. /// </summary>
  28. public partial class MeasureControl : UserControl
  29. {
  30. public MeasurePropertyControl measurePropertyControl = new MeasurePropertyControl();
  31. private CPDFDisplaySettingsControl displaySettingsControl;
  32. private PDFViewControl PdfViewControl = new PDFViewControl();
  33. private PanelState panelState = PanelState.GetInstance();
  34. public event EventHandler ExpandEvent;
  35. public MeasureControl()
  36. {
  37. InitializeComponent();
  38. MeasureSetting.MeasureChanged += MeasureSetting_MeasureChanged;
  39. }
  40. private void MeasureSetting_MeasureChanged(object sender, MeasureEventArgs e)
  41. {
  42. InfoPanel.SetMeasureInfo(e);
  43. }
  44. #region Init PDFViewer
  45. public void InitWithPDFViewer(PDFViewControl pdfViewControl, CPDFViewer pdfViewer)
  46. {
  47. PdfViewControl = pdfViewControl;
  48. PdfViewControl.PDFView = pdfViewer;
  49. PDFMeasureTool.InitWithPDFViewer(pdfViewer, measurePropertyControl, this);
  50. FloatPageTool.InitWithPDFViewer(pdfViewer);
  51. PDFGrid.Child = PdfViewControl;
  52. panelState.PropertyChanged -= PanelState_PropertyChanged;
  53. panelState.PropertyChanged += PanelState_PropertyChanged;
  54. pdfViewControl.PDFView.AnnotActiveHandler -= PDFView_AnnotActiveHandler;
  55. pdfViewControl.PDFView.AnnotActiveHandler += PDFView_AnnotActiveHandler;
  56. pdfViewControl.PDFView.AnnotCommandHandler -= PDFView_AnnotCommandHandler;
  57. pdfViewControl.PDFView.AnnotCommandHandler += PDFView_AnnotCommandHandler;
  58. SetInfoPanelVisble(false, false);
  59. }
  60. private void PDFView_AnnotCommandHandler(object sender, AnnotCommandArgs e)
  61. {
  62. switch (e.CommandType)
  63. {
  64. case CommandType.Context:
  65. if (e.CommandTarget == TargetType.Annot && e.PressOnAnnot)
  66. {
  67. e.Handle = true;
  68. e.PopupMenu = new ContextMenu();
  69. e.PopupMenu.Items.Add(new MenuItem() { Header = "Delete", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
  70. MenuItem menuItem = new MenuItem();
  71. menuItem.Header = "Measure Setting";
  72. menuItem.Click += (item, param) =>
  73. {
  74. SettingPanel.UpdateArgsList = e.AnnotEventArgsList;
  75. SettingPanel.BindMeasureSetting();
  76. SetInfoPanelVisble(false, true);
  77. };
  78. MenuItem propertyItem = new MenuItem();
  79. propertyItem.Header = "Property Setting";
  80. propertyItem.Click += (item, param) =>
  81. {
  82. ExpandEvent?.Invoke(this, new EventArgs());
  83. };
  84. e.PopupMenu.Items.Add(menuItem);
  85. e.PopupMenu.Items.Add(propertyItem);
  86. }
  87. break;
  88. case CommandType.Delete:
  89. e.DoCommand();
  90. break;
  91. default:
  92. break;
  93. }
  94. }
  95. private void PDFView_AnnotActiveHandler(object sender, AnnotAttribEvent e)
  96. {
  97. if (e == null || e.IsAnnotCreateReset)
  98. {
  99. return;
  100. }
  101. else
  102. {
  103. switch (e.GetAnnotTypes())
  104. {
  105. case AnnotArgsType.LineMeasure:
  106. LineMeasureArgs LineArgs = e.GetAnnotHandlerEventArgs(AnnotArgsType.LineMeasure).First() as LineMeasureArgs;
  107. panelState.RightPanel = PanelState.RightPanelState.PropertyPanel;
  108. measurePropertyControl.SetPropertyForMeasureCreate(LineArgs, e);
  109. SetInfoPanelVisble(true, false);
  110. SetMeasureInfoPanel(LineArgs.GetPDFAnnot());
  111. break;
  112. case AnnotArgsType.PolygonMeasure:
  113. PolygonMeasureArgs polygonArgs = e.GetAnnotHandlerEventArgs(AnnotArgsType.PolygonMeasure).First() as PolygonMeasureArgs;
  114. panelState.RightPanel = PanelState.RightPanelState.PropertyPanel;
  115. measurePropertyControl.SetPropertyForMeasureCreate(polygonArgs, e);
  116. SetInfoPanelVisble(true, false);
  117. SetMeasureInfoPanel(polygonArgs.GetPDFAnnot());
  118. break;
  119. case AnnotArgsType.PolyLineMeasure:
  120. PolyLineMeasureArgs polyLineArgs = e.GetAnnotHandlerEventArgs(AnnotArgsType.PolyLineMeasure).First() as PolyLineMeasureArgs;
  121. panelState.RightPanel = PanelState.RightPanelState.PropertyPanel;
  122. measurePropertyControl.SetPropertyForMeasureCreate(polyLineArgs, e);
  123. SetInfoPanelVisble(true, false);
  124. SetMeasureInfoPanel(polyLineArgs.GetPDFAnnot());
  125. break;
  126. }
  127. }
  128. }
  129. private void SetMeasureInfoPanel(CPDFAnnotation cPDFAnnotation)
  130. {
  131. CPDFPolygonAnnotation Annot = cPDFAnnotation as CPDFPolygonAnnotation;
  132. double Area = Annot.GetMeasureValue(CPDFCaptionType.CPDF_CAPTION_AREA);
  133. double inch = MeasureSetting.GetMeasurePDFArea(Area);
  134. double Length = Annot.GetMeasureValue(CPDFCaptionType.CPDF_CAPTION_LENGTH);
  135. double currentInch = MeasureSetting.GetMeasurePDFLength(Length);
  136. MeasureEventArgs measureEvent = new MeasureEventArgs();
  137. measureEvent.RulerTranslateUnit = MeasureSetting.RulerTranslateUnit;
  138. measureEvent.RulerTranslate = MeasureSetting.RulerTranslate;
  139. measureEvent.RulerBase = MeasureSetting.RulerBase;
  140. measureEvent.RulerBaseUnit = MeasureSetting.RulerBaseUnit;
  141. measureEvent.Precision = MeasureSetting.Precision;
  142. measureEvent.Type = CPDFMeasureType.CPDF_AREA_MEASURE;
  143. measureEvent.Distance = string.Format("{0}{1}", MeasureSetting.GetPrecisionData(currentInch), MeasureSetting.RulerTranslateUnit);
  144. measureEvent.Area = string.Format("{0}{1}", MeasureSetting.GetPrecisionData(inch), MeasureSetting.RulerTranslateUnit);
  145. MeasureSetting.InvokeMeasureChangeEvent(this, measureEvent);
  146. }
  147. public void SetSettingsControl(CPDFDisplaySettingsControl cPDFDisplaySettingsControl)
  148. {
  149. displaySettingsControl = cPDFDisplaySettingsControl;
  150. }
  151. public void ClearAllToolState()
  152. {
  153. PDFMeasureTool.ClearAllToolState();
  154. }
  155. public void ClearViewerControl()
  156. {
  157. PDFGrid.Child = null;
  158. BotaContainer.Child = null;
  159. PropertyContainer.Child = null;
  160. displaySettingsControl = null;
  161. }
  162. private void PanelState_PropertyChanged(object sender, PropertyChangedEventArgs e)
  163. {
  164. if (e.PropertyName == nameof(PanelState.IsLeftPanelExpand))
  165. {
  166. ExpandLeftPanel(panelState.IsLeftPanelExpand);
  167. }
  168. else if (e.PropertyName == nameof(PanelState.RightPanel))
  169. {
  170. if (panelState.RightPanel == PanelState.RightPanelState.PropertyPanel)
  171. {
  172. ExpandRightPropertyPanel(measurePropertyControl, Visibility.Visible);
  173. }
  174. else if (panelState.RightPanel == PanelState.RightPanelState.ViewSettings)
  175. {
  176. ExpandRightPropertyPanel(displaySettingsControl, Visibility.Visible);
  177. }
  178. else
  179. {
  180. ExpandRightPropertyPanel(null, Visibility.Collapsed);
  181. }
  182. }
  183. }
  184. #endregion
  185. #region Expand and collapse Panel
  186. public void ExpandRightPropertyPanel(Visibility visible)
  187. {
  188. ExpandRightPropertyPanel(measurePropertyControl, visible);
  189. }
  190. public void ExpandNullRightPropertyPanel(Visibility visible)
  191. {
  192. ExpandRightPropertyPanel(null, visible);
  193. }
  194. public void ExpandViewSettings(Visibility visible)
  195. {
  196. SetViewSettings(displaySettingsControl, visible);
  197. }
  198. private void ExpandRightPropertyPanel(UIElement propertytPanel, Visibility visible)
  199. {
  200. PropertyContainer.Width = 260;
  201. PropertyContainer.Child = propertytPanel;
  202. PropertyContainer.Visibility = visible;
  203. }
  204. private void SetViewSettings(CPDFDisplaySettingsControl displaySettingsControl, Visibility visibility)
  205. {
  206. PropertyContainer.Child = displaySettingsControl;
  207. PropertyContainer.Visibility = visibility;
  208. }
  209. public void ExpandLeftPanel(bool isExpand)
  210. {
  211. BotaContainer.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
  212. Splitter.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
  213. if (isExpand)
  214. {
  215. BodyGrid.ColumnDefinitions[0].Width = new GridLength(320);
  216. BodyGrid.ColumnDefinitions[1].Width = new GridLength(15);
  217. }
  218. else
  219. {
  220. BodyGrid.ColumnDefinitions[0].Width = new GridLength(0);
  221. BodyGrid.ColumnDefinitions[1].Width = new GridLength(0);
  222. }
  223. }
  224. #endregion
  225. private void UserControl_Loaded(object sender, RoutedEventArgs e)
  226. {
  227. }
  228. private void MeasureInfoPanel_SettingClick(object sender, EventArgs e)
  229. {
  230. SettingPanel.ReturnToInfoPanel = true;
  231. SetInfoPanelVisble(false, true);
  232. SettingPanel.BindMeasureSetting();
  233. }
  234. private void SettingPanel_CancelEvent(object sender, EventArgs e)
  235. {
  236. SetInfoPanelVisble(SettingPanel.ReturnToInfoPanel, false);
  237. }
  238. private void SettingPanel_DoneEvent(object sender, EventArgs e)
  239. {
  240. SetInfoPanelVisble(SettingPanel.ReturnToInfoPanel, false);
  241. }
  242. public void SetInfoPanelVisble(bool measureInfo, bool measureSetting)
  243. {
  244. if(measureInfo)
  245. {
  246. InfoPanel.ClearMeasureInfo();
  247. }
  248. InfoPanel.Visibility = measureInfo ? Visibility.Visible : Visibility.Collapsed;
  249. SettingPanel.Visibility = measureSetting ? Visibility.Visible : Visibility.Collapsed;
  250. }
  251. public void SetMeasureInfoType(CPDFMeasureType measureType)
  252. {
  253. InfoPanel?.SetMeasureType(measureType);
  254. }
  255. }
  256. }