[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-4.2' - sc/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Sun Jan 4 08:08:45 PST 2015


 sc/source/filter/inc/sheetdatabuffer.hxx  |   14 +++++++++-----
 sc/source/filter/inc/worksheethelper.hxx  |    2 +-
 sc/source/filter/oox/sheetdatabuffer.cxx  |   19 ++++++++++++++-----
 sc/source/filter/oox/sheetdatacontext.cxx |    7 ++++++-
 4 files changed, 30 insertions(+), 12 deletions(-)

New commits:
commit 80817430ee98fad2e6ada52a52741ef9992f4a44
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Wed Dec 24 04:11:08 2014 +0100

    reimplement shared formula import for xlsb, fdo#86734
    
    (cherry picked from commit e1351ed4c5f9152c80b32bbaa53e3eff56671331)
    
    Change-Id: Ic5d678a2b1197ce8d83b308b0a4387bf657052d5

diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx
index f84f91c..f8290bf 100644
--- a/sc/source/filter/inc/sheetdatabuffer.hxx
+++ b/sc/source/filter/inc/sheetdatabuffer.hxx
@@ -136,6 +136,10 @@ public:
     /** Inserts a ISO 8601 date cell into the sheet. */
     void                setDateCell( const CellModel& rModel, const OUString& rDateString );
 
+    void                createSharedFormula(
+            const com::sun::star::table::CellAddress& rRange,
+            const ApiTokenSequence& rTokens);
+
     /** Inserts the passed token array as array formula. */
     void                createArrayFormula(
                             const ::com::sun::star::table::CellRangeAddress& rRange,
@@ -161,17 +165,17 @@ public:
     /** Final processing after the sheet has been imported. */
     void                finalizeImport();
 
-private:
-    struct XfIdRowRange;
-
     /** Sets the passed formula token array into a cell. */
     void                setCellFormula(
                             const ::com::sun::star::table::CellAddress& rCellAddr,
                             const ApiTokenSequence& rTokens );
 
+private:
+    struct XfIdRowRange;
+
     /** Creates a formula token array representing the shared formula with the
         passed identifier. */
-    ApiTokenSequence    resolveSharedFormula( const BinAddress& rMapKey ) const;
+    ApiTokenSequence    resolveSharedFormula( const css::table::CellAddress& rMapKey ) const;
 
     /** Inserts the passed array formula into the sheet. */
     void                finalizeArrayFormula(
@@ -244,7 +248,7 @@ private:
     SharedFormulaMap    maSharedFormulas;       /// Maps shared formula base address to defined name token index.
     ::com::sun::star::table::CellAddress
                         maSharedFmlaAddr;       /// Address of a cell containing a pending shared formula.
-    BinAddress          maSharedBaseAddr;       /// Base address of the pending shared formula.
+    css::table::CellAddress maSharedBaseAddr;       /// Base address of the pending shared formula.
     XfIdRowRange        maXfIdRowRange;         /// Cached XF identifier for a range of rows.
     XfIdRangeListMap    maXfIdRangeLists;       /// Collected XF identifiers for cell rangelists.
     MergedRangeList     maMergedRanges;         /// Merged cell ranges.
diff --git a/sc/source/filter/inc/worksheethelper.hxx b/sc/source/filter/inc/worksheethelper.hxx
index a07019a..dbf1990 100644
--- a/sc/source/filter/inc/worksheethelper.hxx
+++ b/sc/source/filter/inc/worksheethelper.hxx
@@ -61,7 +61,7 @@ typedef ::std::map< OUString, void* >  ExtLst;
 // ============================================================================
 // ============================================================================
 
-typedef ::std::map< BinAddress, sal_Int32 > SharedFormulaMap;
+typedef ::std::map< BinAddress, ApiTokenSequence > SharedFormulaMap;
 
 /** An enumeration for all types of sheets in a workbook. */
 enum WorksheetType
diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx
index 60987c9..98cf684 100644
--- a/sc/source/filter/oox/sheetdatabuffer.cxx
+++ b/sc/source/filter/oox/sheetdatabuffer.cxx
@@ -241,6 +241,14 @@ void SheetDataBuffer::setDateCell( const CellModel& rModel, const OUString& rDat
         setValueCell( rModel, fValue );
 }
 
+void SheetDataBuffer::createSharedFormula(const CellAddress& rAddr, const ApiTokenSequence& rTokens)
+{
+    BinAddress aAddr(rAddr);
+    maSharedFormulas[aAddr] = rTokens;
+    if( mbPendingSharedFmla )
+        setCellFormula( maSharedFmlaAddr, resolveSharedFormula( maSharedBaseAddr ) );
+}
+
 void SheetDataBuffer::setFormulaCell( const CellModel& rModel, const ApiTokenSequence& rTokens )
 {
     mbPendingSharedFmla = false;
@@ -270,11 +278,11 @@ void SheetDataBuffer::setFormulaCell( const CellModel& rModel, const ApiTokenSeq
                 reading the formula definition it will be retried to insert the
                 formula via retryPendingSharedFormulaCell(). */
             BinAddress aBaseAddr( aTokenInfo.First );
-            aTokens = resolveSharedFormula( aBaseAddr );
+            aTokens = resolveSharedFormula( aTokenInfo.First );
             if( !aTokens.hasElements() )
             {
                 maSharedFmlaAddr = rModel.maCellAddr;
-                maSharedBaseAddr = aBaseAddr;
+                maSharedBaseAddr = aTokenInfo.First;
                 mbPendingSharedFmla = true;
             }
         }
@@ -579,10 +587,11 @@ void SheetDataBuffer::setCellFormula( const CellAddress& rCellAddr, const ApiTok
     }
 }
 
-ApiTokenSequence SheetDataBuffer::resolveSharedFormula( const BinAddress& rMapKey ) const
+ApiTokenSequence SheetDataBuffer::resolveSharedFormula( const CellAddress& rAddr ) const
 {
-    sal_Int32 nTokenIndex = ContainerHelper::getMapElement( maSharedFormulas, rMapKey, -1 );
-    return (nTokenIndex >= 0) ? getFormulaParser().convertNameToFormula( nTokenIndex ) : ApiTokenSequence();
+    BinAddress aAddr(rAddr);
+    ApiTokenSequence aTokens = ContainerHelper::getMapElement( maSharedFormulas, aAddr, ApiTokenSequence() );
+    return aTokens;
 }
 
 void SheetDataBuffer::finalizeArrayFormula( const CellRangeAddress& rRange, const ApiTokenSequence& rTokens ) const
diff --git a/sc/source/filter/oox/sheetdatacontext.cxx b/sc/source/filter/oox/sheetdatacontext.cxx
index bbda959..0778f22 100644
--- a/sc/source/filter/oox/sheetdatacontext.cxx
+++ b/sc/source/filter/oox/sheetdatacontext.cxx
@@ -566,8 +566,13 @@ void SheetDataContext::importDataTable( SequenceInputStream& rStrm )
     }
 }
 
-void SheetDataContext::importSharedFmla( SequenceInputStream& /*rStrm*/ )
+void SheetDataContext::importSharedFmla( SequenceInputStream& rStrm )
 {
+    if( readFormulaRef( rStrm ) && maFmlaData.isValidSharedRef( maCellData.maCellAddr ) )
+    {
+        ApiTokenSequence aTokens = mrFormulaParser.importFormula( maCellData.maCellAddr, FORMULATYPE_SHAREDFORMULA, rStrm );
+        mrSheetData.createSharedFormula( maCellData.maCellAddr, aTokens );
+    }
 }
 
 } // namespace xls


More information about the Libreoffice-commits mailing list