diff options
-rw-r--r-- | editeng/source/items/numitem.cxx | 21 | ||||
-rw-r--r-- | include/editeng/numitem.hxx | 1 | ||||
-rw-r--r-- | sw/inc/chpfld.hxx | 1 | ||||
-rw-r--r-- | sw/qa/core/fields/data/chapter_field_followedby.odt | bin | 0 -> 11183 bytes | |||
-rw-r--r-- | sw/qa/core/fields/fields.cxx | 41 | ||||
-rw-r--r-- | sw/source/core/fields/chpfld.cxx | 9 | ||||
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 28 |
7 files changed, 68 insertions, 33 deletions
diff --git a/editeng/source/items/numitem.cxx b/editeng/source/items/numitem.cxx index 2f30242b911a..12ee8dbe533d 100644 --- a/editeng/source/items/numitem.cxx +++ b/editeng/source/items/numitem.cxx @@ -483,6 +483,27 @@ void SvxNumberFormat::SetLabelFollowedBy( const LabelFollowedBy eLabelFollowedBy { meLabelFollowedBy = eLabelFollowedBy; } + +OUString SvxNumberFormat::GetLabelFollowedByAsString() const +{ + switch (meLabelFollowedBy) + { + case LISTTAB: + return "\t"; + case SPACE: + return " "; + case NEWLINE: + return "\n"; + case NOTHING: + // intentionally left blank. + return OUString(); + default: + SAL_WARN("editeng", "Unknown SvxNumberFormat::GetLabelFollowedBy() return value"); + assert(false); + } + return OUString(); +} + void SvxNumberFormat::SetListtabPos( const tools::Long nListtabPos ) { mnListtabPos = nListtabPos; diff --git a/include/editeng/numitem.hxx b/include/editeng/numitem.hxx index 1846e6a8739c..63e819edf27e 100644 --- a/include/editeng/numitem.hxx +++ b/include/editeng/numitem.hxx @@ -213,6 +213,7 @@ public: void SetLabelFollowedBy( const LabelFollowedBy eLabelFollowedBy ); LabelFollowedBy GetLabelFollowedBy() const { return meLabelFollowedBy;} + OUString GetLabelFollowedByAsString() const; void SetListtabPos( const tools::Long nListtabPos ); tools::Long GetListtabPos() const { return mnListtabPos;} void SetFirstLineIndent( const tools::Long nFirstLineIndent ); diff --git a/sw/inc/chpfld.hxx b/sw/inc/chpfld.hxx index 305831911b5f..1032f19b4abe 100644 --- a/sw/inc/chpfld.hxx +++ b/sw/inc/chpfld.hxx @@ -55,6 +55,7 @@ class SW_DLLPUBLIC SwChapterField final : public SwField sal_uInt8 nLevel; OUString sTitle; OUString sNumber; + OUString sLabelFollowedBy; OUString sPre; OUString sPost; State() : nLevel(0) {} diff --git a/sw/qa/core/fields/data/chapter_field_followedby.odt b/sw/qa/core/fields/data/chapter_field_followedby.odt Binary files differnew file mode 100644 index 000000000000..b2086f2591b3 --- /dev/null +++ b/sw/qa/core/fields/data/chapter_field_followedby.odt diff --git a/sw/qa/core/fields/fields.cxx b/sw/qa/core/fields/fields.cxx index 7f59597831ea..a0c5a2c86c7e 100644 --- a/sw/qa/core/fields/fields.cxx +++ b/sw/qa/core/fields/fields.cxx @@ -84,9 +84,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf143424) // Field: Chapter Format: Chapter number and name xField.set(xFields->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2 -Another title"), xField->getPresentation(false)); - // ^^ seems here must be a separator - // Please modify this testcase once this behavior will be fixed. For now I just fix and check this behavior + CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2 - Another title"), xField->getPresentation(false)); // Field: Chapter Format: Chapter number xField.set(xFields->nextElement(), uno::UNO_QUERY); @@ -96,6 +94,43 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf143424) xField.set(xFields->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(OUString("2"), xField->getPresentation(false)); } + +CPPUNIT_TEST_FIXTURE(Test, testChapterFieldsFollowedBy) +{ + createSwDoc(DATA_DIRECTORY, "chapter_field_followedby.odt"); + + uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xFieldsAccess( + xTextFieldsSupplier->getTextFields()); + uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); + + // TODO: I have no idea why fields are enumerated in invalid order, not like in document + std::vector<OUString> aFieldValues = { + "Followed by tab", // #1 + "I.I.I.I", // #16 + ">I.I.I.I< Followed by newline", // #15 Linefeed is replaced by space + ">I.I.I.I<", // #14 + "Followed by newline", // #13 + "I.I.I", // #12 + ">I.I.I<Followed by nothing", // #11 Nothing between text & outline + ">I.I.I<", // #10 + "Followed by nothing", // #9 + "I.I", // #8 + ">I.I< Followed by space", // #7 Space as is + ">I.I<", // #6 + "Followed by space", // #5 + "I", // #4 + ">I< Followed by tab", // #3 Here is a tab, but replaced by space in field + ">I<", // #2 + }; + + for (const auto& sValue : aFieldValues) + { + CPPUNIT_ASSERT(xFields->hasMoreElements()); + uno::Reference<text::XTextField> xField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sValue, xField->getPresentation(false)); + } +} } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/fields/chpfld.cxx b/sw/source/core/fields/chpfld.cxx index 191c1de85110..229e6c96154c 100644 --- a/sw/source/core/fields/chpfld.cxx +++ b/sw/source/core/fields/chpfld.cxx @@ -37,7 +37,8 @@ namespace OUString removeControlChars(const OUString& sIn) { - OUStringBuffer aBuf(sIn.replace('\n', ' ')); + OUStringBuffer aBuf(sIn); + aBuf = aBuf.replace('\n', ' ').replace('\t', ' '); sal_Int32 nLen = aBuf.getLength(); for (sal_Int32 i = 0; i < nLen; ++i) { @@ -106,9 +107,9 @@ OUString SwChapterField::ExpandImpl(SwRootFrame const*const pLayout) const case CF_NUMBER: return rState.sPre + rState.sNumber + rState.sPost; case CF_NUM_TITLE: - return rState.sPre + rState.sNumber + rState.sPost + rState.sTitle; + return rState.sPre + rState.sNumber + rState.sPost + rState.sLabelFollowedBy + rState.sTitle; case CF_NUM_NOPREPST_TITLE: - return rState.sNumber + rState.sTitle; + return rState.sNumber + rState.sLabelFollowedBy + rState.sTitle; } // CF_NUMBER_NOPREPST return rState.sNumber; @@ -149,6 +150,7 @@ void SwChapterField::ChangeExpansion(const SwTextNode &rTextNd, bool bSrchNum, { State & rState(pLayout && pLayout->IsHideRedlines() ? m_StateRLHidden : m_State); rState.sNumber.clear(); + rState.sLabelFollowedBy.clear(); rState.sTitle.clear(); rState.sPost.clear(); rState.sPre.clear(); @@ -209,6 +211,7 @@ void SwChapterField::ChangeExpansion(const SwTextNode &rTextNd, bool bSrchNum, const SwNumFormat& rNFormat = pRule->Get(nListLevel); rState.sPost = rNFormat.GetSuffix(); rState.sPre = rNFormat.GetPrefix(); + rState.sLabelFollowedBy = removeControlChars(rNFormat.GetLabelFollowedByAsString()); } } else diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index bb43cfab5af4..cbe797f08dcb 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -4499,33 +4499,7 @@ OUString SwTextNode::GetLabelFollowedBy() const const SwNumFormat& rFormat = pNumRule->Get( o3tl::narrowing<sal_uInt16>(GetActualListLevel()) ); if ( rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT ) { - switch ( rFormat.GetLabelFollowedBy() ) - { - case SvxNumberFormat::LISTTAB: - { - return "\t"; - } - break; - case SvxNumberFormat::SPACE: - { - return " "; - } - break; - case SvxNumberFormat::NEWLINE: - { - return "\n"; - } - break; - case SvxNumberFormat::NOTHING: - { - // intentionally left blank. - } - break; - default: - { - OSL_FAIL( "<SwTextNode::GetLabelFollowedBy()> - unknown SvxNumberFormat::GetLabelFollowedBy() return value" ); - } - } + return rFormat.GetLabelFollowedByAsString(); } } |