ComparisonSettingDialog.xaml.cs 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563
  1. using System.Windows;
  2. using ComPDFKit.Compare;
  3. using ComPDFKit.PDFDocument;
  4. using ComPDFKit.PDFPage;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Drawing;
  8. using System.Drawing.Imaging;
  9. using System.Linq;
  10. using System.Text.RegularExpressions;
  11. using System.Threading.Tasks;
  12. using System.Windows.Controls;
  13. using System.Windows.Input;
  14. using System.Windows.Media;
  15. using System.Windows.Media.Imaging;
  16. using System.IO;
  17. using System.Windows.Forms;
  18. using System.Windows.Interop;
  19. using System.Runtime.InteropServices;
  20. using ComPDFKit.Controls.Common;
  21. using ComPDFKit.Controls.Helper;
  22. using ComPDFKit.Controls.PDFControl;
  23. using ComPDFKit.Controls.Properties;
  24. using Color = System.Windows.Media.Color;
  25. using ColorConverter = System.Windows.Media.ColorConverter;
  26. using ComboBox = System.Windows.Forms.ComboBox;
  27. using Image = System.Windows.Controls.Image;
  28. namespace ComPDFKit.Controls.Comparison
  29. {
  30. /// <summary>
  31. /// ConvertPage.xaml 的交互逻辑
  32. /// </summary>
  33. ///
  34. public enum CompareType
  35. {
  36. ContentCompare = 1,
  37. OverwriteCompare = 2
  38. }
  39. public partial class ComparisonSettingDialog : Window
  40. {
  41. [DllImport("gdi32.dll")]
  42. public static extern bool DeleteObject(IntPtr hObject);
  43. /// <summary>
  44. /// 0 Unknow 1 Content Compare 2 Overwrite Compare
  45. /// </summary>
  46. private CompareType CompareType { get; set; } = CompareType.ContentCompare;
  47. public CPDFDocument OldDocument { get; private set; }
  48. public CPDFDocument NewDocument { get; private set; }
  49. private List<string> NewFilePathList { get; set; } = new List<string>();
  50. private List<string> OldFilePathList { get; set; } = new List<string>();
  51. public Dictionary<string, string> FileAndPassword = new Dictionary<string, string>();
  52. //private List<int> OldRange { get; set; } = new List<int>();
  53. //private List<int> NewRange { get; set; } = new List<int>();
  54. private CPDFCompareType ObjectCompareType { get; set; } = CPDFCompareType.CPDFCompareTypeAll;
  55. private Color ReplaceColor { get; set; } = Color.FromRgb(255, 214, 102);
  56. private Color InsertColor { get; set; } = Color.FromRgb(51, 135, 255);
  57. private Color DeleteColor { get; set; } = Color.FromRgb(255, 51, 51);
  58. private double OldOpacity { get; set; } = 1;
  59. private double NewOpacity { get; set; } = 1;
  60. private Color OldMarkColor { get; set; } = Color.FromRgb(255, 51, 51);
  61. private Color NewMarkColor { get; set; } = Color.FromRgb(51, 135, 255);
  62. private CPDFBlendMode MixMode { get; set; } = CPDFBlendMode.CPDFBlendModeDarken;
  63. private PDFViewControl viewCtrl = null;
  64. private List<CPDFBlendMode> MixModeList { get; set; } = new List<CPDFBlendMode>()
  65. {
  66. CPDFBlendMode.CPDFBlendModeNormal,
  67. CPDFBlendMode.CPDFBlendModeMultiply,
  68. CPDFBlendMode.CPDFBlendModeScreen,
  69. CPDFBlendMode.CPDFBlendModeOverlay,
  70. CPDFBlendMode.CPDFBlendModeDarken,
  71. CPDFBlendMode.CPDFBlendModeLighten,
  72. CPDFBlendMode.CPDFBlendModeColorDodge,
  73. CPDFBlendMode.CPDFBlendModeColorBurn,
  74. CPDFBlendMode.CPDFBlendModeHardLight,
  75. CPDFBlendMode.CPDFBlendModeSoftLight,
  76. CPDFBlendMode.CPDFBlendModeDifference,
  77. CPDFBlendMode.CPDFBlendModeExclusion,
  78. CPDFBlendMode.CPDFBlendModeHue,
  79. CPDFBlendMode.CPDFBlendModeSaturation,
  80. CPDFBlendMode.CPDFBlendModeColor,
  81. CPDFBlendMode.CPDFBlendModeLuminosity
  82. };
  83. private bool IsFillWhite { get; set; } = false;
  84. public event EventHandler<UIElement> OnCompareStatusChanged;
  85. public ComparisonSettingDialog(PDFViewControl viewCtrl)
  86. {
  87. InitializeComponent();
  88. this.viewCtrl = viewCtrl;
  89. SwapeImage.IsEnabled = false;
  90. Title = LanguageHelper.CompareManager.GetString("Title_CompareDoc");
  91. }
  92. public string ConvertBrushToHex(Color color)
  93. {
  94. return $"#{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}";
  95. }
  96. public static Color ConvertHexToColor(string hex)
  97. {
  98. return (Color)ColorConverter.ConvertFromString(hex);
  99. }
  100. private int AddNewFileList(string filename, string filepath)
  101. {
  102. if (!NewFilePathList.Contains(filepath))
  103. {
  104. NewFileComboBox.Items.Insert(0, filename);
  105. NewFilePathList.Insert(0, filepath);
  106. NewFileComboBox.IsEnabled = true;
  107. if (NewFilePathList.Count > 5 && NewFileComboBox.Items.Count > 5)
  108. {
  109. NewFilePathList.RemoveAt(NewFilePathList.Count - 1);
  110. NewFileComboBox.Items.RemoveAt(NewFileComboBox.Items.Count - 1);
  111. }
  112. return 0;
  113. }
  114. else
  115. {
  116. return NewFilePathList.IndexOf(filepath);
  117. }
  118. }
  119. private int AddOldFileList(string filename, string filepath)
  120. {
  121. if (!OldFilePathList.Contains(filepath))
  122. {
  123. OldFileComboBox.Items.Insert(0, filename);
  124. OldFilePathList.Insert(0, filepath);
  125. if (OldFilePathList.Count > 5 && OldFileComboBox.Items.Count > 5)
  126. {
  127. OldFilePathList.RemoveAt(OldFilePathList.Count - 1);
  128. OldFileComboBox.Items.RemoveAt(OldFileComboBox.Items.Count - 1);
  129. }
  130. return 0;
  131. }
  132. else
  133. {
  134. return OldFilePathList.IndexOf(filepath);
  135. }
  136. }
  137. private void CompareType_MouseLeftDown(object sender, MouseButtonEventArgs e)
  138. {
  139. }
  140. public void SetCompareType(CompareType compareType)
  141. {
  142. if (compareType == CompareType.ContentCompare)
  143. {
  144. CompareTypeTab.SelectedIndex = 0;
  145. }
  146. else
  147. {
  148. CompareTypeTab.SelectedIndex = 1;
  149. }
  150. }
  151. private void CompareTypeTab_SelectionChanged(object sender, SelectionChangedEventArgs e)
  152. {
  153. if (CompareTypeTab != null)
  154. {
  155. if (CompareTypeTab.SelectedIndex == 0)
  156. {
  157. CompareType = CompareType.ContentCompare;
  158. ContentSettingBox.Visibility = Visibility.Visible;
  159. OverlaySettingBox.Visibility = Visibility.Collapsed;
  160. }
  161. if (CompareTypeTab.SelectedIndex == 1)
  162. {
  163. CompareType = CompareType.OverwriteCompare;
  164. ContentSettingBox.Visibility = Visibility.Collapsed;
  165. OverlaySettingBox.Visibility = Visibility.Visible;
  166. }
  167. }
  168. }
  169. private void Close_MouseLeftDown(object sender, MouseButtonEventArgs e)
  170. {
  171. //MainWindow parentWnd = Window.GetWindow(this) as MainWindow;
  172. //if (parentWnd == null)
  173. //{
  174. // return;
  175. //}
  176. //parentWnd.ContentGrid.Children.Clear();
  177. //if (parentWnd.PrevElement != null)
  178. //{
  179. // parentWnd.ContentGrid.Children.Add(parentWnd.PrevElement);
  180. //}
  181. }
  182. public void UpdateDocCover(bool isOld)
  183. {
  184. if (isOld)
  185. {
  186. InitOldDocument();
  187. int select = AddOldFileList(OldDocument.FileName, OldDocument.FilePath);
  188. OldFileComboBox.SelectedIndex = select;
  189. }
  190. else
  191. {
  192. InitNewDocument();
  193. int select = AddNewFileList(NewDocument.FileName, NewDocument.FilePath);
  194. NewFileComboBox.SelectedIndex = select;
  195. }
  196. }
  197. public void SetDocument(CPDFDocument doc, bool isOld)
  198. {
  199. if (isOld)
  200. {
  201. OldDocument = doc;
  202. if (OldRange != null && OldRange.Count > 0)
  203. {
  204. List<int> rangeList = new List<int>();
  205. for (int i = OldRange.Min(); i <= OldRange.Max(); i++)
  206. {
  207. if (i >= doc.PageCount)
  208. {
  209. break;
  210. }
  211. rangeList.Add(i);
  212. }
  213. OldRange = rangeList;
  214. }
  215. }
  216. else
  217. {
  218. NewDocument = doc;
  219. if (NewRange != null && NewRange.Count > 0)
  220. {
  221. List<int> rangeList = new List<int>();
  222. for (int i = NewRange.Min(); i <= NewRange.Max(); i++)
  223. {
  224. if (i >= doc.PageCount)
  225. {
  226. break;
  227. }
  228. rangeList.Add(i);
  229. }
  230. NewRange = rangeList;
  231. }
  232. }
  233. }
  234. private void UpdateCover(CPDFDocument doc, Image imageControl, int pageIndex)
  235. {
  236. imageControl.Source = null;
  237. if (doc != null && doc.PageCount > 0 && doc.PageCount > pageIndex)
  238. {
  239. CPDFPage pdfPage = doc.PageAtIndex(pageIndex, true);
  240. int width = (int)pdfPage.PageSize.width;
  241. int height = (int)pdfPage.PageSize.height;
  242. Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  243. BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
  244. pdfPage.RenderPageBitmap(0, 0, width, height, uint.MaxValue, bitmapData.Scan0, 1 , true);
  245. bitmap.UnlockBits(bitmapData);
  246. IntPtr bitmapHandle = bitmap.GetHbitmap();
  247. BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(bitmapHandle, IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
  248. imageControl.Source = bitmapSource;
  249. DeleteObject(bitmapHandle);
  250. }
  251. }
  252. private string GetChoosePdf()
  253. {
  254. Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog();
  255. openFileDialog.Filter = "PDF Files(*.pdf;)|*.pdf;";
  256. if (openFileDialog.ShowDialog() == true)
  257. {
  258. return openFileDialog.FileName;
  259. }
  260. return string.Empty;
  261. }
  262. private void CheckDocPassword(CPDFDocument checkDoc)
  263. {
  264. if (checkDoc == null)
  265. {
  266. return;
  267. }
  268. if (checkDoc.IsLocked)
  269. {
  270. checkDoc.UnlockWithPassword(FileAndPassword[checkDoc.FilePath]);
  271. if (checkDoc.IsLocked)
  272. {
  273. PasswordDialog dialog = new PasswordDialog();
  274. dialog.Confirmed += (sender, s) =>
  275. {
  276. if (checkDoc.UnlockWithPassword(s))
  277. {
  278. FileAndPassword.Add(checkDoc.FilePath, s);
  279. }
  280. };
  281. }
  282. }
  283. }
  284. private void InitOldDocument()
  285. {
  286. TxtOldPage.Text = "1";
  287. CurrentOldPageIndex = 0;
  288. TxtOldPageCount.Text = "/" + OldDocument.PageCount;
  289. OldRange.Clear();
  290. for (int i = 0; i < OldDocument.PageCount; i++)
  291. {
  292. if (i < OldDocument.PageCount)
  293. {
  294. OldRange.Add(i);
  295. }
  296. }
  297. CmbOldPageRange.SelectedIndex = "0";
  298. if (OldFileComboBox.SelectedIndex != OldFilePathList.IndexOf(OldDocument.FilePath))
  299. {
  300. OldFileComboBox.SelectedIndex = OldFilePathList.IndexOf(OldDocument.FilePath);
  301. }
  302. UpdateCover(OldDocument, OldImageControl, CurrentOldPageIndex);
  303. CheckOldPageBtnState();
  304. UpdateOldPageIndex();
  305. }
  306. private void InitNewDocument()
  307. {
  308. TxtNewPage.Text = "1";
  309. CurrentNewPageIndex = 0;
  310. TxtNewPageCount.Text = "/" + NewDocument.PageCount;
  311. NewRange.Clear();
  312. for (int i = 0; i < NewDocument.PageCount; i++)
  313. {
  314. if (i < NewDocument.PageCount)
  315. {
  316. NewRange.Add(i);
  317. }
  318. }
  319. CmbNewPageRange.SelectedIndex = "0";
  320. if (NewFileComboBox.SelectedIndex != NewFilePathList.IndexOf(NewDocument.FilePath))
  321. {
  322. NewFileComboBox.SelectedIndex = NewFilePathList.IndexOf(NewDocument.FilePath);
  323. }
  324. UpdateCover(NewDocument, NewImageControl, CurrentNewPageIndex);
  325. CheckNewPageBtnState();
  326. UpdateNewPageIndex();
  327. }
  328. private void OldFileComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  329. {
  330. if (OldFilePathList != null && OldFilePathList.Count > OldFileComboBox.SelectedIndex && OldFileComboBox.SelectedIndex > -1)
  331. {
  332. string pdfFile = OldFilePathList[OldFileComboBox.SelectedIndex];
  333. if (File.Exists(pdfFile))
  334. {
  335. if (NewFilePathList != null && NewFileComboBox.SelectedIndex > -1 && !swapeImage)
  336. {
  337. if (pdfFile == NewFilePathList[NewFileComboBox.SelectedIndex])
  338. {
  339. OldFileComboBox.SelectedIndex = 0;
  340. // // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_DifferentFiles"));
  341. return;
  342. }
  343. }
  344. if (OldDocument != null)
  345. {
  346. if (OldDocument.FilePath != pdfFile)
  347. {
  348. CPDFDocument oldDocument = CPDFDocument.InitWithFilePath(pdfFile);
  349. CheckDocPassword(oldDocument);
  350. if (oldDocument.IsLocked == false)
  351. {
  352. OldDocument = oldDocument;
  353. }
  354. }
  355. }
  356. else
  357. {
  358. CPDFDocument oldDocument = CPDFDocument.InitWithFilePath(pdfFile);
  359. CheckDocPassword(oldDocument);
  360. if (oldDocument.IsLocked == false)
  361. {
  362. NewDocument = oldDocument;
  363. }
  364. }
  365. if (OldDocument != null && OldDocument.IsLocked == false)
  366. {
  367. if (OldFilePathList.IndexOf(OldDocument.FilePath) != 0)
  368. {
  369. OldFileComboBox.Items.RemoveAt(OldFilePathList.IndexOf(OldDocument.FilePath));
  370. OldFileComboBox.Items.Insert(0, OldDocument.FileName);
  371. OldFilePathList.Remove(OldDocument.FilePath);
  372. OldFilePathList.Insert(0, OldDocument.FilePath);
  373. OldFileComboBox.SelectedIndex = 0;
  374. }
  375. InitOldDocument();
  376. }
  377. else
  378. {
  379. NewFileComboBox.SelectedIndex = -1;
  380. }
  381. }
  382. else
  383. {
  384. OldFilePathList.RemoveAt(OldFileComboBox.SelectedIndex);
  385. NewFileComboBox.Items.RemoveAt(OldFileComboBox.SelectedIndex);
  386. if (OldFileComboBox.Items.Count > 0)
  387. {
  388. OldFileComboBox.SelectedIndex = 0;
  389. }
  390. else
  391. {
  392. OldFileComboBox.SelectedIndex = -1;
  393. }
  394. // // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_FileRemoved"));
  395. return;
  396. }
  397. }
  398. }
  399. private void NewFileComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  400. {
  401. if (NewFilePathList != null && NewFilePathList.Count > NewFileComboBox.SelectedIndex && NewFileComboBox.SelectedIndex > -1)
  402. {
  403. string pdfFile = NewFilePathList[NewFileComboBox.SelectedIndex];
  404. if (File.Exists(pdfFile))
  405. {
  406. if (OldFilePathList != null && OldFileComboBox.SelectedIndex > -1 && !swapeImage)
  407. {
  408. if (pdfFile == OldFilePathList[OldFileComboBox.SelectedIndex])
  409. {
  410. if (ADDFileBorder.Visibility != Visibility.Visible)
  411. {
  412. NewFileComboBox.SelectedIndex = 0;
  413. }
  414. else
  415. {
  416. NewFileComboBox.SelectedIndex = -1;
  417. }
  418. // // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_DifferentFiles"));
  419. return;
  420. }
  421. }
  422. if (NewDocument != null)
  423. {
  424. if (NewDocument.FilePath != pdfFile)
  425. {
  426. CPDFDocument newDocument = CPDFDocument.InitWithFilePath(pdfFile);
  427. CheckDocPassword(newDocument);
  428. if (newDocument.IsLocked == false)
  429. {
  430. NewDocument = newDocument;
  431. }
  432. }
  433. }
  434. else
  435. {
  436. CPDFDocument newDocument = CPDFDocument.InitWithFilePath(pdfFile);
  437. CheckDocPassword(newDocument);
  438. if (newDocument.IsLocked == false)
  439. {
  440. NewDocument = newDocument;
  441. }
  442. }
  443. if (NewDocument != null && NewDocument.IsLocked == false)
  444. {
  445. if (ADDFileBorder.Visibility == Visibility.Visible)
  446. {
  447. ADDFileBorder.Visibility = Visibility.Collapsed;
  448. }
  449. if (NewFilePathList.IndexOf(NewDocument.FilePath) != 0)
  450. {
  451. NewFileComboBox.Items.RemoveAt(NewFilePathList.IndexOf(NewDocument.FilePath));
  452. NewFileComboBox.Items.Insert(0, NewDocument.FileName);
  453. NewFilePathList.Remove(NewDocument.FilePath);
  454. NewFilePathList.Insert(0, NewDocument.FilePath);
  455. NewFileComboBox.SelectedIndex = 0;
  456. }
  457. SwapeImage.IsEnabled = true;
  458. InitNewDocument();
  459. }
  460. else
  461. {
  462. NewFileComboBox.SelectedIndex = -1;
  463. }
  464. }
  465. else
  466. {
  467. NewFilePathList.RemoveAt(NewFileComboBox.SelectedIndex);
  468. NewFileComboBox.Items.RemoveAt(NewFileComboBox.SelectedIndex);
  469. if (NewFileComboBox.Items.Count > 0)
  470. {
  471. NewFileComboBox.SelectedIndex = 0;
  472. }
  473. else
  474. {
  475. NewFileComboBox.SelectedIndex = -1;
  476. }
  477. // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_FileRemoved"));
  478. return;
  479. }
  480. }
  481. }
  482. private void BrowseOldBtn_Click(object sender, RoutedEventArgs e)
  483. {
  484. string pdfFile = GetChoosePdf();
  485. if (File.Exists(pdfFile))
  486. {
  487. if (NewFilePathList != null && NewFileComboBox.SelectedIndex > -1)
  488. {
  489. if (pdfFile == NewFilePathList[NewFileComboBox.SelectedIndex])
  490. {
  491. // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_DifferentFiles"));
  492. return;
  493. }
  494. }
  495. OldDocument = CPDFDocument.InitWithFilePath(pdfFile);
  496. CheckDocPassword(OldDocument);
  497. if (OldDocument != null && OldDocument.IsLocked == false)
  498. {
  499. int select = AddOldFileList(OldDocument.FileName, pdfFile);
  500. OldFileComboBox.SelectedIndex = select;
  501. InitOldDocument();
  502. }
  503. }
  504. }
  505. public void OpenOldFile(CPDFDocument document)
  506. {
  507. OldDocument = document;
  508. int select = AddOldFileList(OldDocument.FileName, document.FilePath);
  509. OldFileComboBox.SelectedIndex = select;
  510. InitOldDocument();
  511. }
  512. private void BrowseNewBtn_Click(object sender, RoutedEventArgs e)
  513. {
  514. string pdfFile = GetChoosePdf();
  515. if (File.Exists(pdfFile))
  516. {
  517. if (OldFilePathList != null && OldFileComboBox.SelectedIndex > -1)
  518. {
  519. if (pdfFile == OldFilePathList[OldFileComboBox.SelectedIndex])
  520. {
  521. // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_DifferentFiles"));
  522. return;
  523. }
  524. }
  525. NewDocument = CPDFDocument.InitWithFilePath(pdfFile);
  526. CheckDocPassword(NewDocument);
  527. if (NewDocument != null && NewDocument.IsLocked == false)
  528. {
  529. int select = AddNewFileList(NewDocument.FileName, pdfFile);
  530. NewFileComboBox.SelectedIndex = select;
  531. InitNewDocument();
  532. }
  533. }
  534. }
  535. public bool swapeImage = false;
  536. private void SwapeImage_MouseLeftDown(object sender, RoutedEventArgs e)
  537. {
  538. try
  539. {
  540. if (NewDocument != null && OldDocument != null)
  541. {
  542. swapeImage = true;
  543. UpdateCover(NewDocument, OldImageControl, CurrentOldPageIndex);
  544. UpdateCover(OldDocument, NewImageControl, CurrentNewPageIndex);
  545. CPDFDocument tempDoc = NewDocument;
  546. NewDocument = OldDocument;
  547. OldDocument = tempDoc;
  548. int oldselect = AddOldFileList(OldDocument.FileName, OldDocument.FilePath);
  549. OldFileComboBox.SelectedIndex = oldselect;
  550. int newselect = AddNewFileList(NewDocument.FileName, NewDocument.FilePath);
  551. NewFileComboBox.SelectedIndex = newselect;
  552. InitOldDocument();
  553. InitNewDocument();
  554. swapeImage = false;
  555. }
  556. else
  557. {
  558. swapeImage = false;
  559. // MessageBoxEx.Show(App.MainPageLoader.GetString("Main_NoSelectedFilesWarning"));
  560. }
  561. }
  562. catch
  563. {
  564. swapeImage = false;
  565. }
  566. }
  567. private void SavePageRanges(System.Windows.Controls.TextBox textBox, CPDFDocument doc, List<int> rangeList)
  568. {
  569. rangeList.Clear();
  570. if (textBox.Text != string.Empty && doc != null)
  571. {
  572. string[] checkTextArray = textBox.Text.Split(',');
  573. foreach (string checkText in checkTextArray)
  574. {
  575. if (Regex.IsMatch(checkText, "[0-9]+") && Regex.IsMatch(checkText, "[^0-9]") == false)
  576. {
  577. int range = int.Parse(checkText) - 1;
  578. if (range < 0)
  579. {
  580. continue;
  581. }
  582. if (rangeList.Contains(range) == false)
  583. {
  584. rangeList.Add(range);
  585. }
  586. continue;
  587. }
  588. if (Regex.IsMatch(checkText, "[1-9]+[0-9]*(-)[0-9]+") && Regex.IsMatch(checkText, "[^0-9\\-]") == false)
  589. {
  590. if (Regex.Matches(checkText, "[-]+").Count == 1)
  591. {
  592. string[] pagesArray = checkText.Split('-');
  593. int rangeLeft = int.Parse(pagesArray[0]);
  594. int rangeRight = int.Parse(pagesArray[1]);
  595. for (int i = Math.Min(rangeLeft, rangeRight) - 1; i < Math.Max(rangeLeft, rangeRight); i++)
  596. {
  597. if (i >= doc.PageCount)
  598. {
  599. break;
  600. }
  601. if (rangeList.Contains(i) == false)
  602. {
  603. rangeList.Add(i);
  604. }
  605. }
  606. }
  607. }
  608. }
  609. }
  610. }
  611. private void SetCoverGrid()
  612. {
  613. ReplaceColorRect.Fill = new SolidColorBrush(ReplaceColor);
  614. InsertColorRect.Fill = new SolidColorBrush(InsertColor);
  615. DeleteColorRect.Fill = new SolidColorBrush(DeleteColor);
  616. }
  617. private void ShowSelectFileBorder(bool isShow)
  618. {
  619. SelectFileBorder.Visibility = isShow ? Visibility.Visible : Visibility.Collapsed;
  620. }
  621. private void SaveCoverGrid()
  622. {
  623. if (ReplaceColorRect.Fill != null && ((SolidColorBrush)ReplaceColorRect.Fill).Color != ReplaceColor)
  624. {
  625. ReplaceColor = ((SolidColorBrush)ReplaceColorRect.Fill).Color;
  626. }
  627. if (InsertColorRect.Fill != null && ((SolidColorBrush)InsertColorRect.Fill).Color != InsertColor)
  628. {
  629. InsertColor = ((SolidColorBrush)InsertColorRect.Fill).Color;
  630. }
  631. if (DeleteColorRect.Fill != null && ((SolidColorBrush)DeleteColorRect.Fill).Color != DeleteColor)
  632. {
  633. DeleteColor = ((SolidColorBrush)DeleteColorRect.Fill).Color;
  634. }
  635. }
  636. private void CompareDocBtn_Click(object sender, RoutedEventArgs e)
  637. {
  638. try
  639. {
  640. if(OldFileComboBox.Text == "" || NewFileComboBox.Text == "")
  641. {
  642. ShowSelectFileBorder(true);
  643. return;
  644. }
  645. if (NewDocument != null && OldDocument != null && NewDocument.IsLocked == false && OldDocument.IsLocked == false && viewCtrl != null)
  646. {
  647. if (Math.Min(OldRange.Count, NewRange.Count) == 0 || (CmbOldPageRange.SelectedIndex == "3" && CmbOldPageRange.Text == "") || (CmbNewPageRange.SelectedIndex == "3" && CmbNewPageRange.Text == ""))
  648. {
  649. PageRangeBorder.Visibility = Visibility.Visible;
  650. return;
  651. }
  652. this.Close();
  653. bool cancel = false;
  654. // Dispatcher.Invoke(() =>
  655. // {
  656. CompareProgressControl progressControl = new CompareProgressControl();
  657. progressControl.CloseClick += (s, r) =>
  658. {
  659. cancel = true;
  660. OnCompareStatusChanged?.Invoke(this, null);
  661. };
  662. OnCompareStatusChanged?.Invoke(this, progressControl);
  663. // });
  664. if (CompareType == CompareType.ContentCompare)
  665. {
  666. ObjectCompareType = CPDFCompareType.CPDFCompareTypeAll;
  667. if (TextCheckBox.IsChecked == true && ImageCheckBox.IsChecked == true)
  668. {
  669. ObjectCompareType = CPDFCompareType.CPDFCompareTypeAll;
  670. }
  671. else
  672. {
  673. if (TextCheckBox.IsChecked == true)
  674. {
  675. ObjectCompareType = CPDFCompareType.CPDFCompareTypeText;
  676. }
  677. if (ImageCheckBox.IsChecked == true)
  678. {
  679. ObjectCompareType = CPDFCompareType.CPDFCompareTypeImage;
  680. }
  681. }
  682. Task.Factory.StartNew(() =>
  683. {
  684. CPDFCompareContent CPdfContent = new CPDFCompareContent(OldDocument, NewDocument);
  685. CPdfContent.SetInsertColor(new byte[] { InsertColor.R, InsertColor.G, InsertColor.B });
  686. CPdfContent.SetReplaceColor(new byte[] { ReplaceColor.R, ReplaceColor.G, ReplaceColor.B });
  687. CPdfContent.SetDeleteColor(new byte[] { DeleteColor.R, DeleteColor.G, DeleteColor.B });
  688. CPdfContent.SetReplaceTransparency(ReplaceColor.A);
  689. CPdfContent.SetDeleteTransparency(DeleteColor.A);
  690. CPdfContent.SetInsertTransparency(InsertColor.A);
  691. List<CPDFCompareResults> resultList = new List<CPDFCompareResults>();
  692. int minLength = Math.Min(OldRange.Count, NewRange.Count);
  693. List<int> oldTemp = new List<int>(OldRange);
  694. List<int> newTemp = new List<int>(NewRange);
  695. if (minLength == 0)
  696. {
  697. int maxCount = Math.Max(OldDocument.PageCount, NewDocument.PageCount);
  698. for (int i = 0; i < maxCount; i++)
  699. {
  700. if (cancel) return;
  701. if (i < OldDocument.PageCount)
  702. {
  703. oldTemp.Add(i);
  704. }
  705. if (i >= OldDocument.PageCount)
  706. {
  707. oldTemp.Add(OldDocument.PageCount);
  708. }
  709. if (i < NewDocument.PageCount)
  710. {
  711. newTemp.Add(i);
  712. }
  713. if (i >= NewDocument.PageCount)
  714. {
  715. newTemp.Add(OldDocument.PageCount);
  716. }
  717. }
  718. minLength = oldTemp.Count;
  719. }
  720. else
  721. {
  722. if (oldTemp.Count != newTemp.Count)
  723. {
  724. if (oldTemp.Count < newTemp.Count)
  725. {
  726. for (int i = oldTemp.Count; i < newTemp.Count; i++)
  727. {
  728. if (cancel) return;
  729. oldTemp.Add(OldDocument.PageCount);
  730. }
  731. }
  732. if (oldTemp.Count > newTemp.Count)
  733. {
  734. for (int i = newTemp.Count; i < oldTemp.Count; i++)
  735. {
  736. newTemp.Add(NewDocument.PageCount);
  737. }
  738. }
  739. minLength = oldTemp.Count;
  740. }
  741. }
  742. for (int i = 0; i < minLength; i++)
  743. {
  744. CPDFCompareResults result = CPdfContent.Compare(oldTemp[i], newTemp[i], ObjectCompareType, true);
  745. if (result != null && (result.TextResults.Count > 0 || result.ImageResults.Count > 0))
  746. {
  747. if (cancel) return;
  748. resultList.Add(result);
  749. Dispatcher.Invoke(() =>
  750. {
  751. if (minLength != 0)
  752. {
  753. progressControl.SetValue((0.3 + ((double)i / (double)minLength) / (double)2));
  754. }
  755. });
  756. }
  757. }
  758. string tempPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString() + ".pdf");
  759. CPdfContent.SaveAsComparisonDocument(tempPath);
  760. CPDFDocument combineDoc = CPDFDocument.InitWithFilePath(tempPath);
  761. Dispatcher.Invoke(() =>
  762. {
  763. if (viewCtrl != null)
  764. {
  765. FileCompareGrid.Visibility = Visibility.Collapsed;
  766. CompareContentResultControl resultPage = new CompareContentResultControl();
  767. resultPage.SetCompareColor(new SolidColorBrush(DeleteColor), new SolidColorBrush(ReplaceColor), new SolidColorBrush(InsertColor));
  768. resultPage.SetCompareName(OldDocument.FileName, NewDocument.FileName);
  769. resultPage.pdfViewerCtrl = viewCtrl;
  770. resultPage.LoadComparePdf(combineDoc, OldDocument, NewDocument);
  771. resultPage.SetCompareResult(resultList);
  772. resultPage.ExitCompareEvent += (s, r) =>
  773. {
  774. OnCompareStatusChanged?.Invoke(this, null);
  775. };
  776. OnCompareStatusChanged?.Invoke(this, resultPage);
  777. }
  778. });
  779. });
  780. }
  781. if (CompareType == CompareType.OverwriteCompare)
  782. {
  783. Dispatcher.Invoke(() => { progressControl.SetValue(0.3); });
  784. List<int> oldTemp = new List<int>(OldRange);
  785. List<int> newTemp = new List<int>(NewRange);
  786. string oldRnage = "";
  787. string newRnage = "";
  788. foreach (var odlrange in oldTemp)
  789. {
  790. if (oldRnage != "")
  791. {
  792. oldRnage += ",";
  793. }
  794. oldRnage += (odlrange + 1);
  795. }
  796. foreach (var newrange in newTemp)
  797. {
  798. if (newRnage != "")
  799. {
  800. newRnage += ",";
  801. }
  802. newRnage += (newrange + 1);
  803. }
  804. Task.Factory.StartNew(() =>
  805. {
  806. Dispatcher.Invoke(() => { progressControl.SetValue(0.6); });
  807. CPDFCompareOverlay CPdfOverlay = null;
  808. if (string.IsNullOrEmpty(oldRnage) || string.IsNullOrEmpty(newRnage))
  809. {
  810. CPdfOverlay = new CPDFCompareOverlay(OldDocument, NewDocument);
  811. }
  812. else
  813. {
  814. CPdfOverlay = new CPDFCompareOverlay(OldDocument, oldRnage, NewDocument, newRnage);
  815. }
  816. CPdfOverlay?.SetBlendMode(MixMode);
  817. CPdfOverlay?.SetNoFill(IsFillWhite);
  818. CPdfOverlay?.SetNewDocumentStrokeAlpha((float)NewOpacity);
  819. CPdfOverlay?.SetOldDocumentStrokeAlpha((float)OldOpacity);
  820. CPdfOverlay?.SetNewDocumentFillAlpha((float)NewOpacity);
  821. CPdfOverlay?.SetOldDocumentFillAlpha((float)OldOpacity);
  822. CPdfOverlay?.SetNewDocumentStrokeColor(new byte[] { NewMarkColor.R, NewMarkColor.G, NewMarkColor.B });
  823. CPdfOverlay?.SetOldDocumentStrokeColor(new byte[] { OldMarkColor.R, OldMarkColor.G, OldMarkColor.B });
  824. CPdfOverlay?.Compare();
  825. CPDFDocument resultDoc = CPdfOverlay?.ComparisonDocument();
  826. Dispatcher.Invoke(() =>
  827. {
  828. if (viewCtrl != null)
  829. {
  830. // if (viewCtrl.ParentPage.loadingConceal.Visibility == Visibility.Collapsed)
  831. // {
  832. // return;
  833. // }
  834. progressControl.SetValue(0.9);
  835. FileCompareGrid.Visibility = Visibility.Collapsed;
  836. CompareOverwriteResultControl resultPage = new CompareOverwriteResultControl();
  837. resultPage.SetCompareColor(new SolidColorBrush(NewMarkColor), new SolidColorBrush(OldMarkColor));
  838. resultPage.pdfViewerCtrl = viewCtrl;
  839. // resultPage.pdfViewerCtrl.ParentPage.SetCompareModel(false);
  840. // viewCtrl.ParentPage.loadingConcealClose.Visibility = Visibility.Visible;
  841. // viewCtrl.ParentPage.loadingConceal.Visibility = Visibility.Collapsed;
  842. resultPage.LoadComparePdf(resultDoc);
  843. resultPage.LeftDoc = OldDocument;
  844. resultPage.RightDoc = NewDocument;
  845. resultPage.ExitCompareEvent += (s, r) =>
  846. {
  847. OnCompareStatusChanged?.Invoke(this, null);
  848. };
  849. OnCompareStatusChanged?.Invoke(this, resultPage);
  850. }
  851. });
  852. });
  853. }
  854. }
  855. else
  856. {
  857. // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_PleaseSelect"));
  858. }
  859. }
  860. catch
  861. {
  862. return;
  863. }
  864. }
  865. private void TextBox_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
  866. {
  867. List<Key> allowKeyStroke = new List<Key>()
  868. {
  869. Key.D0, Key.D1, Key.D2, Key.D3, Key.D4, Key.D5,
  870. Key.D6,Key.D7,Key.D8,Key.D9,Key.NumPad0,Key.NumPad1,
  871. Key.NumPad2,Key.NumPad3,Key.NumPad4,Key.NumPad5,
  872. Key.NumPad6,Key.NumPad7,Key.NumPad8,Key.NumPad9,
  873. Key.Delete,Key.Back
  874. };
  875. if (allowKeyStroke.Contains(e.Key) == false)
  876. {
  877. e.Handled = true;
  878. }
  879. }
  880. private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
  881. {
  882. e.CanExecute = false;
  883. e.Handled = true;
  884. }
  885. private void PageRangeCheck_LostFocus(object sender, RoutedEventArgs e)
  886. {
  887. System.Windows.Controls.TextBox textBox = sender as System.Windows.Controls.TextBox;
  888. if (textBox != null && string.IsNullOrEmpty(textBox.Text) == false)
  889. {
  890. bool isMatch = true;
  891. string[] checkTextArray = textBox.Text.Split(',');
  892. foreach (string checkText in checkTextArray)
  893. {
  894. if (Regex.IsMatch(checkText, "[0-9]+") && Regex.IsMatch(checkText, "[^0-9]") == false)
  895. {
  896. continue;
  897. }
  898. if (Regex.IsMatch(checkText, "[1-9]+[0-9]*(-)[0-9]+") && Regex.IsMatch(checkText, "[^0-9\\-]") == false)
  899. {
  900. if (Regex.Matches(checkText, "[-]+").Count == 1)
  901. {
  902. continue;
  903. }
  904. }
  905. isMatch = false;
  906. }
  907. if (isMatch == false)
  908. {
  909. textBox.Text = string.Empty;
  910. }
  911. }
  912. }
  913. int CurrentOldPageIndex = 0;
  914. private List<int> OldRange = new List<int>();
  915. private void UpdateOldPageIndex()
  916. {
  917. TxtOldPage.Text = (CurrentOldPageIndex + 1).ToString();
  918. TxtOldPageCount.Text = "/" + OldRange.Count;
  919. }
  920. private void CheckOldPageBtnState()
  921. {
  922. if (CurrentOldPageIndex + 1 >= OldRange.Count)
  923. {
  924. BtnOldNext.IsEnabled = false;
  925. }
  926. else
  927. {
  928. BtnOldNext.IsEnabled = true;
  929. }
  930. if (CurrentOldPageIndex + 1 <= 1)
  931. {
  932. BtnOldPre.IsEnabled = false;
  933. }
  934. else
  935. {
  936. BtnOldPre.IsEnabled = true;
  937. }
  938. }
  939. private void btnOldPre_Click(object sender, RoutedEventArgs e)
  940. {
  941. if (OldDocument == null)
  942. {
  943. return;
  944. }
  945. CurrentOldPageIndex--;
  946. if (CurrentOldPageIndex < 0 || CurrentOldPageIndex >= OldRange.Count)
  947. {
  948. CheckOldPageBtnState();
  949. TxtOldPage.Focus();
  950. return;
  951. }
  952. UpdateCover(OldDocument, OldImageControl, OldRange[CurrentOldPageIndex]);
  953. //RefreshPicture(pageOldIndexLists[CurrentPageIndex]);
  954. CheckOldPageBtnState();
  955. UpdateOldPageIndex();
  956. }
  957. private void txtOldPage_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
  958. {
  959. if (OldDocument == null)
  960. {
  961. return;
  962. }
  963. if (e == null)
  964. {
  965. return;
  966. }
  967. //限制文本框输入内容
  968. List<Key> NumberKeys = new List<Key>() { Key.D0, Key.D1, Key.D2, Key.D3, Key.D4, Key.D5, Key.D6, Key.D7, Key.D8, Key.D9, Key.NumPad0, Key.NumPad1, Key.NumPad2, Key.NumPad3, Key.NumPad4, Key.NumPad5, Key.NumPad6, Key.NumPad7, Key.NumPad8, Key.NumPad9, Key.Delete, Key.Back, Key.Enter, Key.Right, Key.Left };
  969. if (!NumberKeys.Contains(e.Key))
  970. {
  971. e.Handled = true;
  972. }
  973. if (e.Key == Key.Enter)
  974. {
  975. int value = 0;
  976. bool result = int.TryParse(TxtOldPage.Text, out value);
  977. if (!result || value <= 0 || value > OldRange.Count)
  978. {
  979. TxtOldPage.Text = "1";
  980. CurrentOldPageIndex = 0;
  981. }
  982. else
  983. {
  984. CurrentOldPageIndex = value - 1;
  985. UpdateCover(OldDocument, OldImageControl, OldRange[CurrentOldPageIndex]);
  986. }
  987. CheckOldPageBtnState();
  988. }
  989. }
  990. private void txtOldPage_LostFocus(object sender, RoutedEventArgs e)
  991. {
  992. if (OldDocument == null)
  993. {
  994. return;
  995. }
  996. int value = 0;
  997. bool result = int.TryParse(TxtOldPage.Text, out value);
  998. if (!result || value < 0 || value > OldRange.Count)
  999. {
  1000. TxtOldPage.Text = "1";
  1001. CurrentOldPageIndex = 0;
  1002. }
  1003. else
  1004. {
  1005. CurrentOldPageIndex = value - 1;
  1006. if(CurrentOldPageIndex < 0 || CurrentOldPageIndex >= OldRange.Count)
  1007. {
  1008. CurrentOldPageIndex = 0;
  1009. }
  1010. UpdateCover(OldDocument, OldImageControl, OldRange[CurrentOldPageIndex]);
  1011. }
  1012. CheckOldPageBtnState();
  1013. }
  1014. private void btnOldNext_Click(object sender, RoutedEventArgs e)
  1015. {
  1016. if (OldDocument == null)
  1017. {
  1018. return;
  1019. }
  1020. CurrentOldPageIndex++;
  1021. if (CurrentOldPageIndex < 0 || CurrentOldPageIndex >= OldRange.Count)
  1022. {
  1023. CheckOldPageBtnState();
  1024. TxtOldPage.Focus();
  1025. return;
  1026. }
  1027. UpdateCover(OldDocument, OldImageControl, OldRange[CurrentOldPageIndex]);
  1028. CheckOldPageBtnState();
  1029. UpdateOldPageIndex();
  1030. }
  1031. int CurrentNewPageIndex = 0;
  1032. private List<int> NewRange = new List<int>();
  1033. private void UpdateNewPageIndex()
  1034. {
  1035. TxtNewPage.Text = (CurrentNewPageIndex + 1).ToString();
  1036. TxtNewPageCount.Text = "/" + NewRange.Count;
  1037. }
  1038. private void CheckNewPageBtnState()
  1039. {
  1040. if (CurrentNewPageIndex + 1 >= NewRange.Count)
  1041. {
  1042. BtnNewNext.IsEnabled = false;
  1043. }
  1044. else
  1045. {
  1046. BtnNewNext.IsEnabled = true;
  1047. }
  1048. if (CurrentNewPageIndex + 1 <= 1)
  1049. {
  1050. BtnNewPre.IsEnabled = false;
  1051. }
  1052. else
  1053. {
  1054. BtnNewPre.IsEnabled = true;
  1055. }
  1056. }
  1057. private void btnNewPre_Click(object sender, RoutedEventArgs e)
  1058. {
  1059. if (NewDocument == null)
  1060. {
  1061. return;
  1062. }
  1063. CurrentNewPageIndex--;
  1064. if (CurrentNewPageIndex < 0 || CurrentNewPageIndex >= NewRange.Count)
  1065. {
  1066. CheckNewPageBtnState();
  1067. TxtNewPage.Focus();
  1068. return;
  1069. }
  1070. UpdateCover(NewDocument, NewImageControl, NewRange[CurrentNewPageIndex]);
  1071. CheckNewPageBtnState();
  1072. UpdateNewPageIndex();
  1073. }
  1074. private void txtNewPage_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
  1075. {
  1076. if (NewDocument == null)
  1077. {
  1078. return;
  1079. }
  1080. if (e == null)
  1081. {
  1082. return;
  1083. }
  1084. //限制文本框输入内容
  1085. List<Key> NumberKeys = new List<Key>() { Key.D0, Key.D1, Key.D2, Key.D3, Key.D4, Key.D5, Key.D6, Key.D7, Key.D8, Key.D9, Key.NumPad0, Key.NumPad1, Key.NumPad2, Key.NumPad3, Key.NumPad4, Key.NumPad5, Key.NumPad6, Key.NumPad7, Key.NumPad8, Key.NumPad9, Key.Delete, Key.Back, Key.Enter, Key.Right, Key.Left };
  1086. if (!NumberKeys.Contains(e.Key))
  1087. {
  1088. e.Handled = true;
  1089. }
  1090. if (e.Key == Key.Enter)
  1091. {
  1092. int value = 0;
  1093. bool result = int.TryParse(TxtNewPage.Text, out value);
  1094. if (!result || value <= 0 || value > NewRange.Count)
  1095. {
  1096. TxtNewPage.Text = "1";
  1097. CurrentNewPageIndex = 0;
  1098. }
  1099. else
  1100. {
  1101. CurrentNewPageIndex = value - 1;
  1102. UpdateCover(NewDocument, NewImageControl, NewRange[CurrentNewPageIndex]);
  1103. }
  1104. CheckNewPageBtnState();
  1105. }
  1106. }
  1107. private void txtNewPage_LostFocus(object sender, RoutedEventArgs e)
  1108. {
  1109. if (NewDocument == null)
  1110. {
  1111. return;
  1112. }
  1113. int value = 0;
  1114. bool result = int.TryParse(TxtNewPage.Text, out value);
  1115. if (!result || value < 0 || value > NewRange.Count)
  1116. {
  1117. TxtNewPage.Text = "1";
  1118. CurrentNewPageIndex = 0;
  1119. }
  1120. else
  1121. {
  1122. CurrentNewPageIndex = value - 1;
  1123. UpdateCover(NewDocument, NewImageControl, NewRange[CurrentNewPageIndex]);
  1124. }
  1125. CheckNewPageBtnState();
  1126. }
  1127. private void btnNewNext_Click(object sender, RoutedEventArgs e)
  1128. {
  1129. if (NewDocument == null)
  1130. {
  1131. return;
  1132. }
  1133. CurrentNewPageIndex++;
  1134. if (CurrentNewPageIndex < 0 || CurrentNewPageIndex >= NewRange.Count)
  1135. {
  1136. CheckNewPageBtnState();
  1137. TxtNewPage.Focus();
  1138. return;
  1139. }
  1140. UpdateCover(NewDocument, NewImageControl, NewRange[CurrentNewPageIndex]);
  1141. CheckNewPageBtnState();
  1142. UpdateNewPageIndex();
  1143. }
  1144. private void CmbOldPageRange_SelectionChanged(object sender, RoutedEventArgs e)
  1145. {
  1146. if (OldDocument != null)
  1147. {
  1148. switch (int.Parse(CmbOldPageRange.SelectedIndex))
  1149. {
  1150. case 0:
  1151. OldRange.Clear();
  1152. for (int i = 0; i < OldDocument.PageCount; i++)
  1153. {
  1154. if (i < OldDocument.PageCount)
  1155. {
  1156. OldRange.Add(i);
  1157. }
  1158. }
  1159. break;
  1160. case 1:
  1161. var numType1 = int.Parse(CmbOldPageRange.SelectedIndex) == 1 ? 1 : 0;
  1162. int[] page1 = new int[(OldDocument.PageCount + numType1) / 2];
  1163. for (int i = 0; i < page1.Length; i++)
  1164. {
  1165. page1[i] = i * 2 + 1 - numType1;
  1166. }
  1167. OldRange = page1.ToList();
  1168. break;
  1169. case 2:
  1170. var numType2 = int.Parse(CmbOldPageRange.SelectedIndex) == 1 ? 1 : 0;
  1171. int[] page2 = new int[(OldDocument.PageCount + numType2) / 2];
  1172. for (int i = 0; i < page2.Length; i++)
  1173. {
  1174. page2[i] = i * 2 + 1 - numType2;
  1175. }
  1176. OldRange = page2.ToList();
  1177. break;
  1178. case 3:
  1179. CmbOldPageRange.MaxPageRange = OldRange.Count;
  1180. if (CmbOldPageRange.PageIndexList != null && CmbOldPageRange.PageIndexList.Count > 0)
  1181. {
  1182. OldRange = CmbOldPageRange.PageIndexList;
  1183. }
  1184. break;
  1185. }
  1186. if (CurrentOldPageIndex > OldRange.Count)
  1187. {
  1188. CurrentOldPageIndex = OldRange.Count - 1;
  1189. }
  1190. if (OldRange.Count != 0)
  1191. {
  1192. UpdateCover(OldDocument, OldImageControl, OldRange[CurrentOldPageIndex]);
  1193. CheckOldPageBtnState();
  1194. UpdateOldPageIndex();
  1195. }
  1196. else
  1197. {
  1198. CmbOldPageRange.SelectedIndex = "0";
  1199. }
  1200. }
  1201. }
  1202. private void CmbOldPageRange_TextChanged(object sender, RoutedEventArgs e)
  1203. {
  1204. if (OldDocument != null)
  1205. {
  1206. List<int> TargetPages = new List<int>();
  1207. if (CommonHelper.GetPagesInRange(ref TargetPages, CmbOldPageRange.Text, OldDocument.PageCount, new char[] { ',' }, new char[] { '-' }))
  1208. {
  1209. OldRange = TargetPages;
  1210. if (CurrentOldPageIndex > OldRange.Count)
  1211. {
  1212. CurrentOldPageIndex = OldRange.Count - 1;
  1213. }
  1214. UpdateCover(OldDocument, OldImageControl, OldRange[CurrentOldPageIndex]);
  1215. CheckOldPageBtnState();
  1216. UpdateOldPageIndex();
  1217. }
  1218. }
  1219. }
  1220. private void CmbNewPageRange_SelectionChanged(object sender, RoutedEventArgs e)
  1221. {
  1222. if (NewDocument != null)
  1223. {
  1224. switch (int.Parse(CmbNewPageRange.SelectedIndex))
  1225. {
  1226. case 0:
  1227. NewRange.Clear();
  1228. for (int i = 0; i < NewDocument.PageCount; i++)
  1229. {
  1230. if (i < NewDocument.PageCount)
  1231. {
  1232. NewRange.Add(i);
  1233. }
  1234. }
  1235. break;
  1236. case 1:
  1237. var numType1 = int.Parse(CmbNewPageRange.SelectedIndex) == 1 ? 1 : 0;
  1238. int[] page1 = new int[(NewDocument.PageCount + numType1) / 2];
  1239. for (int i = 0; i < page1.Length; i++)
  1240. {
  1241. page1[i] = i * 2 + 1 - numType1;
  1242. }
  1243. NewRange = page1.ToList();
  1244. break;
  1245. case 2:
  1246. var numType2 = int.Parse(CmbNewPageRange.SelectedIndex) == 1 ? 1 : 0;
  1247. int[] page2 = new int[(NewDocument.PageCount + numType2) / 2];
  1248. for (int i = 0; i < page2.Length; i++)
  1249. {
  1250. page2[i] = i * 2 + 1 - numType2;
  1251. }
  1252. NewRange = page2.ToList();
  1253. break;
  1254. case 3:
  1255. CmbNewPageRange.MaxPageRange = NewRange.Count;
  1256. if (CmbNewPageRange.PageIndexList != null && CmbNewPageRange.PageIndexList.Count > 0)
  1257. {
  1258. NewRange = CmbNewPageRange.PageIndexList;
  1259. }
  1260. break;
  1261. }
  1262. if (CurrentNewPageIndex > NewRange.Count)
  1263. {
  1264. CurrentNewPageIndex = NewRange.Count - 1;
  1265. }
  1266. if (NewRange.Count != 0)
  1267. {
  1268. UpdateCover(NewDocument, NewImageControl, NewRange[CurrentNewPageIndex]);
  1269. CheckNewPageBtnState();
  1270. UpdateNewPageIndex();
  1271. }
  1272. else
  1273. {
  1274. CmbNewPageRange.SelectedIndex = "0";
  1275. }
  1276. }
  1277. }
  1278. private void CmbNewPageRange_TextChanged(object sender, RoutedEventArgs e)
  1279. {
  1280. if (NewDocument != null)
  1281. {
  1282. List<int> TargetPages = new List<int>();
  1283. if (CommonHelper.GetPagesInRange(ref TargetPages, CmbNewPageRange.Text, NewDocument.PageCount, new char[] { ',' }, new char[] { '-' }))
  1284. {
  1285. NewRange = TargetPages;
  1286. if (CurrentNewPageIndex > NewRange.Count)
  1287. {
  1288. CurrentNewPageIndex = NewRange.Count - 1;
  1289. }
  1290. UpdateCover(NewDocument, NewImageControl, NewRange[CurrentNewPageIndex]);
  1291. CheckNewPageBtnState();
  1292. UpdateNewPageIndex();
  1293. }
  1294. }
  1295. }
  1296. public System.Drawing.Color mediaColorToDrawing(System.Windows.Media.Color mediaColor)
  1297. {
  1298. return System.Drawing.Color.FromArgb(mediaColor.A, mediaColor.R, mediaColor.G, mediaColor.B);
  1299. }
  1300. public System.Windows.Media.Color drawingColorToMedia(System.Drawing.Color drawColor)
  1301. {
  1302. return System.Windows.Media.Color.FromArgb(drawColor.A, drawColor.R, drawColor.G, drawColor.B);
  1303. }
  1304. private void ReplaceColorRect_Click(object sender, MouseButtonEventArgs e)
  1305. {
  1306. ColorDialog colorDialog = new ColorDialog();
  1307. colorDialog.AllowFullOpen = true;
  1308. colorDialog.FullOpen = true;
  1309. if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1310. {
  1311. ReplaceColor = drawingColorToMedia(colorDialog.Color);
  1312. ReplaceColorRect.Fill = new SolidColorBrush(ReplaceColor);
  1313. }
  1314. }
  1315. private void InsertColorRect_Click(object sender, MouseButtonEventArgs e)
  1316. {
  1317. ColorDialog colorDialog = new ColorDialog();
  1318. colorDialog.AllowFullOpen = true;
  1319. colorDialog.FullOpen = true;
  1320. if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1321. {
  1322. InsertColor = drawingColorToMedia(colorDialog.Color);
  1323. InsertColorRect.Fill = new SolidColorBrush(InsertColor);
  1324. }
  1325. }
  1326. private void DeleteColorRect_Click(object sender, MouseButtonEventArgs e)
  1327. {
  1328. ColorDialog colorDialog = new ColorDialog();
  1329. colorDialog.AllowFullOpen = true;
  1330. colorDialog.FullOpen = true;
  1331. if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1332. {
  1333. DeleteColor = drawingColorToMedia(colorDialog.Color);
  1334. DeleteColorRect.Fill = new SolidColorBrush(DeleteColor);
  1335. }
  1336. }
  1337. private void OldMarkColorRect_Click(object sender, MouseButtonEventArgs e)
  1338. {
  1339. ColorDialog colorDialog = new ColorDialog();
  1340. colorDialog.AllowFullOpen = true;
  1341. colorDialog.FullOpen = true;
  1342. if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1343. {
  1344. OldMarkColor = drawingColorToMedia(colorDialog.Color);
  1345. OldColorRect.Fill = new SolidColorBrush(OldMarkColor);
  1346. }
  1347. }
  1348. private void NewMarkColorRect_Click(object sender, MouseButtonEventArgs e)
  1349. {
  1350. ColorDialog colorDialog = new ColorDialog();
  1351. colorDialog.AllowFullOpen = true;
  1352. colorDialog.FullOpen = true;
  1353. if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1354. {
  1355. NewMarkColor = drawingColorToMedia(colorDialog.Color);
  1356. NewColorRect.Fill = new SolidColorBrush(NewMarkColor);
  1357. }
  1358. }
  1359. private void CancleBtn_Click(object sender, RoutedEventArgs e)
  1360. {
  1361. this.Close();
  1362. }
  1363. private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  1364. {
  1365. string pdfFile = GetChoosePdf();
  1366. if (File.Exists(pdfFile))
  1367. {
  1368. if (OldFilePathList != null && OldFileComboBox.SelectedIndex > -1)
  1369. {
  1370. if (pdfFile == OldFilePathList[OldFileComboBox.SelectedIndex])
  1371. {
  1372. // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_DifferentFiles"));
  1373. return;
  1374. }
  1375. }
  1376. NewDocument = CPDFDocument.InitWithFilePath(pdfFile);
  1377. CheckDocPassword(NewDocument);
  1378. if (NewDocument != null && NewDocument.IsLocked == false)
  1379. {
  1380. int select = AddNewFileList(NewDocument.FileName, pdfFile);
  1381. NewFileComboBox.SelectedIndex = select;
  1382. InitNewDocument();
  1383. }
  1384. }
  1385. }
  1386. private void ADDFileBorder_DragOver(object sender, System.Windows.DragEventArgs e)
  1387. {
  1388. e.Effects = e.Data.GetDataPresent(System.Windows.DataFormats.FileDrop) ? System.Windows.DragDropEffects.Copy : System.Windows.DragDropEffects.None;
  1389. e.Handled = true;
  1390. }
  1391. private void ADDFileBorder_Drop(object sender, System.Windows.DragEventArgs e)
  1392. {
  1393. // 检查拖拽的文件类型
  1394. if (e.Data.GetDataPresent(System.Windows.DataFormats.FileDrop))
  1395. {
  1396. var files = (string[])e.Data.GetData(System.Windows.DataFormats.FileDrop);
  1397. var pdfFiles = files.Where(f => f.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)).ToArray();
  1398. if (pdfFiles.Length > 0)
  1399. {
  1400. if (File.Exists(pdfFiles[0]))
  1401. {
  1402. if (OldFilePathList != null && OldFileComboBox.SelectedIndex > -1)
  1403. {
  1404. if (pdfFiles[0] == OldFilePathList[OldFileComboBox.SelectedIndex])
  1405. {
  1406. // MessageBoxEx.Show(App.MainPageLoader.GetString("FileCompare_DifferentFiles"));
  1407. return;
  1408. }
  1409. }
  1410. NewDocument = CPDFDocument.InitWithFilePath(pdfFiles[0]);
  1411. CheckDocPassword(NewDocument);
  1412. if (NewDocument != null && NewDocument.IsLocked == false)
  1413. {
  1414. int select = AddNewFileList(NewDocument.FileName, pdfFiles[0]);
  1415. NewFileComboBox.SelectedIndex = select;
  1416. InitNewDocument();
  1417. }
  1418. }
  1419. }
  1420. else
  1421. {
  1422. }
  1423. }
  1424. }
  1425. private void SelectFileCancel_OnClick(object sender, RoutedEventArgs e)
  1426. {
  1427. ShowSelectFileBorder(false);
  1428. }
  1429. private void PageRangeCancel_OnClick(object sender, RoutedEventArgs e)
  1430. {
  1431. PageRangeBorder.Visibility = Visibility.Collapsed;
  1432. }
  1433. private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
  1434. {
  1435. if (sender is ComboBox cmb)
  1436. {
  1437. if(cmb.SelectedIndex < 0 || cmb.SelectedIndex > 16)
  1438. {
  1439. return;
  1440. }
  1441. MixMode = (CPDFBlendMode)cmb.SelectedIndex;
  1442. }
  1443. }
  1444. private void OldOpacityControl_OnTextInput(object sender, string e)
  1445. {
  1446. if (float.TryParse(e, out float oldOpacity))
  1447. {
  1448. OldOpacity = oldOpacity / 100.0;
  1449. }
  1450. }
  1451. private void NewOpacityControl_OnTextInput(object sender, string e)
  1452. {
  1453. if (float.TryParse(e, out float newOpacity))
  1454. {
  1455. NewOpacity = newOpacity / 100.0;
  1456. }
  1457. }
  1458. }
  1459. }