sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx |   43 ++++++++++++++++++----
 sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx |   15 ++++++-
 sw/source/uibase/sidebar/SwPanelFactory.cxx       |    4 +-
 3 files changed, 51 insertions(+), 11 deletions(-)

New commits:
commit 3cbfe076658b57aff1bf5c016208b98cefd91ce7
Author:     Balazs Varga <balazs.varga.ext...@allotropia.de>
AuthorDate: Mon Jun 16 13:18:37 2025 +0200
Commit:     Balazs Varga <balazs.varga.ext...@allotropia.de>
CommitDate: Wed Jun 18 16:00:53 2025 +0200

    tdf#161710 - A11Y sw: fix missing scrollbar with many warnings
    
    Update a11y sidebar layout when we expand/collapse or adding a new
    warning to the a11y sidebar in order to have the correct layout size
    of the content of a11y sidebar.
    
    Change-Id: I6829ddba119bbf6f76737d869aec151def38f68b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186570
    Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de>
    Tested-by: Jenkins
    Reviewed-by: Balazs Varga <balazs.varga.ext...@allotropia.de>

diff --git a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx 
b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx
index e495998871fa..ba1799e71717 100644
--- a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx
+++ b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx
@@ -99,11 +99,13 @@ IMPL_LINK_NOARG(AccessibilityCheckEntry, FixButtonClicked, 
weld::Button&, void)
         m_pAccessibilityIssue->quickFixIssue();
 }
 
-AccessibilityCheckLevel::AccessibilityCheckLevel(weld::Box* pParent)
+AccessibilityCheckLevel::AccessibilityCheckLevel(weld::Box* pParent,
+                                                 
css::uno::Reference<css::ui::XSidebar> xSidebar)
     : m_xBuilder(Application::CreateBuilder(pParent, 
u"svx/ui/accessibilitychecklevel.ui"_ustr,
                                             false,
                                             
reinterpret_cast<sal_uInt64>(SfxViewShell::Current())))
     , m_xContainer(m_xBuilder->weld_box(u"accessibilityCheckLevelBox"_ustr))
+    , m_xSidebar(std::move(xSidebar))
 {
     m_xExpanders[0] = m_xBuilder->weld_expander(u"expand_document"_ustr);
     m_xExpanders[1] = m_xBuilder->weld_expander(u"expand_styles"_ustr);
@@ -117,6 +119,9 @@ AccessibilityCheckLevel::AccessibilityCheckLevel(weld::Box* 
pParent)
     m_xExpanders[9] = m_xBuilder->weld_expander(u"expand_numbering"_ustr);
     m_xExpanders[10] = m_xBuilder->weld_expander(u"expand_other"_ustr);
 
+    for (const auto& xExpanders : m_xExpanders)
+        xExpanders->connect_expanded(LINK(this, AccessibilityCheckLevel, 
ExpandHdl));
+
     m_xBoxes[0] = m_xBuilder->weld_box(u"box_document"_ustr);
     m_xBoxes[1] = m_xBuilder->weld_box(u"box_styles"_ustr);
     m_xBoxes[2] = m_xBuilder->weld_box(u"box_linked"_ustr);
@@ -130,6 +135,12 @@ 
AccessibilityCheckLevel::AccessibilityCheckLevel(weld::Box* pParent)
     m_xBoxes[10] = m_xBuilder->weld_box(u"box_other"_ustr);
 }
 
+IMPL_LINK_NOARG(AccessibilityCheckLevel, ExpandHdl, weld::Expander&, void)
+{
+    if (m_xSidebar.is())
+        m_xSidebar->requestLayout();
+}
+
 void AccessibilityCheckLevel::removeAllEntries()
 {
     for (auto eGroup : o3tl::enumrange<AccessibilityCheckGroups>())
@@ -163,16 +174,18 @@ void AccessibilityCheckLevel::show(size_t nGroupIndex) { 
m_xExpanders[nGroupInde
 
 void AccessibilityCheckLevel::hide(size_t nGroupIndex) { 
m_xExpanders[nGroupIndex]->hide(); }
 
-std::unique_ptr<PanelLayout> A11yCheckIssuesPanel::Create(weld::Widget* 
pParent,
-                                                          SfxBindings* 
pBindings)
+std::unique_ptr<PanelLayout>
+A11yCheckIssuesPanel::Create(weld::Widget* pParent, SfxBindings* pBindings,
+                             css::uno::Reference<css::ui::XSidebar> xSidebar)
 {
     if (pParent == nullptr)
         throw css::lang::IllegalArgumentException(
             u"no parent window given to A11yCheckIssuesPanel::Create"_ustr, 
nullptr, 0);
-    return std::make_unique<A11yCheckIssuesPanel>(pParent, pBindings);
+    return std::make_unique<A11yCheckIssuesPanel>(pParent, pBindings, 
xSidebar);
 }
 
-A11yCheckIssuesPanel::A11yCheckIssuesPanel(weld::Widget* pParent, SfxBindings* 
pBindings)
+A11yCheckIssuesPanel::A11yCheckIssuesPanel(weld::Widget* pParent, SfxBindings* 
pBindings,
+                                           
css::uno::Reference<css::ui::XSidebar> xSidebar)
     : PanelLayout(pParent, u"A11yCheckIssuesPanel"_ustr,
                   u"modules/swriter/ui/a11ycheckissuespanel.ui"_ustr)
     , m_xOptionsButton(m_xBuilder->weld_button(u"bOptions"_ustr))
@@ -181,19 +194,26 @@ A11yCheckIssuesPanel::A11yCheckIssuesPanel(weld::Widget* 
pParent, SfxBindings* p
     , m_xListSep(m_xBuilder->weld_widget(u"sep_level"_ustr))
     , mpBindings(pBindings)
     , mpDoc(nullptr)
+    , mxSidebar(std::move(xSidebar))
     , maA11yCheckController(FN_STAT_ACCESSIBILITY_CHECK, *pBindings, *this)
     , mnIssueCount(0)
     , mbAutomaticCheckEnabled(false)
 {
     // errors
     m_xLevelExpanders[0] = m_xBuilder->weld_expander(u"expand_errors"_ustr);
+    m_xLevelExpanders[0]->connect_expanded(LINK(this, A11yCheckIssuesPanel, 
ExpandHdl));
+
     mxAccessibilityBox[0] = m_xBuilder->weld_box(u"accessibilityBoxErr"_ustr);
-    m_aLevelEntries[0] = 
std::make_unique<AccessibilityCheckLevel>(mxAccessibilityBox[0].get());
+    m_aLevelEntries[0]
+        = 
std::make_unique<AccessibilityCheckLevel>(mxAccessibilityBox[0].get(), 
mxSidebar);
 
     // warnings
     m_xLevelExpanders[1] = m_xBuilder->weld_expander(u"expand_warnings"_ustr);
+    m_xLevelExpanders[1]->connect_expanded(LINK(this, A11yCheckIssuesPanel, 
ExpandHdl));
+
     mxAccessibilityBox[1] = m_xBuilder->weld_box(u"accessibilityBoxWrn"_ustr);
-    m_aLevelEntries[1] = 
std::make_unique<AccessibilityCheckLevel>(mxAccessibilityBox[1].get());
+    m_aLevelEntries[1]
+        = 
std::make_unique<AccessibilityCheckLevel>(mxAccessibilityBox[1].get(), 
mxSidebar);
 
     mxUpdateLinkButton->connect_activate_link(
         LINK(this, A11yCheckIssuesPanel, UpdateLinkButtonClicked));
@@ -244,6 +264,12 @@ IMPL_LINK_NOARG(A11yCheckIssuesPanel, 
OptionsButtonClicked, weld::Button&, void)
     pDispatcher->ExecuteList(SID_OPTIONS_TREEDIALOG, SfxCallMode::SYNCHRON, { 
&aPageID });
 }
 
+IMPL_LINK_NOARG(A11yCheckIssuesPanel, ExpandHdl, weld::Expander&, void)
+{
+    if (mxSidebar.is())
+        mxSidebar->requestLayout();
+}
+
 IMPL_LINK_NOARG(A11yCheckIssuesPanel, UpdateLinkButtonClicked, 
weld::LinkButton&, bool)
 {
     m_xLevelExpanders[0]->show();
@@ -454,6 +480,9 @@ void A11yCheckIssuesPanel::populateIssues()
 
     if (pWindow)
         pWindow->SetPointer(PointerStyle::Arrow);
+
+    if (mxSidebar.is())
+        mxSidebar->requestLayout();
 }
 
 void A11yCheckIssuesPanel::NotifyItemUpdate(const sal_uInt16 nSid, const 
SfxItemState /* eState */,
diff --git a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx 
b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx
index cae37c9dcecd..10fb734b9734 100644
--- a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx
+++ b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx
@@ -18,6 +18,8 @@
 #include <tools/link.hxx>
 #include <vcl/weld.hxx>
 
+#include <com/sun/star/ui/XSidebar.hpp>
+
 #include <doc.hxx>
 
 namespace sw::sidebar
@@ -64,12 +66,15 @@ class AccessibilityCheckLevel
 private:
     std::unique_ptr<weld::Builder> m_xBuilder;
     std::unique_ptr<weld::Box> m_xContainer; ///< this is required for gtk3 
even if unused
+    css::uno::Reference<css::ui::XSidebar> m_xSidebar;
     std::array<std::vector<std::unique_ptr<AccessibilityCheckEntry>>, 11> 
m_aEntries;
     std::array<std::unique_ptr<weld::Expander>, 11> m_xExpanders;
     std::array<std::unique_ptr<weld::Box>, 11> m_xBoxes;
 
+    DECL_LINK(ExpandHdl, weld::Expander&, void);
+
 public:
-    AccessibilityCheckLevel(weld::Box* pParent);
+    AccessibilityCheckLevel(weld::Box* pParent, 
css::uno::Reference<css::ui::XSidebar> xSidebar);
 
     void removeAllEntries();
 
@@ -85,7 +90,8 @@ class A11yCheckIssuesPanel : public PanelLayout,
                              public 
::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface
 {
 public:
-    static std::unique_ptr<PanelLayout> Create(weld::Widget* pParent, 
SfxBindings* pBindings);
+    static std::unique_ptr<PanelLayout> Create(weld::Widget* pParent, 
SfxBindings* pBindings,
+                                               
css::uno::Reference<css::ui::XSidebar> xSidebar);
 
     virtual void NotifyItemUpdate(const sal_uInt16 nSId, const SfxItemState 
eState,
                                   const SfxPoolItem* pState) override;
@@ -93,7 +99,8 @@ public:
     virtual void GetControlState(const sal_uInt16 /*nSId*/,
                                  boost::property_tree::ptree& /*rState*/) 
override{};
 
-    A11yCheckIssuesPanel(weld::Widget* pParent, SfxBindings* pBindings);
+    A11yCheckIssuesPanel(weld::Widget* pParent, SfxBindings* pBindings,
+                         css::uno::Reference<css::ui::XSidebar> xSidebar);
     void ImplDestroy();
     virtual ~A11yCheckIssuesPanel() override;
 
@@ -111,6 +118,7 @@ private:
     void populateIssues();
 
     DECL_LINK(OptionsButtonClicked, weld::Button&, void);
+    DECL_LINK(ExpandHdl, weld::Expander&, void);
     DECL_LINK(UpdateLinkButtonClicked, weld::LinkButton&, bool);
     DECL_LINK(PopulateIssuesHdl, void*, void);
 
@@ -122,6 +130,7 @@ private:
 
     SfxBindings* mpBindings;
     SwDoc* mpDoc;
+    css::uno::Reference<css::ui::XSidebar> mxSidebar;
     ::sfx2::sidebar::ControllerItem maA11yCheckController;
     sal_Int32 mnIssueCount;
     bool mbAutomaticCheckEnabled;
diff --git a/sw/source/uibase/sidebar/SwPanelFactory.cxx 
b/sw/source/uibase/sidebar/SwPanelFactory.cxx
index 181858f99f45..cb8c8248bf3f 100644
--- a/sw/source/uibase/sidebar/SwPanelFactory.cxx
+++ b/sw/source/uibase/sidebar/SwPanelFactory.cxx
@@ -18,6 +18,7 @@
  */
 
 #include <com/sun/star/ui/XUIElementFactory.hpp>
+#include <com/sun/star/ui/XSidebar.hpp>
 
 #include "A11yCheckIssuesPanel.hxx"
 #include "CommentsPanel.hxx"
@@ -90,6 +91,7 @@ Reference<ui::XUIElement> SAL_CALL 
SwPanelFactory::createUIElement (
     const ::comphelper::NamedValueCollection aArguments (rArguments);
     Reference<frame::XFrame> xFrame (aArguments.getOrDefault(u"Frame"_ustr, 
Reference<frame::XFrame>()));
     Reference<awt::XWindow> xParentWindow 
(aArguments.getOrDefault(u"ParentWindow"_ustr, Reference<awt::XWindow>()));
+    Reference<ui::XSidebar> xSidebar(aArguments.getOrDefault(u"Sidebar"_ustr, 
Reference<ui::XSidebar>()));
     const sal_uInt64 nBindingsValue 
(aArguments.getOrDefault(u"SfxBindings"_ustr, sal_uInt64(0)));
     SfxBindings* pBindings = reinterpret_cast<SfxBindings*>(nBindingsValue);
 
@@ -211,7 +213,7 @@ Reference<ui::XUIElement> SAL_CALL 
SwPanelFactory::createUIElement (
     }
     else if (rsResourceURL.endsWith("/A11yCheckIssuesPanel"))
     {
-        std::unique_ptr<PanelLayout> xPanel = 
sw::sidebar::A11yCheckIssuesPanel::Create(pParent, pBindings);
+        std::unique_ptr<PanelLayout> xPanel = 
sw::sidebar::A11yCheckIssuesPanel::Create(pParent, pBindings, xSidebar);
         xElement = sfx2::sidebar::SidebarPanelBase::Create(
                         rsResourceURL, xFrame, std::move(xPanel), 
ui::LayoutSize(-1,-1,-1));
     }

Reply via email to