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

Michael Stahl mstahl at redhat.com
Thu Oct 30 08:02:18 PDT 2014


 sw/inc/IDocumentSettingAccess.hxx             |    3 ++-
 sw/source/core/doc/DocumentSettingManager.cxx |    6 ++++++
 sw/source/core/inc/DocumentSettingManager.hxx |    1 +
 sw/source/core/text/itrform2.cxx              |   19 ++++++++++++++-----
 sw/source/filter/ww8/ww8par.cxx               |    1 +
 sw/source/filter/xml/xmlimp.cxx               |   10 ++++++++++
 sw/source/uibase/uno/SwXDocumentSettings.cxx  |   21 ++++++++++++++++++++-
 writerfilter/source/filter/ImportFilter.cxx   |    1 +
 8 files changed, 55 insertions(+), 7 deletions(-)

New commits:
commit 9605763e3dc8c85137787c77c31e8639553a35ed
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Oct 30 15:12:33 2014 +0100

    fdo#79602: sw: add new compatibiltiy flag PropLineSpacingShrinksFirstLine
    
    This is enabled by default, to get the new formatting where the first
    line of a paragraph is shrunk if a proportional line spacing < 100% is
    applied; existing OOo documents get the previous (before LO 3.3)
    formatting.  Since the formatting in LO releases is broken anyway, it
    does not matter much which way documents written by old LO get
    formatted.
    
    Change-Id: I0952f568a933c137bd03070759989cac3517d8b9

diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index a544549..f0e941e 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -79,6 +79,7 @@ namespace com { namespace sun { namespace star { namespace i18n { struct Forbidd
          TAB_OVER_MARGIN,
          // MS Word still wraps text around objects with less space than LO would.
          SURROUND_TEXT_WRAP_SMALL,
+         PROP_LINE_SPACING_SHRINKS_FIRST_LINE,
          // COMPATIBILITY FLAGS END
 
          BROWSE_MODE,
@@ -93,7 +94,7 @@ namespace com { namespace sun { namespace star { namespace i18n { struct Forbidd
          FLOATTABLE_NOMARGINS,
          EMBED_FONTS,
          EMBED_SYSTEM_FONTS,
-         APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING
+         APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING,
      };
 
  public:
diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx
index f192f72..95dca59 100644
--- a/sw/source/core/doc/DocumentSettingManager.cxx
+++ b/sw/source/core/doc/DocumentSettingManager.cxx
@@ -80,6 +80,7 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc)
     mbBackgroundParaOverDrawings(false),
     mbTabOverMargin(false),
     mbSurroundTextWrapSmall(false),
+    mbPropLineSpacingShrinksFirstLine(true),
     mApplyParagraphMarkFormatToNumbering(false),
     mbLastBrowseMode( false )
 
@@ -154,6 +155,7 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const
         case BACKGROUND_PARA_OVER_DRAWINGS: return mbBackgroundParaOverDrawings;
         case TAB_OVER_MARGIN: return mbTabOverMargin;
         case SURROUND_TEXT_WRAP_SMALL: return mbSurroundTextWrapSmall;
+        case PROP_LINE_SPACING_SHRINKS_FIRST_LINE: return mbPropLineSpacingShrinksFirstLine;
 
         case BROWSE_MODE: return mbLastBrowseMode; // Attention: normally the SwViewShell has to be asked!
         case HTML_MODE: return mbHTMLMode;
@@ -316,6 +318,10 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo
             mbSurroundTextWrapSmall = value;
             break;
 
+        case PROP_LINE_SPACING_SHRINKS_FIRST_LINE:
+            mbPropLineSpacingShrinksFirstLine = value;
+            break;
+
         // COMPATIBILITY FLAGS END
 
         case BROWSE_MODE: //can be used temporary (load/save) when no SwViewShell is available
diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx
index 66cc76c..6dc27ca 100644
--- a/sw/source/core/inc/DocumentSettingManager.hxx
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -147,6 +147,7 @@ class DocumentSettingManager :
     bool mbBackgroundParaOverDrawings;
     bool mbTabOverMargin;
     bool mbSurroundTextWrapSmall;
+    bool mbPropLineSpacingShrinksFirstLine; // fdo#79602
     bool mApplyParagraphMarkFormatToNumbering;
 
     bool mbLastBrowseMode                           : 1;
diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index 233aaab..c650214 100644
--- a/sw/source/core/text/itrform2.cxx
+++ b/sw/source/core/text/itrform2.cxx
@@ -1744,7 +1744,8 @@ void SwTxtFormatter::CalcRealHeight( bool bNewLine )
                 case SVX_LINE_SPACE_AUTO:
                     // shrink first line of paragraph too on spacing < 100%
                     if (IsParaLine() &&
-                        pSpace->GetInterLineSpaceRule() == SVX_INTER_LINE_SPACE_PROP)
+                        pSpace->GetInterLineSpaceRule() == SVX_INTER_LINE_SPACE_PROP
+                        && GetTxtFrm()->GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::PROP_LINE_SPACING_SHRINKS_FIRST_LINE))
                     {
                         long nTmp = pSpace->GetPropLineSpace();
                         // Word will render < 50% too but it's just not readable
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index f3f921e..8104530 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -1945,6 +1945,7 @@ void SwWW8ImplReader::ImportDop()
     rDoc.getIDocumentSettingAccess().set(IDocumentSettingAccess::CLIPPED_PICTURES, true);
     rDoc.getIDocumentSettingAccess().set(IDocumentSettingAccess::TAB_OVER_MARGIN, true);
     rDoc.getIDocumentSettingAccess().set(IDocumentSettingAccess::SURROUND_TEXT_WRAP_SMALL, true);
+    rDoc.getIDocumentSettingAccess().set(IDocumentSettingAccess::PROP_LINE_SPACING_SHRINKS_FIRST_LINE, true);
 
     // COMPATIBILITY FLAGS END
 
diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx
index ab2e643..f45ebf0 100644
--- a/sw/source/filter/xml/xmlimp.cxx
+++ b/sw/source/filter/xml/xmlimp.cxx
@@ -1064,6 +1064,9 @@ void SwXMLImport::SetViewSettings(const Sequence < PropertyValue > & aViewProps)
         GetTextImport()->SetShowChanges( bShowRedlineChanges );
 }
 
+// Note: this will be called only if there are OOo elements in settings.xml.
+// So if a setting is missing there we can assume that it was written
+// by an OOo/LO version that is older than the introduction of the setting!
 void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aConfigProps)
 {
     // this method will modify the document directly -> lock SolarMutex
@@ -1113,6 +1116,7 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
     aSet.insert("ClippedPictures");
     aSet.insert("BackgroundParaOverDrawings");
     aSet.insert("TabOverMargin");
+    aSet.insert("PropLineSpacingShrinksFirstLine");
 
     sal_Int32 nCount = aConfigProps.getLength();
     const PropertyValue* pValues = aConfigProps.getConstArray();
@@ -1147,6 +1151,7 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
     bool bClippedPictures = false;
     bool bBackgroundParaOverDrawings = false;
     bool bTabOverMargin = false;
+    bool bPropLineSpacingShrinksFirstLine = false;
 
     const PropertyValue* currentDatabaseDataSource = NULL;
     const PropertyValue* currentDatabaseCommand = NULL;
@@ -1234,6 +1239,8 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
                     bBackgroundParaOverDrawings = true;
                 else if ( pValues->Name == "TabOverMargin" )
                     bTabOverMargin = true;
+                else if ( pValues->Name == "PropLineSpacingShrinksFirstLine" )
+                    bPropLineSpacingShrinksFirstLine = true;
             }
             catch( Exception& )
             {
@@ -1409,6 +1416,9 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
     if ( !bTabOverMargin )
         xProps->setPropertyValue("TabOverMargin", makeAny( false ) );
 
+    if (!bPropLineSpacingShrinksFirstLine)
+        xProps->setPropertyValue("PropLineSpacingShrinksFirstLine", makeAny(false));
+
     SwDoc *pDoc = getDoc();
     SfxPrinter *pPrinter = pDoc->getIDocumentDeviceAccess().getPrinter( false );
     if( pPrinter )
diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx
index c8494ac..ec71f6d 100644
--- a/sw/source/uibase/uno/SwXDocumentSettings.cxx
+++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx
@@ -126,7 +126,8 @@ enum SwDocumentSettingsPropertyHandles
     HANDLE_EMBED_SYSTEM_FONTS,
     HANDLE_TAB_OVER_MARGIN,
     HANDLE_SURROUND_TEXT_WRAP_SMALL,
-    HANDLE_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING
+    HANDLE_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING,
+    HANDLE_PROP_LINE_SPACING_SHRINKS_FIRST_LINE,
 };
 
 static MasterPropertySetInfo * lcl_createSettingsInfo()
@@ -198,6 +199,7 @@ static MasterPropertySetInfo * lcl_createSettingsInfo()
         { OUString("TabOverMargin"), HANDLE_TAB_OVER_MARGIN, cppu::UnoType<bool>::get(), 0, 0},
         { OUString("SurroundTextWrapSmall"), HANDLE_SURROUND_TEXT_WRAP_SMALL, cppu::UnoType<bool>::get(), 0, 0},
         { OUString("ApplyParagraphMarkFormatToNumbering"), HANDLE_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING, cppu::UnoType<bool>::get(), 0, 0},
+        { OUString("PropLineSpacingShrinksFirstLine"),       HANDLE_PROP_LINE_SPACING_SHRINKS_FIRST_LINE,         cppu::UnoType<bool>::get(),           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
@@ -805,6 +807,16 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
             mpDoc->getIDocumentSettingAccess().set(IDocumentSettingAccess::APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING, bTmp);
         }
         break;
+        case HANDLE_PROP_LINE_SPACING_SHRINKS_FIRST_LINE:
+        {
+            bool bTmp;
+            if (rValue >>= bTmp)
+            {
+                mpDoc->getIDocumentSettingAccess().set(
+                    IDocumentSettingAccess::PROP_LINE_SPACING_SHRINKS_FIRST_LINE, bTmp);
+            }
+        }
+        break;
         default:
             throw UnknownPropertyException();
     }
@@ -1234,6 +1246,13 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
             rValue.setValue( &bTmp, ::getBooleanCppuType() );
         }
         break;
+        case HANDLE_PROP_LINE_SPACING_SHRINKS_FIRST_LINE:
+        {
+            sal_Bool const bTmp(mpDoc->getIDocumentSettingAccess().get(
+                IDocumentSettingAccess::PROP_LINE_SPACING_SHRINKS_FIRST_LINE));
+            rValue <<= bTmp;
+        }
+        break;
         default:
             throw UnknownPropertyException();
     }
diff --git a/writerfilter/source/filter/ImportFilter.cxx b/writerfilter/source/filter/ImportFilter.cxx
index bc705a4..eb8801f 100644
--- a/writerfilter/source/filter/ImportFilter.cxx
+++ b/writerfilter/source/filter/ImportFilter.cxx
@@ -209,6 +209,7 @@ void WriterFilter::setTargetDocument( const uno::Reference< lang::XComponent >&
    xSettings->setPropertyValue( "ClippedPictures", uno::makeAny( sal_True ) );
    xSettings->setPropertyValue( "BackgroundParaOverDrawings", uno::makeAny( sal_True ) );
    xSettings->setPropertyValue( "TabOverMargin", uno::makeAny( sal_True ) );
+   xSettings->setPropertyValue("PropLineSpacingShrinksFirstLine", uno::makeAny(sal_True));
 }
 
 void WriterFilter::setSourceDocument( const uno::Reference< lang::XComponent >& xDoc )
commit 4e223fab04279c3583689e69fa1342966e81de36
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Oct 29 23:50:21 2014 +0100

    fdo#79602: sw: fix text formatting of proportional line space < 100%
    
    SwTxtFormatter::CalcRealHeight(): Apply the special treatment of < 100%
    line space shrinking the Height() of the line only to the first line
    in a paragraph; the subsequent ones are shrunk again (to the square of
    the desired proportion) 30 lines later.
    
    Also set the Ascent of the line, as the wrong base-line causes the lower
    part of the line to be clipped.
    
    (regression from 42532d42bfcdb12df86376cda009e8e315a82153)
    
    Change-Id: I0424396263293deaa318c80eedc2237cdb01b22b

diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index 0d3e80b..233aaab 100644
--- a/sw/source/core/text/itrform2.cxx
+++ b/sw/source/core/text/itrform2.cxx
@@ -1742,24 +1742,30 @@ void SwTxtFormatter::CalcRealHeight( bool bNewLine )
             switch( pSpace->GetLineSpaceRule() )
             {
                 case SVX_LINE_SPACE_AUTO:
-            if (pSpace->GetInterLineSpaceRule()==SVX_INTER_LINE_SPACE_PROP) {
+                    // shrink first line of paragraph too on spacing < 100%
+                    if (IsParaLine() &&
+                        pSpace->GetInterLineSpaceRule() == SVX_INTER_LINE_SPACE_PROP)
+                    {
                         long nTmp = pSpace->GetPropLineSpace();
+                        // Word will render < 50% too but it's just not readable
+                        if( nTmp < 50 )
+                            nTmp = nTmp ? 50 : 100;
                         if (nTmp<100) { // code adaped from fixed line height
                             nTmp *= nLineHeight;
                             nTmp /= 100;
                             if( !nTmp )
                                 ++nTmp;
                             nLineHeight = (sal_uInt16)nTmp;
-                            /*
-                            //@TODO figure out how WW maps ascent and descent
-                            //in case of prop  line spacing <100%
                             sal_uInt16 nAsc = ( 4 * nLineHeight ) / 5;  // 80%
+#if 0
+                            // could do clipping here (like Word does)
+                            // but at 0.5 its unreadable either way...
                             if( nAsc < pCurr->GetAscent() ||
                                 nLineHeight - nAsc < pCurr->Height() -
                                 pCurr->GetAscent() )
                                 pCurr->SetClipping( true );
+#endif
                             pCurr->SetAscent( nAsc );
-                            */
                             pCurr->Height( nLineHeight );
                             pInf->GetParaPortion()->SetFixLineHeight();
                         }
@@ -1785,6 +1791,8 @@ void SwTxtFormatter::CalcRealHeight( bool bNewLine )
                 break;
                 default: OSL_FAIL( ": unknown LineSpaceRule" );
             }
+            // Note: for the _first_ line the line spacing of the previous
+            // paragraph is applied in SwFlowFrm::CalcUpperSpace()
             if( !IsParaLine() )
                 switch( pSpace->GetInterLineSpaceRule() )
                 {


More information about the Libreoffice-commits mailing list