[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/inc sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Thu Apr 25 12:41:31 PDT 2013


 sc/inc/column.hxx                |    6 ++++++
 sc/inc/document.hxx              |    9 +++++++++
 sc/inc/formulacell.hxx           |    6 +++---
 sc/inc/table.hxx                 |    1 +
 sc/source/core/data/column.cxx   |    5 +++++
 sc/source/core/data/column2.cxx  |   27 +++++++++++++++++++++++++++
 sc/source/core/data/document.cxx |    9 +++++++++
 sc/source/core/data/table1.cxx   |   11 +++++++++++
 8 files changed, 71 insertions(+), 3 deletions(-)

New commits:
commit fe7eede8274500d8c45aa886fc5bbe38e518a0c4
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Thu Apr 25 15:43:32 2013 -0400

    Not yet used, but a hook to retrieve a vector reference value.
    
    Will be used in the next iteration.
    
    Change-Id: Iff875e7e8a48df849d6df4dfb1418a024c9f7c06

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 8e076ee..866fce3 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -93,6 +93,11 @@ struct ColEntry
 {
     SCROW       nRow;
     ScBaseCell* pCell;
+
+    struct Less : std::binary_function<ColEntry, ColEntry, bool>
+    {
+        bool operator() (const ColEntry& r1, const ColEntry& r2) const;
+    };
 };
 
 struct ColDoubleEntry
@@ -443,6 +448,7 @@ public:
     size_t GetFormulaHash( SCROW nRow ) const;
 
     ScFormulaVectorState GetFormulaVectorState( SCROW nRow ) const;
+    bool ResolveVectorReference( SCROW nRow1, SCROW nRow2 );
 
     ScRefCellValue GetRefCellValue( SCROW );
 
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index afdd493..71d76ad 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1940,6 +1940,15 @@ public:
 
     ScFormulaVectorState GetFormulaVectorState( const ScAddress& rPos ) const;
 
+    /**
+     * Check if the range contains any "dirty" formula cells.  In the future
+     * we'll use this function to interpret those "dirty" formula cells on
+     * demand.
+     *
+     * @return true if the range is totally clean, false otherwise.
+     */
+    bool ResolveVectorReference( const ScAddress& rPos, SCROW nEndRow );
+
 private: // CLOOK-Impl-methods
 
     /**
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 3e68144..e6239e3 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -33,9 +33,9 @@ struct ScSimilarFormulaDelta;
 
 struct SC_DLLPUBLIC ScFormulaCellGroup
 {
-    sal_Int32              mnRefCount;
-    sal_Int32              mnStart;  // Start offset of that cell
-    sal_Int32              mnLength; // How many of these do we have ?
+    sal_Int32 mnRefCount;
+    SCROW mnStart;  // Start offset of that cell
+    SCROW mnLength; // How many of these do we have ?
     bool mbInvariant;
 
     ScFormulaCellGroup();
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index d46a447..eb5f756 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -819,6 +819,7 @@ public:
     size_t GetFormulaHash( SCCOL nCol, SCROW nRow ) const;
 
     ScFormulaVectorState GetFormulaVectorState( SCCOL nCol, SCROW nRow ) const;
+    bool ResolveVectorReference( SCCOL nCol, SCROW nRow1, SCROW nRow2 );
 
     ScRefCellValue GetRefCellValue( SCCOL nCol, SCROW nRow );
 
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 8ecb82e..0c3e630 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -45,6 +45,11 @@
 using ::editeng::SvxBorderLine;
 using namespace formula;
 
+bool ColEntry::Less::operator() (const ColEntry& r1, const ColEntry& r2) const
+{
+    return r1.nRow < r2.nRow;
+}
+
 namespace {
 
 inline bool IsAmbiguousScriptNonZero( sal_uInt8 nScript )
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 82f03cc..00f900b 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1589,6 +1589,33 @@ ScFormulaVectorState ScColumn::GetFormulaVectorState( SCROW nRow ) const
     return pCell ? pCell->GetVectorState() : FormulaVectorUnknown;
 }
 
+bool ScColumn::ResolveVectorReference( SCROW nRow1, SCROW nRow2 )
+{
+    std::vector<ColEntry>::iterator itEnd = maItems.end();
+    // Find first cell whose position is equal or greater than nRow1.
+    ColEntry aBound;
+    aBound.nRow = nRow1;
+    std::vector<ColEntry>::iterator it =
+        std::lower_bound(maItems.begin(), itEnd, aBound, ColEntry::Less());
+
+    if (it == itEnd)
+        return false;
+
+    for (; it != itEnd && it->nRow <= nRow2; ++it)
+    {
+        if (it->pCell->GetCellType() != CELLTYPE_FORMULA)
+            // Non-formula cells are fine.
+            continue;
+
+        ScFormulaCell* pFC = static_cast<ScFormulaCell*>(it->pCell);
+        if (pFC->GetDirty())
+            // Dirty formula cells are not supported yet.
+            return false;
+    }
+
+    return true;
+}
+
 ScRefCellValue ScColumn::GetRefCellValue( SCROW nRow )
 {
     ScRefCellValue aCell; // start empty
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 9d86d45..6a00d36 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -1574,6 +1574,15 @@ ScFormulaVectorState ScDocument::GetFormulaVectorState( const ScAddress& rPos )
     return maTabs[nTab]->GetFormulaVectorState(rPos.Col(), rPos.Row());
 }
 
+bool ScDocument::ResolveVectorReference( const ScAddress& rPos, SCROW nEndRow )
+{
+    SCTAB nTab = rPos.Tab();
+    if (!TableExists(nTab))
+        return false;
+
+    return maTabs[nTab]->ResolveVectorReference(rPos.Col(), rPos.Row(), nEndRow);
+}
+
 bool ScDocument::CanFitBlock( const ScRange& rOld, const ScRange& rNew )
 {
     if ( rOld == rNew )
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 9c52585..7ae3c66 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -2113,6 +2113,17 @@ ScFormulaVectorState ScTable::GetFormulaVectorState( SCCOL nCol, SCROW nRow ) co
     return aCol[nCol].GetFormulaVectorState(nRow);
 }
 
+bool ScTable::ResolveVectorReference( SCCOL nCol, SCROW nRow1, SCROW nRow2 )
+{
+    if (!ValidCol(nCol) || !ValidRow(nRow1) || !ValidRow(nRow2))
+        return false;
+
+    if (!aCol[nCol].ResolveVectorReference(nRow1, nRow2))
+        return false;
+
+    return true;
+}
+
 ScRefCellValue ScTable::GetRefCellValue( SCCOL nCol, SCROW nRow )
 {
     if (!ValidColRow(nCol, nRow))


More information about the Libreoffice-commits mailing list