basctl/source/basicide/brkdlg.cxx          |    6 --
 cui/source/dialogs/hangulhanjadlg.cxx      |    3 -
 dbaccess/source/ui/dlg/paramdialog.cxx     |   10 ---
 dbaccess/source/ui/misc/WCopyTable.cxx     |    4 -
 extensions/source/dbpilots/groupboxwiz.cxx |   14 +++-
 include/vcl/weld.hxx                       |   11 ++-
 vcl/inc/salvtables.hxx                     |   16 ++---
 vcl/source/app/salvtables.cxx              |   84 ++++++++++++++++-------------
 vcl/source/control/wizardmachine.cxx       |   14 +---
 vcl/unx/gtk3/gtkinst.cxx                   |   84 ++++++++++++++++++-----------
 10 files changed, 136 insertions(+), 110 deletions(-)

New commits:
commit e2ff4206d60df486bf02931ce69c47857de6b04e
Author:     Caolán McNamara <[email protected]>
AuthorDate: Mon Jan 24 11:11:05 2022 +0000
Commit:     Caolán McNamara <[email protected]>
CommitDate: Mon Jan 24 15:56:59 2022 +0100

    gtk4: adapt to window_[g|s]et_default_widget
    
    Change-Id: I916e5db05f8ea10ecc8b319cc77a671ca7cbcb93
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128859
    Tested-by: Caolán McNamara <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/basctl/source/basicide/brkdlg.cxx 
b/basctl/source/basicide/brkdlg.cxx
index 6a79d0e1da54..37ba1dbb60ae 100644
--- a/basctl/source/basicide/brkdlg.cxx
+++ b/basctl/source/basicide/brkdlg.cxx
@@ -125,16 +125,14 @@ void BreakPointDialog::CheckButtons()
         m_xNewButton->set_sensitive(true);
         m_xOKButton->set_sensitive(false);
         m_xDelButton->set_sensitive(false);
-        m_xDelButton->set_has_default(false);
-        m_xNewButton->set_has_default(true);
+        m_xDialog->change_default_widget(m_xDelButton.get(), 
m_xNewButton.get());
     }
     else
     {
         m_xNewButton->set_sensitive(false);
         m_xOKButton->set_sensitive(true);
         m_xDelButton->set_sensitive(true);
-        m_xNewButton->set_has_default(false);
-        m_xDelButton->set_has_default(true);
+        m_xDialog->change_default_widget(m_xNewButton.get(), 
m_xDelButton.get());
     }
 }
 
diff --git a/cui/source/dialogs/hangulhanjadlg.cxx 
b/cui/source/dialogs/hangulhanjadlg.cxx
index cb1778329974..fb25df938e17 100644
--- a/cui/source/dialogs/hangulhanjadlg.cxx
+++ b/cui/source/dialogs/hangulhanjadlg.cxx
@@ -622,8 +622,7 @@ namespace svx
             pNewDefButton = m_xFind.get();
         }
 
-        pOldDefButton->set_has_default(false);
-        pNewDefButton->set_has_default(true);
+        m_xDialog->change_default_widget(pOldDefButton, pNewDefButton);
     }
 
     OUString HangulHanjaConversionDialog::GetCurrentSuggestion( ) const
diff --git a/dbaccess/source/ui/dlg/paramdialog.cxx 
b/dbaccess/source/ui/dlg/paramdialog.cxx
index 12f96d186f78..de3347682ed3 100644
--- a/dbaccess/source/ui/dlg/paramdialog.cxx
+++ b/dbaccess/source/ui/dlg/paramdialog.cxx
@@ -124,15 +124,10 @@ namespace dbaui
             OnEntrySelected();
 
             if (m_xAllParams->n_children() == 1)
-            {
                 m_xTravelNext->set_sensitive(false);
-            }
 
             if (m_xAllParams->n_children() > 1)
-            {
-                m_xOKBtn->set_has_default(false);
-                m_xTravelNext->set_has_default(true);
-            }
+                m_xDialog->change_default_widget(m_xOKBtn.get(), 
m_xTravelNext.get());
         }
 
         m_xParam->grab_focus();
@@ -322,8 +317,7 @@ namespace dbaui
         if (!bVisited)
         {
             // yes, there isn't another one -> change the "default button"
-            m_xTravelNext->set_has_default(false);
-            m_xOKBtn->set_has_default(true);
+            m_xDialog->change_default_widget(m_xTravelNext.get(), 
m_xOKBtn.get());
         }
     }
 
diff --git a/dbaccess/source/ui/misc/WCopyTable.cxx 
b/dbaccess/source/ui/misc/WCopyTable.cxx
index 03458111fc73..a4f04f1aa037 100644
--- a/dbaccess/source/ui/misc/WCopyTable.cxx
+++ b/dbaccess/source/ui/misc/WCopyTable.cxx
@@ -651,9 +651,9 @@ void OCopyTableWizard::construct()
 
     if (!m_vDestColumns.empty())
         // source is a html or rtf table
-        m_xNextPage->set_has_default(true);
+        m_xAssistant->change_default_widget(nullptr, m_xNextPage.get());
     else
-        m_xFinish->set_has_default(true);
+        m_xAssistant->change_default_widget(nullptr, m_xFinish.get());
 
     m_pTypeInfo = std::make_shared<OTypeInfo>();
     m_pTypeInfo->aUIName = m_sTypeNames.getToken(TYPE_OTHER, ';');
diff --git a/extensions/source/dbpilots/groupboxwiz.cxx 
b/extensions/source/dbpilots/groupboxwiz.cxx
index ead0e4a4e48e..a093d9154b22 100644
--- a/extensions/source/dbpilots/groupboxwiz.cxx
+++ b/extensions/source/dbpilots/groupboxwiz.cxx
@@ -280,17 +280,21 @@ namespace dbp
         m_xMoveLeft->set_sensitive(bSelectedSome);
         m_xMoveRight->set_sensitive(bUnfinishedInput);
 
-        getDialog()->enableButtons(WizardButtonFlags::NEXT, bHaveSome);
+        OControlWizard* pDialogController = getDialog();
+
+        pDialogController->enableButtons(WizardButtonFlags::NEXT, bHaveSome);
+
+        weld::Dialog* pDialog = pDialogController->getDialog();
 
         if (bUnfinishedInput)
         {
-            if (!m_xMoveRight->get_has_default())
-                getDialog()->defaultButton(m_xMoveRight.get());
+            if (!pDialog->is_default_widget(m_xMoveRight.get()))
+                pDialogController->defaultButton(m_xMoveRight.get());
         }
         else
         {
-            if (m_xMoveRight->get_has_default())
-                getDialog()->defaultButton(WizardButtonFlags::NEXT);
+            if (pDialog->is_default_widget(m_xMoveRight.get()))
+                pDialogController->defaultButton(WizardButtonFlags::NEXT);
         }
     }
 
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 40c2fbd86b49..af92c7640004 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -136,9 +136,6 @@ public:
     // TODO: review if this has any practical difference from has_focus()
     virtual bool is_active() const = 0;
 
-    virtual void set_has_default(bool has_default) = 0;
-    virtual bool get_has_default() const = 0;
-
     /* size */
     virtual void set_size_request(int nWidth, int nHeight) = 0;
     virtual Size get_size_request() const = 0;
@@ -356,8 +353,6 @@ protected:
 public:
     // remove and add in one go
     virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) = 0;
-    // recursively unset has-default on any buttons in the widget hierarchy
-    virtual void recursively_unset_default_buttons() = 0;
     // create an XWindow as a child of this container. The XWindow is
     // suitable to contain css::awt::XControl items
     virtual css::uno::Reference<css::awt::XWindow> CreateChildFrame() = 0;
@@ -535,6 +530,12 @@ public:
     // desirable)
     virtual bool has_toplevel_focus() const = 0;
     virtual void present() = 0;
+
+    // with pOld of null, automatically find the old default widget and unset
+    // it, otherwise use as hint to the old default
+    virtual void change_default_widget(weld::Widget* pOld, weld::Widget* pNew) 
= 0;
+    virtual bool is_default_widget(const weld::Widget* pCandidate) const = 0;
+
     virtual void set_window_state(const OString& rStr) = 0;
     virtual OString get_window_state(WindowStateMask nMask) const = 0;
 
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index e21c9d48780e..b6573d2cf489 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -228,10 +228,6 @@ public:
 
     virtual bool has_child_focus() const override;
 
-    virtual void set_has_default(bool has_default) override;
-
-    virtual bool get_has_default() const override;
-
     virtual void show() override;
 
     virtual void hide() override;
@@ -417,9 +413,6 @@ class SalInstanceContainer : public SalInstanceWidget, 
public virtual weld::Cont
 protected:
     VclPtr<vcl::Window> m_xContainer;
 
-private:
-    void implResetDefault(const vcl::Window* _pWindow);
-
 public:
     SalInstanceContainer(vcl::Window* pContainer, SalInstanceBuilder* pBuilder,
                          bool bTakeOwnership);
@@ -427,7 +420,6 @@ public:
     virtual void connect_container_focus_changed(const Link<Container&, void>& 
rLink) override;
     virtual void child_grab_focus() override;
     virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) 
override;
-    virtual void recursively_unset_default_buttons() override;
     virtual css::uno::Reference<css::awt::XWindow> CreateChildFrame() override;
 };
 
@@ -442,6 +434,10 @@ private:
 
     void clear_child_help(vcl::Window* pParent);
 
+    void recursively_unset_default_buttons();
+
+    void implResetDefault(const vcl::Window* _pWindow);
+
 public:
     SalInstanceWindow(vcl::Window* pWindow, SalInstanceBuilder* pBuilder, bool 
bTakeOwnership);
 
@@ -475,6 +471,10 @@ public:
 
     virtual void present() override;
 
+    virtual void change_default_widget(weld::Widget* pOld, weld::Widget* pNew) 
override;
+
+    virtual bool is_default_widget(const weld::Widget* pCandidate) const 
override;
+
     virtual void set_window_state(const OString& rStr) override;
 
     virtual OString get_window_state(WindowStateMask nMask) const override;
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index bfcd6834caac..7f33f6e7973b 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -304,13 +304,6 @@ bool SalInstanceWidget::is_active() const { return 
m_xWidget->IsActive(); }
 
 bool SalInstanceWidget::has_child_focus() const { return 
m_xWidget->HasChildPathFocus(true); }
 
-void SalInstanceWidget::set_has_default(bool has_default)
-{
-    m_xWidget->set_property("has-default", OUString::boolean(has_default));
-}
-
-bool SalInstanceWidget::get_has_default() const { return m_xWidget->GetStyle() 
& WB_DEFBUTTON; }
-
 void SalInstanceWidget::show() { m_xWidget->Show(); }
 
 void SalInstanceWidget::hide() { m_xWidget->Hide(); }
@@ -1179,30 +1172,6 @@ public:
 };
 }
 
-void SalInstanceContainer::implResetDefault(const vcl::Window* _pWindow)
-{
-    vcl::Window* pChildLoop = _pWindow->GetWindow(GetWindowType::FirstChild);
-    while (pChildLoop)
-    {
-        // does the window participate in the tabbing order?
-        if (pChildLoop->GetStyle() & WB_DIALOGCONTROL)
-            implResetDefault(pChildLoop);
-
-        // is it a button?
-        WindowType eType = pChildLoop->GetType();
-        if ((WindowType::PUSHBUTTON == eType) || (WindowType::OKBUTTON == 
eType)
-            || (WindowType::CANCELBUTTON == eType) || (WindowType::HELPBUTTON 
== eType)
-            || (WindowType::IMAGEBUTTON == eType) || (WindowType::MENUBUTTON 
== eType)
-            || (WindowType::MOREBUTTON == eType))
-        {
-            pChildLoop->SetStyle(pChildLoop->GetStyle() & ~WB_DEFBUTTON);
-        }
-
-        // the next one ...
-        pChildLoop = pChildLoop->GetWindow(GetWindowType::Next);
-    }
-}
-
 void SalInstanceContainer::connect_container_focus_changed(const 
Link<Container&, void>& rLink)
 {
     ensure_event_listener();
@@ -1250,11 +1219,6 @@ void SalInstanceContainer::child_grab_focus()
         pFirstChild->ImplControlFocus();
 }
 
-void SalInstanceContainer::recursively_unset_default_buttons()
-{
-    implResetDefault(m_xContainer.get());
-}
-
 css::uno::Reference<css::awt::XWindow> SalInstanceContainer::CreateChildFrame()
 {
     auto xPage = VclPtr<VclBin>::Create(m_xContainer.get());
@@ -1514,6 +1478,54 @@ void SalInstanceWindow::present()
     m_xWindow->ToTop(ToTopFlags::RestoreWhenMin | ToTopFlags::ForegroundTask);
 }
 
+void SalInstanceWindow::implResetDefault(const vcl::Window* _pWindow)
+{
+    vcl::Window* pChildLoop = _pWindow->GetWindow(GetWindowType::FirstChild);
+    while (pChildLoop)
+    {
+        // does the window participate in the tabbing order?
+        if (pChildLoop->GetStyle() & WB_DIALOGCONTROL)
+            implResetDefault(pChildLoop);
+
+        // is it a button?
+        WindowType eType = pChildLoop->GetType();
+        if ((WindowType::PUSHBUTTON == eType) || (WindowType::OKBUTTON == 
eType)
+            || (WindowType::CANCELBUTTON == eType) || (WindowType::HELPBUTTON 
== eType)
+            || (WindowType::IMAGEBUTTON == eType) || (WindowType::MENUBUTTON 
== eType)
+            || (WindowType::MOREBUTTON == eType))
+        {
+            pChildLoop->SetStyle(pChildLoop->GetStyle() & ~WB_DEFBUTTON);
+        }
+
+        // the next one ...
+        pChildLoop = pChildLoop->GetWindow(GetWindowType::Next);
+    }
+}
+
+void SalInstanceWindow::recursively_unset_default_buttons() { 
implResetDefault(m_xWindow.get()); }
+
+void SalInstanceWindow::change_default_widget(weld::Widget* pOld, 
weld::Widget* pNew)
+{
+    if (!pOld)
+        recursively_unset_default_buttons();
+    else
+    {
+        SalInstanceWidget* pVclOld = dynamic_cast<SalInstanceWidget*>(pOld);
+        pVclOld->getWidget()->set_property("has-default", 
OUString::boolean(false));
+    }
+    if (pNew)
+    {
+        SalInstanceWidget* pVclNew = dynamic_cast<SalInstanceWidget*>(pNew);
+        pVclNew->getWidget()->set_property("has-default", 
OUString::boolean(true));
+    }
+}
+
+bool SalInstanceWindow::is_default_widget(const weld::Widget* pCandidate) const
+{
+    const SalInstanceWidget* pVclCandidate = dynamic_cast<const 
SalInstanceWidget*>(pCandidate);
+    return pVclCandidate->getWidget()->GetStyle() & WB_DEFBUTTON;
+}
+
 void SalInstanceWindow::set_window_state(const OString& rStr)
 {
     SystemWindow* pSysWin = dynamic_cast<SystemWindow*>(m_xWindow.get());
diff --git a/vcl/source/control/wizardmachine.cxx 
b/vcl/source/control/wizardmachine.cxx
index 59d2514fbbce..e2ed41ff0de7 100644
--- a/vcl/source/control/wizardmachine.cxx
+++ b/vcl/source/control/wizardmachine.cxx
@@ -949,21 +949,15 @@ namespace vcl
         if (_nWizardButtonFlags & WizardButtonFlags::CANCEL)
             pNewDefButton = m_xCancel.get();
 
-        if ( pNewDefButton )
-            defaultButton( pNewDefButton );
-        else
-            m_xAssistant->recursively_unset_default_buttons();
+        defaultButton(pNewDefButton);
     }
 
     void WizardMachine::defaultButton(weld::Button* _pNewDefButton)
     {
         // loop through all (direct and indirect) descendants which 
participate in our tabbing order, and
-        // reset the WB_DEFBUTTON for every window which is a button
-        m_xAssistant->recursively_unset_default_buttons();
-
-        // set its new style
-        if (_pNewDefButton)
-            _pNewDefButton->set_has_default(true);
+        // reset the WB_DEFBUTTON for every window which is a button and set 
_pNewDefButton as the new
+        // WB_DEFBUTTON
+        m_xAssistant->change_default_widget(nullptr, _pNewDefButton);
     }
 
     void WizardMachine::enableButtons(WizardButtonFlags _nWizardButtonFlags, 
bool _bEnable)
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 39ebfb67bb38..ebc162dfcf65 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -3510,18 +3510,6 @@ public:
         return false;
     }
 
-    virtual void set_has_default(bool has_default) override
-    {
-        g_object_set(G_OBJECT(m_pWidget), "has-default", has_default, nullptr);
-    }
-
-    virtual bool get_has_default() const override
-    {
-        gboolean has_default(false);
-        g_object_get(G_OBJECT(m_pWidget), "has-default", &has_default, 
nullptr);
-        return has_default;
-    }
-
     virtual void show() override
     {
         gtk_widget_show(m_pWidget);
@@ -3876,7 +3864,7 @@ public:
         return m_pWidget;
     }
 
-    GtkWindow* getWindow()
+    GtkWindow* getWindow() const
     {
         return GTK_WINDOW(widget_get_toplevel(m_pWidget));
     }
@@ -5692,18 +5680,6 @@ private:
     gulong m_nSetFocusChildSignalId;
     bool m_bChildHasFocus;
 
-    static void implResetDefault(GtkWidget *pWidget, gpointer user_data)
-    {
-        if (GTK_IS_BUTTON(pWidget))
-            g_object_set(G_OBJECT(pWidget), "has-default", false, nullptr);
-#if !GTK_CHECK_VERSION(4, 0, 0)
-        if (GTK_IS_CONTAINER(pWidget))
-            gtk_container_forall(GTK_CONTAINER(pWidget), implResetDefault, 
user_data);
-#else
-        (void)user_data;
-#endif
-    }
-
     void signal_set_focus_child(bool bChildHasFocus)
     {
         if (m_bChildHasFocus != bChildHasFocus)
@@ -5807,11 +5783,6 @@ public:
         g_object_unref(pChild);
     }
 
-    virtual void recursively_unset_default_buttons() override
-    {
-        implResetDefault(GTK_WIDGET(m_pContainer), nullptr);
-    }
-
     virtual css::uno::Reference<css::awt::XWindow> CreateChildFrame() override
     {
         // This will cause a GtkSalFrame to be created. With 
WB_SYSTEMCHILDWINDOW set it
@@ -6033,6 +6004,21 @@ private:
     rtl::Reference<SalGtkXWindow> m_xWindow; //uno api
     gulong m_nToplevelFocusChangedSignalId;
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
+    static void implResetDefault(GtkWidget *pWidget, gpointer user_data)
+    {
+        if (GTK_IS_BUTTON(pWidget))
+            g_object_set(G_OBJECT(pWidget), "has-default", false, nullptr);
+        if (GTK_IS_CONTAINER(pWidget))
+            gtk_container_forall(GTK_CONTAINER(pWidget), implResetDefault, 
user_data);
+    }
+
+    void recursively_unset_default_buttons()
+    {
+        implResetDefault(GTK_WIDGET(m_pWindow), nullptr);
+    }
+#endif
+
 #if !GTK_CHECK_VERSION(4, 0, 0)
     static gboolean help_pressed(GtkAccelGroup*, GObject*, guint, 
GdkModifierType, gpointer widget)
     {
@@ -6191,6 +6177,44 @@ public:
         gtk_window_present(m_pWindow);
     }
 
+    virtual void change_default_widget(weld::Widget* pOld, weld::Widget* pNew) 
override
+    {
+#if GTK_CHECK_VERSION(4, 0, 0)
+        GtkInstanceWidget* pGtkNew = dynamic_cast<GtkInstanceWidget*>(pNew);
+        GtkWidget* pWidgetNew = pGtkNew ? pGtkNew->getWidget() : nullptr;
+        gtk_window_set_default_widget(m_pWindow, pWidgetNew);
+        (void)pOld;
+#else
+        if (!pOld)
+            recursively_unset_default_buttons();
+        else
+        {
+            GtkInstanceWidget* pGtkOld = 
dynamic_cast<GtkInstanceWidget*>(pOld);
+            GtkWidget* pWidgetOld = pGtkOld->getWidget();
+            g_object_set(G_OBJECT(pWidgetOld), "has-default", false, nullptr);
+        }
+        if (pNew)
+        {
+            GtkInstanceWidget* pGtkNew = 
dynamic_cast<GtkInstanceWidget*>(pNew);
+            GtkWidget* pWidgetNew = pGtkNew->getWidget();
+            g_object_set(G_OBJECT(pWidgetNew), "has-default", true, nullptr);
+        }
+#endif
+    }
+
+    virtual bool is_default_widget(const weld::Widget* pCandidate) const 
override
+    {
+        const GtkInstanceWidget* pGtkCandidate = dynamic_cast<const 
GtkInstanceWidget*>(pCandidate);
+        GtkWidget* pWidget = pGtkCandidate->getWidget();
+#if GTK_CHECK_VERSION(4, 0, 0)
+        return gtk_window_get_default_widget(m_pWindow) == pWidget;
+#else
+        gboolean has_default(false);
+        g_object_get(G_OBJECT(pWidget), "has-default", &has_default, nullptr);
+        return has_default;
+#endif
+    }
+
     virtual void set_window_state(const OString& rStr) override
     {
         WindowStateData aData;

Reply via email to