tdf#126206 DOCX: add rejection of character formatting changes

using imported change tracking data, instead of
clearing only direct formatting in the modified text range.

See commit 9c4eef7d809ad7d283860c7b47b0f561aa240906
"tdf#52391 reject/clear formatting of format-only changes".

Change-Id: Ie27d5c5bca6d9f30681e8f542f95417e9bb4c266
Reviewed-on: https://gerrit.libreoffice.org/75011
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
diff --git a/sw/qa/extras/uiwriter/data2/tdf126206.docx b/sw/qa/extras/uiwriter/data2/tdf126206.docx
new file mode 100644
index 0000000..166125e
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data2/tdf126206.docx
Binary files differ
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 04b2c4d..24e3f3d 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -8,6 +8,7 @@
 */

#include <swmodeltestbase.hxx>
#include <com/sun/star/awt/FontWeight.hpp>
#include <com/sun/star/frame/DispatchHelper.hpp>
#include <com/sun/star/style/LineSpacing.hpp>
#include <comphelper/propertysequence.hxx>
@@ -1139,6 +1140,35 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf52391)
    CPPUNIT_ASSERT_EQUAL(OUString("Portion1Portion2"), xRun->getString());
}

CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf126206)
{
    load(DATA_DIRECTORY, "tdf126206.docx");

    SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
    CPPUNIT_ASSERT(pTextDoc);

    // normal text (it was bold)
    auto xText = getParagraph(1)->getText();
    CPPUNIT_ASSERT(xText.is());
    {
        auto xCursor(xText->createTextCursorByRange(getRun(getParagraph(1), 2)));
        CPPUNIT_ASSERT(xCursor.is());
        CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xCursor, "CharWeight"));
    }

    // reject tracked changes
    lcl_dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {});

    // bold text again
    xText = getParagraph(1)->getText();
    CPPUNIT_ASSERT(xText.is());
    {
        auto xCursor(xText->createTextCursorByRange(getRun(getParagraph(1), 2)));
        CPPUNIT_ASSERT(xCursor.is());
        CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, "CharWeight"));
    }
}

CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf101873)
{
    SwDoc* pDoc = createDoc();
diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx
index 30b6b09..e46de6b 100644
--- a/sw/source/core/doc/DocumentRedlineManager.cxx
+++ b/sw/source/core/doc/DocumentRedlineManager.cxx
@@ -649,9 +649,6 @@ namespace
        case RedlineType::Format:
        case RedlineType::FmtColl:
            {
                if( pRedl->GetExtraData() )
                    pRedl->GetExtraData()->Reject( *pRedl );

                // tdf#52391 instead of hidden acception at the requested
                // rejection, remove direct text formatting to get the potential
                // original state of the text (FIXME if the original text
@@ -660,10 +657,13 @@ namespace
                if ( pRedl->GetType() == RedlineType::Format )
                {
                    SwPaM aPam( *(pRedl->Start()), *(pRedl->End()) );
                    rArr.DeleteAndDestroy( rPos-- );
                    rDoc.ResetAttrs(aPam);
                } else
                    rArr.DeleteAndDestroy( rPos-- );
                }

                if( pRedl->GetExtraData() )
                    pRedl->GetExtraData()->Reject( *pRedl );

                rArr.DeleteAndDestroy( rPos-- );
            }
            break;

diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx
index 36734ea..94c903b 100644
--- a/sw/source/core/doc/docredln.cxx
+++ b/sw/source/core/doc/docredln.cxx
@@ -913,9 +913,19 @@ SwRedlineExtraData* SwRedlineExtraData_FormattingChanges::CreateNew() const
    return new SwRedlineExtraData_FormattingChanges( *this );
}

void SwRedlineExtraData_FormattingChanges::Reject(SwPaM&) const
void SwRedlineExtraData_FormattingChanges::Reject(SwPaM& rPam) const
{
    // ToDo: Add 'Reject' logic
    SwDoc* pDoc = rPam.GetDoc();

    if( m_pSet )
    {
        RedlineFlags eOld = pDoc->getIDocumentRedlineAccess().GetRedlineFlags();
        pDoc->getIDocumentRedlineAccess().SetRedlineFlags_intern(eOld & ~RedlineFlags(RedlineFlags::On | RedlineFlags::Ignore));

        pDoc->getIDocumentContentOperations().InsertItemSet(rPam, *GetItemSet());

        pDoc->getIDocumentRedlineAccess().SetRedlineFlags_intern( eOld );
    }
}

bool SwRedlineExtraData_FormattingChanges::operator == ( const SwRedlineExtraData& rExtraData ) const