public static void InitializeCertificateProperties(
            this PropertyCollection properties,
            string certificateSourcePropertyName,
            string certificateFilePathPropertyName,
            string certificateFilePasswordPropertyName,
            string certificatePropertyName,
            ref int propertyOrder,
            VisibleDependency visibleDependency)
        {
            Action <bool> applyVisibility = (isVisible) =>
            {
                CertificateSource certificateSourceValue = properties[certificateSourcePropertyName].GetValue <CertificateSource>();

                properties[certificateSourcePropertyName].IsVisible       = isVisible;
                properties[certificateFilePathPropertyName].IsVisible     = (isVisible && certificateSourceValue == CertificateSource.File);
                properties[certificateFilePasswordPropertyName].IsVisible = (isVisible && certificateSourceValue == CertificateSource.File);
                properties[certificatePropertyName].IsVisible             = (isVisible && certificateSourceValue == CertificateSource.Store);
            };
            EventHandler updateVisibility = (sender, args) => applyVisibility(visibleDependency.Visible);

            visibleDependency.VisibleChanged += (visible) => applyVisibility(visible);

            Property certificateSource = properties.AddOrRetrieve(certificateSourcePropertyName, typeof(CertificateSource), ValueUseOption.DesignTime, CertificateSource.File);

            certificateSource.Order         = propertyOrder++;
            certificateSource.Description   = "Source to load the certificate from.";
            certificateSource.ValueChanged += updateVisibility;

            Property certificateFilePath = properties.AddOrRetrieve(certificateFilePathPropertyName, typeof(string), ValueUseOption.RuntimeRead, string.Empty);

            certificateFilePath.Order       = propertyOrder++;
            certificateFilePath.Description = "Path to the file containing a certificate.";
            certificateFilePath.Editor      = typeof(FilePathEditor);
            certificateFilePath.Validations.Add(new RequiredValidator());

            Property certificateFilePassword = properties.AddOrRetrieve(certificateFilePasswordPropertyName, typeof(string), ValueUseOption.RuntimeRead, string.Empty);

            certificateFilePassword.Order       = propertyOrder++;
            certificateFilePassword.Description = "Password required to open the certificate file.";

            Property certificate = properties.AddOrRetrieve(certificatePropertyName, typeof(StoredCertificate), ValueUseOption.DesignTime, new StoredCertificate());

            certificate.Order       = propertyOrder++;
            certificate.Description = "Certificate in the windows keystore.";
            certificate.Validations.Add(new StoredCertificateValidator());
            certificate.Editor = typeof(CertificateEditor);

            applyVisibility(visibleDependency.Visible);
        }
 public static Property AddOrRetrieve(
     this PropertyCollection properties,
     string name,
     Type type,
     ValueUseOption valueUsage,
     object defaultValue)
 {
     return(properties.AddOrRetrieve(name, TypeReference.Create(type), valueUsage, defaultValue));
 }
        public static void InitializeInputFileProperties(
            this PropertyCollection properties,
            string inputFilePathPropertyName,
            string authenticationTypePropertyName,
            string passwordPropertyName,
            string certificateSourcePropertyName,
            string certificateFilePathPropertyName,
            string certificateFilePasswordPropertyName,
            string certificatePropertyName,
            bool supportCertificateAuthentication,
            ref int propertyOrder,
            VisibleDependency visibleDependency)
        {
            var           certVisibleDependency = new VisibleDependency(() => visibleDependency.Visible && properties.PropertyValueEquals(authenticationTypePropertyName, AuthenticationType.Certificate));
            Action <bool> applyVisibility       = (isVisible) =>
            {
                AuthenticationType authenticationTypeValue = properties[authenticationTypePropertyName].GetValue <AuthenticationType>();

                properties[inputFilePathPropertyName].IsVisible      = isVisible;
                properties[authenticationTypePropertyName].IsVisible = isVisible;
                properties[passwordPropertyName].IsVisible           = (isVisible && authenticationTypeValue == AuthenticationType.Password);
            };
            EventHandler updateVisibility = (sender, args) =>
            {
                applyVisibility(visibleDependency.Visible);
                certVisibleDependency.Refresh();
            };

            visibleDependency.VisibleChanged += (visible) =>
            {
                applyVisibility(visible);
                certVisibleDependency.Refresh();
            };

            Property pdfFilePath = properties.AddOrRetrieve(inputFilePathPropertyName, typeof(string), ValueUseOption.RuntimeRead, string.Empty);

            pdfFilePath.Order       = propertyOrder++;
            pdfFilePath.Description = "Path to the PDF file.";
            pdfFilePath.Editor      = typeof(FilePathEditor);
            pdfFilePath.Validations.Add(new RequiredValidator());

            Property authenticationType = properties.AddOrRetrieve(authenticationTypePropertyName, typeof(AuthenticationType), ValueUseOption.DesignTime, AuthenticationType.None);

            authenticationType.Order       = propertyOrder++;
            authenticationType.Description = "Authentication type required to open the PDF file.";
            if (!supportCertificateAuthentication)
            {
                authenticationType.Validations.Add(new CertificateAuthenticationValidator());
            }
            authenticationType.ValueChanged += updateVisibility;

            Property pdfPassword = properties.AddOrRetrieve(passwordPropertyName, typeof(string), ValueUseOption.RuntimeRead, string.Empty);

            pdfPassword.Order       = propertyOrder++;
            pdfPassword.Description = "Password required to access the PDF file.";
            pdfPassword.Validations.Add(new RequiredValidator());

            properties.InitializeCertificateProperties(
                certificateSourcePropertyName,
                certificateFilePathPropertyName,
                certificateFilePasswordPropertyName,
                certificatePropertyName,
                ref propertyOrder,
                certVisibleDependency);

            applyVisibility(visibleDependency.Visible);
        }