Related: tdf#115964 convert the problematic dialog to a native gtk3 one

Change-Id: I84e10f1c45dfbe267f9b350d74271ac149bdaf43
Reviewed-on: https://gerrit.libreoffice.org/51432
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/uui/source/iahndl-authentication.cxx b/uui/source/iahndl-authentication.cxx
index 12ed4ed..2d4d536 100644
--- a/uui/source/iahndl-authentication.cxx
+++ b/uui/source/iahndl-authentication.cxx
@@ -518,11 +518,11 @@ executePasswordDialog(
        {
            if (bIsSimplePasswordRequest)
            {
                ScopedVclPtrInstance<PasswordDialog> xDialog(pParent, nMode, aResLocale, aDocName,
                    bIsPasswordToModify, bIsSimplePasswordRequest);
                std::unique_ptr<PasswordDialog> xDialog(new PasswordDialog(pParent ? pParent->GetFrameWeld() : nullptr, nMode,
                    aResLocale, aDocName, bIsPasswordToModify, bIsSimplePasswordRequest));
                xDialog->SetMinLen(0);

                rInfo.SetResult(xDialog->Execute() == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
                rInfo.SetResult(xDialog->run() == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
                rInfo.SetPassword(xDialog->GetPassword());
            }
            else
@@ -541,11 +541,11 @@ executePasswordDialog(
        }
        else // enter password or reenter password
        {
            ScopedVclPtrInstance<PasswordDialog> xDialog(pParent, nMode, aResLocale, aDocName,
                bIsPasswordToModify, bIsSimplePasswordRequest);
            std::unique_ptr<PasswordDialog> xDialog(new PasswordDialog(pParent ? pParent->GetFrameWeld() : nullptr, nMode,
                aResLocale, aDocName, bIsPasswordToModify, bIsSimplePasswordRequest));
            xDialog->SetMinLen(0);

            rInfo.SetResult(xDialog->Execute() == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
            rInfo.SetResult(xDialog->run() == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
            rInfo.SetPassword(bIsPasswordToModify ? OUString() : xDialog->GetPassword());
            rInfo.SetPasswordToModify(bIsPasswordToModify ? xDialog->GetPassword() : OUString());
        }
diff --git a/uui/source/passworddlg.cxx b/uui/source/passworddlg.cxx
index eec9540..14cb634 100644
--- a/uui/source/passworddlg.cxx
+++ b/uui/source/passworddlg.cxx
@@ -27,100 +27,84 @@

using namespace ::com::sun::star;

PasswordDialog::PasswordDialog(vcl::Window* _pParent,
PasswordDialog::PasswordDialog(weld::Window* pParent,
    task::PasswordRequestMode nDlgMode, const std::locale& rLocale,
    const OUString& aDocURL, bool bOpenToModify, bool bIsSimplePasswordRequest)
    : ModalDialog(_pParent, "PasswordDialog", "uui/ui/password.ui")
    : GenericDialogController(pParent, "uui/ui/password.ui", "PasswordDialog")
    , m_xFTPassword(m_xBuilder->weld_label("newpassFT"))
    , m_xEDPassword(m_xBuilder->weld_entry("newpassEntry"))
    , m_xFTConfirmPassword(m_xBuilder->weld_label("confirmpassFT"))
    , m_xEDConfirmPassword(m_xBuilder->weld_entry("confirmpassEntry"))
    , m_xOKBtn(m_xBuilder->weld_button("ok"))
    , nMinLen(1)
    , aPasswdMismatch(Translate::get(STR_PASSWORD_MISMATCH, rLocale))
    , nDialogMode(nDlgMode)
    , rResLocale(rLocale)
{
    get(m_pFTPassword, "newpassFT");
    get(m_pEDPassword, "newpassEntry");
    get(m_pFTConfirmPassword, "confirmpassFT");
    get(m_pEDConfirmPassword, "confirmpassEntry");
    get(m_pOKBtn, "ok");

    if( nDialogMode == task::PasswordRequestMode_PASSWORD_REENTER )
    {
        const char* pOpenToModifyErrStrId = bOpenToModify ? STR_ERROR_PASSWORD_TO_MODIFY_WRONG : STR_ERROR_PASSWORD_TO_OPEN_WRONG;
        const char* pErrStrId = bIsSimplePasswordRequest ? STR_ERROR_SIMPLE_PASSWORD_WRONG : pOpenToModifyErrStrId;
        OUString aErrorMsg(Translate::get(pErrStrId, rResLocale));
        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(_pParent ? _pParent->GetFrameWeld() : nullptr,
        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(pParent,
                                                  VclMessageType::Warning, VclButtonsType::Ok, aErrorMsg));
        xBox->run();
    }

    // default settings for enter password or reenter passwd...
    OUString aTitle(Translate::get(STR_TITLE_ENTER_PASSWORD, rResLocale));
    m_pFTConfirmPassword->Hide();
    m_pEDConfirmPassword->Hide();
    m_pFTConfirmPassword->Enable( false );
    m_pEDConfirmPassword->Enable( false );
    m_xFTConfirmPassword->hide();
    m_xEDConfirmPassword->hide();
    m_xFTConfirmPassword->set_sensitive(false);
    m_xEDConfirmPassword->set_sensitive(false);

    // settings for create password
    if (nDialogMode == task::PasswordRequestMode_PASSWORD_CREATE)
    {
        aTitle = Translate::get(STR_TITLE_CREATE_PASSWORD, rResLocale);

        m_pFTConfirmPassword->SetText(Translate::get(STR_CONFIRM_SIMPLE_PASSWORD, rResLocale));
        m_xFTConfirmPassword->set_label(Translate::get(STR_CONFIRM_SIMPLE_PASSWORD, rResLocale));

        m_pFTConfirmPassword->Show();
        m_pEDConfirmPassword->Show();
        m_pFTConfirmPassword->Enable();
        m_pEDConfirmPassword->Enable();
        m_xFTConfirmPassword->show();
        m_xEDConfirmPassword->show();
        m_xFTConfirmPassword->set_sensitive(true);
        m_xEDConfirmPassword->set_sensitive(true);
    }

    SetText( aTitle );
    m_xDialog->set_title(aTitle);

    const char* pStrId = bOpenToModify ? STR_ENTER_PASSWORD_TO_MODIFY : STR_ENTER_PASSWORD_TO_OPEN;
    OUString aMessage(Translate::get(pStrId, rResLocale));
    INetURLObject url(aDocURL);
    aMessage += url.HasError()
        ? aDocURL : url.GetMainURL(INetURLObject::DecodeMechanism::Unambiguous);
    m_pFTPassword->SetText(aMessage);
    m_xFTPassword->set_label(aMessage);

    if (bIsSimplePasswordRequest)
    {
        DBG_ASSERT( aDocURL.isEmpty(), "A simple password request should not have a document URL! Use document password request instead." );
        m_pFTPassword->SetText(Translate::get(STR_ENTER_SIMPLE_PASSWORD, rResLocale));
        m_xFTPassword->set_label(Translate::get(STR_ENTER_SIMPLE_PASSWORD, rResLocale));
    }

    m_pOKBtn->SetClickHdl( LINK( this, PasswordDialog, OKHdl_Impl ) );
    m_xOKBtn->connect_clicked(LINK(this, PasswordDialog, OKHdl_Impl));
}

PasswordDialog::~PasswordDialog()
IMPL_LINK_NOARG(PasswordDialog, OKHdl_Impl, weld::Button&, void)
{
    disposeOnce();
}
    bool bEDPasswdValid = m_xEDPassword->get_text().getLength() >= nMinLen;
    bool bPasswdMismatch = m_xEDConfirmPassword->get_text() != m_xEDPassword->get_text();
    bool bValid = (!m_xEDConfirmPassword->get_visible() && bEDPasswdValid) ||
            (m_xEDConfirmPassword->get_visible() && bEDPasswdValid && !bPasswdMismatch);

void PasswordDialog::dispose()
{
    m_pFTPassword.clear();
    m_pEDPassword.clear();
    m_pFTConfirmPassword.clear();
    m_pEDConfirmPassword.clear();
    m_pOKBtn.clear();
    ModalDialog::dispose();
}

IMPL_LINK_NOARG(PasswordDialog, OKHdl_Impl, Button*, void)
{
    bool bEDPasswdValid = m_pEDPassword->GetText().getLength() >= nMinLen;
    bool bPasswdMismatch = m_pEDConfirmPassword->GetText() != m_pEDPassword->GetText();
    bool bValid = (!m_pEDConfirmPassword->IsVisible() && bEDPasswdValid) ||
            (m_pEDConfirmPassword->IsVisible() && bEDPasswdValid && !bPasswdMismatch);

    if (m_pEDConfirmPassword->IsVisible() && bPasswdMismatch)
    if (m_xEDConfirmPassword->get_visible() && bPasswdMismatch)
    {
        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(GetFrameWeld(),
        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_xDialog.get(),
                                                  VclMessageType::Warning, VclButtonsType::Ok,
                                                  aPasswdMismatch));
        xBox->run();
    }
    else if (bValid)
        EndDialog( RET_OK );
        m_xDialog->response(RET_OK);
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/uui/source/passworddlg.hxx b/uui/source/passworddlg.hxx
index fc067db..bf865b0 100644
--- a/uui/source/passworddlg.hxx
+++ b/uui/source/passworddlg.hxx
@@ -21,34 +21,27 @@
#define INCLUDED_UUI_SOURCE_PASSWORDDLG_HXX

#include <com/sun/star/task/PasswordRequestMode.hpp>
#include <vcl/button.hxx>
#include <vcl/dialog.hxx>
#include <vcl/edit.hxx>
#include <vcl/group.hxx>
#include <vcl/fixed.hxx>
#include <vcl/weld.hxx>


class PasswordDialog : public ModalDialog
class PasswordDialog : public weld::GenericDialogController
{
    VclPtr<FixedText>      m_pFTPassword;
    VclPtr<Edit>           m_pEDPassword;
    VclPtr<FixedText>      m_pFTConfirmPassword;
    VclPtr<Edit>           m_pEDConfirmPassword;
    VclPtr<OKButton>       m_pOKBtn;
    std::unique_ptr<weld::Label> m_xFTPassword;
    std::unique_ptr<weld::Entry> m_xEDPassword;
    std::unique_ptr<weld::Label> m_xFTConfirmPassword;
    std::unique_ptr<weld::Entry> m_xEDConfirmPassword;
    std::unique_ptr<weld::Button> m_xOKBtn;
    sal_uInt16      nMinLen;
    OUString        aPasswdMismatch;


    DECL_LINK(OKHdl_Impl, Button*, void);
    DECL_LINK(OKHdl_Impl, weld::Button&, void);

public:
    PasswordDialog(vcl::Window* pParent, css::task::PasswordRequestMode nDlgMode, const std::locale& rLocale, const OUString& aDocURL,
    PasswordDialog(weld::Window* pParent, css::task::PasswordRequestMode nDlgMode, const std::locale& rLocale, const OUString& aDocURL,
                   bool bOpenToModify, bool bIsSimplePasswordRequest);
    virtual ~PasswordDialog() override;
    virtual void dispose() override;

    void            SetMinLen( sal_uInt16 nMin ) { nMinLen = nMin; }
    OUString        GetPassword() const { return m_pEDPassword->GetText(); }
    OUString        GetPassword() const { return m_xEDPassword->get_text(); }

private:
    css::task::PasswordRequestMode     nDialogMode;
diff --git a/uui/uiconfig/ui/password.ui b/uui/uiconfig/ui/password.ui
index 22149b7..ea574d0 100644
--- a/uui/uiconfig/ui/password.ui
+++ b/uui/uiconfig/ui/password.ui
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.20.2 -->
<interface domain="uui">
  <requires lib="gtk+" version="3.18"/>
  <object class="GtkDialog" id="PasswordDialog">
    <property name="can_focus">False</property>
    <property name="border_width">6</property>
    <property name="title" translatable="yes" context="password|PasswordDialog">Set Password</property>
    <property name="modal">True</property>
    <property name="default_width">0</property>
    <property name="default_height">0</property>
    <property name="type_hint">dialog</property>
    <child internal-child="vbox">
      <object class="GtkBox" id="dialog-vbox1">
@@ -80,9 +83,9 @@
              <object class="GtkLabel" id="confirmpassFT">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="xalign">0</property>
                <property name="use_underline">True</property>
                <property name="mnemonic_widget">confirmpassEntry</property>
                <property name="xalign">0</property>
              </object>
              <packing>
                <property name="left_attach">0</property>
@@ -93,9 +96,9 @@
              <object class="GtkLabel" id="newpassFT">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="xalign">0</property>
                <property name="use_underline">True</property>
                <property name="mnemonic_widget">newpassEntry</property>
                <property name="xalign">0</property>
              </object>
              <packing>
                <property name="left_attach">0</property>
@@ -108,6 +111,7 @@
                <property name="can_focus">True</property>
                <property name="hexpand">True</property>
                <property name="visibility">False</property>
                <property name="activates_default">True</property>
              </object>
              <packing>
                <property name="left_attach">0</property>
@@ -120,6 +124,7 @@
                <property name="can_focus">True</property>
                <property name="hexpand">True</property>
                <property name="visibility">False</property>
                <property name="activates_default">True</property>
              </object>
              <packing>
                <property name="left_attach">0</property>
@@ -136,10 +141,12 @@
      </object>
    </child>
    <action-widgets>
      <action-widget response="-5">ok</action-widget>
      <action-widget response="-6">cancel</action-widget>
      <action-widget response="-11">help</action-widget>
    </action-widgets>
    <child>
      <placeholder/>
    </child>
  </object>
  <object class="GtkSizeGroup" id="sizegroup1"/>
</interface>