internal void AddAttachmentRiskControl(AttachmentRiskControl rc)
        {
            lock (_attachmentLock)
            {
                cbPerformAction.CheckedChanged += rc.PerformActionCheckChanged;
                rc.MetadataTypeCheckChanged += OnMetadataTypeCheckChanged;
                pnlContent.Controls.Add(rc);
                rc.EnableControls(cbPerformAction.Checked);

                // Auto expand - when a password protected file is added
                if (rc.Attachment.HasPassword && !AutoSize)
                {
                    ExpanderClicked();
                    this.AutoSize = true;
                }

                if (AnyAttachmentsWithMetadata())
                {
                    cbPerformAction.Enabled = (PolicyBridge.IsEnabled("InteractiveProtectAllowUsersToSkipCleaning") && PolicyBridge.IsEnabled("InteractiveProtectShowAdvancedSendOptions"));
                    cbPerformAction.Checked = true;
                }
                else
                {
                    cbPerformAction.Enabled = false;
                    cbPerformAction.Checked = false;
                }
            }
        }
        public void AddAttachment(IProtectAttachment attachment)
        {
            try
            {
                if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(() => AddAttachment(attachment)));
                    return;
                }

                if (_cleanFilesControl.pnlContent.Controls.ContainsKey(attachment.Id))
                {
                    _cleanFilesControl.pnlContent.Controls.RemoveByKey(attachment.Id);
                }

                var rc = new AttachmentRiskControl(attachment, PropertyChanged) { Dock = DockStyle.Top, Name = attachment.Id };

                // Do not touch the following code, there is a race condition whereby the control's handle is not created by the
                // time the statusupdate events start firing. This ensures that it is created immediately.
                var handle = rc.Handle;
                if (handle == IntPtr.Zero)
                {
                    Logger.LogError("Attachment risk control's handle is invalid.");
                }
                rc.DecryptAttachmentClicked += OnDecryptAttachmentClicked;
                rc.ViewRiskReportClicked += (sender, args) => _presenter.ViewRiskReport(args.Attachment);
                rc.RemoveEncryptedAttachment += (sender, args) => RemoveAttachment(args.Attachment, false);

                _cleanFilesControl.AddAttachmentRiskControl(rc);

                _convertToPdfControl.AddAttachment(attachment);
            }
            catch (ObjectDisposedException e)
            {
                Logger.LogError(e);
            }
        }
        private void AddAttachment(IProtectAttachment attachment)
        {
            try
            {
                if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(() => AddAttachment(attachment)));
                    return;
                }

                if (_filesPanel.Controls.ContainsKey(attachment.Id))
                    _filesPanel.Controls.RemoveByKey(attachment.Id);

                var rc = new AttachmentRiskControl(attachment, PropertyChanged) { Dock = DockStyle.Top, Name = attachment.Id };
                // Do not touch the following code, there is a race condition whereby the control's handle is not created by the
                // time the statusupdate events start firing. This ensures that it is created immediately.
                var handle = rc.Handle;
                if (handle == IntPtr.Zero)
                {
                    Logger.LogError("Attachment risk control's handle is invalid.");
                }
                rc.AllowedToExpand = false;
                rc.DecryptAttachmentClicked += OnDecryptAttachmentClicked;
                _filesPanel.Controls.Add(rc);
            }
            catch (ObjectDisposedException e)
            {
                Logger.LogError(e);
            }
        }