dbaccess/inc/strings.hrc              |    3 
 dbaccess/source/ui/dlg/UserAdmin.cxx  |  160 +++++++++++++++++-----------------
 dbaccess/source/ui/dlg/UserAdmin.hxx  |    6 -
 dbaccess/uiconfig/ui/useradminpage.ui |  112 +++++++++--------------
 4 files changed, 128 insertions(+), 153 deletions(-)

New commits:
commit 947ad25207a52d8d245a977430244cce38734b65
Author:     Heiko Tietze <tietze.he...@gmail.com>
AuthorDate: Wed Aug 3 16:56:18 2022 +0200
Commit:     Heiko Tietze <heiko.tie...@documentfoundation.org>
CommitDate: Wed Aug 3 19:54:05 2022 +0200

    Resolves tdf#149944 - UI issues with Base's User Administration dialog
    
    Buttons for add, delete user and change password moved into a menu
    
    Change-Id: Ibddda5269f0a8a9219538833b1f871b041dd5341
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137754
    Tested-by: Jenkins
    Reviewed-by: Heiko Tietze <heiko.tie...@documentfoundation.org>

diff --git a/dbaccess/inc/strings.hrc b/dbaccess/inc/strings.hrc
index ea57f4ebd240..f8370a1832b0 100644
--- a/dbaccess/inc/strings.hrc
+++ b/dbaccess/inc/strings.hrc
@@ -420,6 +420,9 @@
 #define STR_EXCEPTION_INFO                          NC_("STR_EXCEPTION_INFO", 
"Information")
 #define STR_EXCEPTION_DETAILS                       
NC_("STR_EXCEPTION_DETAILS", "Details")
 
+#define STR_ADD_USER                                NC_("STR_ADD_USER", "Add 
User")
+#define STR_DELETE_USER                             NC_("STR_DELETE_USER", 
"Delete User")
+#define STR_CHANGE_PASSWORD                         NC_("STR_CHANGE_PASSWORD", 
"Change Password")
 #define STR_QUERY_USERADMIN_DELETE_USER             
NC_("STR_QUERY_USERADMIN_DELETE_USER", "Do you really want to delete the user?")
 #define STR_USERADMIN_NOT_AVAILABLE                 
NC_("STR_USERADMIN_NOT_AVAILABLE", "The database does not support user 
administration." )
 #define STR_ERROR_PASSWORDS_NOT_IDENTICAL           
NC_("STR_ERROR_PASSWORDS_NOT_IDENTICAL", "The passwords do not match. Please 
enter the password again.")
diff --git a/dbaccess/source/ui/dlg/UserAdmin.cxx 
b/dbaccess/source/ui/dlg/UserAdmin.cxx
index b601c49391fc..d7396dc4970f 100644
--- a/dbaccess/source/ui/dlg/UserAdmin.cxx
+++ b/dbaccess/source/ui/dlg/UserAdmin.cxx
@@ -49,6 +49,10 @@ using namespace comphelper;
 
 namespace {
 
+#define MNI_ACTION_ADD_USER "add"
+#define MNI_ACTION_DEL_USER "delete"
+#define MNI_ACTION_CHANGE_PASSWORD "password"
+
 class OPasswordDialog : public weld::GenericDialogController
 {
     std::unique_ptr<weld::Frame> m_xUser;
@@ -111,20 +115,87 @@ IMPL_LINK(OPasswordDialog, ModifiedHdl, weld::Entry&, 
rEdit, void)
 // OUserAdmin
 OUserAdmin::OUserAdmin(weld::Container* pPage, weld::DialogController* 
pController,const SfxItemSet& _rAttrSet)
     : OGenericAdministrationPage(pPage, pController, 
"dbaccess/ui/useradminpage.ui", "UserAdminPage", _rAttrSet)
+    , mxActionBar(m_xBuilder->weld_menu_button("action_menu"))
     , m_xUSER(m_xBuilder->weld_combo_box("user"))
-    , m_xNEWUSER(m_xBuilder->weld_button("add"))
-    , m_xCHANGEPWD(m_xBuilder->weld_button("changepass"))
-    , m_xDELETEUSER(m_xBuilder->weld_button("delete"))
     , m_xTable(m_xBuilder->weld_container("table"))
     , m_xTableCtrlParent(m_xTable->CreateChildFrame())
     , m_xTableCtrl(VclPtr<OTableGrantControl>::Create(m_xTableCtrlParent))
 {
+    mxActionBar->append_item(MNI_ACTION_ADD_USER, DBA_RES(STR_ADD_USER));
+    mxActionBar->append_item(MNI_ACTION_DEL_USER, DBA_RES(STR_DELETE_USER));
+    mxActionBar->append_item(MNI_ACTION_CHANGE_PASSWORD, 
DBA_RES(STR_CHANGE_PASSWORD));
+    mxActionBar->connect_selected(LINK(this,OUserAdmin,MenuSelectHdl));
+
     m_xTableCtrl->Show();
 
     m_xUSER->connect_changed(LINK(this, OUserAdmin, ListDblClickHdl));
-    m_xNEWUSER->connect_clicked(LINK(this, OUserAdmin, UserHdl));
-    m_xCHANGEPWD->connect_clicked(LINK(this, OUserAdmin, UserHdl));
-    m_xDELETEUSER->connect_clicked(LINK(this, OUserAdmin, UserHdl));
+}
+
+IMPL_LINK(OUserAdmin, MenuSelectHdl, const OString&, rIdent, void)
+{
+    try
+    {
+        if (rIdent == MNI_ACTION_ADD_USER) {
+            SfxPasswordDialog aPwdDlg(GetFrameWeld());
+            aPwdDlg.ShowExtras(SfxShowExtras::ALL);
+            if (aPwdDlg.run())
+            {
+                Reference<XDataDescriptorFactory> 
xUserFactory(m_xUsers,UNO_QUERY);
+                Reference<XPropertySet> xNewUser = 
xUserFactory->createDataDescriptor();
+                if(xNewUser.is())
+                {
+                    
xNewUser->setPropertyValue(PROPERTY_NAME,Any(aPwdDlg.GetUser()));
+                    
xNewUser->setPropertyValue(PROPERTY_PASSWORD,Any(aPwdDlg.GetPassword()));
+                    Reference<XAppend> xAppend(m_xUsers,UNO_QUERY);
+                    if(xAppend.is())
+                        xAppend->appendByDescriptor(xNewUser);
+                }
+            }
+        }
+        else if (rIdent == MNI_ACTION_DEL_USER) {
+            if (m_xUsers.is() && m_xUsers->hasByName(GetUser()))
+            {
+                Reference<XDrop> xDrop(m_xUsers,UNO_QUERY);
+                if(xDrop.is())
+                {
+                    std::unique_ptr<weld::MessageDialog> 
xQry(Application::CreateMessageDialog(GetFrameWeld(),
+                                                            
VclMessageType::Question, VclButtonsType::YesNo,
+                                                            
DBA_RES(STR_QUERY_USERADMIN_DELETE_USER)));
+                    if (xQry->run() == RET_YES)
+                        xDrop->dropByName(GetUser());
+                }
+            }
+        }
+        else if (rIdent == MNI_ACTION_CHANGE_PASSWORD) {
+            OUString sName = GetUser();
+            if(m_xUsers->hasByName(sName))
+            {
+                Reference<XUser> xUser;
+                m_xUsers->getByName(sName) >>= xUser;
+                if(xUser.is())
+                {
+                    OPasswordDialog aDlg(GetFrameWeld(), sName);
+                    if (aDlg.run() == RET_OK)
+                    {
+                        OUString sNewPassword,sOldPassword;
+                        sNewPassword = aDlg.GetNewPassword();
+                        sOldPassword = aDlg.GetOldPassword();
+
+                        if(!sNewPassword.isEmpty())
+                            xUser->changePassword(sOldPassword,sNewPassword);
+                    }
+                }
+            }
+        }
+        FillUserNames();
+    }
+    catch(const SQLException& e)
+    {
+        ::dbtools::showError(::dbtools::SQLExceptionInfo(e), 
GetDialogController()->getDialog()->GetXWindow(), m_xORB);
+    }
+    catch(Exception& )
+    {
+    }
 }
 
 OUserAdmin::~OUserAdmin()
@@ -173,11 +244,11 @@ void OUserAdmin::FillUserNames()
     }
 
     Reference<XAppend> xAppend(m_xUsers,UNO_QUERY);
-    m_xNEWUSER->set_sensitive(xAppend.is());
+    mxActionBar->set_item_sensitive(MNI_ACTION_ADD_USER, xAppend.is());
     Reference<XDrop> xDrop(m_xUsers,UNO_QUERY);
-    m_xDELETEUSER->set_sensitive(xDrop.is());
+    mxActionBar->set_item_sensitive(MNI_ACTION_DEL_USER, xDrop.is());
+    mxActionBar->set_item_sensitive(MNI_ACTION_CHANGE_PASSWORD, m_xUsers.is());
 
-    m_xCHANGEPWD->set_sensitive(m_xUsers.is());
     m_xTableCtrl->Enable(m_xUsers.is());
 }
 
@@ -186,77 +257,6 @@ std::unique_ptr<SfxTabPage> OUserAdmin::Create( 
weld::Container* pPage, weld::Di
     return std::make_unique<OUserAdmin>( pPage, pController, *_rAttrSet );
 }
 
-IMPL_LINK(OUserAdmin, UserHdl, weld::Button&, rButton, void)
-{
-    try
-    {
-        if (&rButton == m_xNEWUSER.get())
-        {
-            SfxPasswordDialog aPwdDlg(GetFrameWeld());
-            aPwdDlg.ShowExtras(SfxShowExtras::ALL);
-            if (aPwdDlg.run())
-            {
-                Reference<XDataDescriptorFactory> 
xUserFactory(m_xUsers,UNO_QUERY);
-                Reference<XPropertySet> xNewUser = 
xUserFactory->createDataDescriptor();
-                if(xNewUser.is())
-                {
-                    
xNewUser->setPropertyValue(PROPERTY_NAME,Any(aPwdDlg.GetUser()));
-                    
xNewUser->setPropertyValue(PROPERTY_PASSWORD,Any(aPwdDlg.GetPassword()));
-                    Reference<XAppend> xAppend(m_xUsers,UNO_QUERY);
-                    if(xAppend.is())
-                        xAppend->appendByDescriptor(xNewUser);
-                }
-            }
-        }
-        else if (&rButton == m_xCHANGEPWD.get())
-        {
-            OUString sName = GetUser();
-
-            if(m_xUsers->hasByName(sName))
-            {
-                Reference<XUser> xUser;
-                m_xUsers->getByName(sName) >>= xUser;
-                if(xUser.is())
-                {
-                    OPasswordDialog aDlg(GetFrameWeld(), sName);
-                    if (aDlg.run() == RET_OK)
-                    {
-                        OUString sNewPassword,sOldPassword;
-                        sNewPassword = aDlg.GetNewPassword();
-                        sOldPassword = aDlg.GetOldPassword();
-
-                        if(!sNewPassword.isEmpty())
-                            xUser->changePassword(sOldPassword,sNewPassword);
-                    }
-                }
-            }
-        }
-        else
-        {// delete user
-            if(m_xUsers.is() && m_xUsers->hasByName(GetUser()))
-            {
-                Reference<XDrop> xDrop(m_xUsers,UNO_QUERY);
-                if(xDrop.is())
-                {
-                    std::unique_ptr<weld::MessageDialog> 
xQry(Application::CreateMessageDialog(GetFrameWeld(),
-                                                              
VclMessageType::Question, VclButtonsType::YesNo,
-                                                              
DBA_RES(STR_QUERY_USERADMIN_DELETE_USER)));
-                    if (xQry->run() == RET_YES)
-                        xDrop->dropByName(GetUser());
-                }
-            }
-        }
-        FillUserNames();
-    }
-    catch(const SQLException& e)
-    {
-        ::dbtools::showError(::dbtools::SQLExceptionInfo(e), 
GetDialogController()->getDialog()->GetXWindow(), m_xORB);
-    }
-    catch(Exception& )
-    {
-    }
-}
-
 IMPL_LINK_NOARG(OUserAdmin, ListDblClickHdl, weld::ComboBox&, void)
 {
     m_xTableCtrl->setUserName(GetUser());
diff --git a/dbaccess/source/ui/dlg/UserAdmin.hxx 
b/dbaccess/source/ui/dlg/UserAdmin.hxx
index e9c2a13e7876..045d8c39806f 100644
--- a/dbaccess/source/ui/dlg/UserAdmin.hxx
+++ b/dbaccess/source/ui/dlg/UserAdmin.hxx
@@ -32,10 +32,8 @@ namespace dbaui
 
 class OUserAdmin final : public OGenericAdministrationPage
 {
+    std::unique_ptr<weld::MenuButton> mxActionBar;
     std::unique_ptr<weld::ComboBox> m_xUSER;
-    std::unique_ptr<weld::Button> m_xNEWUSER;
-    std::unique_ptr<weld::Button> m_xCHANGEPWD;
-    std::unique_ptr<weld::Button> m_xDELETEUSER;
     std::unique_ptr<weld::Container> m_xTable;
     css::uno::Reference<css::awt::XWindow> m_xTableCtrlParent;
     VclPtr<OTableGrantControl> m_xTableCtrl; // show the grant rights of one 
user
@@ -48,7 +46,7 @@ class OUserAdmin final : public OGenericAdministrationPage
 
     // methods
     DECL_LINK(ListDblClickHdl, weld::ComboBox&, void);
-    DECL_LINK(UserHdl, weld::Button&, void);
+    DECL_LINK(MenuSelectHdl, const OString&, void);
 
     void        FillUserNames();
 
diff --git a/dbaccess/uiconfig/ui/useradminpage.ui 
b/dbaccess/uiconfig/ui/useradminpage.ui
index 4d649ea90af9..e76349a49b90 100644
--- a/dbaccess/uiconfig/ui/useradminpage.ui
+++ b/dbaccess/uiconfig/ui/useradminpage.ui
@@ -1,44 +1,50 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.1 -->
+<!-- Generated with glade 3.38.2 -->
 <interface domain="dba">
   <requires lib="gtk+" version="3.20"/>
+  <object class="GtkMenu" id="menu">
+    <property name="visible">True</property>
+    <property name="can-focus">False</property>
+  </object>
   <object class="GtkBox" id="UserAdminPage">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <property name="hexpand">True</property>
     <property name="vexpand">True</property>
-    <property name="border_width">6</property>
+    <property name="border-width">6</property>
     <property name="orientation">vertical</property>
     <property name="spacing">12</property>
     <child>
       <object class="GtkFrame" id="frame1">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
+        <property name="margin-start">6</property>
+        <property name="margin-end">6</property>
+        <property name="margin-top">6</property>
         <property name="hexpand">True</property>
-        <property name="label_xalign">0</property>
-        <property name="shadow_type">none</property>
+        <property name="label-xalign">0</property>
+        <property name="shadow-type">none</property>
         <child>
           <object class="GtkBox" id="box1">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
+            <property name="margin-top">6</property>
             <property name="hexpand">True</property>
             <property name="orientation">vertical</property>
             <property name="spacing">6</property>
-            <property name="margin-top">6</property>
             <child>
               <object class="GtkBox" id="box2">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
                 <property name="spacing">12</property>
                 <child>
                   <object class="GtkLabel" id="label3">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="halign">start</property>
-                    <property name="hexpand">True</property>
                     <property name="label" translatable="yes" 
context="useradminpage|label3">Us_er:</property>
-                    <property name="use_underline">True</property>
+                    <property name="use-underline">True</property>
                     <property name="xalign">0</property>
                   </object>
                   <packing>
@@ -50,7 +56,7 @@
                 <child>
                   <object class="GtkComboBoxText" id="user">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="hexpand">True</property>
                   </object>
                   <packing>
@@ -59,54 +65,19 @@
                     <property name="position">1</property>
                   </packing>
                 </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="box3">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="hexpand">True</property>
-                <property name="spacing">6</property>
-                <child>
-                  <object class="GtkButton" id="add">
-                    <property name="label" translatable="yes" 
context="useradminpage|add">_Add User...</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_underline">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="changepass">
-                    <property name="label" translatable="yes" 
context="useradminpage|changepass">Change _Password...</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_underline">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
                 <child>
-                  <object class="GtkButton" id="delete">
-                    <property name="label" translatable="yes" 
context="useradminpage|delete">_Delete User...</property>
+                  <object class="GtkMenuButton" id="action_menu">
+                    <property name="label" translatable="yes" 
context="templatedlg|action_menu|label">_Manage</property>
+                    <property name="use-underline">True</property>
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_underline">True</property>
+                    <property name="can-focus">True</property>
+                    <property name="focus-on-click">False</property>
+                    <property name="receives-default">True</property>
+                    <property name="halign">end</property>
+                    <property name="popup">menu</property>
+                    <child>
+                      <placeholder/>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -118,7 +89,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">True</property>
-                <property name="position">1</property>
+                <property name="position">0</property>
               </packing>
             </child>
           </object>
@@ -126,7 +97,7 @@
         <child type="label">
           <object class="GtkLabel" id="label1">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="label" translatable="yes" 
context="useradminpage|label1">User Selection</property>
             <attributes>
               <attribute name="weight" value="bold"/>
@@ -143,20 +114,23 @@
     <child>
       <object class="GtkFrame" id="frame2">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
+        <property name="margin-start">6</property>
+        <property name="margin-end">6</property>
+        <property name="margin-bottom">6</property>
         <property name="hexpand">True</property>
         <property name="vexpand">True</property>
-        <property name="label_xalign">0</property>
-        <property name="shadow_type">none</property>
+        <property name="label-xalign">0</property>
+        <property name="shadow-type">none</property>
         <child>
           <object class="GtkBox" id="table">
+            <property name="height-request">150</property>
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="margin-top">6</property>
             <property name="hexpand">True</property>
             <property name="vexpand">True</property>
-            <property name="visible">True</property>
-            <property name="height_request">150</property>
-            <property name="can_focus">False</property>
             <property name="orientation">vertical</property>
-            <property name="margin-top">6</property>
             <child>
               <placeholder/>
             </child>
@@ -165,7 +139,7 @@
         <child type="label">
           <object class="GtkLabel" id="label2">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="label" translatable="yes" 
context="useradminpage|label2">Access Rights for Selected User</property>
             <attributes>
               <attribute name="weight" value="bold"/>

Reply via email to