PDFImageEditControl.xaml.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. using ComPDFKit.Import;
  2. using ComPDFKit.PDFDocument;
  3. using ComPDFKit.PDFPage;
  4. using ComPDFKit.PDFPage.Edit;
  5. using ComPDFKit.Tool;
  6. using ComPDFKit.Tool.UndoManger;
  7. using ComPDFKit.Viewer.Helper;
  8. using ComPDFKitViewer;
  9. using Microsoft.Win32;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Diagnostics;
  13. using System.Drawing;
  14. using System.Globalization;
  15. using System.IO;
  16. using System.Windows;
  17. using System.Windows.Controls;
  18. using System.Windows.Controls.Primitives;
  19. using System.Windows.Input;
  20. using System.Windows.Media.Imaging;
  21. using ComPDFKit.Tool.DrawTool;
  22. using ComPDFKitViewer.Helper;
  23. using ComPDFKit.Tool.Help;
  24. using System.Linq;
  25. using System.ComponentModel;
  26. using System.Runtime.CompilerServices;
  27. namespace ComPDFKit.Controls.Edit
  28. {
  29. public partial class PDFImageEditControl : UserControl, INotifyPropertyChanged
  30. {
  31. #region property
  32. public CPDFViewerTool ToolView { get; set; }
  33. public List<ImageEditParam> EditEvents { get; set; } = new List<ImageEditParam>();
  34. private Visibility _onlySingleVisible = Visibility.Collapsed;
  35. public Visibility OnlySingleVisible
  36. {
  37. get => _onlySingleVisible;
  38. set => UpdateProper(ref _onlySingleVisible, value);
  39. }
  40. //public List<PDFEditEvent> EditMultiEvents { get; set; }
  41. #endregion
  42. public PDFImageEditControl()
  43. {
  44. DataContext = this;
  45. InitializeComponent();
  46. Loaded += PDFImageEditControl_Loaded;
  47. Unloaded += PDFImageEditControl_Unloaded;
  48. }
  49. #region Load unload custom control
  50. private void PDFImageEditControl_Loaded(object sender, RoutedEventArgs e)
  51. {
  52. RotateUI.RotationChanged -= RotateUI_RotationChanged;
  53. FlipUI.FlipChanged -= FlipUI_FlipChanged;
  54. RotateUI.RotationChanged += RotateUI_RotationChanged;
  55. FlipUI.FlipChanged += FlipUI_FlipChanged;
  56. ToolView.SelectedDataChanged -= ToolView_SelectedDataChanged;
  57. ToolView.SelectedDataChanged += ToolView_SelectedDataChanged;
  58. }
  59. private void PDFImageEditControl_Unloaded(object sender, RoutedEventArgs e)
  60. {
  61. RotateUI.RotationChanged -= RotateUI_RotationChanged;
  62. FlipUI.FlipChanged -= FlipUI_FlipChanged;
  63. }
  64. #endregion
  65. #region Property changed
  66. private void ImageCut()
  67. {
  68. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  69. if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
  70. return;
  71. SelectedRect selectedRect = ToolView.GetSelectedRectForEditAreaObject(imageAreas[0]);
  72. if (selectedRect == null)
  73. return;
  74. Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
  75. double currentZoom = ToolView.GetCPDFViewer().CurrentRenderFrame.ZoomFactor;
  76. Rect rect = selectedRect.GetRect();
  77. Rect maxRect = selectedRect.GetMaxRect();
  78. Rect pdfRect = new Rect((rect.X - maxRect.X) / currentZoom, (rect.Y - maxRect.Y) / currentZoom, rect.Width / currentZoom, rect.Height / currentZoom);
  79. pdfRect = DpiHelper.StandardRectToPDFRect(pdfRect);
  80. CRect newCRect = new CRect((float)pdfRect.Left, (float)pdfRect.Bottom, (float)pdfRect.Right, (float)pdfRect.Top);
  81. if (imageAreas[0].CutWithRect(newCRect))
  82. {
  83. PDFEditHistory editHistory = new PDFEditHistory();
  84. editHistory.EditPage = editPage;
  85. editHistory.PageIndex = pdfPage.PageIndex;
  86. ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
  87. ToolView.UpdateRender(oldRect, imageAreas[0]);
  88. }
  89. editPage.EndEdit();
  90. SetImageThumb();
  91. }
  92. private void ToolView_SelectedDataChanged(object sender, SelectedAnnotData e)
  93. {
  94. if (ToolView.GetIsCropMode())
  95. {
  96. ImageCut();
  97. }
  98. }
  99. #endregion
  100. #region Init PDFViewer
  101. public void InitWithPDFViewer(CPDFViewerTool newPDFView)
  102. {
  103. ToolView = newPDFView;
  104. }
  105. #endregion
  106. #region public method
  107. public void SetRotationText(float rotation)
  108. {
  109. RotationTxb.Text = rotation.ToString(CultureInfo.CurrentCulture);
  110. }
  111. #endregion
  112. #region Image Edit
  113. public void SetImageThumb()
  114. {
  115. if (EditEvents.Count == 1)
  116. {
  117. try
  118. {
  119. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  120. string path = Path.GetTempPath();
  121. string uuid = Guid.NewGuid().ToString("N");
  122. string imagePath = Path.Combine(path, uuid + ".tmp");
  123. imageAreas.FirstOrDefault().ExtractImage(imagePath);
  124. Bitmap bitmapImage = new Bitmap(imagePath);
  125. MemoryStream memoryStream = new MemoryStream();
  126. bitmapImage.Save(memoryStream, bitmapImage.RawFormat);
  127. BitmapImage imageShow = new BitmapImage();
  128. imageShow.BeginInit();
  129. imageShow.StreamSource = memoryStream;
  130. imageShow.EndInit();
  131. ImageThumbUI.Source = imageShow;
  132. }
  133. catch (Exception ex)
  134. {
  135. }
  136. }
  137. }
  138. public void SetImageTransparency(double transparency)
  139. {
  140. ImasgeOpacitySlider.Value = transparency / 255D;
  141. OpacityTextBox.Text = string.Format("{0}%", (int)(Math.Round(ImasgeOpacitySlider.Value * 100)));
  142. }
  143. public void SetPDFImageEditData(List<ImageEditParam> newEvents)
  144. {
  145. EditEvents = newEvents.Where(newEvent => newEvent.EditIndex >= 0 && newEvent.EditType == CPDFEditType.EditImage).ToList();
  146. if (EditEvents.Count > 0)
  147. {
  148. SetImageTransparency(EditEvents.FirstOrDefault().Transparency);
  149. }
  150. if (RotationTxb != null && EditEvents.Count > 0)
  151. {
  152. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  153. RotationTxb.Text = imageAreas?.FirstOrDefault()?.GetRotation().ToString();
  154. }
  155. if (EditEvents.Count == 1)
  156. {
  157. OnlySingleVisible = Visibility.Visible;
  158. SetImageThumb();
  159. }
  160. else
  161. {
  162. OnlySingleVisible = Visibility.Collapsed;
  163. }
  164. }
  165. #endregion
  166. //public void SetPDFImageMultiEditData(List<PDFEditEvent> editEvents)
  167. //{
  168. // EditEvent = null;
  169. // EditMultiEvents = null;
  170. // if (ImageThumbBorder != null)
  171. // {
  172. // ImageThumbBorder.Visibility = Visibility.Collapsed;
  173. // }
  174. // if(ImageReplaceBtn != null)
  175. // {
  176. // ImageReplaceBtn.Visibility = Visibility.Collapsed;
  177. // }
  178. // if(ImageClipBtn!=null)
  179. // {
  180. // ImageClipBtn.Visibility = Visibility.Collapsed;
  181. // }
  182. // if (ImageThumbUI != null)
  183. // {
  184. // ImageThumbUI.Source = null;
  185. // }
  186. // if (editEvents != null && editEvents.Count > 0)
  187. // {
  188. // PDFEditEvent editEvent = editEvents[0];
  189. // if (editEvent != null && editEvent.EditType == CPDFEditType.EditImage)
  190. // {
  191. // SetImageTransparency(editEvent.Transparency);
  192. // }
  193. // }
  194. // EditMultiEvents = editEvents;
  195. //}
  196. #region Property changed
  197. private void FlipUI_FlipChanged(object sender, bool e)
  198. {
  199. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  200. if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
  201. return;
  202. if(ToolView.CurrentEditAreaObject() != null)
  203. {
  204. Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
  205. bool result;
  206. if (e)
  207. {
  208. result = imageAreas[0].VerticalMirror();
  209. }
  210. else
  211. {
  212. result = imageAreas[0].HorizontalMirror();
  213. }
  214. if (result)
  215. {
  216. PDFEditHistory editHistory = new PDFEditHistory();
  217. editHistory.EditPage = editPage;
  218. editHistory.PageIndex = pdfPage.PageIndex;
  219. ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
  220. ToolView.UpdateRender(oldRect, imageAreas[0]);
  221. }
  222. }
  223. else
  224. {
  225. GroupHistory groupHistory = new GroupHistory();
  226. foreach (CPDFEditImageArea imageArea in imageAreas)
  227. {
  228. bool result;
  229. if (e)
  230. {
  231. result = imageArea.VerticalMirror();
  232. }
  233. else
  234. {
  235. result = imageArea.HorizontalMirror();
  236. }
  237. if (result)
  238. {
  239. PDFEditHistory editHistory = new PDFEditHistory();
  240. editHistory.EditPage = editPage;
  241. editHistory.PageIndex = pdfPage.PageIndex;
  242. groupHistory.Histories.Add(editHistory);
  243. }
  244. }
  245. ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
  246. ToolView.GetCPDFViewer()?.UpdateRenderFrame();
  247. }
  248. editPage.EndEdit();
  249. if (imageAreas.Count == 1)
  250. SetImageThumb();
  251. //if (EditMultiEvents != null)
  252. //{
  253. // foreach (PDFEditEvent editEvent in EditMultiEvents)
  254. // {
  255. // if (e)
  256. // {
  257. // editEvent.VerticalMirror = true;
  258. // }
  259. // else
  260. // {
  261. // editEvent.HorizontalMirror = true;
  262. // }
  263. // }
  264. // PDFEditEvent.UpdatePDFEditList(EditMultiEvents);
  265. //}
  266. }
  267. private void RotateUI_RotationChanged(object sender, double e)
  268. {
  269. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  270. if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
  271. return;
  272. if(ToolView.CurrentEditAreaObject() != null)
  273. {
  274. Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
  275. if (imageAreas[0].Rotate((int)e))
  276. {
  277. PDFEditHistory editHistory = new PDFEditHistory();
  278. editHistory.EditPage = editPage;
  279. editHistory.PageIndex = pdfPage.PageIndex;
  280. ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
  281. ToolView.UpdateRender(oldRect, imageAreas[0]);
  282. }
  283. }
  284. else
  285. {
  286. GroupHistory groupHistory = new GroupHistory();
  287. foreach (CPDFEditImageArea imageArea in imageAreas)
  288. {
  289. if (imageArea.Rotate((int)e))
  290. {
  291. PDFEditHistory editHistory = new PDFEditHistory();
  292. editHistory.EditPage = editPage;
  293. editHistory.PageIndex = pdfPage.PageIndex;
  294. groupHistory.Histories.Add(editHistory);
  295. }
  296. }
  297. ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
  298. ToolView.GetCPDFViewer()?.UpdateRenderFrame();
  299. }
  300. editPage.EndEdit();
  301. RotationTxb.Text = imageAreas.FirstOrDefault().GetRotation().ToString();
  302. if (imageAreas.Count == 1)
  303. SetImageThumb();
  304. //if (EditMultiEvents != null)
  305. //{
  306. // foreach (PDFEditEvent editEvent in EditMultiEvents)
  307. // {
  308. // editEvent.Rotate = (int)e;
  309. // }
  310. // PDFEditEvent.UpdatePDFEditList(EditMultiEvents);
  311. //}
  312. }
  313. private void Slider_DragStarted(object sender, DragStartedEventArgs e)
  314. {
  315. Slider slider = sender as Slider;
  316. if (slider != null)
  317. {
  318. slider.Tag = "false";
  319. }
  320. }
  321. private void SliderOpacity_DragCompleted(object sender, DragCompletedEventArgs e)
  322. {
  323. Slider slider = sender as Slider;
  324. if (slider != null)
  325. {
  326. slider.Tag = "true";
  327. }
  328. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  329. if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
  330. return;
  331. if (ToolView.CurrentEditAreaObject() != null)
  332. {
  333. Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
  334. if (imageAreas[0].SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
  335. {
  336. PDFEditHistory editHistory = new PDFEditHistory();
  337. editHistory.EditPage = editPage;
  338. editHistory.PageIndex = pdfPage.PageIndex;
  339. ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
  340. ToolView.UpdateRender(oldRect, imageAreas[0]);
  341. }
  342. }
  343. else
  344. {
  345. GroupHistory groupHistory = new GroupHistory();
  346. foreach (CPDFEditImageArea imageArea in imageAreas)
  347. {
  348. if (imageArea.SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
  349. {
  350. PDFEditHistory editHistory = new PDFEditHistory();
  351. editHistory.EditPage = editPage;
  352. editHistory.PageIndex = pdfPage.PageIndex;
  353. groupHistory.Histories.Add(editHistory);
  354. }
  355. }
  356. ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
  357. ToolView.GetCPDFViewer()?.UpdateRenderFrame();
  358. }
  359. editPage.EndEdit();
  360. if (imageAreas.Count == 1)
  361. SetImageThumb();
  362. }
  363. private void SliderOpacity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  364. {
  365. Slider slider = sender as Slider;
  366. if (OpacityTextBox != null)
  367. {
  368. OpacityTextBox.Text = string.Format("{0}%", (int)(ImasgeOpacitySlider.Value * 100));
  369. }
  370. if (slider != null && slider.Tag != null && slider.Tag.ToString() == "false")
  371. {
  372. return;
  373. }
  374. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  375. if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
  376. return;
  377. if (ToolView.CurrentEditAreaObject() != null)
  378. {
  379. Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
  380. if (imageAreas[0].SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
  381. {
  382. PDFEditHistory editHistory = new PDFEditHistory();
  383. editHistory.EditPage = editPage;
  384. editHistory.PageIndex = pdfPage.PageIndex;
  385. ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
  386. ToolView.UpdateRender(oldRect, imageAreas[0]);
  387. }
  388. }
  389. else
  390. {
  391. GroupHistory groupHistory = new GroupHistory();
  392. foreach (CPDFEditImageArea imageArea in imageAreas)
  393. {
  394. if (imageArea.SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
  395. {
  396. PDFEditHistory editHistory = new PDFEditHistory();
  397. editHistory.EditPage = editPage;
  398. editHistory.PageIndex = pdfPage.PageIndex;
  399. groupHistory.Histories.Add(editHistory);
  400. }
  401. }
  402. ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
  403. ToolView.GetCPDFViewer()?.UpdateRenderFrame();
  404. }
  405. editPage.EndEdit();
  406. if (imageAreas.Count == 1)
  407. SetImageThumb();
  408. }
  409. private void ImageReplaceBtn_Click(object sender, RoutedEventArgs e)
  410. {
  411. //if(EditMultiEvents!=null && EditMultiEvents.Count>1)
  412. //{
  413. // return;
  414. //}
  415. if (EditEvents.Count > 0)
  416. {
  417. OpenFileDialog openFileDialog = new OpenFileDialog();
  418. openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
  419. if (openFileDialog.ShowDialog() == true)
  420. {
  421. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  422. if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
  423. return;
  424. int imageWidth = 0;
  425. int imageHeight = 0;
  426. byte[] imageData = null;
  427. PDFHelp.ImagePathToByte(openFileDialog.FileName, ref imageData, ref imageWidth, ref imageHeight);
  428. if (imageData != null && imageWidth > 0 && imageHeight > 0)
  429. {
  430. Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
  431. CRect imageRect = imageAreas[0].GetClipRect();
  432. if (imageAreas[0].ReplaceImageArea(imageRect, imageData, imageWidth, imageHeight))
  433. {
  434. PDFEditHistory editHistory = new PDFEditHistory();
  435. editHistory.EditPage = editPage;
  436. editHistory.PageIndex = pdfPage.PageIndex;
  437. ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
  438. ToolView.UpdateRender(oldRect, imageAreas[0]);
  439. }
  440. editPage.EndEdit();
  441. SetImageThumb();
  442. }
  443. }
  444. }
  445. }
  446. private void ImageExportBtn_Click(object sender, RoutedEventArgs e)
  447. {
  448. if (ToolView != null)
  449. {
  450. // Dictionary<int, List<Bitmap>> imageDict = PDFView.GetSelectedImages();
  451. Dictionary<int, List<Bitmap>> imageDict = new Dictionary<int, List<Bitmap>>();
  452. if (imageDict != null && imageDict.Count > 0)
  453. {
  454. System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
  455. if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  456. {
  457. string choosePath = folderBrowser.SelectedPath;
  458. string openPath = choosePath;
  459. try
  460. {
  461. foreach (int pageIndex in imageDict.Keys)
  462. {
  463. List<Bitmap> imageList = imageDict[pageIndex];
  464. foreach (Bitmap image in imageList)
  465. {
  466. string savePath = System.IO.Path.Combine(choosePath, Guid.NewGuid() + ".jpg");
  467. image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  468. openPath = savePath;
  469. }
  470. }
  471. Process.Start("explorer", "/select,\"" + openPath + "\"");
  472. }
  473. catch (Exception ex)
  474. {
  475. }
  476. }
  477. }
  478. }
  479. }
  480. private void ImageClipBtn_Click(object sender, RoutedEventArgs e)
  481. {
  482. ToolView.SetCropMode(!ToolView.GetIsCropMode());
  483. }
  484. private void OpacityComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  485. {
  486. ComboBoxItem selectItem = OpacityComboBox.SelectedItem as ComboBoxItem;
  487. if (selectItem != null && selectItem.Content != null)
  488. {
  489. if (double.TryParse(selectItem.Content.ToString().TrimEnd('%'), out double newOpacity))
  490. {
  491. OpacityTextBox.Text = selectItem.Content.ToString();
  492. ImasgeOpacitySlider.Value = newOpacity / 100.0;
  493. }
  494. }
  495. }
  496. private void GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage)
  497. {
  498. imageAreas = new List<CPDFEditImageArea>();
  499. editPage = null;
  500. pdfPage = null;
  501. if (ToolView == null || EditEvents.Count == 0)
  502. {
  503. return;
  504. }
  505. try
  506. {
  507. foreach (var EditEvent in EditEvents)
  508. {
  509. CPDFViewer pdfViewer = ToolView.GetCPDFViewer();
  510. CPDFDocument pdfDoc = pdfViewer.GetDocument();
  511. pdfPage = pdfDoc.PageAtIndex(EditEvent.PageIndex);
  512. editPage = pdfPage.GetEditPage();
  513. List<CPDFEditArea> editAreas = editPage.GetEditAreaList();
  514. if (editAreas != null && editAreas.Count > EditEvent.EditIndex)
  515. {
  516. imageAreas.Add(editAreas[EditEvent.EditIndex] as CPDFEditImageArea);
  517. }
  518. }
  519. }
  520. catch (Exception ex)
  521. {
  522. }
  523. }
  524. private void SetAbsRotation(double absRotation)
  525. {
  526. GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
  527. if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
  528. return;
  529. if (ToolView.CurrentEditAreaObject() != null)
  530. {
  531. Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
  532. int rotation = (int)absRotation - imageAreas[0].GetRotation();
  533. if (imageAreas[0].Rotate(rotation))
  534. {
  535. PDFEditHistory editHistory = new PDFEditHistory();
  536. editHistory.EditPage = editPage;
  537. editHistory.PageIndex = pdfPage.PageIndex;
  538. ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
  539. ToolView.UpdateRender(oldRect, imageAreas[0]);
  540. }
  541. }
  542. else
  543. {
  544. GroupHistory groupHistory = new GroupHistory();
  545. foreach (CPDFEditImageArea imageArea in imageAreas)
  546. {
  547. int rotation = (int)absRotation - imageArea.GetRotation();
  548. if (imageArea.Rotate(rotation))
  549. {
  550. PDFEditHistory editHistory = new PDFEditHistory();
  551. editHistory.EditPage = editPage;
  552. editHistory.PageIndex = pdfPage.PageIndex;
  553. groupHistory.Histories.Add(editHistory);
  554. }
  555. }
  556. ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
  557. ToolView.GetCPDFViewer()?.UpdateRenderFrame();
  558. }
  559. editPage.EndEdit();
  560. if(imageAreas.Count == 1)
  561. SetImageThumb();
  562. }
  563. private void RotationTxb_LostFocus(object sender, RoutedEventArgs e)
  564. {
  565. if (!double.TryParse(RotationTxb.Text, out double rotation))
  566. {
  567. return;
  568. }
  569. SetAbsRotation(rotation);
  570. }
  571. private void RotationTxb_PreviewKeyDown(object sender, KeyEventArgs e)
  572. {
  573. if (e.Key == Key.Enter)
  574. {
  575. RotationTxb_LostFocus(null, null);
  576. }
  577. }
  578. #endregion
  579. public event PropertyChangedEventHandler PropertyChanged;
  580. protected bool UpdateProper<T>(ref T properValue,
  581. T newValue,
  582. [CallerMemberName] string properName = "")
  583. {
  584. if (object.Equals(properValue, newValue))
  585. return false;
  586. properValue = newValue;
  587. OnPropertyChanged(properName);
  588. return true;
  589. }
  590. protected void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
  591. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  592. }
  593. }