Revert "tdf#118947 sw tablestyle: manually scan parents for ::SET"

Except its unit test.

This reverts commit 6bced3c6a1bf8d4652dd6ba75e41b128ce1bfc5c.

Change-Id: I525edd59b9d4d522048b272575285f13675413e9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88456
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index 27c66c1..550255d 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -325,6 +325,8 @@ DECLARE_OOXMLEXPORT_TEST(testTdf123636_newlinePageBreak4, "tdf123636_newlinePage
    assertXPath(pDump, "/root/page[2]/body/txt[1]/Text", 0);
}

// disabled temporarily, next commit enables it again
#if 0
DECLARE_OOXMLEXPORT_TEST(testTdf118947_tableStyle, "tdf118947_tableStyle.docx")
{
    uno::Reference<text::XTextTable> xTable(getParagraphOrTable(1), uno::UNO_QUERY);
@@ -352,6 +354,7 @@ DECLARE_OOXMLEXPORT_TEST(testTdf118947_tableStyle, "tdf118947_tableStyle.docx")
    CPPUNIT_ASSERT_EQUAL_MESSAGE("Table style sets 0 right margin", sal_Int32(0), getProperty<sal_Int32>(xPara, "ParaRightMargin"));
    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Table sets 2.5 line-spacing", sal_Int16(250), getProperty<style::LineSpacing>(xPara, "ParaLineSpacing").Height, 1);
}
#endif

DECLARE_OOXMLEXPORT_TEST(tdf123912_protectedForm, "tdf123912_protectedForm.odt")
{
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport2.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport2.cxx
index f72306f..e473e0c 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport2.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport2.cxx
@@ -542,8 +542,10 @@ DECLARE_OOXMLEXPORT_TEST(testTableStylerPrSz, "table-style-rPr-sz.docx")
    uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCell->getText(), uno::UNO_QUERY);
    uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
    uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY);

// disabled temporarily, next commit enables it again
#if 0
    CPPUNIT_ASSERT_EQUAL(20.f, getProperty<float>(getRun(xPara, 1), "CharHeight"));
#endif
//    CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::SINGLE, getProperty<short>(getRun(xPara, 1), "CharUnderline"));
//    CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(getRun(xPara, 1), "CharWeight"));
//    CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, getProperty<awt::FontSlant>(getRun(xPara, 1), "CharPosture"));
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index 2053b75..79cb240 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -105,6 +105,7 @@
#include <docsh.hxx>
#include <fesh.hxx>
#include <itabenum.hxx>
#include <poolfmt.hxx>

using namespace ::com::sun::star;
using ::editeng::SvxBorderLine;
@@ -971,67 +972,6 @@ uno::Reference< beans::XPropertySetInfo >  SwXCell::getPropertySetInfo()
    return xRef;
}

// If the current property matches the previous parent's property (i.e. no reason for it to be set),
// then it may be a ::DEFAULT value, even if it is marked as ::SET
static bool lcl_mayBeDefault( const sal_uInt16 nWhich, sal_uInt8 nMemberId,
                       const SfxPoolItem* pPrevItem, const SfxPoolItem& rCurrItem,
                       const bool bDirect )
{
    bool bMayBeDefault = false;
    // These are the paragraph/character pairs that I found running unit tests.
    // UNFORTUNATELY there is no way to see if a property has multiple members.
    // Since valid members can be nMemberId == 0, we can't do something like "if (nMemberId & ~CONVERT_TWIPS) != 0"
    // Perhaps the full list can be found in editeng/memberids.h???
    switch ( nWhich )
    {
        case RES_BOX:
        case RES_UL_SPACE:
        case RES_LR_SPACE:
        case RES_CHRATR_ESCAPEMENT:
        case RES_CHRATR_FONT:
        case RES_CHRATR_CJK_FONT:
        case RES_CHRATR_CTL_FONT:
        case RES_CHRATR_FONTSIZE:
        case RES_CHRATR_CJK_FONTSIZE:
        case RES_CHRATR_CTL_FONTSIZE:
        case RES_CHRATR_WEIGHT:
        case RES_CHRATR_CJK_WEIGHT:
        case RES_CHRATR_CTL_WEIGHT:
        case RES_CHRATR_LANGUAGE:
        case RES_CHRATR_CJK_LANGUAGE:
        case RES_CHRATR_CTL_LANGUAGE:
        case RES_CHRATR_POSTURE:
        case RES_CHRATR_CJK_POSTURE:
        case RES_CHRATR_CTL_POSTURE:
        case RES_PARATR_ADJUST:
        {
            // These properties are paired up, containing multiple properties in one nWhich.
            // If one is ::SET, they all report ::SET, even if only initialized with the default value.
            // Assume created automatically by another MemberId.
            bMayBeDefault = true;
            if ( pPrevItem )
            {
                uno::Any aPrev;
                uno::Any aCurr;
                (*pPrevItem).QueryValue(aPrev, nMemberId);
                rCurrItem.QueryValue(aCurr, nMemberId);
                // If different, it overrides a parent value, so can't be considered a default.
                bMayBeDefault = aPrev == aCurr;
            }
            break;
        }
        default:
        {
            // Since DocDefaults are copied into root-level stylesheets (tdf#103961),
            // identify the duplicated properties as DocDefault values.
            // Assume any style information could have been inherited/copied.
            if ( !bDirect )
                bMayBeDefault = !pPrevItem || *pPrevItem == rCurrItem;
        }
    }
    return bMayBeDefault;
}

void SwXCell::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue)
{
    SolarMutexGuard aGuard;
@@ -1074,61 +1014,26 @@ void SwXCell::setPropertyValue(const OUString& rPropertyName, const uno::Any& aV
                while ( &aIdx.GetNode() != pEndNd )
                {
                    const SwTextNode* pNd = aIdx.GetNode().GetTextNode();
                    ++aIdx;
                    if ( !pNd )
                        continue;

                    const SfxPoolItem* pPrevItem = nullptr;
                    const SfxPoolItem* pCurrItem = nullptr;
                    // Table-styles don't override direct formatting
                    if ( pNd->HasSwAttrSet() && SfxItemState::SET == pNd->GetSwAttrSet().GetItemState(pEntry->nWID, false, &pCurrItem) )
                    if ( pNd )
                    {
                        // Some WIDs have several MIDs, so perhaps ::SET refers to another MID and this property was copied from parents?
                        if ( lcl_mayBeDefault(pEntry->nWID, pEntry->nMemberId, pPrevItem, *pCurrItem, /*bDirect=*/true) )
                            pPrevItem = pCurrItem;
                        else
                            continue; //don't override direct formatting
                    }

                    bool bSet = false;
                    // HACK: don't check styles if numbering/bullets are turned on. Table-styles don't override numbering formatting
                    SwFormat* pFormatColl = pNd->GetNumRule() ? nullptr : pNd->GetFormatColl();
                    // Manually walk through the parent properties in order to avoid the default properties.
                    // Table-styles don't override paragraph-style formatting.
                    //    TODO: ?except for fontsize/justification if compat:overrideTableStyleFontSizeAndJustification?
                    while ( pFormatColl )
                    {
                        if ( SfxItemState::SET == pFormatColl->GetItemState(pEntry->nWID, /*bSrchInParent=*/false, &pCurrItem) )
                        //point and mark selecting the whole paragraph
                        SwPaM aPaM(*pNd, 0, *pNd, pNd->GetText().getLength());
                        const bool bHasAttrSet = pNd->HasSwAttrSet();
                        const SfxItemSet& aSet = pNd->GetSwAttrSet();
                        // isPARATR: replace DEFAULT_VALUE properties only
                        // Require that the property is default in the paragraph style as well,
                        // unless the style is the default style.
                        // isCHRATR: change the base/auto SwAttr property, but don't remove the DIRECT hints
                        bool bCustomParent = false;
                        if (const SwFormatColl* pFormatColl = pNd->GetFormatColl())
                        {
                            if ( lcl_mayBeDefault(pEntry->nWID, pEntry->nMemberId, pPrevItem, *pCurrItem, false) )
                            {
                                // if the property matches DocDefaults, then table-style needs to override it
                                pPrevItem = pFormatColl->IsDefault() ? nullptr : pCurrItem;
                            }
                            else
                            {
                                bSet = true; //don't override style formatting
                                break;
                            }
                            bCustomParent = pFormatColl->GetPoolFormatId() != RES_POOLCOLL_STANDARD;
                        }
                        pFormatColl = pFormatColl->DerivedFrom();
                        bool bSearchInParent = bCustomParent && !pNd->GetNumRule();
                        if ( !bHasAttrSet || SfxItemState::DEFAULT == aSet.GetItemState(pEntry->nWID, bSearchInParent) )
                            SwUnoCursorHelper::SetPropertyValue(aPaM, rParaPropSet, rPropertyName, aValue, SetAttrMode::DONTREPLACE);
                    }
                    if ( bSet )
                        continue;

                    // Check if previous ::SET came from the pool defaults.
                    if ( pPrevItem && pNd->GetSwAttrSet().GetPool() )
                    {
                        pCurrItem = &pNd->GetSwAttrSet().GetPool()->GetDefaultItem(pEntry->nWID);
                        if ( !lcl_mayBeDefault(pEntry->nWID, pEntry->nMemberId, pPrevItem, *pCurrItem, false) )
                            continue;
                    }

                    // Apply table-style property
                    // point and mark selecting the whole paragraph
                    SwPaM aPaM(*pNd, 0, *pNd, pNd->GetText().getLength());
                    // for isCHRATR: change the base/auto SwAttr property, but don't remove the DIRECT hints
                    SwUnoCursorHelper::SetPropertyValue(aPaM, rParaPropSet, rPropertyName, aValue, SetAttrMode::DONTREPLACE);
                    ++aIdx;
                }
                return;
            }