using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using Compdfkit_Tools.PDFControl; using ComPDFKit.DigitalSign; using ComPDFKitViewer.PdfViewer; namespace Compdfkit_Tools.DigitalSignature.CPDFSignatureListControl { public class SignatureData { public SignatureStatus Status { get; set; } public string Signer { get; set; } } public partial class CPDFSignatureListControl : UserControl { private CPDFViewer pdfViewer; private List signatureDataList; private List signatureList; private ContextMenu popContextMenu; public CPDFSignatureListControl() { InitializeComponent(); DataContext = this; popContextMenu = new ContextMenu(); MenuItem viewSignatureDetailsMenu = new MenuItem(); viewSignatureDetailsMenu.Header = "View Signature Details"; viewSignatureDetailsMenu.Click += ViewSignatureDetailsMenu_Click; popContextMenu.Items.Add(viewSignatureDetailsMenu); MenuItem viewCertificateDetailsMenu = new MenuItem(); viewCertificateDetailsMenu.Header = "View Certificate Details"; viewCertificateDetailsMenu.Click += ViewCertificateDetailsMenu_Click; popContextMenu.Items.Add(viewCertificateDetailsMenu); MenuItem deleteMenu = new MenuItem(); deleteMenu.Header = "Delete"; deleteMenu.Click += DeleteMenu_Click; popContextMenu.Items.Add(deleteMenu); CPDFSignature.SignCertTrustedFolder = @"TrustedFolder\"; } private void ViewSignatureDetailsMenu_Click(object sender, RoutedEventArgs e) { int index = SignatureList.SelectedIndex; if (index >= 0 && index < signatureList.Count) { VerifyDigitalSignatureControl.VerifyDigitalSignatureControl dialog = new VerifyDigitalSignatureControl.VerifyDigitalSignatureControl(); dialog.Show(); dialog.InitWithSignature(signatureList[index]); } } private void DeleteMenu_Click(object sender, RoutedEventArgs e) { int index = SignatureList.SelectedIndex; if (index >= 0 && index < signatureList.Count) { pdfViewer.Document.RemoveSignature(signatureList[index], true); LoadSignatureList(); } } private void ViewCertificateDetailsMenu_Click(object sender, RoutedEventArgs e) { int index = SignatureList.SelectedIndex; if (index >= 0 && index < signatureList.Count) { ViewCertificateDialog dialog = new ViewCertificateDialog(); dialog.Show(); dialog.InitCertificateList(signatureList[index]); } } public void InitWithPDFViewer(CPDFViewer newPDFView) { pdfViewer = newPDFView; } public void LoadSignatureList() { if (pdfViewer != null && pdfViewer.Document != null) { signatureList = pdfViewer.Document.GetSignatureList(); if (signatureList != null) { SignatureList.ItemsSource = null; signatureDataList = new List(); foreach (CPDFSignature signature in signatureList) { signature.VerifySignatureWithDocument(pdfViewer.Document, true); var item = new SignatureData(); CPDFSigner signer = signature.SignerList.Last(); if (!signer.IsSignVerified) { item.Status = SignatureStatus.Invalid; } else if (!signer.IsCertTrusted) { item.Status = SignatureStatus.Unknown; } else { item.Status = SignatureStatus.Valid; } item.Signer = signature.Name + "'s signature"; signatureDataList.Add(item); } if (signatureList.Count > 0) { SignatureList.ContextMenu = popContextMenu; } SignatureList.ItemsSource = signatureDataList; SignatureList.Visibility = Visibility.Visible; } else { SignatureList.Visibility = Visibility.Collapsed; } } } private void SignatureListControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { } private void SignatureList_ContextMenuOpening(object sender, ContextMenuEventArgs e) { try { if (SignatureList != null && SignatureList.SelectedIndex == -1) { foreach (var item in popContextMenu.Items) { (item as MenuItem).IsEnabled = false; } } else { foreach (var item in popContextMenu.Items) { (item as MenuItem).IsEnabled = true; } } } catch (Exception ex) { } } private void SignatureList_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { SignatureList.SelectedIndex = -1; } } public class SignatureStatusToPathConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is SignatureStatus signatureStatus && parameter is CPDFSignatureListControl cpdfSignatureListControl) { switch (signatureStatus) { case SignatureStatus.Valid: return cpdfSignatureListControl.FindResource("ValidSignaturePath"); case SignatureStatus.Invalid: return cpdfSignatureListControl.FindResource("InvalidSignaturePath"); case SignatureStatus.Unknown: return cpdfSignatureListControl.FindResource("UnknownSignaturePath"); default: return null; } } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return null; } } }