sw/inc/swtypes.hxx | 3 sw/qa/extras/ooxmlexport/ooxmlexport8.cxx | 4 sw/qa/extras/rtfexport/data/Tpl-2min3_s1.rtf | 321 ++++++++++++ sw/qa/extras/rtfexport/rtfexport8.cxx | 39 + sw/source/core/unocore/unotbl.cxx | 3 sw/source/ui/vba/vbatablehelper.cxx | 1 sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx | 7 sw/source/writerfilter/dmapper/TableManager.cxx | 27 + 8 files changed, 396 insertions(+), 9 deletions(-)
New commits: commit bee609cf3d42c7e8849a45ac289d84ff84973e2d Author: Michael Stahl <[email protected]> AuthorDate: Tue Jul 22 12:51:31 2025 +0200 Commit: Michael Stahl <[email protected]> CommitDate: Wed Jul 23 17:19:24 2025 +0200 sw,writerfilter: move UNO_TABLE_COLUMN_SUM to swtypes.hxx Change-Id: I0e9a5e0e7916d91d791b0b68fa0a5d27fe2a811f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188157 Reviewed-by: Mike Kaganski <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> (cherry picked from commit 00a276222a2f78d760db33f3880cd71f227823a2) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188217 Reviewed-by: Michael Stahl <[email protected]> Tested-by: Jenkins diff --git a/sw/inc/swtypes.hxx b/sw/inc/swtypes.hxx index 88a33b983ec4..84c544951788 100644 --- a/sw/inc/swtypes.hxx +++ b/sw/inc/swtypes.hxx @@ -59,6 +59,9 @@ constexpr SwTwips cMinHdFtHeight = 56; // ~1mm #define MINFLY 23 // Minimal size for FlyFrames. #define MINLAY 23 // Minimal size for other Frames. +/// hard-coded value of read-only TableColumnRelativeSum property +constexpr SwTwips UNO_TABLE_COLUMN_SUM{10000}; + // Default column distance of two text columns corresponds to 0.3 cm. constexpr SwTwips DEF_GUTTER_WIDTH = o3tl::toTwips(3, o3tl::Length::mm); diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx index 9fd9e51f5380..bfa3e95c600b 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx @@ -612,8 +612,8 @@ DECLARE_OOXMLEXPORT_TEST(testN785767, "n785767.docx") uno::Reference<text::XTextTable> xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); uno::Reference<table::XTableRows> xTableRows = xTextTable->getRows(); // Check the A1 and B1 cells, the width of both of them was the default value (10000 / 9, as there were 9 cells in the row). - CPPUNIT_ASSERT_MESSAGE("A1 must not have default width", sal_Int16(10000 / 9) != getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(0), u"TableColumnSeparators"_ustr)[0].Position); - CPPUNIT_ASSERT_MESSAGE("B1 must not have default width", sal_Int16(10000 / 9) != getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(1), u"TableColumnSeparators"_ustr)[0].Position); + CPPUNIT_ASSERT_MESSAGE("A1 must not have default width", sal_Int16(UNO_TABLE_COLUMN_SUM / 9) != getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(0), u"TableColumnSeparators"_ustr)[0].Position); + CPPUNIT_ASSERT_MESSAGE("B1 must not have default width", sal_Int16(UNO_TABLE_COLUMN_SUM / 9) != getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(1), u"TableColumnSeparators"_ustr)[0].Position); } DECLARE_OOXMLEXPORT_TEST(testFineTableDash, "tableborder-finedash.docx") diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx index 38f375b9f8f4..74071584654d 100644 --- a/sw/source/core/unocore/unotbl.cxx +++ b/sw/source/core/unocore/unotbl.cxx @@ -174,9 +174,6 @@ namespace } } -#define UNO_TABLE_COLUMN_SUM 10000 - - static bool lcl_LineToSvxLine(const table::BorderLine& rLine, SvxBorderLine& rSvxLine) { rSvxLine.SetColor(Color(ColorTransparency, rLine.Color)); diff --git a/sw/source/ui/vba/vbatablehelper.cxx b/sw/source/ui/vba/vbatablehelper.cxx index a5908635b9f8..b7d793345662 100644 --- a/sw/source/ui/vba/vbatablehelper.cxx +++ b/sw/source/ui/vba/vbatablehelper.cxx @@ -27,7 +27,6 @@ using namespace ::com::sun::star; using namespace ::ooo::vba; -#define UNO_TABLE_COLUMN_SUM 10000 SwVbaTableHelper::SwVbaTableHelper( uno::Reference< text::XTextTable > xTextTable ) : mxTextTable(std::move( xTextTable )) { diff --git a/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx b/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx index 312d2abf10b3..b51bbc6cdf79 100644 --- a/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx @@ -21,6 +21,7 @@ #include "ConversionHelper.hxx" #include "MeasureHandler.hxx" #include "TagLogger.hxx" +#include <swtypes.hxx> #include <com/sun/star/text/SizeType.hpp> #include <com/sun/star/text/TableColumnSeparator.hpp> #include <com/sun/star/text/WritingMode2.hpp> @@ -322,7 +323,7 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) { // Contains unit and value, but unit is not interesting for // us, later we'll just distribute these values in a - // 0..10000 scale. + // 0..UNO_TABLE_COLUMN_SUM scale. writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); if( pProperties ) { @@ -725,7 +726,7 @@ void DomainMapperTableManager::endOfRowAction() if (nFullWidthRelative == 0) throw o3tl::divide_by_zero(); - nRelPos = (fGridWidth * 10000) / nFullWidthRelative; + nRelPos = (fGridWidth * UNO_TABLE_COLUMN_SUM) / nFullWidthRelative; } pSeparators[nBorder].Position = rtl::math::round(nRelPos + nLastRelPos); @@ -818,7 +819,7 @@ void DomainMapperTableManager::endOfRowAction() for (size_t i = 0; i < nWidthsBound; ++i) { nSum += (*pCellWidths)[i]; - pSeparators[nPos].Position = (nSum * 10000) / nFullWidthRelative; // Relative position + pSeparators[nPos].Position = (nSum * UNO_TABLE_COLUMN_SUM) / nFullWidthRelative; // Relative position pSeparators[nPos].IsVisible = true; nPos++; } diff --git a/sw/source/writerfilter/dmapper/TableManager.cxx b/sw/source/writerfilter/dmapper/TableManager.cxx index 54aa10765f59..8d3dc62b4d16 100644 --- a/sw/source/writerfilter/dmapper/TableManager.cxx +++ b/sw/source/writerfilter/dmapper/TableManager.cxx @@ -23,6 +23,9 @@ #include "DomainMapperTableHandler.hxx" #include "DomainMapper_Impl.hxx" #include "util.hxx" + +#include <swtypes.hxx> + #include <comphelper/sequence.hxx> #include <comphelper/diagnose_ex.hxx> #include <com/sun/star/text/TableColumnSeparator.hpp> @@ -446,8 +449,8 @@ void TableManager::HandleSmallerRows() static_cast<sal_Int16>(::rtl::math::round(pos)), sep.IsVisible }; }) }; - // TODO replace magic number - it->Position = ::rtl::math::round(10000 * double(nRowWidth) / nMaxRowWidth); + it->Position = ::rtl::math::round(UNO_TABLE_COLUMN_SUM * double(nRowWidth) + / nMaxRowWidth); it->IsVisible = true; pRowData->getProperties()->Insert(PROP_TABLE_COLUMN_SEPARATORS, uno::Any(newSeps)); commit b2dcf38fdb65bf4bc1fdca5ef69f2009b24a98e7 Author: Michael Stahl <[email protected]> AuthorDate: Mon Jul 21 17:34:30 2025 +0200 Commit: Michael Stahl <[email protected]> CommitDate: Wed Jul 23 17:19:16 2025 +0200 tdf#166953 writerfilter: add column width when adding extra cell It's not so obvious how the cell widths are set... 1. The table gets USHRT_MAX as initial width 2. All the cells in the table get USHRT_MAX/nCells as initial width (this is SwFrameSizeItem in box item set) 3. Table property "Width" is set -> this scales all the box widths 4. Row property "TableColumnSeparators" is set; this is *relative* widths to a hard-coded value of TableColumnRelativeSum=10000 Evidently the result is bad if the number of separators is too low. (regression from commit 038473595ed266d15a788d8f97781cbaf066cfe7) Change-Id: Ie71889a074bff43d8f0c34ccefb4d30ed0a9f0c0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188153 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Mike Kaganski <[email protected]> (cherry picked from commit 23e308d5e02ee45ef589d3fddf53dabaa12aadfe) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188207 Tested-by: Jenkins Reviewed-by: Michael Stahl <[email protected]> diff --git a/sw/qa/extras/rtfexport/data/Tpl-2min3_s1.rtf b/sw/qa/extras/rtfexport/data/Tpl-2min3_s1.rtf new file mode 100644 index 000000000000..edc79c6d6d10 --- /dev/null +++ b/sw/qa/extras/rtfexport/data/Tpl-2min3_s1.rtf @@ -0,0 +1,321 @@ +{ tf1nsi\deff3deflang1025 +{onttbl{0romanprq2charset0 Times New Roman;}{1romanprq2charset2 Symbol;}{2swissprq2charset0 Arial;}{3romanprq2charset0 Liberation Serif{\*alt Times New Roman};}{4romanprq2charset0 Arial;}{5romanprq2 charset0 Calibri Light;}{6romanprq2charset0 Times New Roman;}{7romanprq2 charset0 Liberation Sans{\*alt Arial};}{8romanprq2charset0 Courier New;}{ 9romanprq2charset0 Tahoma;}{10romanprq2charset0 Calibri;}{11nilprq2 charset0 Times New Roman;}{12nilprq2charset0 Courier New;}{13nilprq2 charset0 DejaVu Sans;}{14nilprq2charset0 Arial;}{15nilprq2charset0 FreeSans;}{16nilprq2charset0 Tahoma;}} +{+{\stylesheet{\s0\snext0 tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar\hyphpar0 aauto\sb0\sa200\ltrpar+{\s1\sbasedon0\snext0 tlchf14fs22lang1025 \ltrch\lang2057\langfe1040\hichf4\loch\qc\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s2\sbasedon1\snext0 tlchf14fs22lang1025 \ltrch\lang2057\langfe1040\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb240\sa240+{\s3\sbasedon2\snext0\sautoupd tlchf14fs22lang1025 \ltrch\lang2057\langfe1040\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s4\sbasedon3\snext0\sautoupd tlchf14fs22lang1025 \ltrch\lang2057\langfe1040\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s9\sbasedon0\snext0 tlchf11fs21lang1025i \ltrch\lang2057\langfe1033\hichf5\loch\ql\keep\widctlparaautoi0\li0\lin0 i0 in0\sb40\sa0\keepn+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\ *+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\s172\sbasedon0\snext173 tlchf15fs28 \ltrch\hichf7\loch\sb240\sa120\keepn7s28\dbchf13 Heading;} +{\s173\sbasedon0\snext173\loch\sl276\slmult1\sb0\sa140 Body Text;} +{\s174\sbasedon173\snext174 tlchf15 \ltrch\loch\sl240\slmult1\sb0\sa0 List;} +{\s175\sbasedon0\snext175 tlchf15fs24i \ltrch\loch\sb120\sa120s24\i caption;} +{\s176\sbasedon0\snext176 tlchf15 \ltrch\loch\sb0\sa0 Index;} +{\s177\snext177 tlchf11fs20lang1025 \ltrch\lang2057\langfe2057\hichf6\loch\ql\widctlpar\hyphpar0 aauto\ltrpar+{\s178\sbasedon0\snext178\loch\sb0\sa0 Header and Footer;} +{\s179\sbasedon0\snext179 tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar qc x4677 qr x9355aautoi0\li0\lin0 i0 in0\sb0\sa200+{\s180\sbasedon177\snext180 tlchf11fs20lang1025 \ltrch\lang2057\langfe2057\loch\ql\widctlparaauto i0\li0\lin0 i0 in0rdrtrdrnonerdrlrdrnonerdrbrdrnonerdrrrdrnone s20\lang2057\dbch\langfe2057 Table Grid;} +{\s181\sbasedon0\snext181 tlchf11fs20lang1025 \ltrch\lang2057\langfe1033\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s182\snext182 tlchf11fs20lang1025 \ltrch\lang2057\langfe1033\hichf8\loch\qj owidctlpar x-720\hyphpar0aauto\ltrpar+{\s183\sbasedon0\snext183 tlchf11fs24lang1025 \ltrch\lang1033\langfe1033\loch\qj\widctlparaauto i0\li-360\lin-360 i0 in0\sb0\sa200+{\s184\sbasedon0\snext184 tlchf16fs20lang1025 \ltrch\lang2057\langfe1033\hichf9\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sb0\sa200+{\s185\sbasedon0\snext185 tlchf11fs20lang1025 \ltrch\lang1033\langfe1036\hichf4\loch\qj owidctlparaautoi0\li0\lin0 i85 in85\sb0\sa200+{\s186\sbasedon0\snext186 tlchf11fs20lang1025 \ltrch\lang1033\langfe1036\hichf4\loch\qj owidctlparaautoi0\li0\lin0 i85 in85\sb0\sa200+{\s187\sbasedon0\snext187 tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar qc x4536 qr x9072aautoi0\li0\lin0 i0 in0\sb0\sa200+{\s188\sbasedon0\snext188 tlchf16fs16lang1025 \ltrch\lang2057\langfe1033\hichf9\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s189\sbasedon0\snext189 tlchf11fs20lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s190\sbasedon189\snext189 tlchf11fs20lang1025b \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s191\sbasedon0\snext191 tlchf11fs20lang1025 \ltrch\lang2057\langfe1033\loch\qj\widctlpar x283aautoi-283\li283\lin283 i0 in0\sb0\sa240+{\s192\sbasedon0\snext192 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s193\sbasedon0\snext193 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\ widctlparaautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s194\sbasedon0\snext194 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qr\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrnone+{\s195\sbasedon0\snext195 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qr\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrnone+{\s196\sbasedon0\snext196 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s197\sbasedon0\snext197 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s198\sbasedon0\snext198 tlchf14fs24lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s199\sbasedon0\sn ext199 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrnonerdrrrdrnone+{\s200\sbasedon0\snext200 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s201\sbasedon0\snext201 tlchf14fs28lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s202\sbasedon0\snext202 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s203\sbasedon0\snext203 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\l in0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s204\sbasedon0\snext204 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s205\sbasedon0\snext205 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s206\sbasedon0\snext206 tlchf14fs28lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrnonerdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s207\sbasedon0\snext207 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s208\sbasedon0\snext208 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s209\sbasedon0\snext209 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s210\sbasedon0\snext210 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s211\sbasedon0\snext211 tlchf14fs18lang1025b \ltrc h\lang2057\langfe2057\hichf4\loch\qc\widctlparaautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s212\sbasedon0\snext212 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1oxrdrsrdrw10rdrcf1rsp0+{\s213\sbasedon0\snext213 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1oxrdrsrdrw10rdrcf1rsp0+{\s214\sbasedon0\snext214 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s215\sbasedon0\snext215 tlchf14fs28lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrnonerdrlrdrsrdrw30rdrcf1rsp0 rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s216\sbasedon0\snext216 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s217\sbasedon0\snext217 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s218\sbasedon0\snext218 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s219\sbasedon0\snext219 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsr drw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s220\sbasedon0\snext220 tlchf14fs48lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s221\sbasedon0\snext221 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s222\sbasedon0\snext222 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrnonerdrrrdrnone+{\s223\sbasedon0\snext223 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrnonerdrrrdrnone+{\s224\sbasedon0\snext224 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw2 0rdrcf1rsp0rdrlrdrnonerdrbrdrnonerdrrrdrsrdrw20rdrcf1rsp0+{\s225\sbasedon0\snext225 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s226\sbasedon0\snext226 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s227\sbasedon0\snext227 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s228\sbasedon0\snext228 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\ saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s229\sbasedon0\snext229 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s230\sbasedon0\snext230 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s231\sbasedon0\snext231 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s232\sbasedon0\snext232 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctl paracenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s233\sbasedon0\snext233 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s234\sbasedon0\snext234 tlchf14fs32lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s235\sbasedon0\snext235 tlchf14fs32lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s236\sbasedon0\snext236 tlchf14fs32lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar acenteri0\li0\lin0 i0 in0\sbauto1\saauto1 rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s237\snext237 tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar\hyphpar0 aauto\ltrpar+{\s238\snext238 tlchf11fs24lang1025 \ltrch\lang2057\langfe2057\hichf6\loch\ql\widctlpar\hyphpar0 aauto\ltrpar+{\s239\sbasedon0\snext239 tlchf11fs20lang1025 \ltrch\lang2057\langfe1033\loch\qj\widctlpar x2160aautoi0\li1440\lin1440 i0 in0\sb0\sa240+{\s240\sbasedon0\snext240 tlchf11fs23lang1025 \ltrch\lang2057\langfe2052\loch\sl-274\slmult0\qj owidctlparaautoi-380\li0\lin0 i0 in0\sb780\sa180+{\s241\sbasedon0\snext241 tlchf11fs23lang1025b \ltrch\lang2057\langfe2052\loch\sl240\slmult0\ql owidctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s242\sbasedon177\snext180 tlchf11fs22lang1025 \ltrch\lang1033\langfe1033\hichf10\loch\ql owidctlparaautoi0\li0\lin0 i0 in0rdrtrdrnonerdrlrdrnonerdrbrdrnonerdrrrdrnone10 s22\lang1033\dbch\langfe1033 Table Grid1;} +{\s243\sbasedon0\snext0\sautoupd tlchf11fs24lang1025 \ltrch\lang1033\langfe1033\hichf4\loch\ql\widctlpar ldot qr x8505 aautoi0\li0\lin0 i509 in509\sb60\sa60+{\s244\sbasedon0\snext0\sautoupd tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar ldot qr x8505aautoi0\li140\lin140 i0 in0\sb60\sa60+{\s245\sbasedon0\snext0\sautoupd tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar ldot qr x8505aautoi0\li300\lin300 i0 in0\sb60\sa60+{\s246\sbasedon0\snext0\sautoupd tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar ldot qr x8505aautoi0\li600\lin600 i0 in0\sb60\sa60+{\s247\sbasedon0\snext247 tlchf11fs20lang1025 \ltrch\lang2057\langfe2057\loch\sl-240\slmult0\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa160\supers20\lang2057\dbch\langfe2057 1;} +{\s248\sbasedon0\snext248 tlchf14fs16lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s249\sbasedon0\snext249 tlchf14fs16lang1025 \ltrch\lang1033\langfe1033\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 in0\sb120\sa120+{\s250\sbasedon0\snext250\loch\sb0\sa0 Frame Contents;} +{\s251\sbasedon0\snext251\loch\sb0\sa0 Frame Contents (user);} +}{\*\generator Collabora_OfficeDev/25.04.3.1$Linux_X86_64 LibreOffice_project/22365598a3ebd4eef1c367fbff5b3cdf37980a2f}{\info{+\hyphauto1 iewscale80ormshade obrkwrptbl\paperh11906\paperw16838\margl1276\margr1276\margt1300\margb1300\sectd\sbknone\sftnnar\saftnnrlc\sectunlocked1\pgwsxn16838\pghsxn11906\marglsxn1276\margrsxn1276\margtsxn1300\margbsxn1300 tnbjtnstart1tnrstconttnnaretftnrstcontftnstart1ftnnrlc +{\*tnsep+xxxxxxxx}{\loch +{\*kmkstart _Toc95073555}{\*kmkstart _Toc109213984}x{\*kmkend _Toc95073555}{\*kmkend _Toc109213984}} +\par rowd rql rleft186\ltrrow rrh276 rpaddft3 rpaddt0 rpaddfl3 rpaddl0 rpaddfb3 rpaddb0 rpaddfr3 rpaddr0+xxxxxxxxx (xxxxxxxx xx xxxx xxxx 2 xxxxx)} +\par \pard\plain \s0 tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar\hyphpar0 aauto\sb0\sa200\ltrpar+xxxx xx xxxxx xx xxxxx xx xxxx xxx xxxxxxxx xx xxxxxxxxxx. xxxxxx xxxxx/xxxxxxx xx xxxxxxxxx.}+xxxxxxxx xxxx:}++xxxxxxxx}+xxxx 1}+xxxx 2}+xxxx 3}+xxxx 4}+xxxx 5}+xxxx 6}+++x 1}+x 2}+x 3}+x 4}+x 1}+x 2}+ }{ tlchfs16b \ltrch\lochs16\loch +x 3}+ }{ tlchfs16b \ltrch\lochs16\loch +x 4}+x 1}+x 2}+x 3}+x 4}+x 1}+x 2}+x 3}+x 4}+x 1}+x 2}+x 3}+x 4}+x 1}+x 2}+x 3}+x 4}++xxxx 1.1 - \u8230\'85 }++++++++++++++++++++++++++#\u167\'a7xxx-xxx-xx\u167\'a7# } +\par } \ No newline at end of file diff --git a/sw/qa/extras/rtfexport/rtfexport8.cxx b/sw/qa/extras/rtfexport/rtfexport8.cxx index ff05ce5c4fcd..df1f3454e7be 100644 --- a/sw/qa/extras/rtfexport/rtfexport8.cxx +++ b/sw/qa/extras/rtfexport/rtfexport8.cxx @@ -176,6 +176,45 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf158586_lostFrame) verify(); } +CPPUNIT_TEST_FIXTURE(Test, testTdf166953) +{ + auto verify = [this]() { + xmlDocUniquePtr pLayout = parseLayoutDump(); + assertXPath(pLayout, "/root/page[1]/body/tab/row[1]/infos/bounds", "width", u"14149"); + // the problem was that this width was 544 + assertXPath(pLayout, "/root/page[1]/body/tab/row[1]/cell[1]/infos/bounds", "width", + u"14146"); + // there is another cell in this row that was added by writerfilter + assertXPath(pLayout, "/root/page[1]/body/tab/row[2]/infos/bounds", "width", u"14149"); + // the problem was that this width was 544 + assertXPath(pLayout, "/root/page[1]/body/tab/row[2]/cell[1]/infos/bounds", "width", + u"2408"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[2]/cell[2]/infos/bounds", "width", + u"11738"); + // there is another cell in this row that was added by writerfilter + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/infos/bounds", "width", u"14149"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/cell[1]/infos/bounds", "width", + u"3309"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/cell[2]/infos/bounds", "width", + u"1759"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/cell[3]/infos/bounds", "width", + u"1729"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/cell[4]/infos/bounds", "width", + u"1831"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/cell[5]/infos/bounds", "width", + u"1863"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/cell[6]/infos/bounds", "width", + u"1865"); + assertXPath(pLayout, "/root/page[1]/body/tab/row[3]/cell[7]/infos/bounds", "width", + u"1791"); + // there is another cell in this row that was already in the RTF + }; + createSwDoc("Tpl-2min3_s1.rtf"); + verify(); + saveAndReload(mpFilter); + verify(); +} + CPPUNIT_TEST_FIXTURE(Test, testEndnotesAtSectEndRTF) { // Given a document, endnotes at collected at section end: diff --git a/sw/source/writerfilter/dmapper/TableManager.cxx b/sw/source/writerfilter/dmapper/TableManager.cxx index 2baace56973b..54aa10765f59 100644 --- a/sw/source/writerfilter/dmapper/TableManager.cxx +++ b/sw/source/writerfilter/dmapper/TableManager.cxx @@ -25,6 +25,7 @@ #include "util.hxx" #include <comphelper/sequence.hxx> #include <comphelper/diagnose_ex.hxx> +#include <com/sun/star/text/TableColumnSeparator.hpp> using namespace com::sun::star; @@ -428,6 +429,29 @@ void TableManager::HandleSmallerRows() pRowData->addCell(xNewCellTextCursor, pCellPropMap); pRowData->endCell(xNewCellTextCursor); pRowData->getProperties()->setValue(TablePropertyMap::TABLE_WIDTH, nMaxRowWidth); + // tdf#166953 the TableColumnSeparators property needs another + // separator for the extra cell added to it + auto const oSep{ pRowData->getProperties()->getProperty( + PROP_TABLE_COLUMN_SEPARATORS) }; + if (oSep) + { + auto const oldSeps{ + oSep->second.get<uno::Sequence<text::TableColumnSeparator>>() + }; + ::std::remove_const_t<decltype(oldSeps)> newSeps{ oldSeps.getLength() + 1 }; + auto const it{ ::std::transform( + oldSeps.begin(), oldSeps.end(), newSeps.getArray(), [&](auto const sep) { + double const pos{ sep.Position * double(nRowWidth) / nMaxRowWidth }; + return text::TableColumnSeparator{ + static_cast<sal_Int16>(::rtl::math::round(pos)), sep.IsVisible + }; + }) }; + // TODO replace magic number + it->Position = ::rtl::math::round(10000 * double(nRowWidth) / nMaxRowWidth); + it->IsVisible = true; + pRowData->getProperties()->Insert(PROP_TABLE_COLUMN_SEPARATORS, + uno::Any(newSeps)); + } } } }
