[Libreoffice-commits] core.git: 2 commits - sc/source

Noel Power noel.power at suse.com
Fri May 24 04:35:54 PDT 2013


 sc/source/filter/inc/sheetdatabuffer.hxx |   19 ----
 sc/source/filter/inc/stylesbuffer.hxx    |    4 -
 sc/source/filter/oox/sheetdatabuffer.cxx |  122 +++----------------------------
 sc/source/filter/oox/stylesbuffer.cxx    |   64 ----------------
 4 files changed, 16 insertions(+), 193 deletions(-)

New commits:
commit eb9bf904b58aede41b06a5c14335eec6565af202
Author: Noel Power <noel.power at suse.com>
Date:   Fri May 24 12:34:27 2013 +0100

    Revert "improve cell style xls[x|m] import performance"
    
    This reverts commit 4190fd92c6426f40e5ef65a77f3d31e7527db0b9.

diff --git a/sc/source/filter/inc/stylesbuffer.hxx b/sc/source/filter/inc/stylesbuffer.hxx
index 2195ab0..77654c7 100644
--- a/sc/source/filter/inc/stylesbuffer.hxx
+++ b/sc/source/filter/inc/stylesbuffer.hxx
@@ -35,8 +35,6 @@
 #include "stlsheet.hxx"
 #include <editeng/svxenum.hxx>
 #include <editeng/frmdir.hxx>
-#include "attarray.hxx"
-#include <list>
 
 class ScMarkData;
 namespace com { namespace sun { namespace star {
@@ -721,8 +719,6 @@ public:
     inline const Protection& getProtection() const { return maProtection; }
 
     void  writeToMarkData( ::ScMarkData& rMarkData, sal_Int32 nNumFmtId  );
-    void  applyPatternToAttrList( ::std::list<ScAttrEntry>& rAttrs, SCROW nRow1, SCROW nRow2,
-                                  sal_uInt32 nForceScNumFmt );
     /** Writes all formatting attributes to the passed property map. */
     void                writeToPropertyMap( PropertyMap& rPropMap ) const;
     /** Writes all formatting attributes to the passed property set. */
diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx
index 48b5e8e..11a057d 100644
--- a/sc/source/filter/oox/sheetdatabuffer.cxx
+++ b/sc/source/filter/oox/sheetdatabuffer.cxx
@@ -361,50 +361,6 @@ void SheetDataBuffer::finalizeImport()
 
     // write default formatting of remaining row range
     maXfIdRowRangeList[ maXfIdRowRange.mnXfId ].push_back( maXfIdRowRange.maRowRange );
-
-    typedef ::std::pair< sal_Int32, sal_Int32 > RowRange;
-    struct RowRangeStyle
-    {
-        sal_Int32 mnStartRow;
-        sal_Int32 mnEndRow;
-        XfIdNumFmtKey mnNumFmt;
-    };
-    struct StyleRowRangeComp
-    {
-        bool operator() (const RowRangeStyle& lhs, const RowRangeStyle& rhs) const
-        {
-            return lhs.mnEndRow<rhs.mnStartRow;
-        }
-    };
-
-    typedef ::std::set< RowRangeStyle, StyleRowRangeComp > RowStyles;
-    typedef ::std::map< sal_Int32, RowStyles > ColStyles;
-
-    ColStyles aStylesPerColumn;
-    StylesBuffer& rStyles = getStyles();
-
-    std::map< std::pair< sal_Int32, sal_Int32 >, ApiCellRangeList > rangeStyleListMap;
-
-    for( XfIdRangeListMap::const_iterator aIt = maXfIdRangeLists.begin(), aEnd = maXfIdRangeLists.end(); aIt != aEnd; ++aIt )
-        addIfNotInMyMap( getStyles(), rangeStyleListMap, aIt->first.first, aIt->first.second, aIt->second );
-
-    // gather all ranges that have the same style and apply them in bulk
-    for (  std::map< std::pair< sal_Int32, sal_Int32 >, ApiCellRangeList >::iterator it = rangeStyleListMap.begin(), it_end = rangeStyleListMap.end(); it != it_end; ++it )
-    {
-        const ApiCellRangeList& rRanges( it->second );
-        for ( ApiCellRangeList::const_iterator it_range = rRanges.begin(), it_rangeend = rRanges.end(); it_range!=it_rangeend; ++it_range )
-        {
-            RowRangeStyle aStyleRows;
-            aStyleRows.mnNumFmt.first = it->first.first;
-            aStyleRows.mnNumFmt.second = it->first.second;
-            aStyleRows.mnStartRow = it_range->StartRow;
-            aStyleRows.mnEndRow = it_range->EndRow;
-            for ( sal_Int32 nCol = it_range->StartColumn; nCol <= it_range->EndColumn; ++nCol )
-                aStylesPerColumn[ nCol ].insert( aStyleRows );
-        }
-    }
-
-    // process row ranges for each column, don't overwrite any existing row entries for a column
     for ( std::map< sal_Int32, std::vector< ValueRange > >::iterator it = maXfIdRowRangeList.begin(), it_end =  maXfIdRowRangeList.end(); it != it_end; ++it )
     {
         ApiCellRangeList rangeList;
@@ -412,91 +368,27 @@ void SheetDataBuffer::finalizeImport()
         // get all row ranges for id
         for ( std::vector< ValueRange >::iterator rangeIter = it->second.begin(), rangeIter_end = it->second.end(); rangeIter != rangeIter_end; ++rangeIter )
         {
-            RowRangeStyle aStyleRows;
-            aStyleRows.mnNumFmt.first = it->first;
-            if ( aStyleRows.mnNumFmt.first == -1 ) // dud
-                continue;
-            aStyleRows.mnNumFmt.second = -1;
-            aStyleRows.mnStartRow = rangeIter->mnFirst;
-            aStyleRows.mnEndRow = rangeIter->mnLast;
-            for ( sal_Int32 nCol = 0; nCol <= rAddrConv.getMaxApiAddress().Column; ++nCol )
-            {
-                RowStyles& rRowStyles =  aStylesPerColumn[ nCol ];
-                // If the rowrange style includes rows already
-                // allocated to a style then we need to split
-                // the range style Rows into sections ( to
-                // occupy only rows that have no style definition )
-
-                // We dont want to set any rowstyle 'rows'
-                // for rows where there is an existing 'style' )
-                std::vector< RowRangeStyle > aRangeRowsSplits;
-
-                RowStyles::iterator rows_it = rRowStyles.begin();
-                RowStyles::iterator rows_end = rRowStyles.end();
-                bool bAddRange = true;
-                for ( ; rows_it != rows_end; ++rows_it )
-                {
-                    const RowRangeStyle& r = *rows_it;
-                    // if row is completely within existing style, discard it
-                    if ( aStyleRows.mnStartRow >= r.mnStartRow && aStyleRows.mnEndRow <= r.mnEndRow )
-                        bAddRange = false;
-                    else if ( aStyleRows.mnStartRow <= r.mnStartRow )
-                    {
-                        // not intersecting at all?, if so finish as none left
-                        // to check ( row ranges are in ascending order
-                        if ( aStyleRows.mnEndRow < r.mnStartRow )
-                            break;
-                        else if ( aStyleRows.mnEndRow <= r.mnEndRow )
-                        {
-                            aStyleRows.mnEndRow = r.mnStartRow - 1;
-                            break;
-                        }
-                        if ( aStyleRows.mnStartRow < r.mnStartRow )
-                        {
-                            RowRangeStyle aSplit = aStyleRows;
-                            aSplit.mnEndRow = r.mnStartRow - 1;
-                            aRangeRowsSplits.push_back( aSplit );
-                        }
-                    }
-                }
-                std::vector< RowRangeStyle >::iterator splits_it = aRangeRowsSplits.begin();
-                std::vector< RowRangeStyle >::iterator splits_end = aRangeRowsSplits.end();
-                for ( ; splits_it != splits_end; ++splits_it )
-                    rRowStyles.insert( *splits_it );
-                if ( bAddRange )
-                    rRowStyles.insert( aStyleRows );
-            }
-        }
-    }
-    ScDocument& rDoc = getScDocument();
-    for ( ColStyles::iterator col = aStylesPerColumn.begin(), col_end = aStylesPerColumn.end(); col != col_end; ++col )
-    {
-        RowStyles& rRowStyles = col->second;
-        std::list<ScAttrEntry> aAttrs;
-        SCCOL nScCol = static_cast< SCCOL >( col->first );
-        for ( RowStyles::iterator rRows = rRowStyles.begin(), rRows_end = rRowStyles.end(); rRows != rRows_end; ++rRows )
-        {
-             Xf* pXf = rStyles.getCellXf( rRows->mnNumFmt.first ).get();
-
-             if ( pXf )
-                 pXf->applyPatternToAttrList( aAttrs,  rRows->mnStartRow,  rRows->mnEndRow,  rRows->mnNumFmt.second );
+            CellRangeAddress aRange( getSheetIndex(), 0, rangeIter->mnFirst, rAddrConv.getMaxApiAddress().Column, rangeIter->mnLast );
+            rangeList.push_back( aRange );
         }
-        if (aAttrs.empty() || aAttrs.back().nRow != MAXROW)
+        ScRangeList aList;
+        for ( ApiCellRangeList::const_iterator itRange = rangeList.begin(), itRange_end = rangeList.end(); itRange!=itRange_end; ++itRange )
         {
-            ScAttrEntry aEntry;
-            aEntry.nRow = MAXROW;
-            aEntry.pPattern = rDoc.GetDefPattern();
-            aAttrs.push_back(aEntry);
+            ScRange* pRange = new ScRange();
+            ScUnoConversion::FillScRange( *pRange, *itRange );
+            aList.push_back( pRange );
         }
+        ScMarkData aMark;
+        aMark.MarkFromRangeList( aList, false );
 
-        size_t nAttrSize = aAttrs.size();
-        ScAttrEntry* pData = new ScAttrEntry[nAttrSize];
-        std::list<ScAttrEntry>::const_iterator itr = aAttrs.begin(), itrEnd = aAttrs.end();
-        for (size_t i = 0; itr != itrEnd; ++itr, ++i)
-            pData[i] = *itr;
-
-        rDoc.SetAttrEntries(nScCol, getSheetIndex(), pData, static_cast<SCSIZE>(nAttrSize));
+        getStyles().writeCellXfToMarkData( aMark, it->first, -1 );
     }
+    std::map< std::pair< sal_Int32, sal_Int32 >, ApiCellRangeList > rangeStyleListMap;
+    // gather all ranges that have the same style and apply them in bulk
+    for( XfIdRangeListMap::const_iterator aIt = maXfIdRangeLists.begin(), aEnd = maXfIdRangeLists.end(); aIt != aEnd; ++aIt )
+        addIfNotInMyMap( getStyles(), rangeStyleListMap, aIt->first.first, aIt->first.second, aIt->second );
+    for (  std::map< std::pair< sal_Int32, sal_Int32 >, ApiCellRangeList >::iterator it = rangeStyleListMap.begin(), it_end = rangeStyleListMap.end(); it != it_end; ++it )
+        writeXfIdRangeListProperties( it->first.first, it->first.second, it->second );
     // merge all cached merged ranges and update right/bottom cell borders
     for( MergedRangeList::iterator aIt = maMergedRanges.begin(), aEnd = maMergedRanges.end(); aIt != aEnd; ++aIt )
         applyCellMerging( aIt->maRange );
diff --git a/sc/source/filter/oox/stylesbuffer.cxx b/sc/source/filter/oox/stylesbuffer.cxx
index bc990fb..0d0467d 100644
--- a/sc/source/filter/oox/stylesbuffer.cxx
+++ b/sc/source/filter/oox/stylesbuffer.cxx
@@ -2281,70 +2281,6 @@ FontRef Xf::getFont() const
     return getStyles().getFont( maModel.mnFontId );
 }
 
-void Xf::applyPatternToAttrList( ::std::list<ScAttrEntry>& rAttrs, SCROW nRow1, SCROW nRow2,
-                                  sal_uInt32 nNumFmtId )
-{
-    createPattern();
-    ScPatternAttr& rPat = *mpPattern;
-    ScDocument& rDoc = getScDocument();
-    if ( isCellXf() )
-    {
-        StylesBuffer& rStyles = getStyles();
-        rStyles.createCellStyle( maModel.mnStyleXfId );
-
-        mpStyleSheet = rStyles.getCellStyleSheet( maModel.mnStyleXfId );
-        if ( mpStyleSheet )
-        {
-            //rDoc.ApplySelectionStyle( static_cast<ScStyleSheet&>(*mpStyleSheet), rMarkData );
-            rPat.SetStyleSheet(mpStyleSheet, false);
-        }
-        else
-        {
-            ScStyleSheetPool* pStylePool = rDoc.GetStyleSheetPool();
-            if (pStylePool)
-            {
-                ScStyleSheet* pStyleSheet = static_cast<ScStyleSheet*>(
-                    pStylePool->Find(
-                        ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA));
-
-                if (pStyleSheet)
-                    rPat.SetStyleSheet( pStyleSheet, false );
-            }
-        }
-    }
-    if ( nNumFmtId >= 0 )
-    {
-        ScPatternAttr aNumPat(rDoc.GetPool());
-        getStyles().writeNumFmtToItemSet( aNumPat.GetItemSet(), nNumFmtId );
-        rPat.GetItemSet().Put(aNumPat.GetItemSet());
-    }
-    if (rPat.GetStyleName())
-    {
-        // Check for a gap between the last entry and this one.
-        bool bHasGap = false;
-        if (rAttrs.empty() && nRow1 > 0)
-            // First attribute range doesn't start at row 0.
-            bHasGap = true;
-
-        if (!rAttrs.empty() && rAttrs.back().nRow + 1 < nRow1)
-            bHasGap = true;
-
-        if (bHasGap)
-        {
-            // Fill this gap with the default pattern.
-            ScAttrEntry aEntry;
-            aEntry.nRow = nRow1 - 1;
-            aEntry.pPattern = rDoc.GetDefPattern();
-            rAttrs.push_back(aEntry);
-        }
-
-        ScAttrEntry aEntry;
-        aEntry.nRow = nRow2;
-        aEntry.pPattern = static_cast<const ScPatternAttr*>(&rDoc.GetPool()->Put(rPat));
-        rAttrs.push_back(aEntry);
-    }
-}
-
 void Xf::writeToMarkData( ::ScMarkData& rMarkData, sal_Int32 nNumFmtId  )
 {
     createPattern();
commit cd689259bc0fd9d490e490dd3c74b667e9686271
Author: Noel Power <noel.power at suse.com>
Date:   Fri May 24 12:34:07 2013 +0100

    Revert "reorg styles code slightly, process normal (and row ) style in own method"
    
    This reverts commit 9ae9b2f665b3caa9cc584512c26dfa899e1d2d45.

diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx
index 563145e..103418a 100644
--- a/sc/source/filter/inc/sheetdatabuffer.hxx
+++ b/sc/source/filter/inc/sheetdatabuffer.hxx
@@ -192,7 +192,7 @@ private:
     /** Writes all cell formatting attributes to the passed cell range list. (depreciates writeXfIdRangeProperties) */
     void                writeXfIdRangeListProperties( sal_Int32 nXfId, sal_Int32 nNumFmtId, const ApiCellRangeList& rRanges ) const;
     void                applyCellMerging( const ::com::sun::star::table::CellRangeAddress& rRange );
-    void                addColXfStyle( sal_Int32 nXfId, sal_Int32 nFormatId, const ::com::sun::star::table::CellRangeAddress& rAddress, bool bProcessRowRange = false );
+
 private:
     /** Stores cell range address and formula token array of an array formula. */
     typedef ::std::pair< ::com::sun::star::table::CellRangeAddress, ApiTokenSequence > ArrayFormula;
@@ -217,22 +217,6 @@ private:
     typedef ::std::pair< sal_Int32, sal_Int32 > XfIdNumFmtKey;
     typedef ::std::map< XfIdNumFmtKey, ApiCellRangeList > XfIdRangeListMap;
 
-    typedef ::std::pair< sal_Int32, sal_Int32 > RowRange;
-    struct RowRangeStyle
-    {
-        sal_Int32 mnStartRow;
-        sal_Int32 mnEndRow;
-        XfIdNumFmtKey mnNumFmt;
-    };
-    struct StyleRowRangeComp
-    {
-        bool operator() (const RowRangeStyle& lhs, const RowRangeStyle& rhs) const
-        {
-            return lhs.mnEndRow<rhs.mnStartRow;
-        }
-    };
-    typedef ::std::set< RowRangeStyle, StyleRowRangeComp > RowStyles;
-    typedef ::std::map< sal_Int32, RowStyles > ColStyles;
     /** Stores information about a merged cell range. */
     struct MergedRange
     {
@@ -246,7 +230,6 @@ private:
     };
     typedef ::std::list< MergedRange > MergedRangeList;
 
-    ColStyles           maStylesPerColumn;      /// Stores cell styles by column ( in row ranges )
     CellBlockBuffer     maCellBlocks;           /// Manages all open cell blocks.
     ArrayFormulaList    maArrayFormulas;        /// All array formulas in the sheet.
     TableOperationList  maTableOperations;      /// All table operations in the sheet.
diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx
index 174842a..48b5e8e 100644
--- a/sc/source/filter/oox/sheetdatabuffer.cxx
+++ b/sc/source/filter/oox/sheetdatabuffer.cxx
@@ -346,66 +346,6 @@ void addIfNotInMyMap( StylesBuffer& rStyles, std::map< std::pair< sal_Int32, sal
     }
 }
 
-void SheetDataBuffer::addColXfStyle( sal_Int32 nXfId, sal_Int32 nFormatId, const ::com::sun::star::table::CellRangeAddress& rAddress, bool bProcessRowRange )
-{
-    RowRangeStyle aStyleRows;
-    aStyleRows.mnNumFmt.first = nXfId;
-    aStyleRows.mnNumFmt.second = nFormatId;
-    aStyleRows.mnStartRow = rAddress.StartRow;
-    aStyleRows.mnEndRow = rAddress.EndRow;
-    for ( sal_Int32 nCol = rAddress.StartColumn; nCol <= rAddress.EndColumn; ++nCol )
-    {
-        if ( !bProcessRowRange )
-            maStylesPerColumn[ nCol ].insert( aStyleRows );
-        else
-        {
-            RowStyles& rRowStyles =  maStylesPerColumn[ nCol ];
-            // If the rowrange style includes rows already
-            // allocated to a style then we need to split
-            // the range style Rows into sections ( to
-            // occupy only rows that have no style definition )
-
-            // We dont want to set any rowstyle 'rows'
-            // for rows where there is an existing 'style' )
-            std::vector< RowRangeStyle > aRangeRowsSplits;
-
-            RowStyles::iterator rows_it = rRowStyles.begin();
-            RowStyles::iterator rows_end = rRowStyles.end();
-            bool bAddRange = true;
-            for ( ; rows_it != rows_end; ++rows_it )
-            {
-                const RowRangeStyle& r = *rows_it;
-                // if row is completely within existing style, discard it
-                if ( aStyleRows.mnStartRow >= r.mnStartRow && aStyleRows.mnEndRow <= r.mnEndRow )
-                    bAddRange = false;
-                else if ( aStyleRows.mnStartRow <= r.mnStartRow )
-                {
-                    // not intersecting at all?, if so finish as none left
-                    // to check ( row ranges are in ascending order
-                    if ( aStyleRows.mnEndRow < r.mnStartRow )
-                        break;
-                    else if ( aStyleRows.mnEndRow <= r.mnEndRow )
-                    {
-                        aStyleRows.mnEndRow = r.mnStartRow - 1;
-                        break;
-                    }
-                    if ( aStyleRows.mnStartRow < r.mnStartRow )
-                    {
-                        RowRangeStyle aSplit = aStyleRows;
-                        aSplit.mnEndRow = r.mnStartRow - 1;
-                        aRangeRowsSplits.push_back( aSplit );
-                    }
-                }
-            }
-            std::vector< RowRangeStyle >::iterator splits_it = aRangeRowsSplits.begin();
-            std::vector< RowRangeStyle >::iterator splits_end = aRangeRowsSplits.end();
-            for ( ; splits_it != splits_end; ++splits_it )
-                rRowStyles.insert( *splits_it );
-            if ( bAddRange )
-                rRowStyles.insert( aStyleRows );
-        }
-    }
-}
 void SheetDataBuffer::finalizeImport()
 {
     // insert all cells of all open cell blocks
@@ -422,19 +362,49 @@ void SheetDataBuffer::finalizeImport()
     // write default formatting of remaining row range
     maXfIdRowRangeList[ maXfIdRowRange.mnXfId ].push_back( maXfIdRowRange.maRowRange );
 
+    typedef ::std::pair< sal_Int32, sal_Int32 > RowRange;
+    struct RowRangeStyle
+    {
+        sal_Int32 mnStartRow;
+        sal_Int32 mnEndRow;
+        XfIdNumFmtKey mnNumFmt;
+    };
+    struct StyleRowRangeComp
+    {
+        bool operator() (const RowRangeStyle& lhs, const RowRangeStyle& rhs) const
+        {
+            return lhs.mnEndRow<rhs.mnStartRow;
+        }
+    };
+
+    typedef ::std::set< RowRangeStyle, StyleRowRangeComp > RowStyles;
+    typedef ::std::map< sal_Int32, RowStyles > ColStyles;
+
+    ColStyles aStylesPerColumn;
+    StylesBuffer& rStyles = getStyles();
+
     std::map< std::pair< sal_Int32, sal_Int32 >, ApiCellRangeList > rangeStyleListMap;
+
     for( XfIdRangeListMap::const_iterator aIt = maXfIdRangeLists.begin(), aEnd = maXfIdRangeLists.end(); aIt != aEnd; ++aIt )
-    {
         addIfNotInMyMap( getStyles(), rangeStyleListMap, aIt->first.first, aIt->first.second, aIt->second );
-    }
+
     // gather all ranges that have the same style and apply them in bulk
     for (  std::map< std::pair< sal_Int32, sal_Int32 >, ApiCellRangeList >::iterator it = rangeStyleListMap.begin(), it_end = rangeStyleListMap.end(); it != it_end; ++it )
     {
         const ApiCellRangeList& rRanges( it->second );
         for ( ApiCellRangeList::const_iterator it_range = rRanges.begin(), it_rangeend = rRanges.end(); it_range!=it_rangeend; ++it_range )
-            addColXfStyle( it->first.first, it->first.second, *it_range );
+        {
+            RowRangeStyle aStyleRows;
+            aStyleRows.mnNumFmt.first = it->first.first;
+            aStyleRows.mnNumFmt.second = it->first.second;
+            aStyleRows.mnStartRow = it_range->StartRow;
+            aStyleRows.mnEndRow = it_range->EndRow;
+            for ( sal_Int32 nCol = it_range->StartColumn; nCol <= it_range->EndColumn; ++nCol )
+                aStylesPerColumn[ nCol ].insert( aStyleRows );
+        }
     }
 
+    // process row ranges for each column, don't overwrite any existing row entries for a column
     for ( std::map< sal_Int32, std::vector< ValueRange > >::iterator it = maXfIdRowRangeList.begin(), it_end =  maXfIdRowRangeList.end(); it != it_end; ++it )
     {
         ApiCellRangeList rangeList;
@@ -442,17 +412,64 @@ void SheetDataBuffer::finalizeImport()
         // get all row ranges for id
         for ( std::vector< ValueRange >::iterator rangeIter = it->second.begin(), rangeIter_end = it->second.end(); rangeIter != rangeIter_end; ++rangeIter )
         {
-            if ( it->first == -1 ) // it's a dud skip it
+            RowRangeStyle aStyleRows;
+            aStyleRows.mnNumFmt.first = it->first;
+            if ( aStyleRows.mnNumFmt.first == -1 ) // dud
                 continue;
-            CellRangeAddress aRange( getSheetIndex(), 0, rangeIter->mnFirst, rAddrConv.getMaxApiAddress().Column, rangeIter->mnLast );
-
-            addColXfStyle( it->first, -1, aRange, true );
+            aStyleRows.mnNumFmt.second = -1;
+            aStyleRows.mnStartRow = rangeIter->mnFirst;
+            aStyleRows.mnEndRow = rangeIter->mnLast;
+            for ( sal_Int32 nCol = 0; nCol <= rAddrConv.getMaxApiAddress().Column; ++nCol )
+            {
+                RowStyles& rRowStyles =  aStylesPerColumn[ nCol ];
+                // If the rowrange style includes rows already
+                // allocated to a style then we need to split
+                // the range style Rows into sections ( to
+                // occupy only rows that have no style definition )
+
+                // We dont want to set any rowstyle 'rows'
+                // for rows where there is an existing 'style' )
+                std::vector< RowRangeStyle > aRangeRowsSplits;
+
+                RowStyles::iterator rows_it = rRowStyles.begin();
+                RowStyles::iterator rows_end = rRowStyles.end();
+                bool bAddRange = true;
+                for ( ; rows_it != rows_end; ++rows_it )
+                {
+                    const RowRangeStyle& r = *rows_it;
+                    // if row is completely within existing style, discard it
+                    if ( aStyleRows.mnStartRow >= r.mnStartRow && aStyleRows.mnEndRow <= r.mnEndRow )
+                        bAddRange = false;
+                    else if ( aStyleRows.mnStartRow <= r.mnStartRow )
+                    {
+                        // not intersecting at all?, if so finish as none left
+                        // to check ( row ranges are in ascending order
+                        if ( aStyleRows.mnEndRow < r.mnStartRow )
+                            break;
+                        else if ( aStyleRows.mnEndRow <= r.mnEndRow )
+                        {
+                            aStyleRows.mnEndRow = r.mnStartRow - 1;
+                            break;
+                        }
+                        if ( aStyleRows.mnStartRow < r.mnStartRow )
+                        {
+                            RowRangeStyle aSplit = aStyleRows;
+                            aSplit.mnEndRow = r.mnStartRow - 1;
+                            aRangeRowsSplits.push_back( aSplit );
+                        }
+                    }
+                }
+                std::vector< RowRangeStyle >::iterator splits_it = aRangeRowsSplits.begin();
+                std::vector< RowRangeStyle >::iterator splits_end = aRangeRowsSplits.end();
+                for ( ; splits_it != splits_end; ++splits_it )
+                    rRowStyles.insert( *splits_it );
+                if ( bAddRange )
+                    rRowStyles.insert( aStyleRows );
+            }
         }
     }
-
     ScDocument& rDoc = getScDocument();
-    StylesBuffer& rStyles = getStyles();
-    for ( ColStyles::iterator col = maStylesPerColumn.begin(), col_end = maStylesPerColumn.end(); col != col_end; ++col )
+    for ( ColStyles::iterator col = aStylesPerColumn.begin(), col_end = aStylesPerColumn.end(); col != col_end; ++col )
     {
         RowStyles& rRowStyles = col->second;
         std::list<ScAttrEntry> aAttrs;
@@ -480,7 +497,6 @@ void SheetDataBuffer::finalizeImport()
 
         rDoc.SetAttrEntries(nScCol, getSheetIndex(), pData, static_cast<SCSIZE>(nAttrSize));
     }
-
     // merge all cached merged ranges and update right/bottom cell borders
     for( MergedRangeList::iterator aIt = maMergedRanges.begin(), aEnd = maMergedRanges.end(); aIt != aEnd; ++aIt )
         applyCellMerging( aIt->maRange );


More information about the Libreoffice-commits mailing list