MainWindow.xaml.cs 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  1. using ComPDFKit.PDFDocument;
  2. using ComPDFKit.PDFPage;
  3. using Compdfkit_Tools.Edit;
  4. using Compdfkit_Tools.Helper;
  5. using Compdfkit_Tools.PDFControl;
  6. using ComPDFKitViewer;
  7. using ComPDFKitViewer.AnnotEvent;
  8. using ComPDFKitViewer.PdfViewer;
  9. using Microsoft.Win32;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.ComponentModel;
  13. using System.Diagnostics;
  14. using System.Drawing;
  15. using System.IO;
  16. using System.Runtime.CompilerServices;
  17. using System.Windows;
  18. using System.Windows.Controls;
  19. using System.Windows.Controls.Primitives;
  20. using System.Windows.Input;
  21. using System.Windows.Media.Imaging;
  22. namespace ContentEditor
  23. {
  24. public partial class MainWindow : Window, INotifyPropertyChanged
  25. {
  26. #region Property
  27. public bool CanUndo
  28. {
  29. get
  30. {
  31. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  32. {
  33. return pdfViewControl.PDFView.UndoManager.CanUndo;
  34. }
  35. return false;
  36. }
  37. }
  38. public bool CanRedo
  39. {
  40. get
  41. {
  42. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  43. {
  44. return pdfViewControl.PDFView.UndoManager.CanRedo;
  45. }
  46. return false;
  47. }
  48. }
  49. public bool CanSave
  50. {
  51. get
  52. {
  53. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  54. {
  55. return pdfViewControl.PDFView.UndoManager.CanSave;
  56. }
  57. return false;
  58. }
  59. }
  60. /// <summary>
  61. /// The last PDF edit object
  62. /// </summary>
  63. private PDFEditEvent lastPDFEditEvent = null;
  64. private PDFViewControl passwordViewer;
  65. private PDFViewControl pdfViewControl;
  66. private PDFImageEditControl imageEditControl = new PDFImageEditControl();
  67. private PDFTextEditControl textEditControl = new PDFTextEditControl();
  68. private Border empytPanel = new Border();
  69. private UIElement prevPanel = null;
  70. private double[] zoomLevelList = { 1f, 8f, 12f, 25, 33f, 50, 66f, 75, 100, 125, 150, 200, 300, 400, 600, 800, 1000 };
  71. public event PropertyChangedEventHandler PropertyChanged;
  72. #endregion
  73. public MainWindow()
  74. {
  75. InitializeComponent();
  76. Loaded += MainWindow_Loaded;
  77. DataContext = this;
  78. }
  79. private void MainWindow_Loaded(object sender, RoutedEventArgs e)
  80. {
  81. TextBlock emptyBlock = new TextBlock();
  82. emptyBlock.HorizontalAlignment = HorizontalAlignment.Center;
  83. emptyBlock.VerticalAlignment = VerticalAlignment.Center;
  84. empytPanel.Child = emptyBlock;
  85. empytPanel.Width = 260;
  86. BotaSideTool.AddBOTAContent(BOTATools.Thumbnail | BOTATools.Outline | BOTATools.Bookmark | BOTATools.Search);
  87. LoadDefaultDocument();
  88. }
  89. #region Load document
  90. private void LoadDocument()
  91. {
  92. pdfViewControl.PDFView?.Load();
  93. PDFGrid.Child = pdfViewControl;
  94. pdfViewControl.PDFView.InfoChanged -= PdfViewer_InfoChanged;
  95. pdfViewControl.PDFView.InfoChanged += PdfViewer_InfoChanged;
  96. PasswordUI.Closed -= PasswordUI_Closed;
  97. PasswordUI.Canceled -= PasswordUI_Canceled;
  98. PasswordUI.Confirmed -= PasswordUI_Confirmed;
  99. PasswordUI.Closed += PasswordUI_Closed;
  100. PasswordUI.Canceled += PasswordUI_Canceled;
  101. PasswordUI.Confirmed += PasswordUI_Confirmed;
  102. pdfViewControl.PDFView.PDFEditActiveHandler -= PDFView_PDFEditActiveHandler;
  103. pdfViewControl.PDFView.PDFEditActiveHandler += PDFView_PDFEditActiveHandler;
  104. pdfViewControl.PDFView.UndoManager.PropertyChanged -= UndoManager_PropertyChanged;
  105. pdfViewControl.PDFView.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
  106. pdfViewControl.PDFView.PDFEditCommandHandler -= PDFView_PDFEditCommandHandler;
  107. pdfViewControl.PDFView.PDFEditCommandHandler += PDFView_PDFEditCommandHandler;
  108. pdfViewControl.PDFView.AnnotCommandHandler -= PDFView_AnnotCommandHandler;
  109. pdfViewControl.PDFView.AnnotCommandHandler += PDFView_AnnotCommandHandler;
  110. pdfViewControl.PDFView.SetFormFieldHighlight(true);
  111. pdfViewControl.PDFView.ChangeFitMode(FitMode.FitWidth);
  112. CPDFSaclingControl.InitWithPDFViewer(pdfViewControl.PDFView);
  113. CPDFSaclingControl.SetZoomTextBoxText(string.Format("{0}", (int)(pdfViewControl.PDFView.ZoomFactor * 100)));
  114. FloatPageTool.InitWithPDFViewer(pdfViewControl.PDFView);
  115. BotaSideTool.InitWithPDFViewer(pdfViewControl.PDFView);
  116. BotaSideTool.SelectBotaTool(BOTATools.Thumbnail);
  117. ViewSettingBtn.IsChecked = false;
  118. PropertyContainer.Child = null;
  119. PropertyContainer.Visibility = Visibility.Collapsed;
  120. SetEditMode();
  121. }
  122. private void LoadDefaultDocument()
  123. {
  124. string defaultFilePath = "PDF32000_2008.pdf";
  125. pdfViewControl = new PDFViewControl();
  126. pdfViewControl.PDFView.InitDocument(defaultFilePath);
  127. LoadDocument();
  128. }
  129. #endregion
  130. #region Password
  131. private void PasswordUI_Confirmed(object sender, string e)
  132. {
  133. if (passwordViewer != null && passwordViewer.PDFView != null && passwordViewer.PDFView.Document != null)
  134. {
  135. passwordViewer.PDFView.Document.UnlockWithPassword(e);
  136. if (passwordViewer.PDFView.Document.IsLocked == false)
  137. {
  138. PasswordUI.SetShowError("", Visibility.Collapsed);
  139. PasswordUI.ClearPassword();
  140. PasswordUI.Visibility = Visibility.Collapsed;
  141. PopupBorder.Visibility = Visibility.Collapsed;
  142. pdfViewControl = passwordViewer;
  143. LoadDocument();
  144. }
  145. else
  146. {
  147. PasswordUI.SetShowError("Wrong Password", Visibility.Visible);
  148. }
  149. }
  150. }
  151. private void PasswordUI_Canceled(object sender, EventArgs e)
  152. {
  153. PopupBorder.Visibility = Visibility.Collapsed;
  154. PasswordUI.Visibility = Visibility.Collapsed;
  155. }
  156. private void PasswordUI_Closed(object sender, EventArgs e)
  157. {
  158. PopupBorder.Visibility = Visibility.Collapsed;
  159. PasswordUI.Visibility = Visibility.Collapsed;
  160. }
  161. #endregion
  162. #region Expand and collapse Panel
  163. private void ExpandLeftPanel(bool isExpand)
  164. {
  165. BotaSideTool.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
  166. Splitter.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
  167. if (isExpand)
  168. {
  169. BodyGrid.ColumnDefinitions[0].Width = new GridLength(260);
  170. BodyGrid.ColumnDefinitions[1].Width = new GridLength(15);
  171. }
  172. else
  173. {
  174. BodyGrid.ColumnDefinitions[0].Width = new GridLength(0);
  175. BodyGrid.ColumnDefinitions[1].Width = new GridLength(0);
  176. }
  177. }
  178. #endregion
  179. #region Context menu
  180. private void PDFView_AnnotCommandHandler(object sender, AnnotCommandArgs e)
  181. {
  182. if (e != null && e.CommandType == CommandType.Context)
  183. {
  184. if (e.PressOnSelectedText)
  185. {
  186. e.Handle = true;
  187. e.PopupMenu = new ContextMenu();
  188. e.PopupMenu.Items.Add(new MenuItem() { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
  189. }
  190. else if (e.CommandTarget == TargetType.ImageSelection)
  191. {
  192. if (pdfViewControl != null && pdfViewControl.PDFView != null && pdfViewControl.PDFView.GetSelectImageCount() > 0)
  193. {
  194. e.Handle = true;
  195. e.PopupMenu = new ContextMenu();
  196. MenuItem imageCopyMenu = new MenuItem();
  197. imageCopyMenu = new MenuItem();
  198. imageCopyMenu.Header = "Copy Images";
  199. WeakEventManager<MenuItem, RoutedEventArgs>.AddHandler(imageCopyMenu, "Click", CopyImage_Click);
  200. imageCopyMenu.CommandParameter = e;
  201. e.PopupMenu.Items.Add(imageCopyMenu);
  202. MenuItem imageExtraMenu = new MenuItem();
  203. imageExtraMenu = new MenuItem();
  204. imageExtraMenu.Header = "Extract Images";
  205. WeakEventManager<MenuItem, RoutedEventArgs>.AddHandler(imageExtraMenu, "Click", ExtraImage_Click);
  206. imageExtraMenu.CommandParameter = e;
  207. e.PopupMenu.Items.Add(imageExtraMenu);
  208. }
  209. }
  210. else
  211. {
  212. e.Handle = true;
  213. e.PopupMenu = new ContextMenu();
  214. MenuItem fitWidthMenu = new MenuItem();
  215. fitWidthMenu.Header = "Automatically Resize";
  216. fitWidthMenu.Click += (o, p) =>
  217. {
  218. if (pdfViewControl != null)
  219. {
  220. pdfViewControl.PDFView?.ChangeFitMode(FitMode.FitWidth);
  221. }
  222. };
  223. e.PopupMenu.Items.Add(fitWidthMenu);
  224. MenuItem fitSizeMenu = new MenuItem();
  225. fitSizeMenu.Header = "Actual Size";
  226. fitSizeMenu.Click += (o, p) =>
  227. {
  228. if (pdfViewControl != null)
  229. {
  230. pdfViewControl.PDFView?.ChangeFitMode(FitMode.FitSize);
  231. }
  232. };
  233. e.PopupMenu.Items.Add(fitSizeMenu);
  234. MenuItem zoomInMenu = new MenuItem();
  235. zoomInMenu.Header = "Zoom In";
  236. zoomInMenu.Click += (o, p) =>
  237. {
  238. if (pdfViewControl != null)
  239. {
  240. double newZoom = CheckZoomLevel(pdfViewControl.PDFView.ZoomFactor + 0.01, true);
  241. pdfViewControl.PDFView?.Zoom(newZoom);
  242. }
  243. };
  244. e.PopupMenu.Items.Add(zoomInMenu);
  245. MenuItem zoomOutMenu = new MenuItem();
  246. zoomOutMenu.Header = "Zoom Out";
  247. zoomOutMenu.Click += (o, p) =>
  248. {
  249. if (pdfViewControl != null)
  250. {
  251. double newZoom = CheckZoomLevel(pdfViewControl.PDFView.ZoomFactor - 0.01, false);
  252. pdfViewControl.PDFView?.Zoom(newZoom);
  253. }
  254. };
  255. e.PopupMenu.Items.Add(zoomOutMenu);
  256. e.PopupMenu.Items.Add(new Separator());
  257. MenuItem singleView = new MenuItem();
  258. singleView.Header = "Single Page";
  259. singleView.Click += (o, p) =>
  260. {
  261. if (pdfViewControl != null)
  262. {
  263. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.Single);
  264. }
  265. };
  266. e.PopupMenu.Items.Add(singleView);
  267. MenuItem singleContinuousView = new MenuItem();
  268. singleContinuousView.Header = "Single Page Continuous";
  269. singleContinuousView.Click += (o, p) =>
  270. {
  271. if (pdfViewControl != null)
  272. {
  273. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.SingleContinuous);
  274. }
  275. };
  276. e.PopupMenu.Items.Add(singleContinuousView);
  277. MenuItem doubleView = new MenuItem();
  278. doubleView.Header = "Two Pages";
  279. doubleView.Click += (o, p) =>
  280. {
  281. if (pdfViewControl != null)
  282. {
  283. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.Double);
  284. }
  285. };
  286. e.PopupMenu.Items.Add(doubleView);
  287. MenuItem doubleContinuousView = new MenuItem();
  288. doubleContinuousView.Header = "Two Pages Continuous";
  289. doubleContinuousView.Click += (o, p) =>
  290. {
  291. if (pdfViewControl != null)
  292. {
  293. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.DoubleContinuous);
  294. }
  295. };
  296. e.PopupMenu.Items.Add(doubleContinuousView);
  297. }
  298. }
  299. if (e != null && e.CommandType == CommandType.Copy)
  300. {
  301. e.DoCommand();
  302. }
  303. }
  304. private void CopyImage_Click(object sender, RoutedEventArgs e)
  305. {
  306. try
  307. {
  308. Dictionary<int, List<Bitmap>> imageDict = pdfViewControl.PDFView?.GetSelectedImages();
  309. if (imageDict != null && imageDict.Count > 0)
  310. {
  311. foreach (int pageIndex in imageDict.Keys)
  312. {
  313. List<Bitmap> imageList = imageDict[pageIndex];
  314. foreach (Bitmap image in imageList)
  315. {
  316. MemoryStream ms = new MemoryStream();
  317. image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  318. BitmapImage imageData = new BitmapImage();
  319. imageData.BeginInit();
  320. imageData.StreamSource = ms;
  321. imageData.CacheOption = BitmapCacheOption.OnLoad;
  322. imageData.EndInit();
  323. imageData.Freeze();
  324. Clipboard.SetImage(imageData);
  325. break;
  326. }
  327. }
  328. }
  329. }
  330. catch (Exception ex)
  331. {
  332. }
  333. }
  334. private void ExtraImage_Click(object sender, RoutedEventArgs e)
  335. {
  336. System.Windows.Forms.FolderBrowserDialog folderDialog = new System.Windows.Forms.FolderBrowserDialog();
  337. if (folderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  338. {
  339. string choosePath = folderDialog.SelectedPath;
  340. string openPath = choosePath;
  341. try
  342. {
  343. Dictionary<int, List<Bitmap>> imageDict = pdfViewControl.PDFView?.GetSelectedImages();
  344. if (imageDict != null && imageDict.Count > 0)
  345. {
  346. foreach (int pageIndex in imageDict.Keys)
  347. {
  348. List<Bitmap> imageList = imageDict[pageIndex];
  349. foreach (Bitmap image in imageList)
  350. {
  351. string savePath = Path.Combine(choosePath, Guid.NewGuid() + ".jpg");
  352. image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  353. openPath = savePath;
  354. }
  355. }
  356. }
  357. Process.Start("explorer", "/select,\"" + openPath + "\"");
  358. }
  359. catch (Exception ex)
  360. {
  361. }
  362. }
  363. }
  364. private void PDFEditImageContextMenu(object sender, PDFEditCommand editCommand)
  365. {
  366. editCommand.PopupMenu = new ContextMenu();
  367. if (ApplicationCommands.Copy.CanExecute(null, (UIElement)sender) && lastPDFEditEvent != null)
  368. {
  369. MenuItem rotateLeftMenu = new MenuItem();
  370. rotateLeftMenu.Header = "Rotate Left";
  371. rotateLeftMenu.Click += (o, p) =>
  372. {
  373. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  374. {
  375. lastPDFEditEvent.Rotate = -90;
  376. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  377. imageEditControl?.SetImageThumb();
  378. }
  379. };
  380. editCommand.PopupMenu.Items.Add(rotateLeftMenu);
  381. MenuItem rotateRightMenu = new MenuItem();
  382. rotateRightMenu.Header = "Rotate Right";
  383. rotateRightMenu.Click += (o, p) =>
  384. {
  385. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  386. {
  387. lastPDFEditEvent.Rotate = 90;
  388. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  389. imageEditControl?.SetImageThumb();
  390. }
  391. };
  392. editCommand.PopupMenu.Items.Add(rotateRightMenu);
  393. MenuItem replaceMenu = new MenuItem();
  394. replaceMenu.Header = "Replace";
  395. replaceMenu.Click += (o, p) =>
  396. {
  397. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  398. {
  399. OpenFileDialog openFileDialog = new OpenFileDialog();
  400. openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
  401. if (openFileDialog.ShowDialog() == true)
  402. {
  403. lastPDFEditEvent.ReplaceImagePath = openFileDialog.FileName;
  404. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  405. pdfViewControl.PDFView?.ClearSelectPDFEdit();
  406. }
  407. }
  408. };
  409. editCommand.PopupMenu.Items.Add(replaceMenu);
  410. MenuItem exportMenu = new MenuItem();
  411. exportMenu.Header = "Export";
  412. exportMenu.Click += (o, p) =>
  413. {
  414. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  415. {
  416. Dictionary<int, List<Bitmap>> imageDict = pdfViewControl.PDFView.GetSelectedImages();
  417. if (imageDict != null && imageDict.Count > 0)
  418. {
  419. System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
  420. if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  421. {
  422. string choosePath = folderBrowser.SelectedPath;
  423. string openPath = choosePath;
  424. try
  425. {
  426. foreach (int pageIndex in imageDict.Keys)
  427. {
  428. List<Bitmap> imageList = imageDict[pageIndex];
  429. foreach (Bitmap image in imageList)
  430. {
  431. string savePath = System.IO.Path.Combine(choosePath, Guid.NewGuid() + ".jpg");
  432. image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  433. openPath = savePath;
  434. }
  435. }
  436. Process.Start("explorer", "/select,\"" + openPath + "\"");
  437. }
  438. catch (Exception ex)
  439. {
  440. }
  441. }
  442. }
  443. }
  444. };
  445. editCommand.PopupMenu.Items.Add(exportMenu);
  446. MenuItem opacityMenu = new MenuItem();
  447. opacityMenu.Header = "Opacity";
  448. editCommand.PopupMenu.Items.Add(opacityMenu);
  449. AppendOpacityMenu(opacityMenu);
  450. MenuItem horizonMirror = new MenuItem();
  451. horizonMirror.Header = "Flip horizontal";
  452. horizonMirror.Click += (o, p) =>
  453. {
  454. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  455. {
  456. lastPDFEditEvent.HorizontalMirror = true;
  457. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  458. imageEditControl?.SetImageThumb();
  459. }
  460. };
  461. editCommand.PopupMenu.Items.Add(horizonMirror);
  462. MenuItem verticalMirror = new MenuItem();
  463. verticalMirror.Header = "Flip vertical";
  464. verticalMirror.Click += (o, p) =>
  465. {
  466. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  467. {
  468. lastPDFEditEvent.VerticalMirror = true;
  469. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  470. imageEditControl?.SetImageThumb();
  471. }
  472. };
  473. editCommand.PopupMenu.Items.Add(verticalMirror);
  474. MenuItem cropMenu = new MenuItem();
  475. cropMenu.Header = "Crop";
  476. cropMenu.Click += (o, p) =>
  477. {
  478. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  479. {
  480. lastPDFEditEvent.ClipImage = true;
  481. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  482. }
  483. };
  484. editCommand.PopupMenu.Items.Add(cropMenu);
  485. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
  486. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Cut", Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
  487. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Delete", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
  488. }
  489. else
  490. {
  491. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
  492. }
  493. }
  494. private void AppendOpacityMenu(MenuItem parentMenu)
  495. {
  496. List<int> opacityList = new List<int>()
  497. {
  498. 25,50,75,100
  499. };
  500. foreach (int opacity in opacityList)
  501. {
  502. MenuItem opacityMenu = new MenuItem();
  503. opacityMenu.Header = string.Format("{0}%", opacity);
  504. opacityMenu.Click += (o, p) =>
  505. {
  506. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  507. {
  508. lastPDFEditEvent.Transparency = (int)(opacity * 255 / 100D);
  509. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  510. imageEditControl?.SetImageTransparency(lastPDFEditEvent.Transparency);
  511. imageEditControl?.SetImageThumb();
  512. }
  513. };
  514. parentMenu.Items.Add(opacityMenu);
  515. }
  516. }
  517. private void PDFEditTextContextMenu(object sender, PDFEditCommand editCommand)
  518. {
  519. editCommand.PopupMenu = new ContextMenu();
  520. if (lastPDFEditEvent != null)
  521. {
  522. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
  523. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Cut", Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
  524. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Delete", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
  525. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
  526. }
  527. else
  528. {
  529. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
  530. if (editCommand.TextAreaCopied)
  531. {
  532. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste And Match Style", Command = CustomCommands.PasteMatchStyle, CommandTarget = (UIElement)sender });
  533. }
  534. }
  535. }
  536. #endregion
  537. #region UI
  538. /// <summary>
  539. /// Check the zoom factor
  540. /// </summary>
  541. private double CheckZoomLevel(double zoom, bool IsGrowth)
  542. {
  543. double standardZoom = 100;
  544. if (zoom <= 0.01)
  545. {
  546. return 0.01;
  547. }
  548. if (zoom >= 10)
  549. {
  550. return 10;
  551. }
  552. zoom *= 100;
  553. for (int i = 0; i < zoomLevelList.Length - 1; i++)
  554. {
  555. if (zoom > zoomLevelList[i] && zoom <= zoomLevelList[i + 1] && IsGrowth)
  556. {
  557. standardZoom = zoomLevelList[i + 1];
  558. break;
  559. }
  560. if (zoom >= zoomLevelList[i] && zoom < zoomLevelList[i + 1] && !IsGrowth)
  561. {
  562. standardZoom = zoomLevelList[i];
  563. break;
  564. }
  565. }
  566. return standardZoom / 100;
  567. }
  568. private void PageView_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  569. {
  570. UIElement pageView = sender as UIElement;
  571. if (pageView != null)
  572. {
  573. pageView.MouseLeftButtonUp -= PageView_MouseLeftButtonUp;
  574. }
  575. SetImageEditProperty();
  576. }
  577. private void RightPanelBtn_Click(object sender, RoutedEventArgs e)
  578. {
  579. ViewSettingBtn.IsChecked = false;
  580. ToggleButton toggleButton = sender as ToggleButton;
  581. if (toggleButton != null)
  582. {
  583. if (toggleButton.IsChecked == true)
  584. {
  585. if (PropertyContainer.Child is CPDFDisplaySettingsControl)
  586. {
  587. PropertyContainer.Child = prevPanel;
  588. }
  589. if (PropertyContainer.Child == null)
  590. {
  591. PropertyContainer.Child = empytPanel;
  592. }
  593. PropertyContainer.Visibility = Visibility.Visible;
  594. }
  595. else
  596. {
  597. PropertyContainer.Visibility = Visibility.Collapsed;
  598. }
  599. }
  600. }
  601. private void ToolExpand_Click(object sender, RoutedEventArgs e)
  602. {
  603. ToggleButton expandBtn = sender as ToggleButton;
  604. if (expandBtn != null)
  605. {
  606. bool isExpand = expandBtn.IsChecked == true;
  607. ExpandLeftPanel(isExpand);
  608. }
  609. }
  610. private void ExpandSearchBtn_Click(object sender, RoutedEventArgs e)
  611. {
  612. ToolExpandBtn.IsChecked = true;
  613. ExpandLeftPanel(true);
  614. BotaSideTool.SelectBotaTool(BOTATools.Search);
  615. }
  616. private void ViewSettingBtn_Click(object sender, RoutedEventArgs e)
  617. {
  618. RightPanelBtn.IsChecked = false;
  619. ToggleButton toggleButton = sender as ToggleButton;
  620. if (toggleButton != null)
  621. {
  622. if (toggleButton.IsChecked == true)
  623. {
  624. CPDFDisplaySettingsControl displayPanel = new CPDFDisplaySettingsControl();
  625. displayPanel.SetSplitContainerVisibility(Visibility.Collapsed);
  626. displayPanel.InitWithPDFViewer(pdfViewControl.PDFView);
  627. prevPanel = PropertyContainer.Child;
  628. PropertyContainer.Child = displayPanel;
  629. PropertyContainer.Visibility = Visibility.Visible;
  630. }
  631. else
  632. {
  633. PropertyContainer.Child = null;
  634. PropertyContainer.Visibility = Visibility.Collapsed;
  635. }
  636. }
  637. }
  638. private void NextPageBorder_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  639. {
  640. pdfViewControl.PDFView?.GoToPage(pdfViewControl.PDFView.CurrentIndex + 1);
  641. }
  642. private void PrevPageBorder_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  643. {
  644. pdfViewControl.PDFView?.GoToPage(pdfViewControl.PDFView.CurrentIndex - 1);
  645. }
  646. private void PageInfoBtn_Click(object sender, RoutedEventArgs e)
  647. {
  648. PasswordUI.Visibility = Visibility.Collapsed;
  649. FileInfoUI.Visibility = Visibility.Visible;
  650. FileInfoControl.InitWithPDFViewer(pdfViewControl.PDFView);
  651. PopupBorder.Visibility = Visibility.Visible;
  652. }
  653. private void FileInfoCloseBtn_Click(object sender, RoutedEventArgs e)
  654. {
  655. PopupBorder.Visibility = Visibility.Collapsed;
  656. }
  657. private void OpenFile_Click(object sender, RoutedEventArgs e)
  658. {
  659. try
  660. {
  661. string filePath = CommonHelper.GetFilePathOrEmpty();
  662. if (!string.IsNullOrEmpty(filePath) && pdfViewControl != null)
  663. {
  664. if (pdfViewControl.PDFView != null && pdfViewControl.PDFView.Document != null)
  665. {
  666. string oldFilePath = pdfViewControl.PDFView.Document.FilePath;
  667. if (oldFilePath.ToLower() == filePath.ToLower())
  668. {
  669. return;
  670. }
  671. }
  672. passwordViewer = new PDFViewControl();
  673. passwordViewer.PDFView.InitDocument(filePath);
  674. if (passwordViewer.PDFView.Document == null)
  675. {
  676. MessageBox.Show("Open File Failed");
  677. return;
  678. }
  679. if (passwordViewer.PDFView.Document.IsLocked)
  680. {
  681. PasswordUI.SetShowText(System.IO.Path.GetFileName(filePath) + " password encrypted.");
  682. PasswordUI.ClearPassword();
  683. PopupBorder.Visibility = Visibility.Visible;
  684. PasswordUI.Visibility = Visibility.Visible;
  685. }
  686. else
  687. {
  688. pdfViewControl = passwordViewer;
  689. LoadDocument();
  690. }
  691. }
  692. }
  693. catch (Exception ex)
  694. {
  695. }
  696. }
  697. private void SaveFileBtn_Click(object sender, RoutedEventArgs e)
  698. {
  699. SaveFile();
  700. }
  701. private void PDFTextEditButton_Click(object sender, RoutedEventArgs e)
  702. {
  703. ToggleButton senderBtn = sender as ToggleButton;
  704. if (senderBtn != null && pdfViewControl != null)
  705. {
  706. ClearPDFEditState(senderBtn);
  707. RightPanelBtn.IsChecked = false;
  708. if (PropertyContainer.Child != null)
  709. {
  710. PropertyContainer.Child = empytPanel;
  711. }
  712. if (senderBtn.IsChecked == true)
  713. {
  714. pdfViewControl.PDFView?.SetMouseMode(MouseModes.Viewer);
  715. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditText);
  716. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.EditText);
  717. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  718. pdfViewControl.PDFView?.ReloadDocument();
  719. }
  720. else
  721. {
  722. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.None);
  723. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditImage | CPDFEditType.EditText);
  724. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  725. pdfViewControl.PDFView?.ReloadDocument();
  726. }
  727. }
  728. }
  729. private void PDFImageEditButton_Click(object sender, RoutedEventArgs e)
  730. {
  731. ToggleButton senderBtn = sender as ToggleButton;
  732. if (senderBtn != null && pdfViewControl != null)
  733. {
  734. ClearPDFEditState(senderBtn);
  735. senderBtn.IsChecked = false;
  736. OpenFileDialog openFileDialog = new OpenFileDialog();
  737. openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
  738. if (openFileDialog.ShowDialog() == true)
  739. {
  740. pdfViewControl.PDFView?.ClearSelectPDFEdit();
  741. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditImage | CPDFEditType.EditText);
  742. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  743. pdfViewControl.PDFView?.ReloadDocument();
  744. RightPanelBtn.IsChecked = false;
  745. if (PropertyContainer.Child != null)
  746. {
  747. PropertyContainer.Child = empytPanel;
  748. }
  749. PropertyContainer.Visibility = Visibility.Collapsed;
  750. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.EditImage);
  751. pdfViewControl.PDFView?.AddPDFEditImage(openFileDialog.FileName);
  752. }
  753. }
  754. }
  755. private void ClearPDFEditState(ToggleButton ignoreBtn = null)
  756. {
  757. List<ToggleButton> clearBtnList = new List<ToggleButton>()
  758. {
  759. PDFTextEditButton,
  760. PDFImageEditButton
  761. };
  762. foreach (ToggleButton item in clearBtnList)
  763. {
  764. if (ignoreBtn == item)
  765. {
  766. continue;
  767. }
  768. item.IsChecked = false;
  769. }
  770. }
  771. private void UndoBtn_Click(object sender, RoutedEventArgs e)
  772. {
  773. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  774. {
  775. pdfViewControl.PDFView.UndoManager?.Undo();
  776. }
  777. }
  778. private void RedoBtn_Click(object sender, RoutedEventArgs e)
  779. {
  780. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  781. {
  782. pdfViewControl.PDFView.UndoManager?.Redo();
  783. }
  784. }
  785. #endregion
  786. #region Property changed
  787. protected void OnPropertyChanged([CallerMemberName] string name = null)
  788. {
  789. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
  790. }
  791. private void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
  792. {
  793. OnPropertyChanged(e.PropertyName);
  794. }
  795. #endregion
  796. #region Event handle
  797. private void PDFView_PDFEditCommandHandler(object sender, PDFEditCommand e)
  798. {
  799. if (e == null)
  800. {
  801. return;
  802. }
  803. if (e.EditType == CPDFEditType.EditText)
  804. {
  805. e.Handle = true;
  806. PDFEditTextContextMenu(sender, e);
  807. }
  808. if (e.EditType == CPDFEditType.EditImage)
  809. {
  810. e.Handle = true;
  811. PDFEditImageContextMenu(sender, e);
  812. }
  813. }
  814. private void PDFView_PDFEditActiveHandler(object sender, PDFEditEvent e)
  815. {
  816. PDFEditEvent tempEvent = lastPDFEditEvent;
  817. lastPDFEditEvent = e;
  818. ViewSettingBtn.IsChecked = false;
  819. if (e == null)
  820. {
  821. PropertyContainer.Child = null;
  822. RightPanelBtn.IsChecked = false;
  823. PropertyContainer.Visibility = Visibility.Collapsed;
  824. return;
  825. }
  826. if (Mouse.RightButton == MouseButtonState.Pressed && PropertyContainer.Visibility != Visibility.Visible)
  827. {
  828. return;
  829. }
  830. if (e.EditType == CPDFEditType.EditText)
  831. {
  832. if (textEditControl == null)
  833. {
  834. textEditControl = new PDFTextEditControl();
  835. }
  836. textEditControl.SetPDFTextEditData(e);
  837. PropertyContainer.Child = textEditControl;
  838. PropertyContainer.Visibility = Visibility.Visible;
  839. RightPanelBtn.IsChecked = true;
  840. return;
  841. }
  842. if (e.EditType == CPDFEditType.EditImage && pdfViewControl != null)
  843. {
  844. UIElement pageView = sender as UIElement;
  845. if (pageView != null)
  846. {
  847. pageView.MouseLeftButtonUp -= PageView_MouseLeftButtonUp;
  848. pageView.MouseLeftButtonUp += PageView_MouseLeftButtonUp;
  849. }
  850. if (Mouse.RightButton == MouseButtonState.Pressed)
  851. {
  852. SetImageEditProperty();
  853. }
  854. return;
  855. }
  856. }
  857. #endregion
  858. #region Save file
  859. private void SaveFile()
  860. {
  861. if (pdfViewControl != null && pdfViewControl.PDFView != null && pdfViewControl.PDFView.Document != null)
  862. {
  863. CPDFDocument pdfDoc = pdfViewControl.PDFView.Document;
  864. if (pdfDoc.WriteToLoadedPath())
  865. {
  866. return;
  867. }
  868. SaveFileDialog saveDialog = new SaveFileDialog();
  869. saveDialog.Filter = "(*.pdf)|*.pdf";
  870. saveDialog.DefaultExt = ".pdf";
  871. saveDialog.OverwritePrompt = true;
  872. if (saveDialog.ShowDialog() == true)
  873. {
  874. pdfDoc.WriteToFilePath(saveDialog.FileName);
  875. }
  876. }
  877. }
  878. #endregion
  879. #region Selected changed
  880. private void PdfViewer_InfoChanged(object sender, KeyValuePair<string, object> e)
  881. {
  882. if (e.Key == "Zoom")
  883. {
  884. CPDFSaclingControl.SetZoomTextBoxText(string.Format("{0}", (int)((double)e.Value * 100)));
  885. }
  886. }
  887. private void SetImageEditProperty()
  888. {
  889. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  890. {
  891. if (imageEditControl == null)
  892. {
  893. imageEditControl = new PDFImageEditControl();
  894. }
  895. imageEditControl.InitWithPDFViewer(pdfViewControl.PDFView);
  896. imageEditControl.SetPDFImageEditData(lastPDFEditEvent);
  897. PropertyContainer.Child = imageEditControl;
  898. PropertyContainer.Visibility = Visibility.Visible;
  899. RightPanelBtn.IsChecked = true;
  900. }
  901. }
  902. private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  903. {
  904. SetEditMode();
  905. }
  906. private void SetEditMode()
  907. {
  908. ClearPDFEditState(null);
  909. if (pdfViewControl != null && ViewComboBox != null)
  910. {
  911. if (ViewComboBox.SelectedIndex == 0)
  912. {
  913. PDFEditTool.Visibility = Visibility.Collapsed;
  914. pdfViewControl.PDFView?.SetShowLink(true);
  915. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.None);
  916. pdfViewControl.PDFView?.SetMouseMode(MouseModes.Viewer);
  917. pdfViewControl.PDFView?.ReloadDocument();
  918. if (PropertyContainer != null)
  919. {
  920. PropertyContainer.Child = null;
  921. }
  922. return;
  923. }
  924. if (ViewComboBox.SelectedIndex == 1)
  925. {
  926. PDFEditTool.Visibility = Visibility.Visible;
  927. pdfViewControl.PDFView?.SetShowLink(false);
  928. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditText | CPDFEditType.EditImage);
  929. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.None);
  930. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  931. pdfViewControl.PDFView?.ReloadDocument();
  932. }
  933. }
  934. }
  935. #endregion
  936. #region Close window
  937. protected override void OnClosing(CancelEventArgs e)
  938. {
  939. if (pdfViewControl.PDFView.UndoManager.CanSave)
  940. {
  941. MessageBoxResult result = MessageBox.Show("Do you want to save your changes before closing the application?", "Message", MessageBoxButton.YesNoCancel);
  942. if (result == MessageBoxResult.Yes)
  943. {
  944. SaveFile();
  945. }
  946. else if (result == MessageBoxResult.No)
  947. {
  948. }
  949. else
  950. {
  951. e.Cancel = true;
  952. }
  953. }
  954. }
  955. #endregion
  956. }
  957. }