sw/source/core/access/AccessibilityCheck.cxx | 166 +++++++++++++++++---------- sw/source/core/inc/AccessibilityCheck.hxx | 4 2 files changed, 110 insertions(+), 60 deletions(-)
New commits: commit 87f7414c071d80b627ffca6d0602f9b4e21448b4 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sun Dec 8 20:59:43 2019 +0100 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Thu Dec 26 21:52:38 2019 +0100 acc. check: Introduce NodeCheck for accessibility checks on nodes NodeCheck responsibility is to check a node for accessibility issues. For each node there are multiple node checks executed and currently there are 2 node check implementations: - NoTextNodeAltTextCheck - TableNodeMergeSplitCheck These 2 checks are converted from the current checks in the code. Change-Id: Idde7092536f094d936aa3d353f4512949ca36a60 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/85839 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx index 165b3da43483..c75122de54bb 100644 --- a/sw/source/core/access/AccessibilityCheck.cxx +++ b/sw/source/core/access/AccessibilityCheck.cxx @@ -24,71 +24,126 @@ namespace // TODO move these to string file and look for a better name. OUString sNoAlt("No alt text for graphic '%OBJECT_NAME%'"); OUString sTableMergeSplit("Table '%OBJECT_NAME%' contains merges or splits"); -} -void AccessibilityCheck::checkTableNode(SwTableNode* pTableNode) +class NodeCheck { - if (!pTableNode) - return; +protected: + std::vector<svx::AccessibilityIssue>& m_rAccessibilityIssueCollection; - SwTable const& rTable = pTableNode->GetTable(); - if (rTable.IsTableComplex()) +public: + NodeCheck(std::vector<svx::AccessibilityIssue>& rAccessibilityIssueCollection) + : m_rAccessibilityIssueCollection(rAccessibilityIssueCollection) { - OUString sName = rTable.GetTableStyleName(); - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); - m_aAccessibilityIssueCollection.push_back(aIssue); } - else + virtual ~NodeCheck() {} + virtual void check(SwNode* pCurrent) = 0; +}; + +// Check NoTextNodes: Graphic, OLE for alt (title) text +class NoTextNodeAltTextCheck : public NodeCheck +{ + void checkNoTextNode(SwNoTextNode* pNoTextNode) { - if (rTable.GetTabLines().size() > 1) + if (!pNoTextNode) + return; + + OUString sAlternative = pNoTextNode->GetTitle(); + if (sAlternative.isEmpty()) { - int i = 0; - size_t nFirstLineSize = 0; - bool bAllColumnsSameSize = true; + OUString sName = pNoTextNode->GetFlyFormat()->GetName(); + svx::AccessibilityIssue aIssue; + aIssue.m_aIssueText = sNoAlt.replaceAll("%OBJECT_NAME%", sName); + m_rAccessibilityIssueCollection.push_back(aIssue); + } + } - for (SwTableLine const* pTableLine : rTable.GetTabLines()) +public: + NoTextNodeAltTextCheck(std::vector<svx::AccessibilityIssue>& rAccessibilityIssueCollection) + : NodeCheck(rAccessibilityIssueCollection) + { + } + + void check(SwNode* pCurrent) override + { + if (pCurrent->GetNodeType() & SwNodeType::NoTextMask) + { + SwNoTextNode* pNoTextNode = pCurrent->GetNoTextNode(); + if (pNoTextNode) + checkNoTextNode(pNoTextNode); + } + } +}; + +// Check Table node if the table is merged and splitted. +class TableNodeMergeSplitCheck : public NodeCheck +{ +private: + void checkTableNode(SwTableNode* pTableNode) + { + if (!pTableNode) + return; + + SwTable const& rTable = pTableNode->GetTable(); + if (rTable.IsTableComplex()) + { + OUString sName = rTable.GetTableStyleName(); + svx::AccessibilityIssue aIssue; + aIssue.m_aIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); + m_rAccessibilityIssueCollection.push_back(aIssue); + } + else + { + if (rTable.GetTabLines().size() > 1) { - if (i == 0) - { - nFirstLineSize = pTableLine->GetTabBoxes().size(); - } - else + int i = 0; + size_t nFirstLineSize = 0; + bool bAllColumnsSameSize = true; + + for (SwTableLine const* pTableLine : rTable.GetTabLines()) { - size_t nLineSize = pTableLine->GetTabBoxes().size(); - if (nFirstLineSize != nLineSize) + if (i == 0) + { + nFirstLineSize = pTableLine->GetTabBoxes().size(); + } + else { - bAllColumnsSameSize = false; + size_t nLineSize = pTableLine->GetTabBoxes().size(); + if (nFirstLineSize != nLineSize) + { + bAllColumnsSameSize = false; + } } + i++; + } + if (!bAllColumnsSameSize) + { + OUString sName = rTable.GetTableStyleName(); + svx::AccessibilityIssue aIssue; + aIssue.m_aIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); + m_rAccessibilityIssueCollection.push_back(aIssue); } - i++; - } - if (!bAllColumnsSameSize) - { - OUString sName = rTable.GetTableStyleName(); - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sTableMergeSplit.replaceAll("%OBJECT_NAME%", sName); - m_aAccessibilityIssueCollection.push_back(aIssue); } } } -} -// Check NoTextNodes: Graphic, OLE -void AccessibilityCheck::checkNoTextNode(SwNoTextNode* pNoTextNode) -{ - if (!pNoTextNode) - return; +public: + TableNodeMergeSplitCheck(std::vector<svx::AccessibilityIssue>& rAccessibilityIssueCollection) + : NodeCheck(rAccessibilityIssueCollection) + { + } - OUString sAlternative = pNoTextNode->GetTitle(); - if (sAlternative.isEmpty()) + void check(SwNode* pCurrent) override { - OUString sName = pNoTextNode->GetFlyFormat()->GetName(); - svx::AccessibilityIssue aIssue; - aIssue.m_aIssueText = sNoAlt.replaceAll("%OBJECT_NAME%", sName); - m_aAccessibilityIssueCollection.push_back(aIssue); + if (pCurrent->GetNodeType() & SwNodeType::Table) + { + SwTableNode* pTableNode = pCurrent->GetTableNode(); + if (pTableNode) + checkTableNode(pTableNode); + } } -} +}; + +} // end anonymous namespace // Check Shapes, TextBox void AccessibilityCheck::checkObject(SdrObject* pObject) @@ -114,23 +169,22 @@ void AccessibilityCheck::check() if (m_pDoc == nullptr) return; + std::vector<std::unique_ptr<NodeCheck>> aNodeChecks; + aNodeChecks.push_back( + std::make_unique<NoTextNodeAltTextCheck>(m_aAccessibilityIssueCollection)); + aNodeChecks.push_back( + std::make_unique<TableNodeMergeSplitCheck>(m_aAccessibilityIssueCollection)); + auto const& pNodes = m_pDoc->GetNodes(); + SwNode* pNode = nullptr; for (sal_uLong n = 0; n < pNodes.Count(); ++n) { - SwNode* pNode = pNodes[n]; + pNode = pNodes[n]; if (pNode) { - if (pNode->GetNodeType() & SwNodeType::NoTextMask) - { - SwNoTextNode* pNoTextNode = pNode->GetNoTextNode(); - if (pNoTextNode) - checkNoTextNode(pNoTextNode); - } - if (pNode->GetNodeType() & SwNodeType::Table) + for (std::unique_ptr<NodeCheck>& rpNodeCheck : aNodeChecks) { - SwTableNode* pTableNode = pNode->GetTableNode(); - if (pTableNode) - checkTableNode(pTableNode); + rpNodeCheck->check(pNode); } } } diff --git a/sw/source/core/inc/AccessibilityCheck.hxx b/sw/source/core/inc/AccessibilityCheck.hxx index 513e862e7e6f..9e77ca15e125 100644 --- a/sw/source/core/inc/AccessibilityCheck.hxx +++ b/sw/source/core/inc/AccessibilityCheck.hxx @@ -13,7 +13,6 @@ #include <svx/AccessibilityCheck.hxx> #include <doc.hxx> -#include <node.hxx> namespace sw { @@ -29,9 +28,6 @@ public: } void check() override; - - void checkTableNode(SwTableNode* pTableNode); - void checkNoTextNode(SwNoTextNode* pNoTextNode); void checkObject(SdrObject* pObject); }; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits