tdf#56126 - Changed separator for conditional fields

In order to support the previosuly used vertical separator.

Change-Id: I62d05a1ce9e95d34879ac2970c57fd0e4f78f987
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198813
Tested-by: Jenkins
Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
This commit is contained in:
Andreas Heinisch
2026-02-08 19:29:20 +01:00
parent aad62f783b
commit a338ec1d3b
5 changed files with 39 additions and 9 deletions
+1
View File
@@ -129,6 +129,7 @@ const char cSequenceMarkSeparator = '!';
sal_Unicode const toxMarkSeparator = '\u0019';
#define DB_DELIM u'\x00ff' // Database <-> table separator.
#define CONDITIONAL_FIELD_SEPARATOR u'\0'
enum class SetAttrMode
{
+26
View File
@@ -119,6 +119,32 @@ CPPUNIT_TEST_FIXTURE(Test, testInsertRefmark)
CPPUNIT_ASSERT_EQUAL(u"aaabbbccc"_ustr, pTextNode->GetText());
}
CPPUNIT_TEST_FIXTURE(Test, testTdf56126InsertConditionalFieldWithVerticalSeparator)
{
// Create an empty document
createSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
// Insert a conditional field containing exactly two dots for its condition
SwFieldMgr aFieldMgr(pWrtShell);
SwInsertField_Data aFieldData(SwFieldTypesEnum::ConditionalText, 0, u"true"_ustr,
u"foo|bar"_ustr, 0);
CPPUNIT_ASSERT(aFieldMgr.InsertField(aFieldData));
pWrtShell->SttEndDoc(true);
// Without the accompanying fix in place, this test would have failed with:
// - Expected: foo|bar
// - Actual : foo
// i.e. the conditional text after the vertical separator disappeared
CPPUNIT_ASSERT_EQUAL(u"foo|bar"_ustr, pWrtShell->GetCurField()->ExpandField(true, nullptr));
// Reload document in order to check if the new separator will be saved in ODT
saveAndReload(TestFilter::ODT);
pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell->SttEndDoc(true);
CPPUNIT_ASSERT_EQUAL(u"foo|bar"_ustr, pWrtShell->GetCurField()->ExpandField(true, nullptr));
}
CPPUNIT_TEST_FIXTURE(Test, testTdf68364InsertConditionalFieldWithTwoDots)
{
// Create an empty document
+5 -5
View File
@@ -1352,14 +1352,14 @@ SwHiddenTextField::SwHiddenTextField( SwHiddenTextFieldType* pFieldType,
if(m_nSubType == SwFieldTypesEnum::ConditionalText)
{
sal_Int32 nPos = 0;
m_aTRUEText = rStr.getToken(0, '|', nPos);
m_aTRUEText = rStr.getToken(0, CONDITIONAL_FIELD_SEPARATOR, nPos);
if(nPos != -1)
{
m_aFALSEText = rStr.getToken(0, '|', nPos);
m_aFALSEText = rStr.getToken(0, CONDITIONAL_FIELD_SEPARATOR, nPos);
if(nPos != -1)
{
m_aContent = rStr.getToken(0, '|', nPos);
m_aContent = rStr.getToken(0, CONDITIONAL_FIELD_SEPARATOR, nPos);
m_bValid = true;
}
}
@@ -1493,7 +1493,7 @@ void SwHiddenTextField::SetPar2(const OUString& rStr)
{
if (m_nSubType == SwFieldTypesEnum::ConditionalText)
{
sal_Int32 nPos = rStr.indexOf('|');
sal_Int32 nPos = rStr.indexOf(CONDITIONAL_FIELD_SEPARATOR);
if (nPos == -1)
m_aTRUEText = rStr;
else
@@ -1513,7 +1513,7 @@ OUString SwHiddenTextField::GetPar2() const
{
return m_aTRUEText;
}
return m_aTRUEText + "|" + m_aFALSEText;
return OUString::Concat(m_aTRUEText) + OUStringChar(CONDITIONAL_FIELD_SEPARATOR) + m_aFALSEText;
}
SwFieldTypesEnum SwHiddenTextField::GetSubType() const
+1 -1
View File
@@ -3501,7 +3501,7 @@ void AttributeOutputBase::TextField( const SwFormatField& rField )
{
OUString aCond = pField->GetPar1();
OUString aTrueFalse = pField->GetPar2();
sal_Int32 nPos = aTrueFalse.indexOf('|');
sal_Int32 nPos = aTrueFalse.indexOf(CONDITIONAL_FIELD_SEPARATOR);
OUString aTrue;
OUString aFalse;
if (nPos == -1)
+6 -3
View File
@@ -334,8 +334,10 @@ IMPL_LINK_NOARG(SwFieldFuncPage, TypeHdl, weld::TreeView&, void)
if (IsFieldEdit())
{
sal_Int32 nIdx{ 0 };
m_xCond1ED->set_text(GetCurField()->GetPar2().getToken(0, '|', nIdx));
m_xCond2ED->set_text(GetCurField()->GetPar2().getToken(0, '|', nIdx));
m_xCond1ED->set_text(
GetCurField()->GetPar2().getToken(0, CONDITIONAL_FIELD_SEPARATOR, nIdx));
m_xCond2ED->set_text(
GetCurField()->GetPar2().getToken(0, CONDITIONAL_FIELD_SEPARATOR, nIdx));
}
bName = bValue = true;
@@ -548,7 +550,8 @@ bool SwFieldFuncPage::FillItemSet(SfxItemSet* )
break;
case SwFieldTypesEnum::ConditionalText:
aVal = m_xCond1ED->get_text() + "|" + m_xCond2ED->get_text();
aVal = OUString::Concat(m_xCond1ED->get_text())
+ OUStringChar(CONDITIONAL_FIELD_SEPARATOR) + m_xCond2ED->get_text();
break;
case SwFieldTypesEnum::Dropdown :
{