tdf#162268 sw: layout: hidden formatting is ignored on cell end marker

... in Word, so ignore it in Writer on the last paragraph in a cell.

(regression from commit 7b8cec8322)

Word also uses hidden character formatting on the row end marker to
determine if a row should be hidden; this isn't possible yet.

Change-Id: I7ceaea0d807193155631083616a93cdd058e20d1
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176060
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Tested-by: Jenkins
This commit is contained in:
Michael Stahl
2024-11-06 20:28:19 +01:00
parent 3e383f1441
commit a6d0b7f683
3 changed files with 260 additions and 5 deletions
+178
View File
@@ -0,0 +1,178 @@
{\rtf1\ansi\ansicpg1252\deff0\adeff1
{\fonttbl{\f0\fbidi\froman\fcharset0\fprq2
{\*\panose 02020603050405020304}
{\*\falt Arial}
Times New Roman;}{\f1\fbidi\fswiss\fcharset0\fprq2
{\*\panose 020b0604020202020204}
{\*\falt Courier New}
Arial;}{\f2\fbidi\fswiss\fcharset0\fprq2
{\*\panose 020b0502040204020203}
Segoe UI;}{\f3\fbidi\froman\fcharset2\fprq2
{\*\panose 05050102010706020507}
Symbol;}{\f4\fbidi\fswiss\fcharset0\fprq2
{\*\panose 00000000000000000000}
{\*\falt Arial}
Univers Condensed;}{\f40\fbidi\froman\fcharset204\fprq2
{\*\falt Arial}
Times New Roman Cyr;}{\f31501\fdbmajor\fbidi\froman\fcharset0\fprq2
{\*\panose 02020603050405020304}
{\*\falt Arial}
Times New Roman;}{\f31502\fhimajor\fbidi\froman\fcharset0\fprq2
{\*\panose 02040503050406030204}
Cambria;}{\f31503\fbimajor\fbidi\froman\fcharset0\fprq2
{\*\panose 02020603050405020304}
{\*\falt Arial}
Times New Roman;}{\f31505\fdbminor\fbidi\froman\fcharset0\fprq2
{\*\panose 02020603050405020304}
{\*\falt Arial}
Times New Roman;}{\f31506\fhiminor\fbidi\fswiss\fcharset0\fprq2
{\*\panose 020f0502020204030204}
Calibri;}{\f31507\fbiminor\fbidi\froman\fcharset0\fprq2
{\*\panose 02020603050405020304}
{\*\falt Arial}
Times New Roman;}}
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;
\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255
\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0
\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128
\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192
\green192\blue192;;;;\red0\green32\blue96;}
\adeflang1025\stshfdbch31505
\stshfloch31506\stshfhich31506\stshfbi0\deflang1031\deflangfe1031
\themelang1031\themelangfe0\themelangcs0
{\*\defchp\fs22\loch\af31506\hich\af31506\dbch\af31505}
{\*\defpap\ql\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha
\aspnum\faauto\adjustright\rin0\lin0\itap0}
{\stylesheet{\ql\li0\ri0\widctlpar\wrapdefault\faauto\adjustright\rin0\lin0
\itap0\rtlch\fcs1\af1\afs20\alang1025\ltrch\fcs0\fs20\lang1031\langfe1031
\loch\f1\hich\af1\dbch\af31505\cgrid\langnp1031\langfenp1031\snext0
\sqformat\spriority0 Normal;}{\s1\ql\li0\ri0\keepn\widctlpar\wrapdefault
\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\rtlch\fcs1\ab\af1\afs20
\alang1025\ltrch\fcs0\b\fs20\lang1031\langfe1031\loch\f1\hich\af1\dbch
\af31505\cgrid\langnp1031\langfenp1031\sbasedon0\snext0\slink15\sqformat
heading 1;}{\s3\ql\li0\ri0
\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\adjustright\rin0\lin0
\itap0\rtlch\fcs1\af1\afs20\alang1025\ltrch\fcs0\v\fs20\cf6\lang1031
\langfe1031\loch\f1\hich\af1\dbch\af31505\cgrid\langnp1031\langfenp1031
\sbasedon0\snext0\slink17\sqformat heading 3;}
{\*\cs10\additive Default Paragraph Font;}
{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3
\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0
\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh
\tsbrdrv\ql\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha
\aspnum\faauto\adjustright\rin0\lin0\itap0\rtlch\fcs1\af0\afs22\alang1025
\ltrch\fcs0\fs22\lang1031\langfe1031\loch\f31506\hich\af31506\dbch\af31505
\cgrid\langnp1031\langfenp1031\snext11\ssemihidden\sunhideused\sqformat
Normal Table;}
{\*\cs15\additive\rtlch\fcs1\ab\af31503\afs32\ltrch\fcs0\b\fs32\kerning32
\loch\f31502\hich\af31502\dbch\af31501\sbasedon10\slink1\slocked\spriority9
Überschrift 1 Zchn;}
{\*\cs17\additive\rtlch\fcs1\ab\af31503\afs26\ltrch\fcs0\b\fs26\loch\f31502
\hich\af31502\dbch\af31501\sbasedon10\slink3\slocked\ssemihidden\spriority9
Überschrift 3 Zchn;}
{\s23\ql\li0\ri0\widctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0
\rtlch\fcs1\af1\afs72\alang1025\ltrch\fcs0\v\fs72\cf6\lang1031\langfe1031
\loch\f1\hich\af1\dbch\af31505\cgrid\langnp1031\langfenp1031\sbasedon0
\snext23\slink24 Body Text;}
{\*\cs24\additive\rtlch\fcs1\af1\afs20\ltrch\fcs0\f1\fs20\sbasedon10
\slink23\slocked\ssemihidden Textkörper Zchn;}
}
\paperw11906\paperh16838\margl1418\margr851\margt1134\margb1134\gutter0
\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves1\trackformatting1
\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0
\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0
\showxmlerrors0\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul
\hyphcaps0\formshade\horzdoc\dgmargin\dghspace100\dgvspace120\dghorigin1418
\dgvorigin1134\dghshow0\dgvshow3\jcompress\viewkind1\viewscale217\viewzk2
\nolnhtadjtbl\fet0
{\*\wgrffmtfilter 2450}
\ilfomacatclnup0
{\*\generator CIB merge 3.13.9}
\uc1\noqfpromote
\ltrsect\pgbrdrhead\pgbrdrfoot\ltrpar\sectd\ltrsect\psz9\sbknone\linex0
\headery709\footery284\colsx709\endnhere\titlepg\pgbrdropt32
\sectlinegrid272\sectdefaultcl\sftnbj
\pard\plain\ltrpar\s1\ql\li0\ri0\keepn\widctlpar\wrapdefault
\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\rtlch\fcs1\ab\af1\afs20
\alang1025\ltrch\fcs0\b\fs20\lang1031\langfe1031\loch\af1\hich\af1\dbch
\af31505\cgrid\langnp1031\langfenp1031{\rtlch\fcs1\ab0\af1\ltrch\fcs0\b0
\cf6\hich\af1\dbch\af31505\loch\f1 Name:\par
}
\trowd\irow12\irowband12\ltrrow\ts11\trgaph70\trleft-70\trbrdrt\brdrs
\brdrw10\trbrdrl\brdrs\brdrw10\trbrdrb\brdrs\brdrw10\trbrdrr\brdrs\brdrw10
\trbrdrh\brdrs\brdrw10\trbrdrv\brdrs\brdrw10\trftsWidth3\trwWidth10204
\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl70\trpaddr70\trpaddfl3
\trpaddfr3\tblind0\tblindtype3\clvertalt\clbrdrt\brdrnone
\clbrdrl\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth1870\clshdrawnil\cellx1800\clvertalt\clbrdrt\brdrnone\clbrdrl
\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth1980\clshdrawnil\cellx3780\clvertalt\clbrdrt\brdrnone\clbrdrl
\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth1800\clshdrawnil\cellx5580\clvertalt\clbrdrt\brdrnone\clbrdrl
\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth4554\clshdrawnil\cellx10134\pard\ltrpar\ql\li0\ri0\keepn\widctlpar
\intbl\wrapdefault\faauto\adjustright\rin0\lin0{\rtlch\fcs1
\af1\afs20\ltrch\fcs0\v\fs20\cf6\hich\af1\dbch\af31507\loch
\f1 05.05.2008\cell
}\pard\plain\ltrpar\s3\ql\li0\ri0\keepn\widctlpar\intbl\wrapdefault\faauto
\outlinelevel2\adjustright\rin0\lin0\rtlch\fcs1\af1\afs20
\alang1025\ltrch\fcs0
\v
\fs20\cf6\lang1031\langfe1031\loch\af1\hich\af1\dbch
\af31507\cgrid\langnp1031\langfenp1031{\rtlch\fcs1\af1\ltrch\fcs0
\hich\af1\dbch\af31507\loch\f1 Aufruf \par
}\pard\plain\ltrpar\s24\ql\li0\ri0\keepn\widctlpar\intbl\wrapdefault\faauto
\adjustright\rin0\lin0\rtlch\fcs1\af1\afs20\alang1025\ltrch
\fcs0\v\fs20\cf6\lang1031\langfe1031\loch\af1\hich\af1\dbch\af31507\cgrid
\langnp1031\langfenp1031{\rtlch\fcs1\af1\ltrch\fcs0\hich\af1
\dbch\af31507\loch\f1\hich\f1 \loch\f1\hich\f1 IF MERGEFIELD Nr\par
}
\pard\plain\ltrpar\ql\li0\ri0\keepn\widctlpar\intbl\wrapdefault\faauto
\adjustright\rin0\lin0\rtlch\fcs1\af1\afs22\alang1025\ltrch
\fcs0\fs22\lang1031\langfe1031\loch\af1\hich\af1\dbch\af31507\cgrid
\langnp1031\langfenp1031{\rtlch\fcs1\af1\afs20\ltrch\fcs0\v\fs20\cf6
\hich\af1\dbch\af31507\loch\f1\hich\f1 Feld\cell
}
\pard\ltrpar\ql\li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault
\aspalpha\aspnum\faauto\adjustright\rin0\lin0{\rtlch\fcs1\af1\afs20\ltrch
\fcs0\v\fs20\cf6\trowd\irow12\irowband12\ltrrow\ts11
\trgaph70\trleft-70\trbrdrt\brdrs\brdrw10\trbrdrl\brdrs\brdrw10\trbrdrb
\brdrs\brdrw10\trbrdrr\brdrs\brdrw10\trbrdrh\brdrs\brdrw10\trbrdrv\brdrs
\brdrw10\trftsWidth3\trwWidth10204\trftsWidthB3\trftsWidthA3\trautofit1
\trpaddl70\trpaddr70\trpaddfl3\trpaddfr3\tblind0\tblindtype3
\clvertalt\clbrdrt\brdrnone\clbrdrl\brdrnone\clbrdrb\brdrnone\clbrdrr
\brdrnone\cltxlrtb\clftsWidth3\clwWidth1870\clshdrawnil\cellx1800\clvertalt
\clbrdrt\brdrnone\clbrdrl\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone
\cltxlrtb\clftsWidth3\clwWidth1980\clshdrawnil\cellx3780\clvertalt\clbrdrt
\brdrnone\clbrdrl\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb
\clftsWidth3\clwWidth1800\clshdrawnil\cellx5580\clvertalt\clbrdrt\brdrnone
\clbrdrl\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth4554\clshdrawnil\cellx10134\row
}\pard\ltrpar\ql\li0\ri0\keepn\widctlpar\intbl\wrapdefault\faauto
\adjustright\rin0\lin0{\rtlch\fcs1\af1\afs20\ltrch\fcs0\v
\fs20\cf6\hich\af1\dbch\af31507\loch\f1 25.03.2008\cell
\hich\af1\dbch\af31507\loch\f1 Neuer \cell
}\pard\ltrpar\ql\li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault
\aspalpha\aspnum\faauto\adjustright\rin0\lin0{\rtlch\fcs1\af1\ltrch\fcs0\v
\cf6\trowd\irow13\irowband13\ltrrow\ts11\trgaph70\trleft-70
\trbrdrt\brdrs\brdrw10\trbrdrl\brdrs\brdrw10\trbrdrb\brdrs\brdrw10\trbrdrr
\brdrs\brdrw10\trbrdrh\brdrs\brdrw10\trbrdrv\brdrs\brdrw10\trftsWidth3
\trwWidth10204\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl70\trpaddr70
\trpaddfl3\trpaddfr3\tblind0\tblindtype3\clvertalt\clbrdrt
\brdrnone\clbrdrl\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb
\clftsWidth3\clwWidth1870\clshdrawnil\cellx1800\clvertalt\clbrdrt\brdrnone
\clbrdrl\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth1980\clshdrawnil\cellx3780\clvertalt\clbrdrt\brdrnone\clbrdrl
\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth1800\clshdrawnil\cellx5580\clvertalt\clbrdrt\brdrnone\clbrdrl
\brdrnone\clbrdrb\brdrnone\clbrdrr\brdrnone\cltxlrtb\clftsWidth3
\clwWidth4554\clshdrawnil\cellx10134\row
}
\pard\plain\ltrpar\ql\li0\ri0\keepn\widctlpar\tx1701\wrapdefault\faauto
\adjustright\rin0\lin0\itap0\rtlch\fcs1\af1\afs20\alang1025\ltrch\fcs0\fs20
\lang1031\langfe1031\loch\af1\hich\af1\dbch\af31505\cgrid\langnp1031
\langfenp1031{\rtlch\fcs1\af1\ltrch\fcs0\cf6\par
}
}
+49
View File
@@ -1963,6 +1963,55 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf137819)
CPPUNIT_ASSERT(sTextRightSidePosition.toInt32() < sShapeRightSidePosition.toInt32());
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testParagraphMarkInCell)
{
createSwDoc("572-min.rtf");
uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
uno::Reference<view::XViewSettingsSupplier> xViewSettingsSupplier(
xModel->getCurrentController(), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xViewSettings(xViewSettingsSupplier->getViewSettings());
uno::Any aOldHidden{ xViewSettings->getPropertyValue(u"ShowHiddenCharacters"_ustr) };
uno::Any aOldNon{ xViewSettings->getPropertyValue(u"ShowNonprintingCharacters"_ustr) };
comphelper::ScopeGuard g([&] {
xViewSettings->setPropertyValue(u"ShowHiddenCharacters"_ustr, aOldHidden);
xViewSettings->setPropertyValue(u"ShowNonprintingCharacters"_ustr, aOldNon);
});
xViewSettings->setPropertyValue(u"ShowHiddenCharacters"_ustr, uno::Any(true));
xViewSettings->setPropertyValue(u"ShowNonprintingCharacters"_ustr, uno::Any(true));
{
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page/body/txt[1]/infos/bounds", "height", u"230");
assertXPath(pXmlDoc, "/root/page/body/tab[1]/row[1]/infos/bounds", "height", u"690");
assertXPath(pXmlDoc, "/root/page/body/tab[1]/row[2]/infos/bounds", "height", u"230");
assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds", "height", u"230");
}
xViewSettings->setPropertyValue(u"ShowNonprintingCharacters"_ustr, uno::Any(false));
{
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page/body/txt[1]/infos/bounds", "height", u"230");
// the problem was that the table rows were not hidden
//TODO assertXPath(pXmlDoc, "/root/page/body/tab[1]/row[1]/infos/bounds", "height",
// u"0");
assertXPath(pXmlDoc, "/root/page/body/tab[1]/row[2]/infos/bounds", "height", u"0");
assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds", "height", u"230");
}
xViewSettings->setPropertyValue(u"ShowNonprintingCharacters"_ustr, uno::Any(true));
{
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page/body/txt[1]/infos/bounds", "height", u"230");
assertXPath(pXmlDoc, "/root/page/body/tab[1]/row[1]/infos/bounds", "height", u"690");
assertXPath(pXmlDoc, "/root/page/body/tab[1]/row[2]/infos/bounds", "height", u"230");
assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds", "height", u"230");
}
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testParagraphMarkLineHeight)
{
createSwDoc("A020-min.rtf");
+33 -5
View File
@@ -1474,6 +1474,19 @@ void SwTextFrame::ResetPreps()
}
}
static auto FindCellFrame(SwFrame const* pLower) -> SwLayoutFrame const*
{
while (pLower)
{
if (pLower->IsCellFrame())
{
return static_cast<SwLayoutFrame const*>(pLower);
}
pLower = pLower->GetUpper();
}
return nullptr;
}
bool SwTextFrame::IsHiddenNow() const
{
SwFrameSwapper aSwapper( this, true );
@@ -1548,12 +1561,27 @@ bool SwTextFrame::IsHiddenNow() const
SwTextNode const*const pNode{ m_pMergedPara
? m_pMergedPara->pLastNode
: static_cast<SwTextNode const*>(SwFrame::GetDep()) };
SwFormatAutoFormat const& rListAutoFormat{pNode->GetAttr(RES_PARATR_LIST_AUTOFMT)};
std::shared_ptr<SfxItemSet> const pSet{rListAutoFormat.GetStyleHandle()};
SvxCharHiddenItem const*const pItem{pSet ? pSet->GetItemIfSet(RES_CHRATR_HIDDEN) : nullptr};
if (!pItem || !pItem->GetValue())
// Word ignores hidden formatting on the cell end marker
bool isLastInCell{false};
if (SwLayoutFrame const*const pCellFrame{FindCellFrame(this)})
{
bHiddenCharsHidePara = false;
SwContentFrame const* pNext{GetNextContentFrame()};
// skip frame in hidden section ("this" is *not* in hidden section!)
while (pNext && pNext->SwContentFrame::IsHiddenNow())
{
pNext = pNext->GetNextContentFrame();
}
isLastInCell = pNext == nullptr || !pCellFrame->IsAnLower(pNext);
}
if (!isLastInCell)
{
SwFormatAutoFormat const& rListAutoFormat{pNode->GetAttr(RES_PARATR_LIST_AUTOFMT)};
std::shared_ptr<SfxItemSet> const pSet{rListAutoFormat.GetStyleHandle()};
SvxCharHiddenItem const*const pItem{pSet ? pSet->GetItemIfSet(RES_CHRATR_HIDDEN) : nullptr};
if (!pItem || !pItem->GetValue())
{
bHiddenCharsHidePara = false;
}
}
}
const SwViewShell* pVsh = getRootFrame()->GetCurrShell();