sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx  |   18 
 sw/qa/core/accessibilitycheck/data/PageCharParaStyles.odt |binary
 sw/source/core/access/AccessibilityCheck.cxx              |  691 +++++++++++++-
 3 files changed, 663 insertions(+), 46 deletions(-)

New commits:
commit b967f9c92e33dc2b77cb4fee13a35052ad404732
Author:     Balazs Varga <balazs.varga.ext...@allotropia.de>
AuthorDate: Fri Sep 13 10:24:38 2024 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Wed Sep 18 12:33:19 2024 +0200

    tdf#162890 - A11Y sidebar: fix unecceserry warning in case if we have
    
    no any direct format or we have a style which are not applied to the page.
    (In that case no need to show the warning since the 'goto' can lead us 
nowhere.)
    
    Also check the direct formats by comparing them to the character styles,
    paragraph styles or to the default character properties.
    
    Change-Id: I154379dc6deaa3af3fe17e51367cc229067216dd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173317
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>
    (cherry picked from commit 7b8ae2bf7cf9d4d637b40030bb9f482f6fba5194)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173495
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx 
b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
index 90c1992b39a3..044ecf8312bf 100644
--- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
+++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
@@ -287,6 +287,24 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, 
testDeleteHeader)
     CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, 
aResultIssues[2]->m_eIssueID);
 }
 
+CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testStylesWithHeader)
+{
+    // Check direct formats, char/para styles and not allowed page styles
+    createSwDoc("PageCharParaStyles.odt");
+    SwDoc* pDoc = getSwDoc();
+    CPPUNIT_ASSERT(pDoc);
+
+    sw::AccessibilityCheck aCheck(pDoc);
+    auto& aIssues = aCheck.getIssueCollection().getIssues();
+    aCheck.check();
+    CPPUNIT_ASSERT_EQUAL(size_t(5), aIssues.size());
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::DOCUMENT_TITLE, 
aIssues[0]->m_eIssueID);
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::DIRECT_FORMATTING, 
aIssues[1]->m_eIssueID);
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::DIRECT_FORMATTING, 
aIssues[2]->m_eIssueID);
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::DIRECT_FORMATTING, 
aIssues[3]->m_eIssueID);
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::DIRECT_FORMATTING, 
aIssues[4]->m_eIssueID);
+}
+
 namespace
 {
 std::vector<std::shared_ptr<sfx::AccessibilityIssue>>
diff --git a/sw/qa/core/accessibilitycheck/data/PageCharParaStyles.odt 
b/sw/qa/core/accessibilitycheck/data/PageCharParaStyles.odt
new file mode 100644
index 000000000000..2f073a4a4afb
Binary files /dev/null and 
b/sw/qa/core/accessibilitycheck/data/PageCharParaStyles.odt differ
diff --git a/sw/source/core/access/AccessibilityCheck.cxx 
b/sw/source/core/access/AccessibilityCheck.cxx
index 04dae2c9dadf..3f2b8906ba83 100644
--- a/sw/source/core/access/AccessibilityCheck.cxx
+++ b/sw/source/core/access/AccessibilityCheck.cxx
@@ -666,11 +666,22 @@ public:
     {
     }
 
-    void checkAutoFormat(SwTextNode* pTextNode, const SwTextAttr* pTextAttr)
+    void checkAutoFormat(SwTextNode* pTextNode, const SwTextAttr* pTextAttr,
+                         const std::map<sal_Int32, const SwTextAttr*>& 
rCharFormats)
     {
         const SwFormatAutoFormat& rAutoFormat = pTextAttr->GetAutoFormat();
         SfxItemIter aItemIter(*rAutoFormat.GetStyleHandle());
         const SfxPoolItem* pItem = aItemIter.GetCurItem();
+
+        const SwTextAttr* pCharAttr = nullptr;
+        auto itr = rCharFormats.find(pTextAttr->GetStart());
+        if (itr != rCharFormats.end())
+            pCharAttr = itr->second;
+
+        const SwCharFormat* pCharformat = nullptr;
+        if (pCharAttr && (*pTextAttr->GetEnd() == *pCharAttr->GetEnd()))
+            pCharformat = pCharAttr->GetCharFormat().GetCharFormat();
+
         std::vector<OUString> aFormattings;
         while (pItem)
         {
@@ -680,61 +691,366 @@ public:
                 case RES_CHRATR_WEIGHT:
                 case RES_CHRATR_CJK_WEIGHT:
                 case RES_CHRATR_CTL_WEIGHT:
-                    sFormattingType = "Weight";
-                    break;
+                {
+                    const SvxWeightItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                    {
+                        pStyleItem = pCharformat->GetItemIfSet(
+                            TypedWhichId<SvxWeightItem>(pItem->Which()), 
false);
+                    }
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                            TypedWhichId<SvxWeightItem>(pItem->Which()), 
false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            TypedWhichId<SvxWeightItem>(pItem->Which()));
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxWeightItem*>(pItem), pStyleItem))
+                        sFormattingType = "Weight";
+                }
+                break;
+
                 case RES_CHRATR_POSTURE:
                 case RES_CHRATR_CJK_POSTURE:
                 case RES_CHRATR_CTL_POSTURE:
-                    sFormattingType = "Posture";
-                    break;
+                {
+                    const SvxPostureItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                    {
+                        pStyleItem = pCharformat->GetItemIfSet(
+                            TypedWhichId<SvxPostureItem>(pItem->Which()), 
false);
+                    }
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                            TypedWhichId<SvxPostureItem>(pItem->Which()), 
false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            TypedWhichId<SvxPostureItem>(pItem->Which()));
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxPostureItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Posture";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_SHADOWED:
-                    sFormattingType = "Shadowed";
-                    break;
+                {
+                    const SvxShadowedItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_SHADOWED, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_SHADOWED, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_SHADOWED);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxShadowedItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Shadowed";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_COLOR:
-                    sFormattingType = "Font Color";
-                    break;
+                {
+                    const SvxColorItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_COLOR, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_COLOR, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_COLOR);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxColorItem*>(pItem), pStyleItem))
+                        sFormattingType = "Font Color";
+                }
+                break;
 
                 case RES_CHRATR_FONTSIZE:
-                case RES_CHRATR_CJK_FONTSIZE:
-                case RES_CHRATR_CTL_FONTSIZE:
-                    sFormattingType = "Font Size";
-                    break;
+                {
+                    // case RES_CHRATR_CJK_FONTSIZE:
+                    // case RES_CHRATR_CTL_FONTSIZE:
+                    // TODO: check depending on which lang is used Western, 
Complex, Asia
+                    const SvxFontHeightItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                    {
+                        pStyleItem = pCharformat->GetItemIfSet(
+                            TypedWhichId<SvxFontHeightItem>(pItem->Which()), 
false);
+                    }
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                            TypedWhichId<SvxFontHeightItem>(pItem->Which()), 
false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            TypedWhichId<SvxFontHeightItem>(pItem->Which()));
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxFontHeightItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Font Size";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_FONT:
                 case RES_CHRATR_CJK_FONT:
                 case RES_CHRATR_CTL_FONT:
-                    sFormattingType = "Font";
-                    break;
+                {
+                    // 3. direct formatting
+                    const SvxFontItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                    {
+                        pStyleItem = pCharformat->GetItemIfSet(
+                            TypedWhichId<SvxFontItem>(pItem->Which()), false);
+                    }
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                            TypedWhichId<SvxFontItem>(pItem->Which()), false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            TypedWhichId<SvxFontItem>(pItem->Which()));
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxFontItem*>(pItem), pStyleItem))
+                        sFormattingType = "Font";
+                }
+                break;
 
                 case RES_CHRATR_EMPHASIS_MARK:
-                    sFormattingType = "Emphasis Mark";
-                    break;
+                {
+                    const SvxEmphasisMarkItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_EMPHASIS_MARK, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                            RES_CHRATR_EMPHASIS_MARK, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_EMPHASIS_MARK);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxEmphasisMarkItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Emphasis Mark";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_UNDERLINE:
-                    sFormattingType = "Underline";
-                    break;
+                {
+                    const SvxUnderlineItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_UNDERLINE, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_UNDERLINE, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_UNDERLINE);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxUnderlineItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Underline";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_OVERLINE:
-                    sFormattingType = "Overline";
-                    break;
+                {
+                    const SvxOverlineItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_OVERLINE, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_OVERLINE, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_OVERLINE);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxOverlineItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Overline";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_CROSSEDOUT:
-                    sFormattingType = "Strikethrough";
-                    break;
+                {
+                    const SvxCrossedOutItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_CROSSEDOUT, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_CROSSEDOUT, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_CROSSEDOUT);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxCrossedOutItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Strikethrough";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_RELIEF:
-                    sFormattingType = "Relief";
-                    break;
+                {
+                    const SvxCharReliefItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_RELIEF, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_RELIEF, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_RELIEF);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxCharReliefItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Relief";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_CONTOUR:
-                    sFormattingType = "Outline";
-                    break;
+                {
+                    const SvxContourItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_CONTOUR, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_CONTOUR, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_CONTOUR);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxContourItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "Outline";
+                    }
+                }
+                break;
 
                 case RES_CHRATR_NOHYPHEN:
-                    sFormattingType = "No Hyphenation";
-                    break;
+                {
+                    const SvxNoHyphenItem* pStyleItem = nullptr;
+
+                    if (pCharformat)
+                        pStyleItem = 
pCharformat->GetItemIfSet(RES_CHRATR_NOHYPHEN, false);
+
+                    if (!pStyleItem && pTextNode->GetTextColl())
+                    {
+                        pStyleItem
+                            = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_NOHYPHEN, false);
+                    }
+
+                    if (!pStyleItem)
+                    {
+                        pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                            RES_CHRATR_NOHYPHEN);
+                    }
+
+                    if (!SfxPoolItem::areSame(static_cast<const 
SvxNoHyphenItem*>(pItem),
+                                              pStyleItem))
+                    {
+                        sFormattingType = "No Hyphenation";
+                    }
+                }
+                break;
 
                 default:
                     break;
@@ -757,46 +1073,329 @@ public:
         pIssue->setEnd(pTextAttr->GetAnyEnd());
     }
 
+    static bool isDirectFormat(const SwTextNode* pTextNode, const SwAttrSet& 
rSwAttrSet)
+    {
+        const SfxPoolItem* pItem = nullptr;
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_WEIGHT, false))
+            || (pItem = rSwAttrSet.GetItem(RES_CHRATR_CJK_WEIGHT, false))
+            || (pItem = rSwAttrSet.GetItem(RES_CHRATR_CTL_WEIGHT, false)))
+        {
+            // 3. direct formatting
+            const SvxWeightItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+            {
+                // 1. paragraph format
+                pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                    TypedWhichId<SvxWeightItem>(pItem->Which()), false);
+            }
+
+            if (!pStyleItem)
+            {
+                // 0. document default
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    TypedWhichId<SvxWeightItem>(pItem->Which()));
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxWeightItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_POSTURE, false))
+            || (pItem = rSwAttrSet.GetItem(RES_CHRATR_CJK_POSTURE, false))
+            || (pItem = rSwAttrSet.GetItem(RES_CHRATR_CTL_POSTURE, false)))
+        {
+            const SvxPostureItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+            {
+                pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                    TypedWhichId<SvxPostureItem>(pItem->Which()), false);
+            }
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    TypedWhichId<SvxPostureItem>(pItem->Which()));
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxPostureItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_SHADOWED, false)))
+        {
+            const SvxShadowedItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_SHADOWED, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_SHADOWED);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxShadowedItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_COLOR, false)))
+        {
+            const SvxColorItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_COLOR, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem
+                    = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(RES_CHRATR_COLOR);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const SvxColorItem*>(pItem), 
pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        // TODO: check depending on which lang is used Western, Complex, Asia
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_FONTSIZE, false))
+            /*|| (pItem = rSwAttrSet.GetItem(RES_CHRATR_CJK_FONTSIZE, false))
+            || (pItem = rSwAttrSet.GetItem(RES_CHRATR_CTL_FONTSIZE, false))*/)
+        {
+            const SvxFontHeightItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+            {
+                pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                    TypedWhichId<SvxFontHeightItem>(pItem->Which()), false);
+            }
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    TypedWhichId<SvxFontHeightItem>(pItem->Which()));
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxFontHeightItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_FONT, false))
+            || (pItem = rSwAttrSet.GetItem(RES_CHRATR_CJK_FONT, false))
+            || (pItem = rSwAttrSet.GetItem(RES_CHRATR_CTL_FONT, false)))
+        {
+            const SvxFontItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+            {
+                pStyleItem = pTextNode->GetTextColl()->GetItemIfSet(
+                    TypedWhichId<SvxFontItem>(pItem->Which()), false);
+            }
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    TypedWhichId<SvxFontItem>(pItem->Which()));
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const SvxFontItem*>(pItem), 
pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_EMPHASIS_MARK, false)))
+        {
+            const SvxEmphasisMarkItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+            {
+                pStyleItem
+                    = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_EMPHASIS_MARK, false);
+            }
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_EMPHASIS_MARK);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxEmphasisMarkItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_UNDERLINE, false)))
+        {
+            const SvxUnderlineItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_UNDERLINE, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_UNDERLINE);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxUnderlineItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_OVERLINE, false)))
+        {
+            const SvxOverlineItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_OVERLINE, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_OVERLINE);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxOverlineItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_CROSSEDOUT, false)))
+        {
+            const SvxCrossedOutItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_CROSSEDOUT, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_CROSSEDOUT);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxCrossedOutItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_RELIEF, false)))
+        {
+            const SvxCharReliefItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_RELIEF, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_RELIEF);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxCharReliefItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_NOHYPHEN, false)))
+        {
+            const SvxNoHyphenItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_NOHYPHEN, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_NOHYPHEN);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxNoHyphenItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        if ((pItem = rSwAttrSet.GetItem(RES_CHRATR_CONTOUR, false)))
+        {
+            const SvxContourItem* pStyleItem = nullptr;
+
+            if (pTextNode->GetTextColl())
+                pStyleItem = 
pTextNode->GetTextColl()->GetItemIfSet(RES_CHRATR_CONTOUR, false);
+
+            if (!pStyleItem)
+            {
+                pStyleItem = 
&pTextNode->GetDoc().GetAttrPool().GetUserOrPoolDefaultItem(
+                    RES_CHRATR_CONTOUR);
+            }
+
+            if (!SfxPoolItem::areSame(static_cast<const 
SvxContourItem*>(pItem), pStyleItem))
+                return true;
+            else
+                pItem = nullptr;
+        }
+
+        return false;
+    }
+
     void check(SwNode* pCurrent) override
     {
         if (!pCurrent->IsTextNode())
             return;
 
         SwTextNode* pTextNode = pCurrent->GetTextNode();
+        SwWrtShell* pWrtShell = 
pTextNode->GetDoc().GetDocShell()->GetWrtShell();
+        if (pWrtShell && !pTextNode->getLayoutFrame(pWrtShell->GetLayout()))
+            return;
+
         if (pTextNode->HasHints())
         {
+            // collect character style formats (if have)
             SwpHints& rHints = pTextNode->GetSwpHints();
+            std::map<sal_Int32, const SwTextAttr*> aCharFormats;
+            for (size_t i = 0; i < rHints.Count(); ++i)
+            {
+                const SwTextAttr* pTextAttr = rHints.Get(i);
+
+                if (pTextAttr->Which() == RES_TXTATR_CHARFMT)
+                {
+                    aCharFormats.insert({ pTextAttr->GetStart(), pTextAttr });
+                }
+            }
+
+            // direct formatting
             for (size_t i = 0; i < rHints.Count(); ++i)
             {
                 const SwTextAttr* pTextAttr = rHints.Get(i);
                 if (pTextAttr->Which() == RES_TXTATR_AUTOFMT)
                 {
-                    checkAutoFormat(pTextNode, pTextAttr);
+                    checkAutoFormat(pTextNode, pTextAttr, aCharFormats);
                 }
             }
         }
+
         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.GetItem(RES_CHRATR_WEIGHT, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_CJK_WEIGHT, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_CTL_WEIGHT, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_POSTURE, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_CJK_POSTURE, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_CTL_POSTURE, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_SHADOWED, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_COLOR, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_EMPHASIS_MARK, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_UNDERLINE, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_OVERLINE, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_CROSSEDOUT, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_RELIEF, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_NOHYPHEN, false)
-                || aSwAttrSet.GetItem(RES_CHRATR_CONTOUR, false))
+            if (isDirectFormat(pTextNode, pTextNode->GetSwAttrSet()))
             {
                 auto pIssue
                     = lclAddIssue(m_rIssueCollection, 
SwResId(STR_TEXT_FORMATTING_CONVEYS_MEANING),

Reply via email to