[Libreoffice-commits] core.git: 11 commits - sc/inc sc/qa sc/source
Kohei Yoshida
kohei.yoshida at gmail.com
Mon Jul 1 07:31:17 PDT 2013
sc/inc/calcmacros.hxx | 24 ++
sc/inc/column.hxx | 6
sc/inc/document.hxx | 7
sc/inc/dpcache.hxx | 2
sc/inc/dpfilteredcache.hxx | 2
sc/inc/dpitemdata.hxx | 2
sc/inc/dpmacros.hxx | 23 --
sc/inc/dpnumgroupinfo.hxx | 2
sc/inc/dpobject.hxx | 2
sc/inc/dptabdat.hxx | 2
sc/inc/dptabres.hxx | 2
sc/inc/mtvelements.hxx | 3
sc/inc/pivot.hxx | 2
sc/inc/scmatrix.hxx | 3
sc/inc/table.hxx | 7
sc/qa/unit/data/xls/shared-formula.xls |binary
sc/qa/unit/data/xlsx/shared-formula.xlsx |binary
sc/qa/unit/filters-test.cxx | 36 ++++
sc/qa/unit/subsequent_filters-test.cxx | 37 ----
sc/qa/unit/ucalc.cxx | 19 ++
sc/source/core/data/column.cxx | 2
sc/source/core/data/column2.cxx | 267 +++++++++++++++++++++++++++----
sc/source/core/data/documen2.cxx | 2
sc/source/core/data/documen9.cxx | 7
sc/source/core/data/document.cxx | 13 +
sc/source/core/data/dptabsrc.cxx | 2
sc/source/core/data/formulacell.cxx | 16 +
sc/source/core/data/table1.cxx | 12 +
sc/source/core/tool/interpr1.cxx | 65 -------
sc/source/core/tool/scmatrix.cxx | 111 ++++++++++++
sc/source/ui/dbgui/fieldwnd.cxx | 2
31 files changed, 494 insertions(+), 186 deletions(-)
New commits:
commit bd4c6a7d7521abb0e36ebfba6e14685a1e195be8
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 1 09:02:13 2013 -0400
Fix a crasher on copy to clip.
The logical row position equals the top block position plus offset within
block, not minus.
Change-Id: Ia6376d8e971f9d3379977895d14f97f43c5664ba
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index a224b6f..aa82f4d1 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1276,7 +1276,7 @@ public:
void operator() (const sc::CellStoreType::value_type& aNode, size_t nOffset, size_t nDataSize)
{
- size_t nTopRow = aNode.position - nOffset;
+ size_t nTopRow = aNode.position + nOffset;
switch (aNode.type)
{
commit add9e14a4a45d29ac7284f9cecf762e3a075a01d
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 19:37:50 2013 -0400
Add tests for matrix's min and max values, and fix one bug.
Apparently numeric_limits<type>::min() is not to be used for signed types.
Change-Id: Ia9730328562905459eb1d3e5cfd1a023c644e219
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index be470b1..c7eda91 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -2562,6 +2562,25 @@ void Test::testMatrix()
CPPUNIT_ASSERT_EQUAL(1.5, pMat->GetDouble(0, 1));
CPPUNIT_ASSERT_EQUAL(1.5, pMat->GetDouble(1, 0));
CPPUNIT_ASSERT_MESSAGE("PutEmpty() call failed.", pMat->IsEmpty(1, 1));
+
+ // Max and min values.
+ pMat = new ScMatrix(2, 2, 0.0);
+ pMat->PutDouble(-10, 0, 0);
+ pMat->PutDouble(-12, 0, 1);
+ pMat->PutDouble(-8, 1, 0);
+ pMat->PutDouble(-25, 1, 1);
+ CPPUNIT_ASSERT_EQUAL(-25.0, pMat->GetMinValue(false));
+ CPPUNIT_ASSERT_EQUAL(-8.0, pMat->GetMaxValue(false));
+ pMat->PutString("Test", 0, 0);
+ CPPUNIT_ASSERT_EQUAL(0.0, pMat->GetMaxValue(true)); // text as zero.
+ CPPUNIT_ASSERT_EQUAL(-8.0, pMat->GetMaxValue(false)); // ignore text.
+ pMat->PutBoolean(true, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(1.0, pMat->GetMaxValue(false));
+ pMat = new ScMatrix(2, 2, 10.0);
+ pMat->PutBoolean(false, 0, 0);
+ pMat->PutDouble(12.5, 1, 1);
+ CPPUNIT_ASSERT_EQUAL(0.0, pMat->GetMinValue(false));
+ CPPUNIT_ASSERT_EQUAL(12.5, pMat->GetMaxValue(false));
}
void Test::testEnterMixedMatrix()
diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index bf3ea63..b0bef2e 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -940,7 +940,7 @@ public:
struct MaxOp
{
- static double init() { return std::numeric_limits<double>::min(); }
+ static double init() { return -std::numeric_limits<double>::max(); }
static double compare(double left, double right)
{
return std::max(left, right);
commit 58380c11216cb9f03a98e3d53dcee702576fedb8
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 17:54:34 2013 -0400
Better to calculate max and min value of matrix *in* the matrix itself.
Change-Id: I410b345ac32550a188aa356e133ef8e0e9b13d9f
diff --git a/sc/inc/scmatrix.hxx b/sc/inc/scmatrix.hxx
index 66b271b..d6ac279 100644
--- a/sc/inc/scmatrix.hxx
+++ b/sc/inc/scmatrix.hxx
@@ -349,6 +349,9 @@ public:
IterateResult Product(bool bTextAsZero) const;
size_t Count(bool bCountStrings) const;
+ double GetMaxValue( bool bTextAsZero ) const;
+ double GetMinValue( bool bTextAsZero ) const;
+
// All other matrix functions MatMult, MInv, ... are in ScInterpreter
// to be numerically safe.
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index aa55dcb..9cb89ae 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -3729,39 +3729,7 @@ void ScInterpreter::ScMin( bool bTextAsZero )
{
ScMatrixRef pMat = GetMatrix();
if (pMat)
- {
- SCSIZE nC, nR;
- nFuncFmtType = NUMBERFORMAT_NUMBER;
- pMat->GetDimensions(nC, nR);
- if (pMat->IsNumeric())
- {
- for (SCSIZE nMatCol = 0; nMatCol < nC; nMatCol++)
- for (SCSIZE nMatRow = 0; nMatRow < nR; nMatRow++)
- {
- nVal = pMat->GetDouble(nMatCol,nMatRow);
- if (nMin > nVal) nMin = nVal;
- }
- }
- else
- {
- for (SCSIZE nMatCol = 0; nMatCol < nC; nMatCol++)
- {
- for (SCSIZE nMatRow = 0; nMatRow < nR; nMatRow++)
- {
- if (!pMat->IsString(nMatCol,nMatRow))
- {
- nVal = pMat->GetDouble(nMatCol,nMatRow);
- if (nMin > nVal) nMin = nVal;
- }
- else if ( bTextAsZero )
- {
- if ( nMin > 0.0 )
- nMin = 0.0;
- }
- }
- }
- }
- }
+ nMin = pMat->GetMinValue(bTextAsZero);
}
break;
case svString :
@@ -3855,36 +3823,7 @@ void ScInterpreter::ScMax( bool bTextAsZero )
if (pMat)
{
nFuncFmtType = NUMBERFORMAT_NUMBER;
- SCSIZE nC, nR;
- pMat->GetDimensions(nC, nR);
- if (pMat->IsNumeric())
- {
- for (SCSIZE nMatCol = 0; nMatCol < nC; nMatCol++)
- for (SCSIZE nMatRow = 0; nMatRow < nR; nMatRow++)
- {
- nVal = pMat->GetDouble(nMatCol,nMatRow);
- if (nMax < nVal) nMax = nVal;
- }
- }
- else
- {
- for (SCSIZE nMatCol = 0; nMatCol < nC; nMatCol++)
- {
- for (SCSIZE nMatRow = 0; nMatRow < nR; nMatRow++)
- {
- if (!pMat->IsString(nMatCol,nMatRow))
- {
- nVal = pMat->GetDouble(nMatCol,nMatRow);
- if (nMax < nVal) nMax = nVal;
- }
- else if ( bTextAsZero )
- {
- if ( nMax < 0.0 )
- nMax = 0.0;
- }
- }
- }
- }
+ nMax = pMat->GetMaxValue(bTextAsZero);
}
}
break;
diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index 26fe7d3..bf3ea63 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -223,6 +223,9 @@ public:
ScMatrix::IterateResult Product(bool bTextAsZero) const;
size_t Count(bool bCountStrings) const;
+ double GetMaxValue( bool bTextAsZero ) const;
+ double GetMinValue( bool bTextAsZero ) const;
+
#if DEBUG_MATRIX
void Dump() const;
#endif
@@ -935,6 +938,90 @@ public:
}
};
+struct MaxOp
+{
+ static double init() { return std::numeric_limits<double>::min(); }
+ static double compare(double left, double right)
+ {
+ return std::max(left, right);
+ }
+
+ static double boolValue(
+ mdds::mtv::boolean_element_block::const_iterator it,
+ mdds::mtv::boolean_element_block::const_iterator itEnd)
+ {
+ // If the array has at least one true value, the maximum value is 1.
+ it = std::find(it, itEnd, true);
+ return it == itEnd ? 0.0 : 1.0;
+ }
+};
+
+struct MinOp
+{
+ static double init() { return std::numeric_limits<double>::max(); }
+ static double compare(double left, double right)
+ {
+ return std::min(left, right);
+ }
+
+ static double boolValue(
+ mdds::mtv::boolean_element_block::const_iterator it,
+ mdds::mtv::boolean_element_block::const_iterator itEnd)
+ {
+ // If the array has at least one false value, the minimum value is 0.
+ it = std::find(it, itEnd, false);
+ return it == itEnd ? 1.0 : 0.0;
+ }
+};
+
+template<typename _Op>
+class CalcMaxMinValue : std::unary_function<MatrixImplType::element_block_type, void>
+{
+ double mfVal;
+ bool mbTextAsZero;
+public:
+ CalcMaxMinValue( bool bTextAsZero ) :
+ mfVal(_Op::init()),
+ mbTextAsZero(bTextAsZero) {}
+
+ double getValue() const { return mfVal; }
+
+ void operator() (const MatrixImplType::element_block_node_type& node)
+ {
+ using namespace mdds::mtv;
+
+ switch (node.type)
+ {
+ case mdds::mtm::element_numeric:
+ {
+ numeric_element_block::const_iterator it = numeric_element_block::begin(*node.data);
+ numeric_element_block::const_iterator itEnd = numeric_element_block::end(*node.data);
+ for (; it != itEnd; ++it)
+ mfVal = _Op::compare(mfVal, *it);
+ }
+ break;
+ case mdds::mtm::element_boolean:
+ {
+ boolean_element_block::const_iterator it = boolean_element_block::begin(*node.data);
+ boolean_element_block::const_iterator itEnd = boolean_element_block::end(*node.data);
+ double fVal = _Op::boolValue(it, itEnd);
+ mfVal = _Op::compare(mfVal, fVal);
+ }
+ break;
+ case mdds::mtm::element_string:
+ case mdds::mtm::element_empty:
+ {
+ // empty elements are treated as empty strings.
+ if (mbTextAsZero)
+ mfVal = _Op::compare(mfVal, 0.0);
+ }
+ break;
+ default:
+ ;
+ }
+ }
+};
+
}
ScMatrix::IterateResult ScMatrixImpl::Sum(bool bTextAsZero) const
@@ -966,6 +1053,20 @@ size_t ScMatrixImpl::Count(bool bCountStrings) const
return aFunc.getCount();
}
+double ScMatrixImpl::GetMaxValue( bool bTextAsZero ) const
+{
+ CalcMaxMinValue<MaxOp> aFunc(bTextAsZero);
+ maMat.walk(aFunc);
+ return aFunc.getValue();
+}
+
+double ScMatrixImpl::GetMinValue( bool bTextAsZero ) const
+{
+ CalcMaxMinValue<MinOp> aFunc(bTextAsZero);
+ maMat.walk(aFunc);
+ return aFunc.getValue();
+}
+
#if DEBUG_MATRIX
void ScMatrixImpl::Dump() const
{
@@ -1308,6 +1409,16 @@ size_t ScMatrix::Count(bool bCountStrings) const
return pImpl->Count(bCountStrings);
}
+double ScMatrix::GetMaxValue( bool bTextAsZero ) const
+{
+ return pImpl->GetMaxValue(bTextAsZero);
+}
+
+double ScMatrix::GetMinValue( bool bTextAsZero ) const
+{
+ return pImpl->GetMinValue(bTextAsZero);
+}
+
#if DEBUG_MATRIX
void ScMatrix::Dump() const
{
commit dfd0b37d82db6cb8f02b48e735cf6caacc2420e4
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 16:38:19 2013 -0400
This is not needed.
Change-Id: I382b9d485b7bb58656561c4790580c9bc6339889
diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx
index c4c1409..3d9110b 100644
--- a/sc/source/core/data/documen9.cxx
+++ b/sc/source/core/data/documen9.cxx
@@ -690,9 +690,6 @@ void ScDocument::ApplyAsianEditSettings( ScEditEngineDefaulter& rEngine )
void ScDocument::RebuildFormulaGroups()
{
- if (!ScInterpreter::GetGlobalConfig().mbOpenCLEnabled)
- return;
-
SCTAB nTab;
for (nTab=0; nTab < static_cast<SCTAB>(maTabs.size()); nTab++)
if (maTabs[nTab])
commit 1968e62d9f242ef5857dda0e09382fd6f59f8e0b
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 15:49:43 2013 -0400
Add a convenient way to dump formula group states for a single column.
Useful when debugging.
Change-Id: I4e408ad9a3dc2046557d152fcd067c1b0c5645c0
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 4601ae2..6cc3c4b 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -525,6 +525,10 @@ public:
void FormulaCellsUndecided( SCROW nRow1, SCROW nRow2 );
+#if DEBUG_COLUMN_STORAGE
+ void DumpFormulaGroups() const;
+#endif
+
private:
sc::CellStoreType::iterator GetPositionToInsert( SCROW nRow );
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 8d942b7..806fb77 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -36,6 +36,7 @@
#include <com/sun/star/chart2/XChartDocument.hpp>
#include "typedstrdata.hxx"
#include "compressedarray.hxx"
+#include "calcmacros.hxx"
#include <tools/fract.hxx>
#include <tools/gen.hxx>
@@ -1984,6 +1985,10 @@ public:
*/
bool HasBroadcaster( SCTAB nTab, SCCOL nCol ) const;
+#if DEBUG_COLUMN_STORAGE
+ void DumpFormulaGroups( SCTAB nTab, SCCOL nCol ) const;
+#endif
+
private: // CLOOK-Impl-methods
/**
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index bda039f..03060bb 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -32,6 +32,7 @@
#include "types.hxx"
#include "cellvalue.hxx"
#include "formula/types.hxx"
+#include "calcmacros.hxx"
#include <set>
#include <map>
@@ -857,6 +858,10 @@ public:
void SetFormulaResults( SCCOL nCol, SCROW nRow, const double* pResults, size_t nLen );
+#if DEBUG_COLUMN_STORAGE
+ void DumpFormulaGroups( SCCOL nCol ) const;
+#endif
+
/** Replace behaves differently to the Search; adjust the rCol and rRow accordingly.
'Replace' replaces at the 'current' position, but in order to achieve
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index a7056d0..ae20e44 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1544,6 +1544,46 @@ void ScColumn::FormulaCellsUndecided( SCROW /*nRow1*/, SCROW /*nRow2*/ )
{
}
+#if DEBUG_COLUMN_STORAGE
+
+namespace {
+
+struct FormulaGroupDumper : std::unary_function<sc::CellStoreType::value_type, void>
+{
+ void operator() (const sc::CellStoreType::value_type& rNode) const
+ {
+ if (rNode.type != sc::element_type_formula)
+ return;
+
+ sc::formula_block::const_iterator it = sc::formula_block::begin(*rNode.data);
+ sc::formula_block::const_iterator itEnd = sc::formula_block::end(*rNode.data);
+
+ for (; it != itEnd; ++it)
+ {
+ const ScFormulaCell& rCell = **it;
+ if (!rCell.IsShared())
+ continue;
+
+ if (rCell.GetSharedTopRow() != rCell.aPos.Row())
+ continue;
+
+ SCROW nLen = rCell.GetSharedLength();
+ cout << " * group: start=" << rCell.aPos.Row() << ", length=" << nLen << endl;
+ std::advance(it, nLen-1);
+ }
+ }
+};
+
+}
+
+void ScColumn::DumpFormulaGroups() const
+{
+ cout << "-- formua groups" << endl;
+ std::for_each(maCells.begin(), maCells.end(), FormulaGroupDumper());
+ cout << "--" << endl;
+}
+#endif
+
void ScColumn::CopyCellTextAttrsToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol) const
{
rDestCol.maCellTextAttrs.set_empty(nRow1, nRow2); // Empty the destination range first.
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 3ce424f..9d3c72f 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -2266,6 +2266,17 @@ bool ScDocument::HasBroadcaster( SCTAB nTab, SCCOL nCol ) const
return pTab->HasBroadcaster(nCol);
}
+#if DEBUG_COLUMN_STORAGE
+void ScDocument::DumpFormulaGroups( SCTAB nTab, SCCOL nCol ) const
+{
+ const ScTable* pTab = FetchTable(nTab);
+ if (!pTab)
+ return;
+
+ pTab->DumpFormulaGroups(nCol);
+}
+#endif
+
bool ScDocument::TableExists( SCTAB nTab ) const
{
return ValidTab(nTab) && static_cast<size_t>(nTab) < maTabs.size() && maTabs[nTab];
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index dcd0344..02c8952 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -2221,6 +2221,16 @@ void ScTable::SetFormulaResults( SCCOL nCol, SCROW nRow, const double* pResults,
aCol[nCol].SetFormulaResults(nRow, pResults, nLen);
}
+#if DEBUG_COLUMN_STORAGE
+void ScTable::DumpFormulaGroups( SCCOL nCol ) const
+{
+ if (!ValidCol(nCol))
+ return;
+
+ aCol[nCol].DumpFormulaGroups();
+}
+#endif
+
const SvtBroadcaster* ScTable::GetBroadcaster( SCCOL nCol, SCROW nRow ) const
{
if (!ValidColRow(nCol, nRow))
commit fb604d067066249bda3a09b91743491dd63e8288
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 15:22:05 2013 -0400
Start moving all these DEBUG_FOO into calcmacros.hxx.
This header was formerly dpmacros.hxx, now renamed to calcmacros.hxx.
Change-Id: I2ed768b7c5678f5216b1e93df2c0cede0c548be4
diff --git a/sc/inc/dpmacros.hxx b/sc/inc/calcmacros.hxx
similarity index 86%
rename from sc/inc/dpmacros.hxx
rename to sc/inc/calcmacros.hxx
index 72659cc..03ca590 100644
--- a/sc/inc/dpmacros.hxx
+++ b/sc/inc/calcmacros.hxx
@@ -7,9 +7,10 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-#ifndef __SC_DPMACROS_HXX__
-#define __SC_DPMACROS_HXX__
+#ifndef SC_CALCMACROS_HXX
+#define SC_CALCMACROS_HXX
+#define DEBUG_COLUMN_STORAGE 0
#define DEBUG_PIVOT_TABLE 0
#if DEBUG_PIVOT_TABLE
diff --git a/sc/inc/dpcache.hxx b/sc/inc/dpcache.hxx
index 5a75463..707749c 100644
--- a/sc/inc/dpcache.hxx
+++ b/sc/inc/dpcache.hxx
@@ -21,7 +21,7 @@
#include "global.hxx"
#include "dpnumgroupinfo.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include "tools/date.hxx"
#include <boost/noncopyable.hpp>
diff --git a/sc/inc/dpfilteredcache.hxx b/sc/inc/dpfilteredcache.hxx
index c65b95c..bff1e18 100644
--- a/sc/inc/dpfilteredcache.hxx
+++ b/sc/inc/dpfilteredcache.hxx
@@ -24,7 +24,7 @@
#include "osl/mutex.hxx"
#include "global.hxx"
#include "dpitemdata.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include <vector>
#include <boost/unordered_set.hpp>
diff --git a/sc/inc/dpitemdata.hxx b/sc/inc/dpitemdata.hxx
index 9137e2a..823a6c1 100644
--- a/sc/inc/dpitemdata.hxx
+++ b/sc/inc/dpitemdata.hxx
@@ -16,7 +16,7 @@
#include "sal/types.h"
#include "tools/solar.h"
#include "rtl/ustring.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include "dpglobal.hxx"
/**
diff --git a/sc/inc/dpnumgroupinfo.hxx b/sc/inc/dpnumgroupinfo.hxx
index 523b792..6989fff 100644
--- a/sc/inc/dpnumgroupinfo.hxx
+++ b/sc/inc/dpnumgroupinfo.hxx
@@ -11,7 +11,7 @@
#define __SC_DPNUMGROUPINFO_HXX__
#include "scdllapi.h"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
struct ScDPNumGroupInfo
{
diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx
index 735b033..bbd3ba8 100644
--- a/sc/inc/dpobject.hxx
+++ b/sc/inc/dpobject.hxx
@@ -26,7 +26,7 @@
#include "dpoutput.hxx"
#include "dptypes.hxx"
#include "pivot.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include <com/sun/star/sheet/XDimensionsSupplier.hpp>
diff --git a/sc/inc/dptabdat.hxx b/sc/inc/dptabdat.hxx
index 22a8ffb..3239a80 100644
--- a/sc/inc/dptabdat.hxx
+++ b/sc/inc/dptabdat.hxx
@@ -24,7 +24,7 @@
#include "dpoutput.hxx"
#include "dpfilteredcache.hxx"
#include "dpcache.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include "svl/zforlist.hxx"
diff --git a/sc/inc/dptabres.hxx b/sc/inc/dptabres.hxx
index e6289be..cab2da8 100644
--- a/sc/inc/dptabres.hxx
+++ b/sc/inc/dptabres.hxx
@@ -22,7 +22,7 @@
#include "global.hxx"
#include "dpfilteredcache.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include <tools/string.hxx>
#include <com/sun/star/sheet/MemberResult.hpp>
diff --git a/sc/inc/mtvelements.hxx b/sc/inc/mtvelements.hxx
index 0ebf8be..ad65418 100644
--- a/sc/inc/mtvelements.hxx
+++ b/sc/inc/mtvelements.hxx
@@ -14,8 +14,7 @@
#include "formulacell.hxx"
#include "svl/broadcast.hxx"
#include "editeng/editobj.hxx"
-
-#define DEBUG_COLUMN_STORAGE 0
+#include "calcmacros.hxx"
#if DEBUG_COLUMN_STORAGE
#ifdef NDEBUG
diff --git a/sc/inc/pivot.hxx b/sc/inc/pivot.hxx
index 85e19e0..12ed637 100644
--- a/sc/inc/pivot.hxx
+++ b/sc/inc/pivot.hxx
@@ -40,7 +40,7 @@
#include "global.hxx"
#include "address.hxx"
#include "dpglobal.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>
diff --git a/sc/source/core/data/dptabsrc.cxx b/sc/source/core/data/dptabsrc.cxx
index c38ee38..76ec9f5 100644
--- a/sc/source/core/data/dptabsrc.cxx
+++ b/sc/source/core/data/dptabsrc.cxx
@@ -45,7 +45,7 @@
#include "dpitemdata.hxx"
#include "dputil.hxx"
#include "dpresfilter.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
diff --git a/sc/source/ui/dbgui/fieldwnd.cxx b/sc/source/ui/dbgui/fieldwnd.cxx
index 3701081..8673e7f 100644
--- a/sc/source/ui/dbgui/fieldwnd.cxx
+++ b/sc/source/ui/dbgui/fieldwnd.cxx
@@ -48,7 +48,7 @@
#include "pvlaydlg.hxx"
#include "dpuiglobal.hxx"
-#include "dpmacros.hxx"
+#include "calcmacros.hxx"
#include "AccessibleDataPilotControl.hxx"
#include "scresid.hxx"
#include "pivot.hrc"
commit e5bbf11028d524a5282e4ce1525cde41c2b1afa5
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 13:28:31 2013 -0400
Ensure that the group calculation path won't get called when it's disabled.
Change-Id: I0ea45616558bebf99c63862a0458776c67789bbc
diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx
index 2938009..c4c1409 100644
--- a/sc/source/core/data/documen9.cxx
+++ b/sc/source/core/data/documen9.cxx
@@ -690,11 +690,7 @@ void ScDocument::ApplyAsianEditSettings( ScEditEngineDefaulter& rEngine )
void ScDocument::RebuildFormulaGroups()
{
- bool bEnableFormulaGroups;
-
- bEnableFormulaGroups = ScInterpreter::GetGlobalConfig().mbOpenCLEnabled;
-
- if ( !bEnableFormulaGroups )
+ if (!ScInterpreter::GetGlobalConfig().mbOpenCLEnabled)
return;
SCTAB nTab;
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 26d7ee5..f2d72da 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3084,6 +3084,9 @@ public:
bool ScFormulaCell::InterpretFormulaGroup()
{
+ if (!ScInterpreter::GetGlobalConfig().mbOpenCLEnabled)
+ return false;
+
// Re-build formulae groups if necessary - ideally this is done at
// import / insert / delete etc. and is integral to the data structures
pDocument->RebuildFormulaGroups();
commit 94040c2034ed657b2c4d4d24c8d92ab7c9caadfd
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 11:50:25 2013 -0400
ResolveStaticReference() to also dynamically recalc formula cells.
Change-Id: If42e5105be0e6db7c63d7c4e7c43de23716d6cbf
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 82990ab..a7056d0 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1859,13 +1859,10 @@ formula::FormulaTokenRef ScColumn::ResolveStaticReference( SCROW nRow )
case sc::element_type_formula:
{
ScFormulaCell* p = sc::formula_block::at(*it->data, aPos.second);
- if (p->GetDirty())
- // Dirty formula cell is not considered static (for now).
- // Return null token. Later we will switch to dynamically
- // interpreting all dirty formula cells.
- return formula::FormulaTokenRef();
+ if (p->IsValue())
+ return formula::FormulaTokenRef(new formula::FormulaDoubleToken(p->GetValue()));
- return formula::FormulaTokenRef(new formula::FormulaDoubleToken(p->GetResultDouble()));
+ return formula::FormulaTokenRef(new formula::FormulaStringToken(p->GetString()));
}
case sc::element_type_empty:
default:
@@ -1881,28 +1878,34 @@ class ToMatrixHandler
ScMatrix& mrMat;
SCCOL mnMatCol;
SCROW mnTopRow;
- bool mbSuccess;
public:
ToMatrixHandler(ScMatrix& rMat, SCCOL nMatCol, SCROW nTopRow) :
- mrMat(rMat), mnMatCol(nMatCol), mnTopRow(nTopRow), mbSuccess(true) {}
+ mrMat(rMat), mnMatCol(nMatCol), mnTopRow(nTopRow) {}
void operator() (size_t nRow, double fVal)
{
mrMat.PutDouble(fVal, mnMatCol, nRow - mnTopRow);
}
- void operator() (size_t nRow, ScFormulaCell* p)
+ void operator() (size_t nRow, const ScFormulaCell* p)
{
- if (p->GetDirty())
- {
- mbSuccess = false;
- return;
- }
+ // Formula cell may need to re-calculate.
+ ScFormulaCell& rCell = const_cast<ScFormulaCell&>(*p);
+ if (rCell.IsValue())
+ mrMat.PutDouble(rCell.GetValue(), mnMatCol, nRow - mnTopRow);
+ else
+ mrMat.PutString(rCell.GetString(), mnMatCol, nRow - mnTopRow);
+ }
- mrMat.PutDouble(p->GetResultDouble(), mnMatCol, nRow - mnTopRow);
+ void operator() (size_t nRow, const OUString& rStr)
+ {
+ mrMat.PutString(rStr, mnMatCol, nRow - mnTopRow);
}
- bool isSuccess() const { return mbSuccess; }
+ void operator() (size_t nRow, const EditTextObject* pStr)
+ {
+ mrMat.PutString(ScEditUtil::GetString(*pStr), mnMatCol, nRow - mnTopRow);
+ }
};
}
@@ -1913,8 +1916,8 @@ bool ScColumn::ResolveStaticReference( ScMatrix& rMat, SCCOL nMatCol, SCROW nRow
return false;
ToMatrixHandler aFunc(rMat, nMatCol, nRow1);
- sc::ProcessFormulaNumeric(maCells.begin(), maCells, nRow1, nRow2, aFunc);
- return aFunc.isSuccess();
+ sc::ParseAllNonEmpty(maCells.begin(), maCells, nRow1, nRow2, aFunc);
+ return true;
}
namespace {
commit f67fa232933e64779f0b3571711e4679214ca521
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Jun 28 11:29:14 2013 -0400
Have FetchDoubleArray() to optionally calculate dependent formula cells.
Change-Id: Ide29df664ff002f9cd8fe3edbf9512dd0cbb9eb6
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index b119d3d..4601ae2 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -471,7 +471,7 @@ public:
formula::FormulaTokenRef ResolveStaticReference( SCROW nRow );
bool ResolveStaticReference( ScMatrix& rMat, SCCOL nMatCol, SCROW nRow1, SCROW nRow2 );
void FillMatrix( ScMatrix& rMat, size_t nMatCol, SCROW nRow1, SCROW nRow2 ) const;
- const double* FetchDoubleArray( sc::FormulaGroupContext& rCxt, SCROW nRow1, SCROW nRow2 ) const;
+ const double* FetchDoubleArray( sc::FormulaGroupContext& rCxt, SCROW nRow1, SCROW nRow2 );
void SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen );
void SetNumberFormat( SCROW nRow, sal_uInt32 nNumberFormat );
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index fd8f61f..8d942b7 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1973,7 +1973,7 @@ public:
formula::FormulaTokenRef ResolveStaticReference( const ScRange& rRange );
const double* FetchDoubleArray(
- sc::FormulaGroupContext& rCxt, const ScAddress& rPos, SCROW nLength ) const;
+ sc::FormulaGroupContext& rCxt, const ScAddress& rPos, SCROW nLength );
SvtBroadcaster* GetBroadcaster( const ScAddress& rPos );
const SvtBroadcaster* GetBroadcaster( const ScAddress& rPos ) const;
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index bae3818..bda039f 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -842,7 +842,7 @@ public:
formula::FormulaTokenRef ResolveStaticReference( SCCOL nCol, SCROW nRow );
formula::FormulaTokenRef ResolveStaticReference( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
const double* FetchDoubleArray(
- sc::FormulaGroupContext& rCxt, SCCOL nCol, SCROW nRow1, SCROW nRow2 ) const;
+ sc::FormulaGroupContext& rCxt, SCCOL nCol, SCROW nRow1, SCROW nRow2 );
ScRefCellValue GetRefCellValue( SCCOL nCol, SCROW nRow );
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 3704c6d..82990ab 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2073,23 +2073,189 @@ void ScColumn::FillMatrix( ScMatrix& rMat, size_t nMatCol, SCROW nRow1, SCROW nR
sc::ParseBlock(maCells.begin(), maCells, aFunc, nRow1, nRow2);
}
-const double* ScColumn::FetchDoubleArray( sc::FormulaGroupContext& /*rCxt*/, SCROW nRow1, SCROW nRow2 ) const
+namespace {
+
+bool appendDouble(
+ sc::FormulaGroupContext::DoubleArrayType& rArray, size_t nLen,
+ sc::CellStoreType::iterator it, const sc::CellStoreType::iterator& itEnd )
{
- // TODO: I'll use the context object later.
- if (nRow1 > nRow2)
- return NULL;
+ size_t nLenRemain = nLen;
+ for (; it != itEnd; ++it)
+ {
+ switch (it->type)
+ {
+ case sc::element_type_numeric:
+ {
+ sc::numeric_block::iterator itData = sc::numeric_block::begin(*it->data);
+ sc::numeric_block::iterator itDataEnd;
+ if (nLenRemain >= it->size)
+ {
+ // Block is shorter than the remaining requested length.
+ itDataEnd = sc::numeric_block::end(*it->data);
+ nLenRemain -= it->size;
+ }
+ else
+ {
+ itDataEnd = itData;
+ std::advance(itDataEnd, nLenRemain);
+ nLenRemain = 0;
+ }
- std::pair<sc::CellStoreType::const_iterator,size_t> aPos = maCells.position(nRow1);
- if (aPos.first->type != sc::element_type_numeric)
- // This is not a numeric cell block.
+ for (; itData != itDataEnd; ++itData)
+ rArray.push_back(*itData);
+ }
+ break;
+ case sc::element_type_formula:
+ {
+ sc::formula_block::iterator itData = sc::formula_block::begin(*it->data);
+ sc::formula_block::iterator itDataEnd;
+ if (nLenRemain >= it->size)
+ {
+ // Block is shorter than the remaining requested length.
+ itDataEnd = sc::formula_block::end(*it->data);
+ nLenRemain -= it->size;
+ }
+ else
+ {
+ itDataEnd = itData;
+ std::advance(itDataEnd, nLenRemain);
+ nLenRemain = 0;
+ }
+
+ for (; itData != itDataEnd; ++itData)
+ {
+ ScFormulaCell& rFC = **itData;
+ rArray.push_back(rFC.GetValue());
+ }
+ }
+ break;
+ case sc::element_type_empty:
+ {
+ // Fill it with 0's.
+ if (nLenRemain >= it->size)
+ {
+ rArray.resize(rArray.size() + it->size, 0);
+ nLenRemain -= it->size;
+ }
+ else
+ {
+ rArray.resize(rArray.size() + nLenRemain, 0);
+ nLenRemain = 0;
+ }
+ }
+ break;
+ case sc::element_type_string:
+ case sc::element_type_edittext:
+ default:
+ return false;
+ }
+
+ if (!nLenRemain)
+ return true;
+ }
+
+ return false;
+}
+
+}
+
+const double* ScColumn::FetchDoubleArray( sc::FormulaGroupContext& rCxt, SCROW nRow1, SCROW nRow2 )
+{
+ if (nRow1 > nRow2)
return NULL;
+ size_t nLenRequested = nRow2 - nRow1 + 1;
+ sc::CellStoreType::position_type aPos = maCells.position(nRow1);
size_t nLen = aPos.first->size - aPos.second;
- if (static_cast<SCROW>(nLen) < nRow2 - nRow1 + 1)
- // Array shorter than requested.
- return NULL;
+ switch (aPos.first->type)
+ {
+ case sc::element_type_numeric:
+ {
+ // This is a numeric cell block.
+ if (nLenRequested <= nLen)
+ // Requested length fits a single block.
+ return &sc::numeric_block::at(*aPos.first->data, aPos.second);
+
+ // Allocate a new array and copy the values to it.
+ sc::numeric_block::const_iterator it = sc::numeric_block::begin(*aPos.first->data);
+ sc::numeric_block::const_iterator itEnd = sc::numeric_block::end(*aPos.first->data);
+ std::advance(it, aPos.second);
+ rCxt.maArrays.push_back(new sc::FormulaGroupContext::DoubleArrayType(it, itEnd));
+ sc::FormulaGroupContext::DoubleArrayType& rArray = rCxt.maArrays.back();
+ rArray.reserve(nLenRequested);
+
+ // Fill the remaining array with values from the following blocks.
+ ++aPos.first;
+ if (!appendDouble(rArray, nLenRequested - nLen, aPos.first, maCells.end()))
+ return NULL;
+
+ return &rArray[0];
+ }
+ break;
+ case sc::element_type_formula:
+ {
+ rCxt.maArrays.push_back(new sc::FormulaGroupContext::DoubleArrayType);
+ sc::FormulaGroupContext::DoubleArrayType& rArray = rCxt.maArrays.back();
+ rArray.reserve(nLenRequested);
+
+ sc::formula_block::const_iterator it = sc::formula_block::begin(*aPos.first->data);
+ sc::formula_block::const_iterator itEnd;
+ if (nLenRequested <= nLen)
+ {
+ // Requested length is within a single block.
+ itEnd = it;
+ std::advance(itEnd, nLenRequested);
+ for (; it != itEnd; ++it)
+ {
+ ScFormulaCell& rCell = **it;
+ rArray.push_back(rCell.GetValue()); // the cell may be interpreted.
+ }
+
+ return &rArray[0];
+ }
+
+ itEnd = sc::formula_block::end(*aPos.first->data);
+ std::advance(itEnd, nLenRequested);
+ for (; it != itEnd; ++it)
+ {
+ ScFormulaCell& rCell = **it;
+ rArray.push_back(rCell.GetValue()); // the cell may be interpreted.
+ }
+
+ // Fill the remaining array with values from the following blocks.
+ ++aPos.first;
+ if (!appendDouble(rArray, nLenRequested - nLen, aPos.first, maCells.end()))
+ return NULL;
+
+ return &rArray[0];
+ }
+ break;
+ case sc::element_type_empty:
+ {
+ if (nLenRequested <= nLen)
+ {
+ // Fill the whole length with zero.
+ rCxt.maArrays.push_back(new sc::FormulaGroupContext::DoubleArrayType(nLenRequested, 0.0));
+ return &rCxt.maArrays.back()[0];
+ }
+
+ // Fill the array with zero for the length of the empty block.
+ rCxt.maArrays.push_back(new sc::FormulaGroupContext::DoubleArrayType(nLen, 0.0));
+ sc::FormulaGroupContext::DoubleArrayType& rArray = rCxt.maArrays.back();
+ rArray.reserve(nLenRequested);
+
+ // Fill the remaining array with values from the following blocks.
+ ++aPos.first;
+ if (!appendDouble(rArray, nLenRequested - nLen, aPos.first, maCells.end()))
+ return NULL;
+
+ return &rArray[0];
+ }
+ default:
+ ;
+ }
- return &sc::numeric_block::at(*aPos.first->data, aPos.second);
+ return NULL;
}
void ScColumn::SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen )
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 3ed67c3..3ce424f 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -1609,7 +1609,7 @@ formula::FormulaTokenRef ScDocument::ResolveStaticReference( const ScRange& rRan
}
const double* ScDocument::FetchDoubleArray(
- sc::FormulaGroupContext& rCxt, const ScAddress& rPos, SCROW nLength ) const
+ sc::FormulaGroupContext& rCxt, const ScAddress& rPos, SCROW nLength )
{
SCTAB nTab = rPos.Tab();
if (!TableExists(nTab))
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 2ade13b..26d7ee5 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -2941,13 +2941,13 @@ namespace {
class GroupTokenConverter
{
- sc::FormulaGroupContext maCxt;
+ sc::FormulaGroupContext& mrCxt;
ScTokenArray& mrGroupTokens;
ScDocument& mrDoc;
ScFormulaCell& mrCell;
public:
- GroupTokenConverter(ScTokenArray& rGroupTokens, ScDocument& rDoc, ScFormulaCell& rCell) :
- mrGroupTokens(rGroupTokens), mrDoc(rDoc), mrCell(rCell) {}
+ GroupTokenConverter(sc::FormulaGroupContext& rCxt, ScTokenArray& rGroupTokens, ScDocument& rDoc, ScFormulaCell& rCell) :
+ mrCxt(rCxt), mrGroupTokens(rGroupTokens), mrDoc(rDoc), mrCell(rCell) {}
bool convert(ScTokenArray& rCode)
{
@@ -2978,7 +2978,7 @@ public:
// we finish cell storage rework, we'll support temporary
// generation of a double array which is a combination of
// multiple cell array segments.
- const double* pArray = mrDoc.FetchDoubleArray(maCxt, aRefPos, mrCell.GetCellGroup()->mnLength);
+ const double* pArray = mrDoc.FetchDoubleArray(mrCxt, aRefPos, mrCell.GetCellGroup()->mnLength);
if (!pArray)
return false;
@@ -3020,7 +3020,7 @@ public:
for (SCCOL i = aRef.Ref1.nCol; i <= aRef.Ref2.nCol; ++i)
{
aRefPos.SetCol(i);
- const double* pArray = mrDoc.FetchDoubleArray(maCxt, aRefPos, nArrayLength);
+ const double* pArray = mrDoc.FetchDoubleArray(mrCxt, aRefPos, nArrayLength);
if (!pArray)
return false;
@@ -3108,9 +3108,8 @@ bool ScFormulaCell::InterpretFormulaGroup()
return InterpretInvariantFormulaGroup();
sc::FormulaGroupContext aCxt;
-
ScTokenArray aCode;
- GroupTokenConverter aConverter(aCode, *pDocument, *this);
+ GroupTokenConverter aConverter(aCxt, aCode, *pDocument, *this);
if (!aConverter.convert(*pCode))
return false;
return sc::FormulaGroupInterpreter::getStatic()->interpret(*pDocument, aPos, xGroup, aCode);
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 2d90fa9..dcd0344 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -2156,7 +2156,7 @@ formula::FormulaTokenRef ScTable::ResolveStaticReference( SCCOL nCol1, SCROW nRo
}
const double* ScTable::FetchDoubleArray(
- sc::FormulaGroupContext& rCxt, SCCOL nCol, SCROW nRow1, SCROW nRow2 ) const
+ sc::FormulaGroupContext& rCxt, SCCOL nCol, SCROW nRow1, SCROW nRow2 )
{
if (nRow2 < nRow1)
return NULL;
commit bdd8986ebd82884402b15d5d1d7cf76de37a47c6
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Thu Jun 27 22:23:58 2013 -0400
Test loading of xls and xlsx with shared formulas.
To make sure I won't break this. And I moved the xlsx version of the
test from the slow check to the normal test, which gets run for the normal
build target.
Change-Id: Id65f79796b11c0ab039842f1c1c158e9af310757
diff --git a/sc/qa/unit/data/xls/shared-formula.xls b/sc/qa/unit/data/xls/shared-formula.xls
new file mode 100644
index 0000000..a9be6b7
Binary files /dev/null and b/sc/qa/unit/data/xls/shared-formula.xls differ
diff --git a/sc/qa/unit/data/xlsx/shared-formula.xlsx b/sc/qa/unit/data/xlsx/shared-formula.xlsx
index d1b4f52..64d0501 100644
Binary files a/sc/qa/unit/data/xlsx/shared-formula.xlsx and b/sc/qa/unit/data/xlsx/shared-formula.xlsx differ
diff --git a/sc/qa/unit/filters-test.cxx b/sc/qa/unit/filters-test.cxx
index f82f1eb..dfaecfd 100644
--- a/sc/qa/unit/filters-test.cxx
+++ b/sc/qa/unit/filters-test.cxx
@@ -65,6 +65,8 @@ public:
void testContentXLSX();
void testContentLotus123();
void testContentDIF();
+ void testSharedFormulaXLS();
+ void testSharedFormulaXLSX();
#if TEST_BUG_FILES
//goes recursively through all files in this dir and tries to open them
void testDir(osl::Directory& rDir, sal_Int32 nType);
@@ -83,6 +85,8 @@ public:
CPPUNIT_TEST(testContentXLSX);
CPPUNIT_TEST(testContentLotus123);
CPPUNIT_TEST(testContentDIF);
+ CPPUNIT_TEST(testSharedFormulaXLS);
+ CPPUNIT_TEST(testSharedFormulaXLSX);
CPPUNIT_TEST(testLegacyCellAnchoredRotatedShape);
#if TEST_BUG_FILES
@@ -325,7 +329,39 @@ void ScFiltersTest::testContentDIF()
ScDocument* pDoc = xDocSh->GetDocument();
CPPUNIT_ASSERT(pDoc);
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testSharedFormulaXLS()
+{
+ ScDocShellRef xDocSh = loadDoc("shared-formula.", XLS);
+ ScDocument* pDoc = xDocSh->GetDocument();
+ CPPUNIT_ASSERT(pDoc);
+ xDocSh->DoHardRecalc(true);
+ // Check the results of formula cells in the shared formula range.
+ for (SCROW i = 1; i <= 18; ++i)
+ {
+ double fVal = pDoc->GetValue(ScAddress(1,i,0));
+ double fCheck = i*10.0;
+ CPPUNIT_ASSERT_EQUAL(fCheck, fVal);
+ }
+ xDocSh->DoClose();
+}
+void ScFiltersTest::testSharedFormulaXLSX()
+{
+ ScDocShellRef xDocSh = loadDoc("shared-formula.", XLSX);
+ ScDocument* pDoc = xDocSh->GetDocument();
+ CPPUNIT_ASSERT(pDoc);
+ xDocSh->DoHardRecalc(true);
+ // Check the results of formula cells in the shared formula range.
+ for (SCROW i = 1; i <= 18; ++i)
+ {
+ double fVal = pDoc->GetValue(ScAddress(1,i,0));
+ double fCheck = i*10.0;
+ CPPUNIT_ASSERT_EQUAL(fCheck, fVal);
+ }
+ xDocSh->DoClose();
}
void impl_testLegacyCellAnchoredRotatedShape( ScDocument* pDoc, Rectangle& aRect, ScDrawObjData& aAnchor, long TOLERANCE = 30 /* 30 hmm */ )
diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx
index f53a430..c8bbcf0 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -114,7 +114,6 @@ public:
void testNewCondFormatXLSX();
//change this test file only in excel and not in calc
- void testSharedFormulaXLSX();
void testCellValueXLSX();
//misc tests unrelated to the import filters
@@ -168,7 +167,6 @@ public:
CPPUNIT_TEST(testRepeatedColumnsODS);
CPPUNIT_TEST(testDataValidityODS);
CPPUNIT_TEST(testBrokenQuotesCSV);
- CPPUNIT_TEST(testSharedFormulaXLSX);
CPPUNIT_TEST(testCellValueXLSX);
CPPUNIT_TEST(testControlImport);
CPPUNIT_TEST(testChartImportODS);
@@ -1190,41 +1188,6 @@ void ScFiltersTest::testBrokenQuotesCSV()
xDocSh->DoClose();
}
-void ScFiltersTest::testSharedFormulaXLSX()
-{
- const OUString aFileNameBase("shared-formula.");
- OUString aFileExtension(aFileFormats[XLSX].pName, strlen(aFileFormats[XLSX].pName), RTL_TEXTENCODING_UTF8 );
- OUString aFilterName(aFileFormats[XLSX].pFilterName, strlen(aFileFormats[XLSX].pFilterName), RTL_TEXTENCODING_UTF8) ;
- OUString aFileName;
- createFileURL(aFileNameBase, aFileExtension, aFileName);
- OUString aFilterType(aFileFormats[XLSX].pTypeName, strlen(aFileFormats[XLSX].pTypeName), RTL_TEXTENCODING_UTF8);
- std::cout << aFileFormats[XLSX].pName << " Test" << std::endl;
-
- unsigned int nFormatType = aFileFormats[XLSX].nFormatType;
- unsigned int nClipboardId = nFormatType ? SFX_FILTER_IMPORT | SFX_FILTER_USESOPTIONS : 0;
- ScDocShellRef xDocSh = ScBootstrapFixture::load(aFileName, aFilterName, OUString(), aFilterType,
- nFormatType, nClipboardId, SOFFICE_FILEFORMAT_CURRENT);
-
- xDocSh->DoHardRecalc(true);
-
- CPPUNIT_ASSERT_MESSAGE("Failed to load shared-formula.xlsx", xDocSh.Is());
- ScDocument* pDoc = xDocSh->GetDocument();
- CPPUNIT_ASSERT_MESSAGE("No Document", pDoc); //remove with first test
-
- OUString aCSVPath;
- createCSVPath( aFileNameBase, aCSVPath );
- testFile( aCSVPath, pDoc, 0 );
-
- //test some additional properties
- ScRangeName* pName = pDoc->GetRangeName();
- for (ScRangeName::iterator itr = pName->begin(); itr != pName->end(); ++itr)
- {
- CPPUNIT_ASSERT(itr->second->GetType() & RT_SHARED);
- }
-
- xDocSh->DoClose();
-}
-
void ScFiltersTest::testCellValueXLSX()
{
const OUString aFileNameBase("cell-value.");
commit cb1310356b358137210ea5445500bb2e96847fda
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Thu Jun 27 16:47:17 2013 -0400
We don't need these header includes.
Change-Id: Ia2f7226fa3c7dc5ac98bd23833e67d7262cd8b9b
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 6244eac..b1b3160 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -86,8 +86,6 @@
#include "macromgr.hxx"
#include "formulacell.hxx"
#include "clipcontext.hxx"
-#include "interpre.hxx"
-#include "formulagroup.hxx"
using namespace com::sun::star;
More information about the Libreoffice-commits
mailing list