[Libreoffice-commits] .: sw/inc sw/source writerfilter/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Aug 23 03:56:58 PDT 2012


 sw/inc/IDocumentSettingAccess.hxx           |    3 +-
 sw/inc/doc.hxx                              |    1 
 sw/source/core/doc/doc.cxx                  |    4 ++
 sw/source/core/doc/docnew.cxx               |    1 
 sw/source/core/layout/frmtool.cxx           |   39 +++++++++++++++++++++++++++-
 sw/source/ui/uno/SwXDocumentSettings.cxx    |   16 ++++++++++-
 writerfilter/source/filter/ImportFilter.cxx |    2 +
 7 files changed, 63 insertions(+), 3 deletions(-)

New commits:
commit 50a1df360c907d8419ce49f098b6bc87a37a9956
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Thu Aug 23 12:11:08 2012 +0200

    n#775899 sw: add FloattableNomargins compat flag
    
    The DOCX filter imports floating tables as frames containing a table.
    Word ignores the margins of paragraphs next to such a table, Writer does
    not. Add a compatibility flag the import filter can set that triggers
    this weird behaviour.
    
    Change-Id: Iaaa1d2a2e2f9d0eaea17832b2e418f9a845efffd

diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index dd907f2..8263ca6 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -94,7 +94,8 @@ namespace com { namespace sun { namespace star { namespace i18n { struct Forbidd
          PURGE_OLE,
          KERN_ASIAN_PUNCTUATION,
          MATH_BASELINE_ALIGNMENT,
-         STYLES_NODEFAULT
+         STYLES_NODEFAULT,
+         FLOATTABLE_NOMARGINS
      };
 
  public:
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index c18635e..2702d1c 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -567,6 +567,7 @@ private:
                                                     // attribute 'WrapInfluenceOnObjPos'.
     bool mbMathBaselineAlignment            : 1;    // TL  2010-10-29 #i972#
     bool mbStylesNoDefault                  : 1;
+    bool mbFloattableNomargins              : 1; ///< If paragraph margins next to a floating table should be ignored.
 
     // non-ui-compatibility flags:
     bool mbOldNumbering                             : 1;
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 834bc96..45749b4 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -210,6 +210,7 @@ bool SwDoc::get(/*[in]*/ DocumentSettingId id) const
         case DO_NOT_RESET_PARA_ATTRS_FOR_NUM_FONT: return mbDoNotResetParaAttrsForNumFont;
         case MATH_BASELINE_ALIGNMENT: return mbMathBaselineAlignment;
         case STYLES_NODEFAULT: return mbStylesNoDefault;
+        case FLOATTABLE_NOMARGINS: return mbFloattableNomargins;
         default:
             OSL_FAIL("Invalid setting id");
     }
@@ -381,6 +382,9 @@ void SwDoc::set(/*[in]*/ DocumentSettingId id, /*[in]*/ bool value)
         case STYLES_NODEFAULT:
             mbStylesNoDefault  = value;
             break;
+        case FLOATTABLE_NOMARGINS:
+            mbFloattableNomargins = value;
+            break;
         default:
             OSL_FAIL("Invalid setting id");
     }
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index 878223c..1a89837 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -356,6 +356,7 @@ SwDoc::SwDoc()
     mbSmallCapsPercentage66                 = false;        // hidden
     mbTabOverflow                           = true;
     mbUnbreakableNumberings                 = false;
+    mbFloattableNomargins                   = false;
 
     //
     // COMPATIBILITY FLAGS END
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index 4d2e231..1f190aa 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -1928,6 +1928,26 @@ long SwBorderAttrs::CalcRight( const SwFrm* pCaller ) const
     return nRight;
 }
 
+/// Tries to detect if this paragraph has a floating table attached.
+bool lcl_hasTabFrm(const SwTxtFrm* pTxtFrm)
+{
+    if (pTxtFrm->GetDrawObjs())
+    {
+        const SwSortedObjs* pSortedObjs = pTxtFrm->GetDrawObjs();
+        if (pSortedObjs->Count() > 0)
+        {
+            SwAnchoredObject* pObject = (*pSortedObjs)[0];
+            if (pObject->IsA(TYPE(SwFlyFrm)))
+            {
+                SwFlyFrm* pFly = (SwFlyFrm*)pObject;
+                if (pFly->Lower()->IsTabFrm())
+                    return true;
+            }
+        }
+    }
+    return false;
+}
+
 long SwBorderAttrs::CalcLeft( const SwFrm *pCaller ) const
 {
     long nLeft=0;
@@ -1945,7 +1965,24 @@ long SwBorderAttrs::CalcLeft( const SwFrm *pCaller ) const
     if ( pCaller->IsTxtFrm() && pCaller->IsRightToLeft() )
         nLeft += rLR.GetRight();
     else
-        nLeft += rLR.GetLeft();
+    {
+        bool bIgnoreMargin = false;
+        if (pCaller->IsTxtFrm())
+        {
+            const SwTxtFrm* pTxtFrm = (const SwTxtFrm*)pCaller;
+            if (pTxtFrm->GetTxtNode()->GetDoc()->get(IDocumentSettingAccess::FLOATTABLE_NOMARGINS))
+            {
+                // If this is explicitly requested, ignore the margins next to the floating table.
+                if (lcl_hasTabFrm(pTxtFrm))
+                    bIgnoreMargin = true;
+                // TODO here we only handle the first two paragraphs, would be nice to generalize this.
+                else if (pTxtFrm->FindPrev() && pTxtFrm->FindPrev()->IsTxtFrm() && lcl_hasTabFrm((const SwTxtFrm*)pTxtFrm->FindPrev()))
+                    bIgnoreMargin = true;
+            }
+        }
+        if (!bIgnoreMargin)
+            nLeft += rLR.GetLeft();
+    }
 
 
     // correction: do not retrieve left margin for numbering in R2L-layout
diff --git a/sw/source/ui/uno/SwXDocumentSettings.cxx b/sw/source/ui/uno/SwXDocumentSettings.cxx
index 69e44a6..f77aefc 100644
--- a/sw/source/ui/uno/SwXDocumentSettings.cxx
+++ b/sw/source/ui/uno/SwXDocumentSettings.cxx
@@ -126,7 +126,8 @@ enum SwDocumentSettingsPropertyHandles
     HANDLE_SMALL_CAPS_PERCENTAGE_66,
     HANDLE_TAB_OVERFLOW,
     HANDLE_UNBREAKABLE_NUMBERINGS,
-    HANDLE_STYLES_NODEFAULT
+    HANDLE_STYLES_NODEFAULT,
+    HANDLE_FLOATTABLE_NOMARGINS
 };
 
 MasterPropertySetInfo * lcl_createSettingsInfo()
@@ -190,6 +191,7 @@ MasterPropertySetInfo * lcl_createSettingsInfo()
         { RTL_CONSTASCII_STRINGPARAM("TabOverflow"), HANDLE_TAB_OVERFLOW, CPPUTYPE_BOOLEAN, 0, 0},
         { RTL_CONSTASCII_STRINGPARAM("UnbreakableNumberings"), HANDLE_UNBREAKABLE_NUMBERINGS, CPPUTYPE_BOOLEAN, 0, 0},
         { RTL_CONSTASCII_STRINGPARAM("StylesNoDefault"), HANDLE_STYLES_NODEFAULT, CPPUTYPE_BOOLEAN, 0, 0},
+        { RTL_CONSTASCII_STRINGPARAM("FloattableNomargins"), HANDLE_FLOATTABLE_NOMARGINS, CPPUTYPE_BOOLEAN, 0, 0},
 /*
  * As OS said, we don't have a view when we need to set this, so I have to
  * find another solution before adding them to this property set - MTG
@@ -755,6 +757,12 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
             mpDoc->set(IDocumentSettingAccess::STYLES_NODEFAULT, bTmp);
         }
         break;
+        case HANDLE_FLOATTABLE_NOMARGINS:
+        {
+            sal_Bool bTmp = *(sal_Bool*)rValue.getValue();
+            mpDoc->set(IDocumentSettingAccess::FLOATTABLE_NOMARGINS, bTmp);
+        }
+        break;
         default:
             throw UnknownPropertyException();
     }
@@ -1133,6 +1141,12 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
             rValue.setValue( &bTmp, ::getBooleanCppuType() );
         }
         break;
+        case HANDLE_FLOATTABLE_NOMARGINS:
+        {
+            sal_Bool bTmp = mpDoc->get( IDocumentSettingAccess::FLOATTABLE_NOMARGINS );
+            rValue.setValue( &bTmp, ::getBooleanCppuType() );
+        }
+        break;
         default:
             throw UnknownPropertyException();
     }
diff --git a/writerfilter/source/filter/ImportFilter.cxx b/writerfilter/source/filter/ImportFilter.cxx
index 8952703..8e60b56 100644
--- a/writerfilter/source/filter/ImportFilter.cxx
+++ b/writerfilter/source/filter/ImportFilter.cxx
@@ -176,6 +176,8 @@ void WriterFilter::setTargetDocument( const uno::Reference< lang::XComponent >&
 
    // Don't load the default style definitions to avoid weird mix
    xSettings->setPropertyValue( "StylesNoDefault", uno::makeAny( sal_True ) );
+
+   xSettings->setPropertyValue("FloattableNomargins", uno::makeAny( sal_True ));
 }
 
 void WriterFilter::setSourceDocument( const uno::Reference< lang::XComponent >& xDoc )


More information about the Libreoffice-commits mailing list