File bnc1021675.patch of Package libreoffice.7249

From f83afe4925099d0918eeb6c5ceeac3b970571237 Mon Sep 17 00:00:00 2001
From: Tamás Zolnai <tamas.zolnai@collabora.com>
Date: Wed, 12 Jul 2017 16:07:10 +0200
Subject: [PATCH] tdf#109053: DOCX: Multipage table is not imported properly

An other use case when converting to a "floating table" is
not a good idea. In this case we can check whether next to
the table anything fits in the text area. If not then we
can avoid floating table conversion.

Reviewed-on: https://gerrit.libreoffice.org/39811
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
(cherry picked from commit fc55711f01af172eb3a034454405fa941454c781)

Change-Id: I798a2f4c7a9dfe6aecbe4a73e3162b49ea5f0adc
---

diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index ec79cb1..29fa2ab 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -1094,16 +1094,27 @@
         }
     }

-    // If the table is wider than the text area, then don't create a fly
-    // for the table: no wrapping will be performed anyway, but multi-page
-    // tables will be broken.
-    if (nTableWidth < nTextAreaWidth)
+    // It seems Word has a limit here, so that in case the table width is quite
+    // close to the text area width, then it won't perform a wrapping, even in
+    // case the content (e.g. an empty paragraph) would fit. The magic constant
+    // here represents this limit.
+    const sal_Int32 nMagicNumber = 469;
+
+    // If the table's with is smaller than the text area width, text might
+    // be next to the table and so it should behave as a floating table.
+    if ( nTableWidth < nTextAreaWidth )
         return true;

-    // If the position is relative to the edge of the page, then we always
-    // create the fly.
-    if (rInfo.getPropertyValue("HoriOrientRelation") == text::RelOrientation::PAGE_FRAME)
-        return true;
+    // If the position is relative to the edge of the page, then we need to check the whole
+    // page width to see whether text can fit next to the table.
+    if ( rInfo.getPropertyValue( "HoriOrientRelation" ) == text::RelOrientation::PAGE_FRAME )
+    {
+        // If the table is wide enough to that no text fits next to it, then don't create a fly
+        // for the table: no wrapping will be performed anyway, but multi-page
+        // tables will be broken.
+        if ((nTableWidth + nMagicNumber) < (nPageWidth - std::min(GetLeftMargin(), GetRightMargin())))
+            return true;
+    }

     // If there are columns, always create the fly, otherwise the columns would
     // restrict geometry of the table.
openSUSE Build Service is sponsored by