diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2019-12-20 09:57:23 +0100 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2019-12-29 17:00:14 +0100 |
commit | 976960791fb3c770c00ee8e94ee4f56bfe610eeb (patch) | |
tree | a972756b3e7ca9472a512d414ce130dd626364cd | |
parent | 53c9a6a0f133b188896eb1a3c40587d7a2c9277d (diff) |
acc. check: add writer specific accessibility issue
This adds sw::AccessibilityIssue and refactors the existing
code to work with it.
In addition adds AccessibilityIssueCollection which holds
the vector of results.
Change-Id: Ide0fdbdba337bbf8c2fd18770895fb63a22528b6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/85919
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r-- | include/svx/AccessibilityCheck.hxx | 7 | ||||
-rw-r--r-- | include/svx/AccessibilityCheckDialog.hxx | 12 | ||||
-rw-r--r-- | include/svx/AccessibilityIssue.hxx | 13 | ||||
-rw-r--r-- | svx/source/dialog/AccessibilityCheckDialog.cxx | 17 | ||||
-rw-r--r-- | sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx | 6 | ||||
-rw-r--r-- | sw/source/core/access/AccessibilityCheck.cxx | 100 | ||||
-rw-r--r-- | sw/source/core/inc/AccessibilityIssue.hxx | 31 |
7 files changed, 111 insertions, 75 deletions
diff --git a/include/svx/AccessibilityCheck.hxx b/include/svx/AccessibilityCheck.hxx index 14e31065b879..f31b39d1d165 100644 --- a/include/svx/AccessibilityCheck.hxx +++ b/include/svx/AccessibilityCheck.hxx @@ -11,9 +11,10 @@ #ifndef INCLUDED_SVX_ACCESSIBILITYCHECK_HXX #define INCLUDED_SVX_ACCESSIBILITYCHECK_HXX +#include <svx/svxdllapi.h> #include <vector> +#include <memory> #include <rtl/ustring.hxx> -#include <svx/svxdllapi.h> #include <svx/AccessibilityIssue.hxx> namespace svx @@ -21,14 +22,14 @@ namespace svx class SVX_DLLPUBLIC AccessibilityCheck { protected: - std::vector<AccessibilityIssue> m_aIssueCollection; + AccessibilityIssueCollection m_aIssueCollection; public: virtual ~AccessibilityCheck() {} virtual void check() = 0; - std::vector<svx::AccessibilityIssue> const& getIssueCollecton() { return m_aIssueCollection; } + AccessibilityIssueCollection& getIssueCollecton() { return m_aIssueCollection; } }; } // end svx namespace diff --git a/include/svx/AccessibilityCheckDialog.hxx b/include/svx/AccessibilityCheckDialog.hxx index c55d69cbc696..d1cb2b8e20ab 100644 --- a/include/svx/AccessibilityCheckDialog.hxx +++ b/include/svx/AccessibilityCheckDialog.hxx @@ -27,27 +27,27 @@ private: std::unique_ptr<weld::Container> m_xContainer; std::unique_ptr<weld::Label> m_xLabel; - svx::AccessibilityIssue const& m_rAccessibilityIssue; + std::shared_ptr<AccessibilityIssue> const& m_pAccessibilityIssue; public: AccessibilityCheckEntry(weld::Container* pParent, - svx::AccessibilityIssue const& rAccessibilityIssue); + std::shared_ptr<AccessibilityIssue> const& pAccessibilityIssue); + weld::Widget* get_widget() const { return m_xContainer.get(); } }; class SVX_DLLPUBLIC AccessibilityCheckDialog final : public weld::GenericDialogController { private: - std::vector<svx::AccessibilityIssue> m_rAccessibilityIssueCollection; + AccessibilityIssueCollection m_aIssueCollection; std::vector<std::unique_ptr<AccessibilityCheckEntry>> m_aAccessibilityCheckEntries; // Controls std::unique_ptr<weld::Box> m_xAccessibilityCheckBox; public: - AccessibilityCheckDialog( - weld::Window* pParent, - std::vector<svx::AccessibilityIssue> const& rAccessibilityIssueCollection); + AccessibilityCheckDialog(weld::Window* pParent, + AccessibilityIssueCollection const& rIssueCollection); virtual ~AccessibilityCheckDialog() override; virtual short run() override; }; diff --git a/include/svx/AccessibilityIssue.hxx b/include/svx/AccessibilityIssue.hxx index 9d9143aef683..1f5089d97064 100644 --- a/include/svx/AccessibilityIssue.hxx +++ b/include/svx/AccessibilityIssue.hxx @@ -30,11 +30,22 @@ public: : m_eIssueID(eIssueID) { } + virtual ~AccessibilityIssue() {} AccessibilityIssueID m_eIssueID; OUString m_aIssueText; }; -} + +class SVX_DLLPUBLIC AccessibilityIssueCollection +{ +private: + std::vector<std::shared_ptr<AccessibilityIssue>> m_aIssues; + +public: + std::vector<std::shared_ptr<AccessibilityIssue>>& getIssues() { return m_aIssues; } +}; + +} // end svx namespace #endif // INCLUDED_SVX_ACCESSIBILITYISSUE_HXX diff --git a/svx/source/dialog/AccessibilityCheckDialog.cxx b/svx/source/dialog/AccessibilityCheckDialog.cxx index 06ab21d7611b..5459cb5ea5f5 100644 --- a/svx/source/dialog/AccessibilityCheckDialog.cxx +++ b/svx/source/dialog/AccessibilityCheckDialog.cxx @@ -14,23 +14,22 @@ namespace svx { -AccessibilityCheckEntry::AccessibilityCheckEntry(weld::Container* pParent, - AccessibilityIssue const& rAccessibilityIssue) +AccessibilityCheckEntry::AccessibilityCheckEntry( + weld::Container* pParent, std::shared_ptr<AccessibilityIssue> const& rAccessibilityIssue) : m_xBuilder(Application::CreateBuilder(pParent, "svx/ui/accessibilitycheckentry.ui")) , m_xContainer(m_xBuilder->weld_container("accessibilityCheckEntryBox")) , m_xLabel(m_xBuilder->weld_label("accessibilityCheckEntryLabel")) - , m_rAccessibilityIssue(rAccessibilityIssue) + , m_pAccessibilityIssue(rAccessibilityIssue) { - m_xLabel->set_label(m_rAccessibilityIssue.m_aIssueText); + m_xLabel->set_label(m_pAccessibilityIssue->m_aIssueText); m_xContainer->show(); } AccessibilityCheckDialog::AccessibilityCheckDialog( - weld::Window* pParent, - std::vector<svx::AccessibilityIssue> const& rAccessibilityIssueCollection) + weld::Window* pParent, AccessibilityIssueCollection const& rIssueCollection) : GenericDialogController(pParent, "svx/ui/accessibilitycheckdialog.ui", "AccessibilityCheckDialog") - , m_rAccessibilityIssueCollection(rAccessibilityIssueCollection) + , m_aIssueCollection(rIssueCollection) , m_xAccessibilityCheckBox(m_xBuilder->weld_box("accessibilityCheckBox")) { } @@ -41,10 +40,10 @@ short AccessibilityCheckDialog::run() { sal_Int32 i = 0; - for (svx::AccessibilityIssue const& rResult : m_rAccessibilityIssueCollection) + for (std::shared_ptr<AccessibilityIssue> const& pIssue : m_aIssueCollection.getIssues()) { auto xEntry - = std::make_unique<AccessibilityCheckEntry>(m_xAccessibilityCheckBox.get(), rResult); + = std::make_unique<AccessibilityCheckEntry>(m_xAccessibilityCheckBox.get(), pIssue); m_xAccessibilityCheckBox->reorder_child(xEntry->get_widget(), i++); m_aAccessibilityCheckEntries.push_back(std::move(xEntry)); } diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx index 1f114c004a6c..4f71190554ba 100644 --- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx +++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx @@ -29,10 +29,10 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheck) CPPUNIT_ASSERT(pDoc); sw::AccessibilityCheck aCheck(pDoc); aCheck.check(); - auto& aIssues = aCheck.getIssueCollecton(); + auto& aIssues = aCheck.getIssueCollecton().getIssues(); CPPUNIT_ASSERT_EQUAL(size_t(2), aIssues.size()); - CPPUNIT_ASSERT_EQUAL(svx::AccessibilityIssueID::DOCUMENT_LANGUAGE, aIssues[0].m_eIssueID); - CPPUNIT_ASSERT_EQUAL(svx::AccessibilityIssueID::DOCUMENT_TITLE, aIssues[1].m_eIssueID); + CPPUNIT_ASSERT_EQUAL(svx::AccessibilityIssueID::DOCUMENT_LANGUAGE, aIssues[0]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(svx::AccessibilityIssueID::DOCUMENT_TITLE, aIssues[1]->m_eIssueID); } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx index bf4fa661429e..dc82b4c17e48 100644 --- a/sw/source/core/access/AccessibilityCheck.cxx +++ b/sw/source/core/access/AccessibilityCheck.cxx @@ -9,6 +9,7 @@ */ #include <AccessibilityCheck.hxx> +#include <AccessibilityIssue.hxx> #include <ndgrf.hxx> #include <ndole.hxx> #include <ndtxt.hxx> @@ -45,13 +46,21 @@ OUString sTextBlinking("Blinking text."); OUString sAvoidFootnotes("Avoid footnotes."); OUString sAvoidEndnotes("Avoid endnotes."); +void lclAddIssue(svx::AccessibilityIssueCollection& rIssueCollection, OUString const& rText, + svx::AccessibilityIssueID eIssue = svx::AccessibilityIssueID::UNSPECIFIED) +{ + auto pIssue = std::make_shared<sw::AccessibilityIssue>(eIssue); + pIssue->m_aIssueText = rText; + rIssueCollection.getIssues().push_back(pIssue); +} + class BaseCheck { protected: - std::vector<svx::AccessibilityIssue>& m_rIssueCollection; + svx::AccessibilityIssueCollection& m_rIssueCollection; public: - BaseCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + BaseCheck(svx::AccessibilityIssueCollection& rIssueCollection) : m_rIssueCollection(rIssueCollection) { } @@ -61,7 +70,7 @@ public: class NodeCheck : public BaseCheck { public: - NodeCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + NodeCheck(svx::AccessibilityIssueCollection& rIssueCollection) : BaseCheck(rIssueCollection) { } @@ -81,14 +90,14 @@ class NoTextNodeAltTextCheck : public NodeCheck if (sAlternative.isEmpty()) { OUString sName = pNoTextNode->GetFlyFormat()->GetName(); - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sNoAlt.replaceAll("%OBJECT_NAME%", sName); - m_rIssueCollection.push_back(aIssue); + + OUString sIssueText = sNoAlt.replaceAll("%OBJECT_NAME%", sName); + lclAddIssue(m_rIssueCollection, sIssueText); } } public: - NoTextNodeAltTextCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + NoTextNodeAltTextCheck(svx::AccessibilityIssueCollection& rIssueCollection) : NodeCheck(rIssueCollection) { } @@ -117,9 +126,8 @@ private: if (rTable.IsTableComplex()) { OUString sName = rTable.GetTableStyleName(); - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); - m_rIssueCollection.push_back(aIssue); + OUString sIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); + lclAddIssue(m_rIssueCollection, sIssueText); } else { @@ -148,17 +156,16 @@ private: if (!bAllColumnsSameSize) { OUString sName = rTable.GetTableStyleName(); - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); - m_rIssueCollection.push_back(aIssue); + OUString sIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); + lclAddIssue(m_rIssueCollection, sIssueText); } } } } public: - TableNodeMergeSplitCheck(std::vector<svx::AccessibilityIssue>& rAccessibilityIssueCollection) - : NodeCheck(rAccessibilityIssueCollection) + TableNodeMergeSplitCheck(svx::AccessibilityIssueCollection& rIssueCollection) + : NodeCheck(rIssueCollection) { } @@ -184,7 +191,7 @@ private: }; public: - NumberingCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + NumberingCheck(svx::AccessibilityIssueCollection& rIssueCollection) : NodeCheck(rIssueCollection) , pPreviousTextNode(nullptr) { @@ -201,10 +208,9 @@ public: if (pCurrent->GetTextNode()->GetText().startsWith(rPair.second) && pPreviousTextNode->GetText().startsWith(rPair.first)) { - svx::AccessibilityIssue aIssue; OUString sNumbering = rPair.first + " " + rPair.second + "..."; - aIssue.m_aIssueText = sFakeNumbering.replaceAll("%NUMBERING%", sNumbering); - m_rIssueCollection.push_back(aIssue); + OUString sIssueText = sFakeNumbering.replaceAll("%NUMBERING%", sNumbering); + lclAddIssue(m_rIssueCollection, sIssueText); } } } @@ -228,16 +234,15 @@ private: OUString sText = xTextRange->getString(); if (INetURLObject(sText) == INetURLObject(sHyperlink)) { - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sHyperlinkTextIsLink.replaceFirst("%LINK%", sHyperlink); - m_rIssueCollection.push_back(aIssue); + OUString sIssueText = sHyperlinkTextIsLink.replaceFirst("%LINK%", sHyperlink); + lclAddIssue(m_rIssueCollection, sIssueText); } } } } public: - HyperlinkCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + HyperlinkCheck(svx::AccessibilityIssueCollection& rIssueCollection) : NodeCheck(rIssueCollection) { } @@ -361,15 +366,13 @@ private: double fContrastRatio = calculateContrastRatio(aForegroundColor, aBackgroundColor); if (fContrastRatio < 4.5) { - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sTextContrast; - m_rIssueCollection.push_back(aIssue); + lclAddIssue(m_rIssueCollection, sTextContrast); } } } public: - TextContrastCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + TextContrastCheck(svx::AccessibilityIssueCollection& rIssueCollection) : NodeCheck(rIssueCollection) { } @@ -411,15 +414,13 @@ private: if (bBlinking) { - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sTextBlinking; - m_rIssueCollection.push_back(aIssue); + lclAddIssue(m_rIssueCollection, sTextBlinking); } } } public: - BlinkingTextCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + BlinkingTextCheck(svx::AccessibilityIssueCollection& rIssueCollection) : NodeCheck(rIssueCollection) { } @@ -451,7 +452,7 @@ public: class DocumentCheck : public BaseCheck { public: - DocumentCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + DocumentCheck(svx::AccessibilityIssueCollection& rIssueCollection) : BaseCheck(rIssueCollection) { } @@ -463,7 +464,7 @@ public: class DocumentDefaultLanguageCheck : public DocumentCheck { public: - DocumentDefaultLanguageCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + DocumentDefaultLanguageCheck(svx::AccessibilityIssueCollection& rIssueCollection) : DocumentCheck(rIssueCollection) { } @@ -475,9 +476,8 @@ public: LanguageType eLanguage = rLang.GetLanguage(); if (eLanguage == LANGUAGE_NONE) { - svx::AccessibilityIssue aIssue(svx::AccessibilityIssueID::DOCUMENT_LANGUAGE); - aIssue.m_aIssueText = sDocumentDefaultLanguage; - m_rIssueCollection.push_back(aIssue); + lclAddIssue(m_rIssueCollection, sDocumentDefaultLanguage, + svx::AccessibilityIssueID::DOCUMENT_LANGUAGE); } else { @@ -486,10 +486,10 @@ public: const SwAttrSet& rAttrSet = pTextFormatCollection->GetAttrSet(); if (rAttrSet.GetLanguage(false).GetLanguage() == LANGUAGE_NONE) { - svx::AccessibilityIssue aIssue(svx::AccessibilityIssueID::STYLE_LANGUAGE); OUString sName = pTextFormatCollection->GetName(); - aIssue.m_aIssueText = sStyleNoLanguage.replaceAll("%STYLE_NAME%", sName); - m_rIssueCollection.push_back(aIssue); + OUString sIssueText = sStyleNoLanguage.replaceAll("%STYLE_NAME%", sName); + lclAddIssue(m_rIssueCollection, sIssueText, + svx::AccessibilityIssueID::STYLE_LANGUAGE); } } } @@ -499,7 +499,7 @@ public: class DocumentTitleCheck : public DocumentCheck { public: - DocumentTitleCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + DocumentTitleCheck(svx::AccessibilityIssueCollection& rIssueCollection) : DocumentCheck(rIssueCollection) { } @@ -516,9 +516,8 @@ public: OUString sTitle = xDocumentProperties->getTitle(); if (sTitle.isEmpty()) { - svx::AccessibilityIssue aIssue(svx::AccessibilityIssueID::DOCUMENT_TITLE); - aIssue.m_aIssueText = sDocumentTitle; - m_rIssueCollection.push_back(aIssue); + lclAddIssue(m_rIssueCollection, sDocumentTitle, + svx::AccessibilityIssueID::DOCUMENT_TITLE); } } } @@ -527,7 +526,7 @@ public: class FootnoteEndnoteCheck : public DocumentCheck { public: - FootnoteEndnoteCheck(std::vector<svx::AccessibilityIssue>& rIssueCollection) + FootnoteEndnoteCheck(svx::AccessibilityIssueCollection& rIssueCollection) : DocumentCheck(rIssueCollection) { } @@ -539,15 +538,11 @@ public: SwFormatFootnote const& rFootnote = pTextFootnote->GetFootnote(); if (rFootnote.IsEndNote()) { - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sAvoidEndnotes; - m_rIssueCollection.push_back(aIssue); + lclAddIssue(m_rIssueCollection, sAvoidEndnotes); } else { - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sAvoidFootnotes; - m_rIssueCollection.push_back(aIssue); + lclAddIssue(m_rIssueCollection, sAvoidFootnotes); } } } @@ -567,9 +562,8 @@ void AccessibilityCheck::checkObject(SdrObject* pObject) if (sAlternative.isEmpty()) { OUString sName = pObject->GetName(); - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sNoAlt.replaceAll("%OBJECT_NAME%", sName); - m_aIssueCollection.push_back(aIssue); + OUString sIssueText = sNoAlt.replaceAll("%OBJECT_NAME%", sName); + lclAddIssue(m_aIssueCollection, sIssueText); } } } diff --git a/sw/source/core/inc/AccessibilityIssue.hxx b/sw/source/core/inc/AccessibilityIssue.hxx new file mode 100644 index 000000000000..c0eaf73b1df6 --- /dev/null +++ b/sw/source/core/inc/AccessibilityIssue.hxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#ifndef INCLUDED_SW_SOURCE_CORE_ACCESSIBILITYISSUE_HXX +#define INCLUDED_SW_SOURCE_CORE_ACCESSIBILITYISSUE_HXX + +#include <svx/AccessibilityIssue.hxx> + +namespace sw +{ +class SW_DLLPUBLIC AccessibilityIssue final : public svx::AccessibilityIssue +{ +public: + AccessibilityIssue(svx::AccessibilityIssueID eIssueID = svx::AccessibilityIssueID::UNSPECIFIED) + : svx::AccessibilityIssue(eIssueID) + { + } +}; + +} // end sw namespace + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |