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)); }