a11y: Add char attr a11y check for entire paragraph

Accessibility check would not work if the entire paragraph had
character attributes, because then it wouldn't have individual text
hints

Now check if there's a SwAttrSet and if it has the a11y char attributes
that an issue should be generated for

Also add test for this specific case

Change-Id: Iee035eecd25ed130e78ed27041c3e56ea988ecc5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141078
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
index 169a3fa..d7ad767 100644
--- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
+++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
@@ -46,6 +46,19 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testTableSplitMergeAndAltText)
    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::NO_ALT_SHAPE, aIssues[6]->m_eIssueID);
}

CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckParagraphIssues)
{
    // Tests whether formatting issues are detected when the whole paragraph has them instead of
    // some text inside the paragraph
    SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "ParagraphTest.odt");
    CPPUNIT_ASSERT(pDoc);
    sw::AccessibilityCheck aCheck(pDoc);
    aCheck.check();
    auto& aIssues = aCheck.getIssueCollection().getIssues();
    CPPUNIT_ASSERT_EQUAL(size_t(1), aIssues.size());
    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[0]->m_eIssueID);
}

CPPUNIT_PLUGIN_IMPLEMENT();

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/core/accessibilitycheck/data/ParagraphTest.odt b/sw/qa/core/accessibilitycheck/data/ParagraphTest.odt
new file mode 100644
index 0000000..766ecd0
--- /dev/null
+++ b/sw/qa/core/accessibilitycheck/data/ParagraphTest.odt
Binary files differ
diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx
index 50a37dc..f6c6ec7 100644
--- a/sw/source/core/access/AccessibilityCheck.cxx
+++ b/sw/source/core/access/AccessibilityCheck.cxx
@@ -551,6 +551,35 @@ public:
                }
            }
        }
        else if (pTextNode->HasSwAttrSet())
        {
            // Paragraph doesn't have hints but the entire paragraph might have char attributes
            auto& aSwAttrSet = pTextNode->GetSwAttrSet();
            auto nParagraphLength = pTextNode->GetText().getLength();
            if (nParagraphLength == 0)
                return;
            if (aSwAttrSet.HasItem(RES_CHRATR_WEIGHT) || aSwAttrSet.HasItem(RES_CHRATR_CJK_WEIGHT)
                || aSwAttrSet.HasItem(RES_CHRATR_CTL_WEIGHT)
                || aSwAttrSet.HasItem(RES_CHRATR_POSTURE)
                || aSwAttrSet.HasItem(RES_CHRATR_CJK_POSTURE)
                || aSwAttrSet.HasItem(RES_CHRATR_CTL_POSTURE)
                || aSwAttrSet.HasItem(RES_CHRATR_SHADOWED) || aSwAttrSet.HasItem(RES_CHRATR_COLOR)
                || aSwAttrSet.HasItem(RES_CHRATR_EMPHASIS_MARK)
                || aSwAttrSet.HasItem(RES_CHRATR_UNDERLINE)
                || aSwAttrSet.HasItem(RES_CHRATR_OVERLINE)
                || aSwAttrSet.HasItem(RES_CHRATR_CROSSEDOUT)
                || aSwAttrSet.HasItem(RES_CHRATR_RELIEF) || aSwAttrSet.HasItem(RES_CHRATR_CONTOUR))
            {
                auto pIssue
                    = lclAddIssue(m_rIssueCollection, SwResId(STR_TEXT_FORMATTING_CONVEYS_MEANING),
                                  sfx::AccessibilityIssueID::TEXT_FORMATTING);
                pIssue->setIssueObject(IssueObject::TEXT);
                pIssue->setNode(pTextNode);
                SwDoc& rDocument = pTextNode->GetDoc();
                pIssue->setDoc(rDocument);
                pIssue->setEnd(nParagraphLength);
            }
        }
    }
};