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{0romanprq2charset0 Times New Roman;}{1romanprq2charset2 
Symbol;}{2swissprq2charset0 Arial;}{3romanprq2charset0 Liberation 
Serif{\*alt Times New Roman};}{4romanprq2charset0 Arial;}{5romanprq2
charset0 Calibri Light;}{6romanprq2charset0 Times New Roman;}{7romanprq2
charset0 Liberation Sans{\*alt Arial};}{8romanprq2charset0 Courier New;}{
9romanprq2charset0 Tahoma;}{10romanprq2charset0 Calibri;}{11nilprq2
charset0 Times New Roman;}{12nilprq2charset0 Courier New;}{13nilprq2
charset0 DejaVu Sans;}{14nilprq2charset0 Arial;}{15nilprq2charset0 
FreeSans;}{16nilprq2charset0 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\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s2\sbasedon1\snext0 tlchf14fs22lang1025 
\ltrch\lang2057\langfe1040\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb240\sa240+{\s3\sbasedon2\snext0\sautoupd tlchf14fs22lang1025 
\ltrch\lang2057\langfe1040\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s4\sbasedon3\snext0\sautoupd tlchf14fs22lang1025 
\ltrch\lang2057\langfe1040\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s9\sbasedon0\snext0 tlchf11fs21lang1025i 
\ltrch\lang2057\langfe1033\hichf5\loch\ql\keep\widctlparaautoi0\li0\lin0 i0 
in0\sb40\sa0\keepn+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\
 
*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\*+{\s172\sbasedon0\snext173
 tlchf15fs28 \ltrch\hichf7\loch\sb240\sa120\keepn7s28\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\sa120s24\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      
x9355aautoi0\li0\lin0 i0 in0\sb0\sa200+{\s180\sbasedon177\snext180 
tlchf11fs20lang1025 \ltrch\lang2057\langfe2057\loch\ql\widctlparaauto
i0\li0\lin0 i0 in0rdrtrdrnonerdrlrdrnonerdrbrdrnonerdrrrdrnone
s20\lang2057\dbch\langfe2057 Table Grid;}
+{\s181\sbasedon0\snext181 tlchf11fs20lang1025 
\ltrch\lang2057\langfe1033\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s182\snext182 tlchf11fs20lang1025 
\ltrch\lang2057\langfe1033\hichf8\loch\qj
owidctlpar      x-720\hyphpar0aauto\ltrpar+{\s183\sbasedon0\snext183 
tlchf11fs24lang1025 \ltrch\lang1033\langfe1033\loch\qj\widctlparaauto
i0\li-360\lin-360 i0 in0\sb0\sa200+{\s184\sbasedon0\snext184 
tlchf16fs20lang1025 \ltrch\lang2057\langfe1033\hichf9\loch\ql\widctlpar
aautoi0\li0\lin0 i0 in0\sb0\sa200+{\s185\sbasedon0\snext185 
tlchf11fs20lang1025 \ltrch\lang1033\langfe1036\hichf4\loch\qj
owidctlparaautoi0\li0\lin0 i85 in85\sb0\sa200+{\s186\sbasedon0\snext186 
tlchf11fs20lang1025 \ltrch\lang1033\langfe1036\hichf4\loch\qj
owidctlparaautoi0\li0\lin0 i85 in85\sb0\sa200+{\s187\sbasedon0\snext187 
tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar   
qc      x4536   qr      x9072aautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s188\sbasedon0\snext188 tlchf16fs16lang1025 
\ltrch\lang2057\langfe1033\hichf9\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s189\sbasedon0\snext189 tlchf11fs20lang1025 
\ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s190\sbasedon189\snext189 tlchf11fs20lang1025b 
\ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s191\sbasedon0\snext191 tlchf11fs20lang1025 
\ltrch\lang2057\langfe1033\loch\qj\widctlpar   x283aautoi-283\li283\lin283 i0 
in0\sb0\sa240+{\s192\sbasedon0\snext192 tlchf14fs32lang1025b 
\ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sbauto1\saauto1+{\s193\sbasedon0\snext193 tlchf14fs32lang1025b 
\ltrch\lang2057\langfe2057\hichf4\loch\ql\
 widctlparaautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s194\sbasedon0\snext194 
tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qr\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrnone+{\s195\sbasedon0\snext195
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qr\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrnone+{\s196\sbasedon0\snext196
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s197\sbasedon0\snext197 
tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s198\sbasedon0\snext198 
tlchf14fs24lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s199\sbasedon0\sn
 ext199 tlchf14fs24lang1025b 
\ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrnonerdrrrdrnone+{\s200\sbasedon0\snext200
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s201\sbasedon0\snext201 
tlchf14fs28lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s202\sbasedon0\snext202
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s203\sbasedon0\snext203
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\l
 in0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s204\sbasedon0\snext204
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s205\sbasedon0\snext205
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s206\sbasedon0\snext206
 tlchf14fs28lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrnonerdrlrdrsrdrw30rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s207\sbasedon0\snext207
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
 aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s208\sbasedon0\snext208
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s209\sbasedon0\snext209
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s210\sbasedon0\snext210
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s211\sbasedon0\snext211
 tlchf14fs18lang1025b \ltrc
 h\lang2057\langfe2057\hichf4\loch\qc\widctlparaautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s212\sbasedon0\snext212
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1oxrdrsrdrw10rdrcf1rsp0+{\s213\sbasedon0\snext213 
tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1oxrdrsrdrw10rdrcf1rsp0+{\s214\sbasedon0\snext214 
tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s215\sbasedon0\snext215
 tlchf14fs28lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrnonerdrlrdrsrdrw30rdrcf1rsp0
 
rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s216\sbasedon0\snext216
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s217\sbasedon0\snext217
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s218\sbasedon0\snext218
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s219\sbasedon0\snext219
 tlchf14fs18lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsr
 
drw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s220\sbasedon0\snext220
 tlchf14fs48lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s221\sbasedon0\snext221 
tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1+{\s222\sbasedon0\snext222 
tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrnonerdrrrdrnone+{\s223\sbasedon0\snext223
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrnonerdrrrdrnone+{\s224\sbasedon0\snext224
 tlchf14fs24lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
aautoi0\li0\lin0 i0 in0\sbauto1\saauto1rdrtrdrsrdrw2
 
0rdrcf1rsp0rdrlrdrnonerdrbrdrnonerdrrrdrsrdrw20rdrcf1rsp0+{\s225\sbasedon0\snext225
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s226\sbasedon0\snext226
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s227\sbasedon0\snext227
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw30rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw10rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s228\sbasedon0\snext228
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 in0\sbauto1\
 
saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s229\sbasedon0\snext229
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw10rdrcf1rsp0+{\s230\sbasedon0\snext230
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw10rdrcf1rsp0rdrlrdrsrdrw10rdrcf1rsp0rdrbrdrsrdrw30rdrcf1rsp0rdrrrdrsrdrw30rdrcf1rsp0+{\s231\sbasedon0\snext231
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s232\sbasedon0\snext232
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctl
 paracenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s233\sbasedon0\snext233
 tlchf14fs32lang1025b \ltrch\lang2057\langfe2057\hichf4\loch\ql\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrsrdrw20rdrcf1rsp0rdrrrdrsrdrw20rdrcf1rsp0+{\s234\sbasedon0\snext234
 tlchf14fs32lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrsrdrw20rdrcf1rsp0rdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s235\sbasedon0\snext235
 tlchf14fs32lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
acenteri0\li0\lin0 i0 
in0\sbauto1\saauto1rdrtrdrsrdrw20rdrcf1rsp0rdrlrdrnonerdrbrdrsrdrw20rdrcf1rsp0rdrrrdrnone+{\s236\sbasedon0\snext236
 tlchf14fs32lang1025 \ltrch\lang2057\langfe2057\hichf4\loch\qc\widctlpar
acenteri0\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  x2160aautoi0\li1440\lin1440 i0 
in0\sb0\sa240+{\s240\sbasedon0\snext240 tlchf11fs23lang1025 
\ltrch\lang2057\langfe2052\loch\sl-274\slmult0\qj
owidctlparaautoi-380\li0\lin0 i0 in0\sb780\sa180+{\s241\sbasedon0\snext241 
tlchf11fs23lang1025b \ltrch\lang2057\langfe2052\loch\sl240\slmult0\ql
owidctlparaautoi0\li0\lin0 i0 in0\sb0\sa200+{\s242\sbasedon177\snext180 
tlchf11fs22lang1025 \ltrch\lang1033\langfe1033\hichf10\loch\ql
owidctlparaautoi0\li0\lin0 i0 
in0rdrtrdrnonerdrlrdrnonerdrbrdrnonerdrrrdrnone10
s22\lang1033\dbch\langfe1033 Table Grid1;}
+{\s243\sbasedon0\snext0\sautoupd tlchf11fs24lang1025 
\ltrch\lang1033\langfe1033\hichf4\loch\ql\widctlpar   ldot    qr      x8505
aautoi0\li0\lin0 i509 in509\sb60\sa60+{\s244\sbasedon0\snext0\sautoupd 
tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar     
  ldot    qr      x8505aautoi0\li140\lin140 i0 
in0\sb60\sa60+{\s245\sbasedon0\snext0\sautoupd tlchf11fs24lang1025 
\ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar       ldot    qr      
x8505aautoi0\li300\lin300 i0 in0\sb60\sa60+{\s246\sbasedon0\snext0\sautoupd 
tlchf11fs24lang1025 \ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlpar     
  ldot    qr      x8505aautoi0\li600\lin600 i0 
in0\sb60\sa60+{\s247\sbasedon0\snext247 tlchf11fs20lang1025 
\ltrch\lang2057\langfe2057\loch\sl-240\slmult0\ql\widctlparaautoi0\li0\lin0 
i0 in0\sb0\sa160\supers20\lang2057\dbch\langfe2057 1;}
+{\s248\sbasedon0\snext248 tlchf14fs16lang1025 
\ltrch\lang2057\langfe1033\hichf4\loch\ql\widctlparaautoi0\li0\lin0 i0 
in0\sb0\sa200+{\s249\sbasedon0\snext249 tlchf14fs16lang1025 
\ltrch\lang1033\langfe1033\hichf4\loch\ql\widctlparaautoi0\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
iewscale80ormshade
obrkwrptbl\paperh11906\paperw16838\margl1276\margr1276\margt1300\margb1300\sectd\sbknone\sftnnar\saftnnrlc\sectunlocked1\pgwsxn16838\pghsxn11906\marglsxn1276\margrsxn1276\margtsxn1300\margbsxn1300
tnbjtnstart1tnrstconttnnaretftnrstcontftnstart1ftnnrlc
+{\*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\lochs16\loch
+x 3}+ }{ tlchfs16b \ltrch\lochs16\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));
+                }
             }
         }
     }

Reply via email to