[Libreoffice-commits] core.git: sw/inc sw/qa sw/source

Justin Luth justin_luth at sil.org
Fri Sep 2 12:37:08 UTC 2016


 sw/inc/IDocumentSettingAccess.hxx                       |    1 +
 sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc |binary
 sw/qa/extras/ww8export/ww8export.cxx                    |    6 ++++++
 sw/source/core/doc/DocumentSettingManager.cxx           |    5 +++++
 sw/source/core/inc/DocumentSettingManager.hxx           |    3 ++-
 sw/source/core/layout/frmtool.cxx                       |   10 +++++++++-
 sw/source/filter/ww8/wrtw8esh.cxx                       |   16 ++++++++++++----
 sw/source/filter/ww8/ww8par.cxx                         |    1 +
 sw/source/uibase/uno/SwXDocumentSettings.cxx            |   13 +++++++++++++
 9 files changed, 49 insertions(+), 6 deletions(-)

New commits:
commit 52b29c60801cf75364fd8275a22e812797cb184d
Author: Justin Luth <justin_luth at sil.org>
Date:   Thu Sep 1 11:19:56 2016 +0300

    tdf#76349 SpacingWithoutBorders: enable .doc RT
    
    Microsoft allows spacing in textboxes even if the borders are not
    shown, but LO does not.  Added a compatible setting, used an existing
    setting to allow the spacing, and changed .doc export not to zero
    out the spacing if the border was zero-width.
    
    Using the compatible setting in the export code is almost redundant,
    but it does require that the document was LOADED as .doc, and not
    "save as" from another format.
    
    This patch simply allows round-tripping - any user attempt to modify the
    border settings will enforce normal LO border rules.
    
    Change-Id: I60ac036e1bfac381eea15e33c21495ad3800277a
    Reviewed-on: https://gerrit.libreoffice.org/28601
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Justin Luth <justin_luth at sil.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index f16ae42..b158f44 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -39,6 +39,7 @@ enum class DocumentSettingId
     ADD_FLY_OFFSETS,
     ADD_VERTICAL_FLY_OFFSETS,
 
+    ALLOW_SPACING_WITHOUT_BORDERS,
     OLD_NUMBERING,
 
     ADD_EXT_LEADING,
diff --git a/sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc b/sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc
new file mode 100755
index 0000000..95bc598
Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc differ
diff --git a/sw/qa/extras/ww8export/ww8export.cxx b/sw/qa/extras/ww8export/ww8export.cxx
index f8fc27a..7d3cf22 100644
--- a/sw/qa/extras/ww8export/ww8export.cxx
+++ b/sw/qa/extras/ww8export/ww8export.cxx
@@ -734,6 +734,12 @@ DECLARE_WW8EXPORT_TEST(testTdf91083_tableKeep, "tdf91083_tableKeep.doc")
     CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xTable, "Split"));
 }
 
+DECLARE_WW8EXPORT_TEST(testTdf76349_textboxMargins, "tdf76349_textboxMargins.doc")
+{
+    // textboxes without borders were losing their spacing items in round-tripping
+    CPPUNIT_ASSERT( 0 < parseDump("/root/page/body/txt/anchored/fly/infos/prtBounds", "left").toInt32() );
+}
+
 DECLARE_WW8EXPORT_TEST(testMoveRange, "fdo66304-1.odt")
 {
     //the save must survive without asserting
diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx
index 5cf29c0..0055c7d 100644
--- a/sw/source/core/doc/DocumentSettingManager.cxx
+++ b/sw/source/core/doc/DocumentSettingManager.cxx
@@ -55,6 +55,7 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc)
 
     mbAddFlyOffsets(false),
     mbAddVerticalFlyOffsets(false),
+    mbAllowSpacingWithoutBorders( false ),
     mbUseHiResolutionVirtualDevice(true),
     mbMathBaselineAlignment(false), // default for *old* documents is 'off'
     mbStylesNoDefault(false),
@@ -146,6 +147,7 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const
         case DocumentSettingId::TAB_COMPAT: return mbTabCompat; //(n8Dummy1 & DUMMY_TAB_COMPAT);
         case DocumentSettingId::ADD_FLY_OFFSETS: return mbAddFlyOffsets; //(n8Dummy2 & DUMMY_ADD_FLY_OFFSETS);
         case DocumentSettingId::ADD_VERTICAL_FLY_OFFSETS: return mbAddVerticalFlyOffsets;
+        case DocumentSettingId::ALLOW_SPACING_WITHOUT_BORDERS: return mbAllowSpacingWithoutBorders;
         case DocumentSettingId::ADD_EXT_LEADING: return mbAddExternalLeading; //(n8Dummy2 & DUMMY_ADD_EXTERNAL_LEADING);
         case DocumentSettingId::USE_VIRTUAL_DEVICE: return mbUseVirtualDevice; //(n8Dummy1 & DUMMY_USE_VIRTUAL_DEVICE);
         case DocumentSettingId::USE_HIRES_VIRTUAL_DEVICE: return mbUseHiResolutionVirtualDevice; //(n8Dummy2 & DUMMY_USE_HIRES_VIR_DEV);
@@ -221,6 +223,9 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo
         case DocumentSettingId::ADD_VERTICAL_FLY_OFFSETS:
             mbAddVerticalFlyOffsets = value;
             break;
+        case DocumentSettingId::ALLOW_SPACING_WITHOUT_BORDERS:
+            mbAllowSpacingWithoutBorders = value;
+            break;
         case DocumentSettingId::ADD_EXT_LEADING:
             mbAddExternalLeading = value;
             break;
diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx
index b971cc5..4159f5a 100644
--- a/sw/source/core/inc/DocumentSettingManager.hxx
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -109,6 +109,7 @@ class DocumentSettingManager :
     bool mbUseVirtualDevice                 : 1;
     bool mbAddFlyOffsets                    : 1;
     bool mbAddVerticalFlyOffsets            : 1;
+    bool mbAllowSpacingWithoutBorders       : 1;    // tdf#41542
     bool mbAddExternalLeading               : 1;
     bool mbUseHiResolutionVirtualDevice     : 1;
     bool mbOldLineSpacing                   : 1;    // #i11859#
@@ -147,7 +148,7 @@ class DocumentSettingManager :
     bool mbClippedPictures;
     bool mbBackgroundParaOverDrawings;
     bool mbTabOverMargin;
-    bool mbTreatSingleColumnBreakAsPageBreak;
+    bool mbTreatSingleColumnBreakAsPageBreak;              // tdf#76349
     bool mbSurroundTextWrapSmall;
     bool mbPropLineSpacingShrinksFirstLine; // fdo#79602
     bool mbSubtractFlys; // tdf#86578
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index b69d987..1e98d75 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -1834,7 +1834,15 @@ SwBorderAttrs::SwBorderAttrs(const SwModify *pMod, const SwFrame *pConstructor)
     m_bCachedJoinedWithPrev = false;
     m_bCachedJoinedWithNext = false;
 
-    m_bBorderDist = bool(pConstructor->GetType() & SwFrameType::Cell);
+    bool bAllowSpacingWithoutBorders = false;
+    if( (pConstructor->GetType() & SwFrameType::Fly)
+        && pConstructor->IsLayoutFrame()
+        && pConstructor->GetLower() && pConstructor->GetLower()->IsTextFrame() )
+    {
+        const SwFrameFormat* pFormat = static_cast<const SwLayoutFrame*>(pConstructor)->GetFormat();
+        bAllowSpacingWithoutBorders = pFormat->getIDocumentSettingAccess().get(DocumentSettingId::ALLOW_SPACING_WITHOUT_BORDERS);
+    }
+    m_bBorderDist = bool(pConstructor->GetType() & SwFrameType::Cell) || bAllowSpacingWithoutBorders;
 }
 
 SwBorderAttrs::~SwBorderAttrs()
diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx
index 2df3fe2..0aa62eb 100644
--- a/sw/source/filter/ww8/wrtw8esh.cxx
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -1967,6 +1967,7 @@ sal_Int32 SwBasicEscherEx::WriteFlyFrameAttr(const SwFrameFormat& rFormat,
     sal_Int32 nLineWidth=0;
     const SfxPoolItem* pItem;
     bool bFirstLine = true;
+    const bool bAllowSpacingWithoutBorders = rFormat.getIDocumentSettingAccess().get(DocumentSettingId::ALLOW_SPACING_WITHOUT_BORDERS);
     if (SfxItemState::SET == rFormat.GetItemState(RES_BOX, true, &pItem))
     {
         static const o3tl::enumarray<SvxBoxItemLine, sal_uInt16> aExhperProp =
@@ -2034,6 +2035,10 @@ sal_Int32 SwBasicEscherEx::WriteFlyFrameAttr(const SwFrameFormat& rFormat,
                 rPropOpt.AddOpt( aExhperProp[ n ], DrawModelToEmu(
                     static_cast<const SvxBoxItem*>(pItem)->GetDistance( n ) ));
             }
+            else if( bAllowSpacingWithoutBorders )
+            {
+                rPropOpt.AddOpt( aExhperProp[ n ], DrawModelToEmu(static_cast<const SvxBoxItem*>(pItem)->GetDistance( n )) );
+            }
             else
                 // MM If there is no line the distance should be set to 0
                 rPropOpt.AddOpt( aExhperProp[ n ], DrawModelToEmu(0));
@@ -2041,10 +2046,13 @@ sal_Int32 SwBasicEscherEx::WriteFlyFrameAttr(const SwFrameFormat& rFormat,
     if( bFirstLine )                // no valid line found
     {
         rPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
-        rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, 0 );
-        rPropOpt.AddOpt( ESCHER_Prop_dyTextBottom, 0 );
-        rPropOpt.AddOpt( ESCHER_Prop_dxTextLeft, 0 );
-        rPropOpt.AddOpt( ESCHER_Prop_dxTextRight, 0 );
+        if( !bAllowSpacingWithoutBorders )
+        {
+            rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, 0 );
+            rPropOpt.AddOpt( ESCHER_Prop_dyTextBottom, 0 );
+            rPropOpt.AddOpt( ESCHER_Prop_dxTextLeft, 0 );
+            rPropOpt.AddOpt( ESCHER_Prop_dxTextRight, 0 );
+        }
     }
     const SwAttrSet& rAttrSet = rFormat.GetAttrSet();
     if (SfxItemState::SET == rAttrSet.GetItemState(RES_BOX, false, &pItem))
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index 0c95f22..f1b7c73 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -1959,6 +1959,7 @@ void SwWW8ImplReader::ImportDop()
     m_rDoc.getIDocumentSettingAccess().set(DocumentSettingId::TAB_OVER_MARGIN, true);
     m_rDoc.getIDocumentSettingAccess().set(DocumentSettingId::SURROUND_TEXT_WRAP_SMALL, true);
     m_rDoc.getIDocumentSettingAccess().set(DocumentSettingId::PROP_LINE_SPACING_SHRINKS_FIRST_LINE, true);
+    m_rDoc.getIDocumentSettingAccess().set(DocumentSettingId::ALLOW_SPACING_WITHOUT_BORDERS, true);
 
     // COMPATIBILITY FLAGS END
 
diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx
index 9918c94..46ec397 100644
--- a/sw/source/uibase/uno/SwXDocumentSettings.cxx
+++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx
@@ -90,6 +90,7 @@ enum SwDocumentSettingsPropertyHandles
     HANDLE_IS_LABEL_DOC,
     HANDLE_IS_ADD_FLY_OFFSET,
     HANDLE_IS_ADD_VERTICAL_FLY_OFFSET,
+    HANDLE_ALLOW_SPACING_WITHOUT_BORDERS,
     HANDLE_IS_ADD_EXTERNAL_LEADING,
     HANDLE_OLD_NUMBERING,
     HANDLE_OUTLINELEVEL_YIELDS_NUMBERING,
@@ -166,6 +167,7 @@ static MasterPropertySetInfo * lcl_createSettingsInfo()
         { OUString("IsLabelDocument"),            HANDLE_IS_LABEL_DOC,                    cppu::UnoType<bool>::get(),           0},
         { OUString("AddFrameOffsets"),            HANDLE_IS_ADD_FLY_OFFSET,               cppu::UnoType<bool>::get(),           0},
         { OUString("AddVerticalFrameOffsets"),    HANDLE_IS_ADD_VERTICAL_FLY_OFFSET,      cppu::UnoType<bool>::get(),           0},
+        { OUString("AllowSpacingWithoutBorders"), HANDLE_ALLOW_SPACING_WITHOUT_BORDERS,   cppu::UnoType<bool>::get(),           0},
         { OUString("AddExternalLeading"),         HANDLE_IS_ADD_EXTERNAL_LEADING,         cppu::UnoType<bool>::get(),           0},
         { OUString("UseOldNumbering"),            HANDLE_OLD_NUMBERING,                   cppu::UnoType<bool>::get(),           0},
         { OUString("OutlineLevelYieldsNumbering"), HANDLE_OUTLINELEVEL_YIELDS_NUMBERING, cppu::UnoType<bool>::get(),           0},
@@ -567,6 +569,12 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
             mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::ADD_VERTICAL_FLY_OFFSETS, bTmp);
         }
         break;
+        case HANDLE_ALLOW_SPACING_WITHOUT_BORDERS:
+        {
+            bool bTmp = *o3tl::doAccess<bool>(rValue);
+            mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::ALLOW_SPACING_WITHOUT_BORDERS, bTmp);
+        }
+        break;
         case HANDLE_IS_ADD_EXTERNAL_LEADING:
         {
             bool bTmp = *o3tl::doAccess<bool>(rValue);
@@ -1055,6 +1063,11 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
             rValue <<= mpDoc->getIDocumentSettingAccess().get(DocumentSettingId::ADD_VERTICAL_FLY_OFFSETS);
         }
         break;
+        case HANDLE_ALLOW_SPACING_WITHOUT_BORDERS:
+        {
+            rValue <<= mpDoc->getIDocumentSettingAccess().get(DocumentSettingId::ALLOW_SPACING_WITHOUT_BORDERS);
+        }
+        break;
         case HANDLE_IS_ADD_EXTERNAL_LEADING:
         {
             rValue <<= mpDoc->getIDocumentSettingAccess().get(DocumentSettingId::ADD_EXT_LEADING);


More information about the Libreoffice-commits mailing list