private void OnHideCheckedChanged(object sender, EventArgs e)
        {
            if (m_bInitializing)
            {
                return;
            }

            bool bHide = m_cbHide.Checked;

            if (!bHide && (m_uPrgmCheck == 0))
            {
                if (!AppPolicy.Try(AppPolicyId.UnhidePasswords))
                {
                    ++m_uPrgmCheck;
                    m_cbHide.Checked = true;
                    --m_uPrgmCheck;
                    return;
                }
            }

            m_tbPassword.EnableProtection(bHide);
            m_tbRepeat.EnableProtection(bHide);

            bool bWasAutoRepeat = Program.Config.UI.RepeatPasswordOnlyWhenHidden;

            if (bHide && (m_uPrgmCheck == 0) && bWasAutoRepeat)
            {
                ++m_uBlockUIUpdate;
                m_tbRepeat.TextEx = m_tbPassword.TextEx;
                --m_uBlockUIUpdate;
            }

            UpdateUI();
            if (m_uPrgmCheck == 0)
            {
                UIUtil.SetFocus(m_tbPassword, m_fParent);
            }
        }
        public void Attach(SecureTextBoxEx tbPassword, CheckBox cbHide, Label lblRepeat,
                           SecureTextBoxEx tbRepeat, Label lblQualityPrompt, QualityProgressBar pbQuality,
                           Label lblQualityInfo, ToolTip ttHint, Form fParent, bool bInitialHide,
                           bool bSecureDesktopMode)
        {
            if (tbPassword == null)
            {
                throw new ArgumentNullException("tbPassword");
            }
            if (cbHide == null)
            {
                throw new ArgumentNullException("cbHide");
            }
            if (lblRepeat == null)
            {
                throw new ArgumentNullException("lblRepeat");
            }
            if (tbRepeat == null)
            {
                throw new ArgumentNullException("tbRepeat");
            }
            if (lblQualityPrompt == null)
            {
                throw new ArgumentNullException("lblQualityPrompt");
            }
            if (pbQuality == null)
            {
                throw new ArgumentNullException("pbQuality");
            }
            if (lblQualityInfo == null)
            {
                throw new ArgumentNullException("lblQualityInfo");
            }
            // ttHint may be null
            if (fParent == null)
            {
                throw new ArgumentNullException("fParent");
            }

            Release();
            m_bInitializing = true;

            m_tbPassword       = tbPassword;
            m_cbHide           = cbHide;
            m_lblRepeat        = lblRepeat;
            m_tbRepeat         = tbRepeat;
            m_lblQualityPrompt = lblQualityPrompt;
            m_pbQuality        = pbQuality;
            m_lblQualityInfo   = lblQualityInfo;
            m_ttHint           = ttHint;
            m_fParent          = fParent;

            m_tbPassword.TextChanged += this.OnPasswordTextChanged;
            m_tbPassword.EnableProtection(bInitialHide);

            m_tbRepeat.TextChanged += this.OnRepeatTextChanged;
            m_tbRepeat.EnableProtection(bInitialHide);

            ConfigureHideButton(m_cbHide, m_ttHint);

            m_cbHide.Checked         = bInitialHide;
            m_cbHide.CheckedChanged += this.OnHideCheckedChanged;

            Debug.Assert(m_pbQuality.Minimum == 0);
            Debug.Assert(m_pbQuality.Maximum == 100);

            m_bInitializing = false;
            UpdateUI();
        }