[Libreoffice-commits] core.git: 18 commits - Repository.mk sc/CppunitTest_sc_filters_test.mk sc/CppunitTest_sc_subsequent_export_test.mk sc/CppunitTest_sc_subsequent_filters_test.mk sc/CppunitTest_sc_ucalc.mk sc/inc sc/Library_scqahelper.mk sc/Module_sc.mk sc/qa sc/source
Kohei Yoshida
kohei.yoshida at gmail.com
Mon Jul 8 19:00:55 PDT 2013
Repository.mk | 1
sc/CppunitTest_sc_filters_test.mk | 1
sc/CppunitTest_sc_subsequent_export_test.mk | 1
sc/CppunitTest_sc_subsequent_filters_test.mk | 1
sc/CppunitTest_sc_ucalc.mk | 2
sc/Library_scqahelper.mk | 48 ++
sc/Module_sc.mk | 1
sc/inc/column.hxx | 7
sc/qa/unit/filters-test.cxx | 1
sc/qa/unit/helper/csv_handler.hxx | 9
sc/qa/unit/helper/debughelper.hxx | 13
sc/qa/unit/helper/qahelper.cxx | 261 ++++++++++++++++
sc/qa/unit/helper/qahelper.hxx | 276 ++---------------
sc/qa/unit/subsequent_export-test.cxx | 3
sc/qa/unit/subsequent_filters-test.cxx | 1
sc/qa/unit/ucalc.cxx | 433 ---------------------------
sc/qa/unit/ucalc.hxx | 306 +++++++++++++++++++
sc/qa/unit/ucalc_sharedformula.cxx | 227 ++++++++++++++
sc/source/core/data/column.cxx | 143 ++++++--
sc/source/core/data/column2.cxx | 33 +-
sc/source/core/data/column3.cxx | 173 +++++++---
sc/source/core/data/formulacell.cxx | 62 +--
22 files changed, 1193 insertions(+), 810 deletions(-)
New commits:
commit 3e4b2a787813bccfc7eead9e502732062173d124
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 20:08:22 2013 -0400
Fix linking problem with subsequent_filters-test.
Change-Id: I5ccf8792ce0d3ffa9a0dffc1bc8976fe029808ab
diff --git a/sc/qa/unit/helper/qahelper.hxx b/sc/qa/unit/helper/qahelper.hxx
index 31e00a8..efbd3b9 100644
--- a/sc/qa/unit/helper/qahelper.hxx
+++ b/sc/qa/unit/helper/qahelper.hxx
@@ -71,7 +71,7 @@ struct FileFormat {
const char* pName; const char* pFilterName; const char* pTypeName; unsigned int nFormatType;
};
-extern FileFormat aFileFormats[];
+SC_DLLPUBLIC extern FileFormat aFileFormats[];
// Why is this here and not in osl, and using the already existing file
// handling APIs? Do we really want to add arbitrary new file handling
commit 100c0f885be5c1b308ad13e60b56060d59bc7100
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 18:28:43 2013 -0400
Split ucalc.cxx into multiple source files.
Change-Id: Ic46dcc8cb415fd3ea9062d477260cb6f120fb815
diff --git a/sc/CppunitTest_sc_ucalc.mk b/sc/CppunitTest_sc_ucalc.mk
index 702117f..8ab28b1 100644
--- a/sc/CppunitTest_sc_ucalc.mk
+++ b/sc/CppunitTest_sc_ucalc.mk
@@ -13,6 +13,7 @@ $(eval $(call gb_CppunitTest_CppunitTest,sc_ucalc))
$(eval $(call gb_CppunitTest_add_exception_objects,sc_ucalc, \
sc/qa/unit/ucalc \
+ sc/qa/unit/ucalc_sharedformula \
))
$(eval $(call gb_CppunitTest_use_library_objects,sc_ucalc,sc))
diff --git a/sc/qa/unit/helper/qahelper.cxx b/sc/qa/unit/helper/qahelper.cxx
index b330f2c..ee806bc 100644
--- a/sc/qa/unit/helper/qahelper.cxx
+++ b/sc/qa/unit/helper/qahelper.cxx
@@ -14,6 +14,16 @@
#include <fstream>
+FileFormat aFileFormats[] = {
+ { "ods" , "calc8", "", ODS_FORMAT_TYPE },
+ { "xls" , "MS Excel 97", "calc_MS_EXCEL_97", XLS_FORMAT_TYPE },
+ { "xlsx", "Calc MS Excel 2007 XML" , "MS Excel 2007 XML", XLSX_FORMAT_TYPE },
+ { "csv" , "Text - txt - csv (StarCalc)", "generic_Text", CSV_FORMAT_TYPE },
+ { "html" , "calc_HTML_WebQuery", "generic_HTML", HTML_FORMAT_TYPE },
+ { "123" , "Lotus", "calc_Lotus", LOTUS123_FORMAT_TYPE },
+ { "dif", "DIF", "calc_DIF", DIF_FORMAT_TYPE },
+};
+
bool testEqualsWithTolerance( long nVal1, long nVal2, long nTol )
{
return ( labs( nVal1 - nVal2 ) <= nTol );
diff --git a/sc/qa/unit/helper/qahelper.hxx b/sc/qa/unit/helper/qahelper.hxx
index b01a581..31e00a8 100644
--- a/sc/qa/unit/helper/qahelper.hxx
+++ b/sc/qa/unit/helper/qahelper.hxx
@@ -71,15 +71,7 @@ struct FileFormat {
const char* pName; const char* pFilterName; const char* pTypeName; unsigned int nFormatType;
};
-FileFormat aFileFormats[] = {
- { "ods" , "calc8", "", ODS_FORMAT_TYPE },
- { "xls" , "MS Excel 97", "calc_MS_EXCEL_97", XLS_FORMAT_TYPE },
- { "xlsx", "Calc MS Excel 2007 XML" , "MS Excel 2007 XML", XLSX_FORMAT_TYPE },
- { "csv" , "Text - txt - csv (StarCalc)", "generic_Text", CSV_FORMAT_TYPE },
- { "html" , "calc_HTML_WebQuery", "generic_HTML", HTML_FORMAT_TYPE },
- { "123" , "Lotus", "calc_Lotus", LOTUS123_FORMAT_TYPE },
- { "dif", "DIF", "calc_DIF", DIF_FORMAT_TYPE },
-};
+extern FileFormat aFileFormats[];
// Why is this here and not in osl, and using the already existing file
// handling APIs? Do we really want to add arbitrary new file handling
@@ -94,7 +86,9 @@ SC_DLLPUBLIC void testFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab, St
//need own handler because conditional formatting strings must be generated
SC_DLLPUBLIC void testCondFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab);
-std::string print(const ScAddress& rAddr)
+SC_DLLPUBLIC void clearRange(ScDocument* pDoc, const ScRange& rRange);
+
+inline std::string print(const ScAddress& rAddr)
{
std::ostringstream str;
str << "Col: " << rAddr.Col();
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index f05872f..8b2f6da 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -54,7 +54,6 @@
#include "tokenarray.hxx"
#include "scopetools.hxx"
#include "dociter.hxx"
-#include "editutil.hxx"
#include "formula/IFunctionDescription.hxx"
@@ -80,309 +79,7 @@
#include <sstream>
#include <vector>
-#include "helper/qahelper.hxx"
-
-using namespace ::com::sun::star;
-
-using ::std::cout;
-using ::std::cerr;
-using ::std::endl;
-using ::std::vector;
-
-namespace {
-
-class Test : public test::BootstrapFixture {
-public:
- Test();
-
- virtual void setUp();
- virtual void tearDown();
-
- /**
- * Basic performance regression test. Pick some actions that *should* take
- * only a fraction of a second to complete, and make sure they stay that
- * way. We set the threshold to 1 second for each action which should be
- * large enough to accommodate slower machines or machines with high load.
- */
- void testPerf();
- void testCollator();
- void testRangeList();
- void testInput();
- void testFormulaHashAndTag();
- void testFuncSUM();
- void testFuncPRODUCT();
- void testFuncN();
- void testFuncCOUNTIF();
- void testFuncNUMBERVALUE();
- void testFuncVLOOKUP();
- void testFuncMATCH();
- void testFuncCELL();
- void testFuncDATEDIF();
- void testFuncINDIRECT();
- void testFuncIFERROR();
- void testCopyToDocument();
- /**
- * Make sure the SHEETS function gets properly updated during sheet
- * insertion and removal.
- */
- void testSheetsFunc();
- void testVolatileFunc();
-
- void testHorizontalIterator();
-
- /**
- * Basic test for formula dependency tracking.
- */
- void testFormulaDepTracking();
-
- /**
- * Another test for formula dependency tracking, inspired by fdo#56278.
- */
- void testFormulaDepTracking2();
-
- /**
- * More direct test for cell broadcaster management, used to track formula
- * dependencies.
- */
- void testCellBroadcaster();
-
- void testFuncParam();
- void testNamedRange();
- void testCSV();
- void testMatrix();
- void testEnterMixedMatrix();
-
- /**
- * Basic test for pivot tables.
- */
- void testPivotTable();
-
- /**
- * Test against unwanted automatic format detection on field names and
- * field members in pivot tables.
- */
- void testPivotTableLabels();
-
- /**
- * Make sure that we set cells displaying date values numeric cells,
- * rather than text cells. Grouping by date or number functionality
- * depends on this.
- */
- void testPivotTableDateLabels();
-
- /**
- * Test for pivot table's filtering functionality by page fields.
- */
- void testPivotTableFilters();
-
- /**
- * Test for pivot table's named source range.
- */
- void testPivotTableNamedSource();
-
- /**
- * Test for pivot table cache. Each dimension in the pivot cache stores
- * only unique values that are sorted in ascending order.
- */
- void testPivotTableCache();
-
- /**
- * Test for pivot table containing data fields that reference the same
- * source field but different functions.
- */
- void testPivotTableDuplicateDataFields();
-
- void testPivotTableNormalGrouping();
- void testPivotTableNumberGrouping();
- void testPivotTableDateGrouping();
- void testPivotTableEmptyRows();
- void testPivotTableTextNumber();
-
- /**
- * Test for checking that pivot table treats strings in a case insensitive
- * manner.
- */
- void testPivotTableCaseInsensitiveStrings();
-
- /**
- * Test for pivot table's handling of double-precision numbers that are
- * very close together.
- */
- void testPivotTableNumStability();
-
- /**
- * Test for pivot table that include field with various non-default field
- * refrences.
- */
- void testPivotTableFieldReference();
-
- /**
- * Test pivot table functionality performed via ScDBDocFunc.
- */
- void testPivotTableDocFunc();
-
- void testSheetCopy();
- void testSheetMove();
- void testExternalRef();
- void testExternalRefFunctions();
- void testDataArea();
- void testAutofilter();
- void testCopyPaste();
- void testMergedCells();
- void testUpdateReference();
- void testSearchCells();
- void testSharedFormulas();
- void testFormulaPosition();
-
- /**
- * Make sure the sheet streams are invalidated properly.
- */
- void testStreamValid();
-
- /**
- * Test built-in cell functions to make sure their categories and order
- * are correct.
- */
- void testFunctionLists();
-
- void testGraphicsInGroup();
- void testGraphicsOnSheetMove();
-
- void testPostIts();
-
- /**
- * Test toggling relative/absolute flag of cell and cell range references.
- * This corresponds with hitting Shift-F4 while the cursor is on a formula
- * cell.
- */
- void testToggleRefFlag();
-
- /**
- * Test to make sure correct precedent / dependent cells are obtained when
- * preparing to jump to them.
- */
- void testJumpToPrecedentsDependents();
-
- void testSetBackgroundColor();
- void testRenameTable();
-
- void testAutoFill();
- void testCopyPasteFormulas();
- void testCopyPasteFormulasExternalDoc();
-
- void testFindAreaPosVertical();
- void testFindAreaPosColRight();
- void testSort();
- void testSortWithFormulaRefs();
- void testShiftCells();
- void testDeleteRow();
- void testDeleteCol();
- void testAnchoredRotatedShape();
- void testCellTextWidth();
-
- /**
- * Test formula & formula grouping
- */
- void testFormulaGrouping();
- void testCondFormatINSDEL();
-
- CPPUNIT_TEST_SUITE(Test);
-#if CALC_TEST_PERF
- CPPUNIT_TEST(testPerf);
-#endif
- CPPUNIT_TEST(testCollator);
- CPPUNIT_TEST(testRangeList);
- CPPUNIT_TEST(testInput);
- CPPUNIT_TEST(testFormulaHashAndTag);
- CPPUNIT_TEST(testFuncSUM);
- CPPUNIT_TEST(testFuncPRODUCT);
- CPPUNIT_TEST(testFuncN);
- CPPUNIT_TEST(testFuncCOUNTIF);
- CPPUNIT_TEST(testFuncNUMBERVALUE);
- CPPUNIT_TEST(testFuncVLOOKUP);
- CPPUNIT_TEST(testFuncMATCH);
- CPPUNIT_TEST(testFuncCELL);
- CPPUNIT_TEST(testFuncDATEDIF);
- CPPUNIT_TEST(testFuncINDIRECT);
- CPPUNIT_TEST(testFuncIFERROR);
- CPPUNIT_TEST(testCopyToDocument);
- CPPUNIT_TEST(testSheetsFunc);
- CPPUNIT_TEST(testVolatileFunc);
- CPPUNIT_TEST(testHorizontalIterator);
- CPPUNIT_TEST(testFormulaDepTracking);
- CPPUNIT_TEST(testFormulaDepTracking2);
- CPPUNIT_TEST(testCellBroadcaster);
- CPPUNIT_TEST(testFuncParam);
- CPPUNIT_TEST(testNamedRange);
- CPPUNIT_TEST(testCSV);
- CPPUNIT_TEST(testMatrix);
- CPPUNIT_TEST(testEnterMixedMatrix);
- CPPUNIT_TEST(testPivotTable);
- CPPUNIT_TEST(testPivotTableLabels);
- CPPUNIT_TEST(testPivotTableDateLabels);
- CPPUNIT_TEST(testPivotTableFilters);
- CPPUNIT_TEST(testPivotTableNamedSource);
- CPPUNIT_TEST(testPivotTableCache);
- CPPUNIT_TEST(testPivotTableDuplicateDataFields);
- CPPUNIT_TEST(testPivotTableNormalGrouping);
- CPPUNIT_TEST(testPivotTableNumberGrouping);
- CPPUNIT_TEST(testPivotTableDateGrouping);
- CPPUNIT_TEST(testPivotTableEmptyRows);
- CPPUNIT_TEST(testPivotTableTextNumber);
- CPPUNIT_TEST(testPivotTableCaseInsensitiveStrings);
- CPPUNIT_TEST(testPivotTableNumStability);
- CPPUNIT_TEST(testPivotTableFieldReference);
- CPPUNIT_TEST(testPivotTableDocFunc);
- CPPUNIT_TEST(testSheetCopy);
- CPPUNIT_TEST(testSheetMove);
- CPPUNIT_TEST(testExternalRef);
- CPPUNIT_TEST(testExternalRefFunctions);
- CPPUNIT_TEST(testDataArea);
- CPPUNIT_TEST(testGraphicsInGroup);
- CPPUNIT_TEST(testGraphicsOnSheetMove);
- CPPUNIT_TEST(testPostIts);
- CPPUNIT_TEST(testStreamValid);
- CPPUNIT_TEST(testFunctionLists);
- CPPUNIT_TEST(testToggleRefFlag);
- CPPUNIT_TEST(testAutofilter);
- CPPUNIT_TEST(testCopyPaste);
- CPPUNIT_TEST(testMergedCells);
- CPPUNIT_TEST(testUpdateReference);
- CPPUNIT_TEST(testSearchCells);
- CPPUNIT_TEST(testSharedFormulas);
- CPPUNIT_TEST(testFormulaPosition);
- CPPUNIT_TEST(testJumpToPrecedentsDependents);
- CPPUNIT_TEST(testSetBackgroundColor);
- CPPUNIT_TEST(testRenameTable);
- CPPUNIT_TEST(testAutoFill);
- CPPUNIT_TEST(testCopyPasteFormulas);
- CPPUNIT_TEST(testCopyPasteFormulasExternalDoc);
- CPPUNIT_TEST(testFindAreaPosVertical);
- CPPUNIT_TEST(testFindAreaPosColRight);
- CPPUNIT_TEST(testSort);
- CPPUNIT_TEST(testSortWithFormulaRefs);
- CPPUNIT_TEST(testShiftCells);
- CPPUNIT_TEST(testDeleteRow);
- CPPUNIT_TEST(testDeleteCol);
- CPPUNIT_TEST(testAnchoredRotatedShape);
- CPPUNIT_TEST(testCellTextWidth);
- CPPUNIT_TEST(testFormulaGrouping);
- CPPUNIT_TEST(testCondFormatINSDEL);
- CPPUNIT_TEST_SUITE_END();
-
-private:
- ScDocument *m_pDoc;
- ScDocShellRef m_xDocShRef;
-};
-
-void clearRange(ScDocument* pDoc, const ScRange& rRange)
-{
- ScMarkData aMarkData;
- aMarkData.SetMarkArea(rRange);
- pDoc->DeleteArea(
- rRange.aStart.Col(), rRange.aStart.Row(),
- rRange.aEnd.Col(), rRange.aEnd.Row(), aMarkData, IDF_CONTENTS);
-}
+#include "ucalc.hxx"
void printRange(ScDocument* pDoc, const ScRange& rRange, const char* pCaption)
{
@@ -407,7 +104,7 @@ ScRange insertRangeData(ScDocument* pDoc, const ScAddress& rPos, const char* aDa
aRange.aEnd.SetCol(rPos.Col()+_Size-1);
aRange.aEnd.SetRow(rPos.Row()+nRowCount-1);
- clearRange(pDoc, aRange);
+ Test::clearRange(pDoc, aRange);
for (size_t i = 0; i < _Size; ++i)
{
@@ -4969,8 +4666,8 @@ void Test::testExternalRef()
void testExtRefFuncT(ScDocument* pDoc, ScDocument* pExtDoc)
{
- clearRange(pDoc, ScRange(0, 0, 0, 1, 9, 0));
- clearRange(pExtDoc, ScRange(0, 0, 0, 1, 9, 0));
+ Test::clearRange(pDoc, ScRange(0, 0, 0, 1, 9, 0));
+ Test::clearRange(pExtDoc, ScRange(0, 0, 0, 1, 9, 0));
pExtDoc->SetString(0, 0, 0, OUString("'1.2"));
pExtDoc->SetString(0, 1, 0, OUString("Foo"));
@@ -6313,220 +6010,6 @@ void Test::testSearchCells()
m_pDoc->DeleteTab(0);
}
-void Test::testSharedFormulas()
-{
- m_pDoc->InsertTab(0, "Test");
-
- ScAddress aPos(1, 9, 0); // B10
- m_pDoc->SetString(aPos, "=A10*2"); // Insert into B10.
- const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("Expected to be a non-shared cell.", pFC && !pFC->IsShared());
-
- aPos.SetRow(10); // B11
- m_pDoc->SetString(aPos, "=A11*2");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(9), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
-
- aPos.SetRow(8); // B9
- m_pDoc->SetString(aPos, "=A9*2");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(3), pFC->GetSharedLength());
-
- aPos.SetRow(12); // B13
- m_pDoc->SetString(aPos, "=A13*2");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This formula cell shouldn't be shared yet.", pFC && !pFC->IsShared());
-
- // Insert a formula to B12, and B9:B13 should be shared.
- aPos.SetRow(11); // B12
- m_pDoc->SetString(aPos, "=A12*2");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(5), pFC->GetSharedLength());
-
- // Insert formulas to B15:B16.
- aPos.SetRow(14); // B15
- m_pDoc->SetString(aPos, "=A15*2");
- aPos.SetRow(15); // B16
- m_pDoc->SetString(aPos, "=A16*2");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(14), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
-
- // Insert a formula to B14, and B9:B16 should be shared.
- aPos.SetRow(13); // B14
- m_pDoc->SetString(aPos, "=A14*2");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedLength());
-
- // Insert an incompatible formula to B12, to split the shared range to B9:B11 and B13:B16.
- aPos.SetRow(11); // B12
- m_pDoc->SetString(aPos, "=$A$1*4");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell shouldn't be shared.", pFC && !pFC->IsShared());
-
- aPos.SetRow(8); // B9
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(3), pFC->GetSharedLength());
-
- aPos.SetRow(12); // B13
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(12), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
-
- // Extend B13:B16 to B13:B20.
- aPos.SetRow(16); // B17
- m_pDoc->SetString(aPos, "=A17*2");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A18*2");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A19*2");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A20*2");
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
- // B13:B20 shuld be shared.
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(12), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedLength());
-
- // Empty B19. This should split it into B13:B18, and B20 non-shared.
- aPos.SetRow(18);
- m_pDoc->SetEmptyCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("This cell should have been emptied.", m_pDoc->GetCellType(aPos) == CELLTYPE_NONE);
- aPos.SetRow(12); // B13
- pFC = m_pDoc->GetFormulaCell(aPos);
- // B13:B18 should be shared.
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(12), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(6), pFC->GetSharedLength());
- // B20 shold be non-shared.
- aPos.SetRow(19); // B20
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B20 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_MESSAGE("This cell should be non-shared.", !pFC->IsShared());
-
- // Empty B14, to make B13 non-shared and B15:B18 shared.
- aPos.SetRow(13); // B14
- m_pDoc->SetEmptyCell(aPos);
- aPos.SetRow(12); // B13
- pFC = m_pDoc->GetFormulaCell(aPos);
- // B13 should be non-shared.
- CPPUNIT_ASSERT_MESSAGE("B13 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_MESSAGE("This cell should be non-shared.", !pFC->IsShared());
- // B15:B18 should be shared.
- aPos.SetRow(14); // B15
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(14), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
-
- // Set numeric value to B15, to make B16:B18 shared.
- aPos.SetRow(14);
- m_pDoc->SetValue(aPos, 1.2);
- aPos.SetRow(15);
- pFC = m_pDoc->GetFormulaCell(aPos);
- // B16:B18 should be shared.
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(15), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(3), pFC->GetSharedLength());
-
- // Set string value to B16 to make B17:B18 shared.
- aPos.SetRow(15);
- ScCellValue aCell("Test");
- CPPUNIT_ASSERT_MESSAGE("This should be a string value.", aCell.meType == CELLTYPE_STRING);
- aCell.commit(*m_pDoc, aPos);
- CPPUNIT_ASSERT_EQUAL(*aCell.mpString, m_pDoc->GetString(aPos));
- aPos.SetRow(16);
- pFC = m_pDoc->GetFormulaCell(aPos);
- // B17:B18 should be shared.
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(16), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
-
- // Set edit text to B17. Now B18 should be non-shared.
- ScFieldEditEngine& rEditEngine = m_pDoc->GetEditEngine();
- rEditEngine.SetText("Edit Text");
- aPos.SetRow(16);
- m_pDoc->SetEditText(aPos, rEditEngine.CreateTextObject());
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, m_pDoc->GetCellType(aPos));
- aPos.SetRow(17);
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B18 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_MESSAGE("B18 should be non-shared.", !pFC->IsShared());
-
- // Set up a new group for shared formulas in B2:B10.
- clearRange(m_pDoc, ScRange(0,0,0,2,100,0));
-
- aPos.SetRow(1);
- m_pDoc->SetString(aPos, "=A2*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A3*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A4*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A5*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A6*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A7*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A8*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A9*10");
- aPos.IncRow();
- m_pDoc->SetString(aPos, "=A10*10");
-
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B10 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(9), pFC->GetSharedLength());
-
- // Delete A4:B8. This should splite the grouping to B2:B3 and B9:B10.
- clearRange(m_pDoc, ScRange(0,3,0,1,7,0));
- aPos.SetRow(1);
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
-
- aPos.SetRow(8);
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B9 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
-
- // Delete rows 4:8 and shift row 9 and below up to row 4. This should
- // re-merge the two into a group of B2:B5.
- m_pDoc->DeleteRow(ScRange(0,3,0,MAXCOL,7,0));
- aPos.SetRow(1);
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
-
- // Insert 2 rows at row 4, to split it into B2:B3 and B6:B7.
- m_pDoc->InsertRow(ScRange(0,3,0,MAXCOL,4,0));
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
-
- aPos.SetRow(5);
- pFC = m_pDoc->GetFormulaCell(aPos);
- CPPUNIT_ASSERT_MESSAGE("B6 should be a formula cell.", pFC);
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(5), pFC->GetSharedTopRow());
- CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
-
- m_pDoc->DeleteTab(0);
-}
-
namespace {
bool checkFormulaPosition(ScDocument& rDoc, const ScAddress& rPos)
@@ -7446,10 +6929,17 @@ void Test::testCondFormatINSDEL()
m_pDoc->DeleteTab(0);
}
-CPPUNIT_TEST_SUITE_REGISTRATION(Test);
-
+void Test::clearRange(ScDocument* pDoc, const ScRange& rRange)
+{
+ ScMarkData aMarkData;
+ aMarkData.SetMarkArea(rRange);
+ pDoc->DeleteArea(
+ rRange.aStart.Col(), rRange.aStart.Row(),
+ rRange.aEnd.Col(), rRange.aEnd.Row(), aMarkData, IDF_CONTENTS);
}
+CPPUNIT_TEST_SUITE_REGISTRATION(Test);
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
new file mode 100644
index 0000000..ca5ddcf
--- /dev/null
+++ b/sc/qa/unit/ucalc.hxx
@@ -0,0 +1,306 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef SC_UCALC_HXX
+#define SC_UCALC_HXX
+
+#include "helper/qahelper.hxx"
+
+class Test : public test::BootstrapFixture
+{
+public:
+
+ static void clearRange(ScDocument* pDoc, const ScRange& rRange);
+
+ Test();
+
+ virtual void setUp();
+ virtual void tearDown();
+
+ /**
+ * Basic performance regression test. Pick some actions that *should* take
+ * only a fraction of a second to complete, and make sure they stay that
+ * way. We set the threshold to 1 second for each action which should be
+ * large enough to accommodate slower machines or machines with high load.
+ */
+ void testPerf();
+ void testCollator();
+ void testRangeList();
+ void testInput();
+ void testFormulaHashAndTag();
+ void testFuncSUM();
+ void testFuncPRODUCT();
+ void testFuncN();
+ void testFuncCOUNTIF();
+ void testFuncNUMBERVALUE();
+ void testFuncVLOOKUP();
+ void testFuncMATCH();
+ void testFuncCELL();
+ void testFuncDATEDIF();
+ void testFuncINDIRECT();
+ void testFuncIFERROR();
+ void testCopyToDocument();
+ /**
+ * Make sure the SHEETS function gets properly updated during sheet
+ * insertion and removal.
+ */
+ void testSheetsFunc();
+ void testVolatileFunc();
+
+ void testHorizontalIterator();
+
+ /**
+ * Basic test for formula dependency tracking.
+ */
+ void testFormulaDepTracking();
+
+ /**
+ * Another test for formula dependency tracking, inspired by fdo#56278.
+ */
+ void testFormulaDepTracking2();
+
+ /**
+ * More direct test for cell broadcaster management, used to track formula
+ * dependencies.
+ */
+ void testCellBroadcaster();
+
+ void testFuncParam();
+ void testNamedRange();
+ void testCSV();
+ void testMatrix();
+ void testEnterMixedMatrix();
+
+ /**
+ * Basic test for pivot tables.
+ */
+ void testPivotTable();
+
+ /**
+ * Test against unwanted automatic format detection on field names and
+ * field members in pivot tables.
+ */
+ void testPivotTableLabels();
+
+ /**
+ * Make sure that we set cells displaying date values numeric cells,
+ * rather than text cells. Grouping by date or number functionality
+ * depends on this.
+ */
+ void testPivotTableDateLabels();
+
+ /**
+ * Test for pivot table's filtering functionality by page fields.
+ */
+ void testPivotTableFilters();
+
+ /**
+ * Test for pivot table's named source range.
+ */
+ void testPivotTableNamedSource();
+
+ /**
+ * Test for pivot table cache. Each dimension in the pivot cache stores
+ * only unique values that are sorted in ascending order.
+ */
+ void testPivotTableCache();
+
+ /**
+ * Test for pivot table containing data fields that reference the same
+ * source field but different functions.
+ */
+ void testPivotTableDuplicateDataFields();
+
+ void testPivotTableNormalGrouping();
+ void testPivotTableNumberGrouping();
+ void testPivotTableDateGrouping();
+ void testPivotTableEmptyRows();
+ void testPivotTableTextNumber();
+
+ /**
+ * Test for checking that pivot table treats strings in a case insensitive
+ * manner.
+ */
+ void testPivotTableCaseInsensitiveStrings();
+
+ /**
+ * Test for pivot table's handling of double-precision numbers that are
+ * very close together.
+ */
+ void testPivotTableNumStability();
+
+ /**
+ * Test for pivot table that include field with various non-default field
+ * refrences.
+ */
+ void testPivotTableFieldReference();
+
+ /**
+ * Test pivot table functionality performed via ScDBDocFunc.
+ */
+ void testPivotTableDocFunc();
+
+ void testSheetCopy();
+ void testSheetMove();
+ void testExternalRef();
+ void testExternalRefFunctions();
+ void testDataArea();
+ void testAutofilter();
+ void testCopyPaste();
+ void testMergedCells();
+ void testUpdateReference();
+ void testSearchCells();
+ void testSharedFormulas();
+ void testFormulaPosition();
+
+ /**
+ * Make sure the sheet streams are invalidated properly.
+ */
+ void testStreamValid();
+
+ /**
+ * Test built-in cell functions to make sure their categories and order
+ * are correct.
+ */
+ void testFunctionLists();
+
+ void testGraphicsInGroup();
+ void testGraphicsOnSheetMove();
+
+ void testPostIts();
+
+ /**
+ * Test toggling relative/absolute flag of cell and cell range references.
+ * This corresponds with hitting Shift-F4 while the cursor is on a formula
+ * cell.
+ */
+ void testToggleRefFlag();
+
+ /**
+ * Test to make sure correct precedent / dependent cells are obtained when
+ * preparing to jump to them.
+ */
+ void testJumpToPrecedentsDependents();
+
+ void testSetBackgroundColor();
+ void testRenameTable();
+
+ void testAutoFill();
+ void testCopyPasteFormulas();
+ void testCopyPasteFormulasExternalDoc();
+
+ void testFindAreaPosVertical();
+ void testFindAreaPosColRight();
+ void testSort();
+ void testSortWithFormulaRefs();
+ void testShiftCells();
+ void testDeleteRow();
+ void testDeleteCol();
+ void testAnchoredRotatedShape();
+ void testCellTextWidth();
+
+ /**
+ * Test formula & formula grouping
+ */
+ void testFormulaGrouping();
+ void testCondFormatINSDEL();
+
+ CPPUNIT_TEST_SUITE(Test);
+#if CALC_TEST_PERF
+ CPPUNIT_TEST(testPerf);
+#endif
+ CPPUNIT_TEST(testCollator);
+ CPPUNIT_TEST(testRangeList);
+ CPPUNIT_TEST(testInput);
+ CPPUNIT_TEST(testFormulaHashAndTag);
+ CPPUNIT_TEST(testFuncSUM);
+ CPPUNIT_TEST(testFuncPRODUCT);
+ CPPUNIT_TEST(testFuncN);
+ CPPUNIT_TEST(testFuncCOUNTIF);
+ CPPUNIT_TEST(testFuncNUMBERVALUE);
+ CPPUNIT_TEST(testFuncVLOOKUP);
+ CPPUNIT_TEST(testFuncMATCH);
+ CPPUNIT_TEST(testFuncCELL);
+ CPPUNIT_TEST(testFuncDATEDIF);
+ CPPUNIT_TEST(testFuncINDIRECT);
+ CPPUNIT_TEST(testFuncIFERROR);
+ CPPUNIT_TEST(testCopyToDocument);
+ CPPUNIT_TEST(testSheetsFunc);
+ CPPUNIT_TEST(testVolatileFunc);
+ CPPUNIT_TEST(testHorizontalIterator);
+ CPPUNIT_TEST(testFormulaDepTracking);
+ CPPUNIT_TEST(testFormulaDepTracking2);
+ CPPUNIT_TEST(testCellBroadcaster);
+ CPPUNIT_TEST(testFuncParam);
+ CPPUNIT_TEST(testNamedRange);
+ CPPUNIT_TEST(testCSV);
+ CPPUNIT_TEST(testMatrix);
+ CPPUNIT_TEST(testEnterMixedMatrix);
+ CPPUNIT_TEST(testPivotTable);
+ CPPUNIT_TEST(testPivotTableLabels);
+ CPPUNIT_TEST(testPivotTableDateLabels);
+ CPPUNIT_TEST(testPivotTableFilters);
+ CPPUNIT_TEST(testPivotTableNamedSource);
+ CPPUNIT_TEST(testPivotTableCache);
+ CPPUNIT_TEST(testPivotTableDuplicateDataFields);
+ CPPUNIT_TEST(testPivotTableNormalGrouping);
+ CPPUNIT_TEST(testPivotTableNumberGrouping);
+ CPPUNIT_TEST(testPivotTableDateGrouping);
+ CPPUNIT_TEST(testPivotTableEmptyRows);
+ CPPUNIT_TEST(testPivotTableTextNumber);
+ CPPUNIT_TEST(testPivotTableCaseInsensitiveStrings);
+ CPPUNIT_TEST(testPivotTableNumStability);
+ CPPUNIT_TEST(testPivotTableFieldReference);
+ CPPUNIT_TEST(testPivotTableDocFunc);
+ CPPUNIT_TEST(testSheetCopy);
+ CPPUNIT_TEST(testSheetMove);
+ CPPUNIT_TEST(testExternalRef);
+ CPPUNIT_TEST(testExternalRefFunctions);
+ CPPUNIT_TEST(testDataArea);
+ CPPUNIT_TEST(testGraphicsInGroup);
+ CPPUNIT_TEST(testGraphicsOnSheetMove);
+ CPPUNIT_TEST(testPostIts);
+ CPPUNIT_TEST(testStreamValid);
+ CPPUNIT_TEST(testFunctionLists);
+ CPPUNIT_TEST(testToggleRefFlag);
+ CPPUNIT_TEST(testAutofilter);
+ CPPUNIT_TEST(testCopyPaste);
+ CPPUNIT_TEST(testMergedCells);
+ CPPUNIT_TEST(testUpdateReference);
+ CPPUNIT_TEST(testSearchCells);
+ CPPUNIT_TEST(testSharedFormulas);
+ CPPUNIT_TEST(testFormulaPosition);
+ CPPUNIT_TEST(testJumpToPrecedentsDependents);
+ CPPUNIT_TEST(testSetBackgroundColor);
+ CPPUNIT_TEST(testRenameTable);
+ CPPUNIT_TEST(testAutoFill);
+ CPPUNIT_TEST(testCopyPasteFormulas);
+ CPPUNIT_TEST(testCopyPasteFormulasExternalDoc);
+ CPPUNIT_TEST(testFindAreaPosVertical);
+ CPPUNIT_TEST(testFindAreaPosColRight);
+ CPPUNIT_TEST(testSort);
+ CPPUNIT_TEST(testSortWithFormulaRefs);
+ CPPUNIT_TEST(testShiftCells);
+ CPPUNIT_TEST(testDeleteRow);
+ CPPUNIT_TEST(testDeleteCol);
+ CPPUNIT_TEST(testAnchoredRotatedShape);
+ CPPUNIT_TEST(testCellTextWidth);
+ CPPUNIT_TEST(testFormulaGrouping);
+ CPPUNIT_TEST(testCondFormatINSDEL);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ ScDocument *m_pDoc;
+ ScDocShellRef m_xDocShRef;
+};
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/ucalc_sharedformula.cxx b/sc/qa/unit/ucalc_sharedformula.cxx
new file mode 100644
index 0000000..3025b52
--- /dev/null
+++ b/sc/qa/unit/ucalc_sharedformula.cxx
@@ -0,0 +1,227 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ucalc.hxx"
+#include "editutil.hxx"
+
+void Test::testSharedFormulas()
+{
+ m_pDoc->InsertTab(0, "Test");
+
+ ScAddress aPos(1, 9, 0); // B10
+ m_pDoc->SetString(aPos, "=A10*2"); // Insert into B10.
+ const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("Expected to be a non-shared cell.", pFC && !pFC->IsShared());
+
+ aPos.SetRow(10); // B11
+ m_pDoc->SetString(aPos, "=A11*2");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(9), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ aPos.SetRow(8); // B9
+ m_pDoc->SetString(aPos, "=A9*2");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(3), pFC->GetSharedLength());
+
+ aPos.SetRow(12); // B13
+ m_pDoc->SetString(aPos, "=A13*2");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This formula cell shouldn't be shared yet.", pFC && !pFC->IsShared());
+
+ // Insert a formula to B12, and B9:B13 should be shared.
+ aPos.SetRow(11); // B12
+ m_pDoc->SetString(aPos, "=A12*2");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(5), pFC->GetSharedLength());
+
+ // Insert formulas to B15:B16.
+ aPos.SetRow(14); // B15
+ m_pDoc->SetString(aPos, "=A15*2");
+ aPos.SetRow(15); // B16
+ m_pDoc->SetString(aPos, "=A16*2");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(14), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ // Insert a formula to B14, and B9:B16 should be shared.
+ aPos.SetRow(13); // B14
+ m_pDoc->SetString(aPos, "=A14*2");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedLength());
+
+ // Insert an incompatible formula to B12, to split the shared range to B9:B11 and B13:B16.
+ aPos.SetRow(11); // B12
+ m_pDoc->SetString(aPos, "=$A$1*4");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell shouldn't be shared.", pFC && !pFC->IsShared());
+
+ aPos.SetRow(8); // B9
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(3), pFC->GetSharedLength());
+
+ aPos.SetRow(12); // B13
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(12), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
+
+ // Extend B13:B16 to B13:B20.
+ aPos.SetRow(16); // B17
+ m_pDoc->SetString(aPos, "=A17*2");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A18*2");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A19*2");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A20*2");
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell is expected to be a shared formula cell.", pFC && pFC->IsShared());
+ // B13:B20 shuld be shared.
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(12), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedLength());
+
+ // Empty B19. This should split it into B13:B18, and B20 non-shared.
+ aPos.SetRow(18);
+ m_pDoc->SetEmptyCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("This cell should have been emptied.", m_pDoc->GetCellType(aPos) == CELLTYPE_NONE);
+ aPos.SetRow(12); // B13
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ // B13:B18 should be shared.
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(12), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(6), pFC->GetSharedLength());
+ // B20 shold be non-shared.
+ aPos.SetRow(19); // B20
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B20 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_MESSAGE("This cell should be non-shared.", !pFC->IsShared());
+
+ // Empty B14, to make B13 non-shared and B15:B18 shared.
+ aPos.SetRow(13); // B14
+ m_pDoc->SetEmptyCell(aPos);
+ aPos.SetRow(12); // B13
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ // B13 should be non-shared.
+ CPPUNIT_ASSERT_MESSAGE("B13 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_MESSAGE("This cell should be non-shared.", !pFC->IsShared());
+ // B15:B18 should be shared.
+ aPos.SetRow(14); // B15
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(14), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
+
+ // Set numeric value to B15, to make B16:B18 shared.
+ aPos.SetRow(14);
+ m_pDoc->SetValue(aPos, 1.2);
+ aPos.SetRow(15);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ // B16:B18 should be shared.
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(15), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(3), pFC->GetSharedLength());
+
+ // Set string value to B16 to make B17:B18 shared.
+ aPos.SetRow(15);
+ ScCellValue aCell("Test");
+ CPPUNIT_ASSERT_MESSAGE("This should be a string value.", aCell.meType == CELLTYPE_STRING);
+ aCell.commit(*m_pDoc, aPos);
+ CPPUNIT_ASSERT_EQUAL(*aCell.mpString, m_pDoc->GetString(aPos));
+ aPos.SetRow(16);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ // B17:B18 should be shared.
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(16), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ // Set edit text to B17. Now B18 should be non-shared.
+ ScFieldEditEngine& rEditEngine = m_pDoc->GetEditEngine();
+ rEditEngine.SetText("Edit Text");
+ aPos.SetRow(16);
+ m_pDoc->SetEditText(aPos, rEditEngine.CreateTextObject());
+ CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, m_pDoc->GetCellType(aPos));
+ aPos.SetRow(17);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B18 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_MESSAGE("B18 should be non-shared.", !pFC->IsShared());
+
+ // Set up a new group for shared formulas in B2:B10.
+ clearRange(m_pDoc, ScRange(0,0,0,2,100,0));
+
+ aPos.SetRow(1);
+ m_pDoc->SetString(aPos, "=A2*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A3*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A4*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A5*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A6*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A7*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A8*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A9*10");
+ aPos.IncRow();
+ m_pDoc->SetString(aPos, "=A10*10");
+
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B10 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(9), pFC->GetSharedLength());
+
+ // Delete A4:B8. This should splite the grouping to B2:B3 and B9:B10.
+ clearRange(m_pDoc, ScRange(0,3,0,1,7,0));
+ aPos.SetRow(1);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ aPos.SetRow(8);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B9 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ // Delete rows 4:8 and shift row 9 and below up to row 4. This should
+ // re-merge the two into a group of B2:B5.
+ m_pDoc->DeleteRow(ScRange(0,3,0,MAXCOL,7,0));
+ aPos.SetRow(1);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
+
+ // Insert 2 rows at row 4, to split it into B2:B3 and B6:B7.
+ m_pDoc->InsertRow(ScRange(0,3,0,MAXCOL,4,0));
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ aPos.SetRow(5);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B6 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(5), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ m_pDoc->DeleteTab(0);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit eef53622798e2e2f81f28ee5e1c82de0d48c149c
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 18:08:30 2013 -0400
Create a new library to store shared qa code for sc.
Change-Id: I38aa1461d05e3dee096e69b7cd95e2ddfccc9594
diff --git a/Repository.mk b/Repository.mk
index 51089bb..0fc2a92 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -432,6 +432,7 @@ $(eval $(call gb_Helper_register_libraries,PLAINLIBS_NONE, \
unobootstrapprotector \
unoexceptionprotector \
unotest \
+ scqahelper \
))
$(eval $(call gb_Helper_register_libraries_for_install,PLAINLIBS_URE,ure, \
diff --git a/sc/CppunitTest_sc_filters_test.mk b/sc/CppunitTest_sc_filters_test.mk
index 56eb345..82a6cf7 100644
--- a/sc/CppunitTest_sc_filters_test.mk
+++ b/sc/CppunitTest_sc_filters_test.mk
@@ -44,6 +44,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sc_filters_test, \
salhelper \
sax \
sc \
+ scqahelper \
sfx \
sot \
svl \
diff --git a/sc/CppunitTest_sc_subsequent_export_test.mk b/sc/CppunitTest_sc_subsequent_export_test.mk
index 9681327..12565a5 100644
--- a/sc/CppunitTest_sc_subsequent_export_test.mk
+++ b/sc/CppunitTest_sc_subsequent_export_test.mk
@@ -38,6 +38,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sc_subsequent_export_test, \
salhelper \
sax \
sc \
+ scqahelper \
sfx \
sot \
svl \
diff --git a/sc/CppunitTest_sc_subsequent_filters_test.mk b/sc/CppunitTest_sc_subsequent_filters_test.mk
index 29bb4b8..4bc57c3 100644
--- a/sc/CppunitTest_sc_subsequent_filters_test.mk
+++ b/sc/CppunitTest_sc_subsequent_filters_test.mk
@@ -38,6 +38,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sc_subsequent_filters_test, \
salhelper \
sax \
sc \
+ scqahelper \
sfx \
sot \
svl \
diff --git a/sc/CppunitTest_sc_ucalc.mk b/sc/CppunitTest_sc_ucalc.mk
index b6e5e3e..702117f 100644
--- a/sc/CppunitTest_sc_ucalc.mk
+++ b/sc/CppunitTest_sc_ucalc.mk
@@ -51,6 +51,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sc_ucalc, \
salhelper \
sax \
sb \
+ scqahelper \
sfx \
sot \
svl \
diff --git a/sc/Library_scqahelper.mk b/sc/Library_scqahelper.mk
new file mode 100644
index 0000000..94ba7c6
--- /dev/null
+++ b/sc/Library_scqahelper.mk
@@ -0,0 +1,48 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Library_Library,scqahelper))
+
+$(eval $(call gb_Library_set_include,scqahelper,\
+ -I$(SRCDIR)/sc/inc \
+ -I$(SRCDIR)/sc/source/ui/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_use_externals,scqahelper, \
+ boost_headers \
+ mdds_headers \
+ orcus \
+ orcus-parser \
+ cppunit \
+))
+
+$(eval $(call gb_Library_use_sdk_api,scqahelper))
+
+$(eval $(call gb_Library_use_libraries,scqahelper,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sfx \
+ sot \
+ svl \
+ svt \
+ tl \
+ utl \
+ sc \
+ ucbhelper \
+ $(gb_UWINAPI) \
+))
+
+$(eval $(call gb_Library_add_exception_objects,scqahelper,\
+ sc/qa/unit/helper/qahelper \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sc/Module_sc.mk b/sc/Module_sc.mk
index 0b3970f..29e53e9 100644
--- a/sc/Module_sc.mk
+++ b/sc/Module_sc.mk
@@ -16,6 +16,7 @@ $(eval $(call gb_Module_add_targets,sc,\
Library_scd \
Library_scfilt \
Library_scui \
+ Library_scqahelper \
UIConfig_scalc \
))
diff --git a/sc/qa/unit/filters-test.cxx b/sc/qa/unit/filters-test.cxx
index dfaecfd..44156ea 100644
--- a/sc/qa/unit/filters-test.cxx
+++ b/sc/qa/unit/filters-test.cxx
@@ -20,7 +20,6 @@
#include <sfx2/sfxmodelfactory.hxx>
#include <svl/stritem.hxx>
-#define CALC_DEBUG_OUTPUT 0
#define TEST_BUG_FILES 0
#include "helper/qahelper.hxx"
diff --git a/sc/qa/unit/helper/csv_handler.hxx b/sc/qa/unit/helper/csv_handler.hxx
index aa98257..0f4b018 100644
--- a/sc/qa/unit/helper/csv_handler.hxx
+++ b/sc/qa/unit/helper/csv_handler.hxx
@@ -7,6 +7,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+#ifndef SC_QA_CSV_HANDLER_HXX
+#define SC_QA_CSV_HANDLER_HXX
+
#include <iostream>
#include "docsh.hxx"
@@ -17,6 +20,10 @@
#include "cellform.hxx"
#include "cellvalue.hxx"
+#include "rtl/strbuf.hxx"
+
+#include <test/bootstrapfixture.hxx>
+
#define DEBUG_CSV_HANDLER 0
namespace {
@@ -221,4 +228,6 @@ private:
SCTAB mnTab;
};
+#endif
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/helper/debughelper.hxx b/sc/qa/unit/helper/debughelper.hxx
index b9cf0a4..11dfc51 100644
--- a/sc/qa/unit/helper/debughelper.hxx
+++ b/sc/qa/unit/helper/debughelper.hxx
@@ -10,11 +10,6 @@
#ifndef SC_DEBUG_HELPER_HXX
#define SC_DEBUG_HELPER_HXX
-/**
- * Print nicely formatted sheet content to stdout. Indispensable when
- * debugging the unit test code involving testing of sheet contents.
- */
-
#include <rtl/strbuf.hxx>
#include <rtl/ustring.hxx>
@@ -32,13 +27,19 @@
#include <iostream>
+#define CALC_DEBUG_OUTPUT 0
+#define CALC_TEST_PERF 0
+
using namespace ::com::sun::star;
using ::std::cout;
using ::std::cerr;
using ::std::endl;
using ::std::vector;
-
+/**
+ * Print nicely formatted sheet content to stdout. Indispensable when
+ * debugging the unit test code involving testing of sheet contents.
+ */
class SheetPrinter
{
typedef ::mdds::mixed_type_matrix<OUString, bool> MatrixType;
diff --git a/sc/qa/unit/helper/qahelper.cxx b/sc/qa/unit/helper/qahelper.cxx
new file mode 100644
index 0000000..b330f2c
--- /dev/null
+++ b/sc/qa/unit/helper/qahelper.cxx
@@ -0,0 +1,251 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "qahelper.hxx"
+
+#define __ORCUS_STATIC_LIB
+#include <orcus/csv_parser.hpp>
+
+#include <fstream>
+
+bool testEqualsWithTolerance( long nVal1, long nVal2, long nTol )
+{
+ return ( labs( nVal1 - nVal2 ) <= nTol );
+}
+
+void loadFile(const OUString& aFileName, std::string& aContent)
+{
+ OString aOFileName = OUStringToOString(aFileName, RTL_TEXTENCODING_UTF8);
+
+#ifdef ANDROID
+ size_t size;
+ if (strncmp(aOFileName.getStr(), "/assets/", sizeof("/assets/")-1) == 0) {
+ const char *contents = (const char *) lo_apkentry(aOFileName.getStr(), &size);
+ if (contents != 0) {
+ aContent = std::string(contents, size);
+ return;
+ }
+ }
+#endif
+
+ std::ifstream aFile(aOFileName.getStr());
+
+ OStringBuffer aErrorMsg("Could not open csv file: ");
+ aErrorMsg.append(aOFileName);
+ CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), aFile);
+ std::ostringstream aOStream;
+ aOStream << aFile.rdbuf();
+ aFile.close();
+ aContent = aOStream.str();
+}
+
+void testFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab, StringType aStringFormat)
+{
+ csv_handler aHandler(pDoc, nTab, aStringFormat);
+ orcus::csv_parser_config aConfig;
+ aConfig.delimiters.push_back(',');
+ aConfig.delimiters.push_back(';');
+ aConfig.text_qualifier = '"';
+ aConfig.trim_cell_value = false;
+
+
+ std::string aContent;
+ loadFile(aFileName, aContent);
+ orcus::csv_parser<csv_handler> parser ( &aContent[0], aContent.size() , aHandler, aConfig);
+ try
+ {
+ parser.parse();
+ }
+ catch (const orcus::csv_parse_error& e)
+ {
+ std::cout << "reading csv content file failed: " << e.what() << std::endl;
+ OStringBuffer aErrorMsg("csv parser error: ");
+ aErrorMsg.append(e.what());
+ CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), false);
+ }
+}
+
+void testCondFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab)
+{
+ conditional_format_handler aHandler(pDoc, nTab);
+ orcus::csv_parser_config aConfig;
+ aConfig.delimiters.push_back(',');
+ aConfig.delimiters.push_back(';');
+ aConfig.text_qualifier = '"';
+ std::string aContent;
+ loadFile(aFileName, aContent);
+ orcus::csv_parser<conditional_format_handler> parser ( &aContent[0], aContent.size() , aHandler, aConfig);
+ try
+ {
+ parser.parse();
+ }
+ catch (const orcus::csv_parse_error& e)
+ {
+ std::cout << "reading csv content file failed: " << e.what() << std::endl;
+ OStringBuffer aErrorMsg("csv parser error: ");
+ aErrorMsg.append(e.what());
+ CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), false);
+ }
+}
+
+ScDocShellRef ScBootstrapFixture::load( bool bReadWrite,
+ const OUString& rURL, const OUString& rFilter, const OUString &rUserData,
+ const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID,
+ sal_uIntPtr nFilterVersion, const OUString* pPassword )
+{
+ SfxFilter* pFilter = new SfxFilter(
+ rFilter,
+ OUString(), nFilterFlags, nClipboardID, rTypeName, 0, OUString(),
+ rUserData, OUString("private:factory/scalc*"));
+ pFilter->SetVersion(nFilterVersion);
+
+ ScDocShellRef xDocShRef = new ScDocShell;
+ xDocShRef->GetDocument()->EnableUserInteraction(false);
+ SfxMedium* pSrcMed = new SfxMedium(rURL, bReadWrite ? STREAM_STD_READWRITE : STREAM_STD_READ );
+ pSrcMed->SetFilter(pFilter);
+ pSrcMed->UseInteractionHandler(false);
+ if (pPassword)
+ {
+ SfxItemSet* pSet = pSrcMed->GetItemSet();
+ pSet->Put(SfxStringItem(SID_PASSWORD, *pPassword));
+ }
+ printf("about to load %s\n", OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 ).getStr() );
+ if (!xDocShRef->DoLoad(pSrcMed))
+ {
+ xDocShRef->DoClose();
+ // load failed.
+ xDocShRef.Clear();
+ }
+
+ return xDocShRef;
+}
+
+ScDocShellRef ScBootstrapFixture::load(
+ const OUString& rURL, const OUString& rFilter, const OUString &rUserData,
+ const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID,
+ sal_uIntPtr nFilterVersion, const OUString* pPassword )
+{
+ return load( false, rURL, rFilter, rUserData, rTypeName, nFilterFlags, nClipboardID, nFilterVersion, pPassword );
+}
+
+ScDocShellRef ScBootstrapFixture::loadDoc(
+ const OUString& rFileName, sal_Int32 nFormat, bool bReadWrite )
+{
+ OUString aFileExtension(aFileFormats[nFormat].pName, strlen(aFileFormats[nFormat].pName), RTL_TEXTENCODING_UTF8 );
+ OUString aFilterName(aFileFormats[nFormat].pFilterName, strlen(aFileFormats[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ;
+ OUString aFileName;
+ createFileURL( rFileName, aFileExtension, aFileName );
+ OUString aFilterType(aFileFormats[nFormat].pTypeName, strlen(aFileFormats[nFormat].pTypeName), RTL_TEXTENCODING_UTF8);
+ unsigned int nFormatType = aFileFormats[nFormat].nFormatType;
+ unsigned int nClipboardId = nFormatType ? SFX_FILTER_IMPORT | SFX_FILTER_USESOPTIONS : 0;
+
+ return load(bReadWrite, aFileName, aFilterName, OUString(), aFilterType, nFormatType, nClipboardId, nFormatType);
+}
+
+void ScBootstrapFixture::createFileURL(
+ const OUString& aFileBase, const OUString& aFileExtension, OUString& rFilePath)
+{
+ OUString aSep("/");
+ OUStringBuffer aBuffer( getSrcRootURL() );
+ aBuffer.append(m_aBaseString).append(aSep).append(aFileExtension);
+ aBuffer.append(aSep).append(aFileBase).append(aFileExtension);
+ rFilePath = aBuffer.makeStringAndClear();
+}
+
+void ScBootstrapFixture::createCSVPath(const OUString& aFileBase, OUString& rCSVPath)
+{
+ OUStringBuffer aBuffer( getSrcRootPath());
+ aBuffer.append(m_aBaseString).append(OUString("/contentCSV/"));
+ aBuffer.append(aFileBase).append(OUString("csv"));
+ rCSVPath = aBuffer.makeStringAndClear();
+}
+
+ScDocShellRef ScBootstrapFixture::saveAndReload(
+ ScDocShell* pShell, const OUString &rFilter,
+ const OUString &rUserData, const OUString& rTypeName, sal_uLong nFormatType)
+{
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ SfxMedium aStoreMedium( aTempFile.GetURL(), STREAM_STD_WRITE );
+ sal_uInt32 nExportFormat = 0;
+ if (nFormatType == ODS_FORMAT_TYPE)
+ nExportFormat = SFX_FILTER_EXPORT | SFX_FILTER_USESOPTIONS;
+ SfxFilter* pExportFilter = new SfxFilter(
+ rFilter,
+ OUString(), nFormatType, nExportFormat, rTypeName, 0, OUString(),
+ rUserData, OUString("private:factory/scalc*") );
+ pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+ aStoreMedium.SetFilter(pExportFilter);
+ pShell->DoSaveAs( aStoreMedium );
+ pShell->DoClose();
+
+ //std::cout << "File: " << aTempFile.GetURL() << std::endl;
+
+ sal_uInt32 nFormat = 0;
+ if (nFormatType == ODS_FORMAT_TYPE)
+ nFormat = SFX_FILTER_IMPORT | SFX_FILTER_USESOPTIONS;
+
+ return load(aTempFile.GetURL(), rFilter, rUserData, rTypeName, nFormatType, nFormat );
+}
+
+ScDocShellRef ScBootstrapFixture::saveAndReload( ScDocShell* pShell, sal_Int32 nFormat )
+{
+ OUString aFilterName(aFileFormats[nFormat].pFilterName, strlen(aFileFormats[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ;
+ OUString aFilterType(aFileFormats[nFormat].pTypeName, strlen(aFileFormats[nFormat].pTypeName), RTL_TEXTENCODING_UTF8);
+ ScDocShellRef xDocSh = saveAndReload(pShell, aFilterName, OUString(), aFilterType, aFileFormats[nFormat].nFormatType);
+
+ CPPUNIT_ASSERT(xDocSh.Is());
+ return xDocSh;
+}
+
+void ScBootstrapFixture::miscRowHeightsTest( TestParam* aTestValues, unsigned int numElems )
+{
+ for ( unsigned int index=0; index<numElems; ++index )
+ {
+ OUString sFileName = OUString::createFromAscii( aTestValues[ index ].sTestDoc );
+ printf("aTestValues[%u] %s\n", index, OUStringToOString( sFileName, RTL_TEXTENCODING_UTF8 ).getStr() );
+ int nImportType = aTestValues[ index ].nImportType;
+ int nExportType = aTestValues[ index ].nExportType;
+ ScDocShellRef xShell = loadDoc( sFileName, nImportType );
+ CPPUNIT_ASSERT(xShell.Is());
+
+ if ( nExportType != -1 )
+ xShell = saveAndReload(&(*xShell), nExportType );
+
+ CPPUNIT_ASSERT(xShell.Is());
+
+ ScDocument* pDoc = xShell->GetDocument();
+
+ for (int i=0; i<aTestValues[ index ].nRowData; ++i)
+ {
+ SCROW nRow = aTestValues[ index ].pData[ i].nStartRow;
+ SCROW nEndRow = aTestValues[ index ].pData[ i ].nEndRow;
+ SCTAB nTab = aTestValues[ index ].pData[ i ].nTab;
+ int nExpectedHeight = aTestValues[ index ].pData[ i ].nExpectedHeight;
+ if ( nExpectedHeight == -1 )
+ nExpectedHeight = sc::TwipsToHMM( ScGlobal::nStdRowHeight );
+ bool bCheckOpt = ( ( aTestValues[ index ].pData[ i ].nCheck & CHECK_OPTIMAL ) == CHECK_OPTIMAL );
+ for ( ; nRow <= nEndRow; ++nRow )
+ {
+ printf("\t checking row %" SAL_PRIdINT32 " for height %d\n", nRow, nExpectedHeight );
+ int nHeight = sc::TwipsToHMM( pDoc->GetRowHeight(nRow, nTab, false) );
+ if ( bCheckOpt )
+ {
+ bool bOpt = !(pDoc->GetRowFlags( nRow, nTab ) & CR_MANUALSIZE);
+ CPPUNIT_ASSERT_EQUAL(aTestValues[ index ].pData[ i ].bOptimal, bOpt);
+ }
+ CPPUNIT_ASSERT_EQUAL(nExpectedHeight, nHeight);
+ }
+ }
+ xShell->DoClose();
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/helper/qahelper.hxx b/sc/qa/unit/helper/qahelper.hxx
index ad25b74..b01a581 100644
--- a/sc/qa/unit/helper/qahelper.hxx
+++ b/sc/qa/unit/helper/qahelper.hxx
@@ -10,15 +10,11 @@
#ifndef SC_QA_HELPER_HXX
#define SC_QA_HELPER_HXX
-#include <test/bootstrapfixture.hxx>
-#define __ORCUS_STATIC_LIB
-#include "helper/csv_handler.hxx"
-#include "helper/debughelper.hxx"
-#include "orcus/csv_parser.hpp"
-#include <fstream>
-#include <string>
-#include <sstream>
+#include "scdllapi.h"
+#include "debughelper.hxx"
+#include "csv_handler.hxx"
+#include <test/bootstrapfixture.hxx>
#include <comphelper/documentconstants.hxx>
#include <osl/detail/android-bootstrap.h>
@@ -26,6 +22,11 @@
#include <unotools/tempfile.hxx>
#include <comphelper/storagehelper.hxx>
#include <sfx2/docfilt.hxx>
+#include "sfx2/docfile.hxx"
+#include "svl/stritem.hxx"
+
+#include <string>
+#include <sstream>
#define ODS_FORMAT_TYPE 50331943
#define XLS_FORMAT_TYPE 318767171
@@ -43,14 +44,7 @@
#define LOTUS123 5
#define DIF 6
-bool testEqualsWithTolerance( long nVal1, long nVal2, long nTol )
-{
- return ( labs( nVal1 - nVal2 ) <= nTol );
-}
-
-struct FileFormat {
- const char* pName; const char* pFilterName; const char* pTypeName; unsigned int nFormatType;
-};
+SC_DLLPUBLIC bool testEqualsWithTolerance( long nVal1, long nVal2, long nTol );
#define CHECK_OPTIMAL 0x1
@@ -73,6 +67,10 @@ struct TestParam
RowData* pData;
};
+struct FileFormat {
+ const char* pName; const char* pFilterName; const char* pTypeName; unsigned int nFormatType;
+};
+
FileFormat aFileFormats[] = {
{ "ods" , "calc8", "", ODS_FORMAT_TYPE },
{ "xls" , "MS Excel 97", "calc_MS_EXCEL_97", XLS_FORMAT_TYPE },
@@ -89,35 +87,16 @@ FileFormat aFileFormats[] = {
// eventually perhaps iOS) special cases here, too)? Please move this to osl,
// it sure looks gemerally useful. Or am I missing something?
-void loadFile(const OUString& aFileName, std::string& aContent)
-{
- OString aOFileName = OUStringToOString(aFileName, RTL_TEXTENCODING_UTF8);
-
-#ifdef ANDROID
- size_t size;
- if (strncmp(aOFileName.getStr(), "/assets/", sizeof("/assets/")-1) == 0) {
- const char *contents = (const char *) lo_apkentry(aOFileName.getStr(), &size);
- if (contents != 0) {
- aContent = std::string(contents, size);
- return;
- }
- }
-#endif
+SC_DLLPUBLIC void loadFile(const OUString& aFileName, std::string& aContent);
- std::ifstream aFile(aOFileName.getStr());
+SC_DLLPUBLIC void testFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab, StringType aStringFormat = StringValue);
- OStringBuffer aErrorMsg("Could not open csv file: ");
- aErrorMsg.append(aOFileName);
- CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), aFile);
- std::ostringstream aOStream;
- aOStream << aFile.rdbuf();
- aFile.close();
- aContent = aOStream.str();
-}
+//need own handler because conditional formatting strings must be generated
+SC_DLLPUBLIC void testCondFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab);
std::string print(const ScAddress& rAddr)
{
- std::stringstream str;
+ std::ostringstream str;
str << "Col: " << rAddr.Col();
str << " Row: " << rAddr.Row();
str << " Tab: " << rAddr.Tab();
@@ -145,213 +124,38 @@ struct assertion_traits<ScRange>
}
-class ScBootstrapFixture : public test::BootstrapFixture
+class SC_DLLPUBLIC ScBootstrapFixture : public test::BootstrapFixture
{
protected:
OUString m_aBaseString;
- ScDocShellRef load( bool bReadWrite,
- const OUString& rURL, const OUString& rFilter, const OUString &rUserData,
- const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID, sal_uIntPtr nFilterVersion = SOFFICE_FILEFORMAT_CURRENT, const OUString* pPassword = NULL )
- {
- SfxFilter* pFilter = new SfxFilter(
- rFilter,
- OUString(), nFilterFlags, nClipboardID, rTypeName, 0, OUString(),
- rUserData, OUString("private:factory/scalc*"));
- pFilter->SetVersion(nFilterVersion);
-
- ScDocShellRef xDocShRef = new ScDocShell;
- xDocShRef->GetDocument()->EnableUserInteraction(false);
- SfxMedium* pSrcMed = new SfxMedium(rURL, bReadWrite ? STREAM_STD_READWRITE : STREAM_STD_READ );
- pSrcMed->SetFilter(pFilter);
- pSrcMed->UseInteractionHandler(false);
- if (pPassword)
- {
- SfxItemSet* pSet = pSrcMed->GetItemSet();
- pSet->Put(SfxStringItem(SID_PASSWORD, *pPassword));
- }
- printf("about to load %s\n", OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 ).getStr() );
- if (!xDocShRef->DoLoad(pSrcMed))
- {
- xDocShRef->DoClose();
- // load failed.
- xDocShRef.Clear();
- }
-
- return xDocShRef;
- }
ScDocShellRef load(
- const OUString& rURL, const OUString& rFilter, const OUString &rUserData,
- const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID, sal_uIntPtr nFilterVersion = SOFFICE_FILEFORMAT_CURRENT, const OUString* pPassword = NULL )
- {
- return load( false, rURL, rFilter, rUserData, rTypeName, nFilterFlags, nClipboardID, nFilterVersion, pPassword );
- }
+ bool bReadWrite, const OUString& rURL, const OUString& rFilter, const OUString &rUserData,
+ const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID,
+ sal_uIntPtr nFilterVersion = SOFFICE_FILEFORMAT_CURRENT, const OUString* pPassword = NULL );
- ScDocShellRef loadDoc(const OUString& rFileName, sal_Int32 nFormat, bool bReadWrite = false )
- {
- OUString aFileExtension(aFileFormats[nFormat].pName, strlen(aFileFormats[nFormat].pName), RTL_TEXTENCODING_UTF8 );
- OUString aFilterName(aFileFormats[nFormat].pFilterName, strlen(aFileFormats[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ;
- OUString aFileName;
- createFileURL( rFileName, aFileExtension, aFileName );
- OUString aFilterType(aFileFormats[nFormat].pTypeName, strlen(aFileFormats[nFormat].pTypeName), RTL_TEXTENCODING_UTF8);
- unsigned int nFormatType = aFileFormats[nFormat].nFormatType;
- unsigned int nClipboardId = nFormatType ? SFX_FILTER_IMPORT | SFX_FILTER_USESOPTIONS : 0;
-
- return load(bReadWrite, aFileName, aFilterName, OUString(), aFilterType, nFormatType, nClipboardId, nFormatType);
- }
+ ScDocShellRef load(
+ const OUString& rURL, const OUString& rFilter, const OUString &rUserData,
+ const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID,
+ sal_uIntPtr nFilterVersion = SOFFICE_FILEFORMAT_CURRENT, const OUString* pPassword = NULL );
+ ScDocShellRef loadDoc(const OUString& rFileName, sal_Int32 nFormat, bool bReadWrite = false );
public:
ScBootstrapFixture( const OUString& rsBaseString ) : m_aBaseString( rsBaseString ) {}
- void createFileURL(const OUString& aFileBase, const OUString& aFileExtension, OUString& rFilePath)
- {
- OUString aSep("/");
- OUStringBuffer aBuffer( getSrcRootURL() );
- aBuffer.append(m_aBaseString).append(aSep).append(aFileExtension);
- aBuffer.append(aSep).append(aFileBase).append(aFileExtension);
- rFilePath = aBuffer.makeStringAndClear();
- }
- void createCSVPath(const OUString& aFileBase, OUString& rCSVPath)
- {
- OUStringBuffer aBuffer( getSrcRootPath());
- aBuffer.append(m_aBaseString).append(OUString("/contentCSV/"));
- aBuffer.append(aFileBase).append(OUString("csv"));
- rCSVPath = aBuffer.makeStringAndClear();
- }
+ void createFileURL(const OUString& aFileBase, const OUString& aFileExtension, OUString& rFilePath);
- ScDocShellRef saveAndReload(ScDocShell* pShell, const OUString &rFilter,
- const OUString &rUserData, const OUString& rTypeName, sal_uLong nFormatType)
- {
+ void createCSVPath(const OUString& aFileBase, OUString& rCSVPath);
- utl::TempFile aTempFile;
- aTempFile.EnableKillingFile();
- SfxMedium aStoreMedium( aTempFile.GetURL(), STREAM_STD_WRITE );
- sal_uInt32 nExportFormat = 0;
- if (nFormatType == ODS_FORMAT_TYPE)
- nExportFormat = SFX_FILTER_EXPORT | SFX_FILTER_USESOPTIONS;
- SfxFilter* pExportFilter = new SfxFilter(
- rFilter,
- OUString(), nFormatType, nExportFormat, rTypeName, 0, OUString(),
- rUserData, OUString("private:factory/scalc*") );
- pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
- aStoreMedium.SetFilter(pExportFilter);
- pShell->DoSaveAs( aStoreMedium );
- pShell->DoClose();
-
- //std::cout << "File: " << aTempFile.GetURL() << std::endl;
-
- sal_uInt32 nFormat = 0;
- if (nFormatType == ODS_FORMAT_TYPE)
- nFormat = SFX_FILTER_IMPORT | SFX_FILTER_USESOPTIONS;
-
- return load(aTempFile.GetURL(), rFilter, rUserData, rTypeName, nFormatType, nFormat );
- }
- ScDocShellRef saveAndReload( ScDocShell* pShell, sal_Int32 nFormat )
- {
- OUString aFilterName(aFileFormats[nFormat].pFilterName, strlen(aFileFormats[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ;
- OUString aFilterType(aFileFormats[nFormat].pTypeName, strlen(aFileFormats[nFormat].pTypeName), RTL_TEXTENCODING_UTF8);
- ScDocShellRef xDocSh = saveAndReload(pShell, aFilterName, OUString(), aFilterType, aFileFormats[nFormat].nFormatType);
+ ScDocShellRef saveAndReload(ScDocShell* pShell, const OUString &rFilter,
+ const OUString &rUserData, const OUString& rTypeName, sal_uLong nFormatType);
- CPPUNIT_ASSERT(xDocSh.Is());
- return xDocSh;
- }
+ ScDocShellRef saveAndReload( ScDocShell* pShell, sal_Int32 nFormat );
- void miscRowHeightsTest( TestParam* aTestValues, unsigned int numElems )
- {
- for ( unsigned int index=0; index<numElems; ++index )
- {
- OUString sFileName = OUString::createFromAscii( aTestValues[ index ].sTestDoc );
- printf("aTestValues[%u] %s\n", index, OUStringToOString( sFileName, RTL_TEXTENCODING_UTF8 ).getStr() );
- int nImportType = aTestValues[ index ].nImportType;
- int nExportType = aTestValues[ index ].nExportType;
- ScDocShellRef xShell = loadDoc( sFileName, nImportType );
- CPPUNIT_ASSERT(xShell.Is());
-
- if ( nExportType != -1 )
- xShell = saveAndReload(&(*xShell), nExportType );
-
- CPPUNIT_ASSERT(xShell.Is());
-
- ScDocument* pDoc = xShell->GetDocument();
-
- for (int i=0; i<aTestValues[ index ].nRowData; ++i)
- {
- SCROW nRow = aTestValues[ index ].pData[ i].nStartRow;
- SCROW nEndRow = aTestValues[ index ].pData[ i ].nEndRow;
- SCTAB nTab = aTestValues[ index ].pData[ i ].nTab;
- int nExpectedHeight = aTestValues[ index ].pData[ i ].nExpectedHeight;
- if ( nExpectedHeight == -1 )
- nExpectedHeight = sc::TwipsToHMM( ScGlobal::nStdRowHeight );
- bool bCheckOpt = ( ( aTestValues[ index ].pData[ i ].nCheck & CHECK_OPTIMAL ) == CHECK_OPTIMAL );
- for ( ; nRow <= nEndRow; ++nRow )
- {
- printf("\t checking row %" SAL_PRIdINT32 " for height %d\n", nRow, nExpectedHeight );
- int nHeight = sc::TwipsToHMM( pDoc->GetRowHeight(nRow, nTab, false) );
- if ( bCheckOpt )
- {
- bool bOpt = !(pDoc->GetRowFlags( nRow, nTab ) & CR_MANUALSIZE);
- CPPUNIT_ASSERT_EQUAL(aTestValues[ index ].pData[ i ].bOptimal, bOpt);
- }
- CPPUNIT_ASSERT_EQUAL(nExpectedHeight, nHeight);
- }
- }
- xShell->DoClose();
- }
- }
+ void miscRowHeightsTest( TestParam* aTestValues, unsigned int numElems );
};
-void testFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab, StringType aStringFormat = StringValue)
-{
- csv_handler aHandler(pDoc, nTab, aStringFormat);
- orcus::csv_parser_config aConfig;
- aConfig.delimiters.push_back(',');
- aConfig.delimiters.push_back(';');
- aConfig.text_qualifier = '"';
- aConfig.trim_cell_value = false;
-
-
- std::string aContent;
- loadFile(aFileName, aContent);
- orcus::csv_parser<csv_handler> parser ( &aContent[0], aContent.size() , aHandler, aConfig);
- try
- {
- parser.parse();
- }
- catch (const orcus::csv_parse_error& e)
- {
- std::cout << "reading csv content file failed: " << e.what() << std::endl;
- OStringBuffer aErrorMsg("csv parser error: ");
- aErrorMsg.append(e.what());
- CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), false);
- }
-}
-
-//need own handler because conditional formatting strings must be generated
-void testCondFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab)
-{
- conditional_format_handler aHandler(pDoc, nTab);
- orcus::csv_parser_config aConfig;
- aConfig.delimiters.push_back(',');
- aConfig.delimiters.push_back(';');
- aConfig.text_qualifier = '"';
- std::string aContent;
- loadFile(aFileName, aContent);
- orcus::csv_parser<conditional_format_handler> parser ( &aContent[0], aContent.size() , aHandler, aConfig);
- try
- {
- parser.parse();
- }
- catch (const orcus::csv_parse_error& e)
- {
- std::cout << "reading csv content file failed: " << e.what() << std::endl;
- OStringBuffer aErrorMsg("csv parser error: ");
- aErrorMsg.append(e.what());
- CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), false);
- }
-
-}
-
#define ASSERT_DOUBLES_EQUAL( expected, result ) \
CPPUNIT_ASSERT_DOUBLES_EQUAL( (expected), (result), 1e-14 )
diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index 2069920..d73ca8a 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -17,9 +17,6 @@
#include <sfx2/sfxmodelfactory.hxx>
#include <svl/stritem.hxx>
-
-#define CALC_DEBUG_OUTPUT 0
-
#include "helper/qahelper.hxx"
#include "helper/shared_test_impl.hxx"
diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx
index a9ca9a2..8d27a75 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -53,7 +53,6 @@
#include <com/sun/star/chart2/XChartDocument.hpp>
#include <com/sun/star/chart2/data/XDataReceiver.hpp>
-#define CALC_DEBUG_OUTPUT 0
#define TEST_BUG_FILES 0
#include "helper/qahelper.hxx"
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index c96d5b6..f05872f 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -80,14 +80,8 @@
#include <sstream>
#include <vector>
-#define CALC_DEBUG_OUTPUT 0
-#define CALC_TEST_PERF 0
-
-#include "helper/debughelper.hxx"
#include "helper/qahelper.hxx"
-const int indeterminate = 2;
-
using namespace ::com::sun::star;
using ::std::cout;
commit 93ab5bc4daed5197a815275cf78fcc562bda4d5b
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 15:32:42 2013 -0400
Nobody uses this marker now.
Change-Id: Ib7c8a7b7b1ce7f2b9afbb17a50848ae1d8e28907
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 37f67d5..9f96975 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -530,8 +530,6 @@ public:
*/
void RegroupFormulaCells( SCROW nRow1, SCROW nRow2 );
- void FormulaCellsUndecided( SCROW nRow1, SCROW nRow2 );
-
#if DEBUG_COLUMN_STORAGE
void DumpFormulaGroups() const;
#endif
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index a651fa6..512dc8b7 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1538,10 +1538,6 @@ void ScColumn::RegroupFormulaCells( SCROW /*nRow1*/, SCROW /*nRow2*/ )
{
}
-void ScColumn::FormulaCellsUndecided( SCROW /*nRow1*/, SCROW /*nRow2*/ )
-{
-}
-
#if DEBUG_COLUMN_STORAGE
namespace {
commit 9ac2f13f8062603cb0eaea78264d0dc229c776fe
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 15:29:40 2013 -0400
Make update ref on copy a separate method.
Change-Id: I95cb42845535532fca5622d8d4f8b394ff22d4d3
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 6bbfb6a..37f67d5 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -310,6 +310,9 @@ public:
void ResetChanged( SCROW nStartRow, SCROW nEndRow );
+ bool UpdateReferenceOnCopy(
+ const ScRange& rRange, SCCOL nDx, SCROW nDy, SCTAB nDz, ScDocument* pUndoDoc = NULL );
+
/**
* Update reference addresses in formula cell in response to mass cell
* movement.
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 5bf6c21..bd48bad 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1991,8 +1991,7 @@ void ScColumn::CopyScenarioFrom( const ScColumn& rSrcCol )
// UpdateUsed not needed, already done in TestCopyScenario (obsolete comment ?)
SCsTAB nDz = nTab - rSrcCol.nTab;
- UpdateReference(
- URM_COPY, ScRange(nCol, nStart, nTab, nCol, nEnd, nTab), 0, 0, nDz, NULL);
+ UpdateReferenceOnCopy(ScRange(nCol, nStart, nTab, nCol, nEnd, nTab), 0, 0, nDz, NULL);
UpdateCompile();
}
@@ -2020,8 +2019,8 @@ void ScColumn::CopyScenarioTo( ScColumn& rDestCol ) const
// UpdateUsed not needed, is already done in TestCopyScenario (obsolete comment ?)
SCsTAB nDz = rDestCol.nTab - nTab;
- rDestCol.UpdateReference(
- URM_COPY, ScRange(rDestCol.nCol, nStart, rDestCol.nTab, rDestCol.nCol, nEnd, rDestCol.nTab),
+ rDestCol.UpdateReferenceOnCopy(
+ ScRange(rDestCol.nCol, nStart, rDestCol.nTab, rDestCol.nCol, nEnd, rDestCol.nTab),
0, 0, nDz, NULL);
rDestCol.UpdateCompile();
}
@@ -2261,32 +2260,36 @@ public:
}
-bool ScColumn::UpdateReference(
- UpdateRefMode eUpdateRefMode, const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScDocument* pUndoDoc )
+bool ScColumn::UpdateReferenceOnCopy(
+ const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz, ScDocument* pUndoDoc )
{
- if (eUpdateRefMode == URM_COPY)
- {
- // When copying, the range equals the destination range where cells
- // are pasted, and the dx, dy, dz refer to the distance from the
- // source range.
+ // When copying, the range equals the destination range where cells
+ // are pasted, and the dx, dy, dz refer to the distance from the
+ // source range.
- UpdateRefOnCopy aHandler(rRange, nDx, nDy, nDz, pUndoDoc);
- sc::CellStoreType::position_type aPos = maCells.position(rRange.aStart.Row());
- sc::ProcessBlock(aPos.first, maCells, aHandler, rRange.aStart.Row(), rRange.aEnd.Row());
+ UpdateRefOnCopy aHandler(rRange, nDx, nDy, nDz, pUndoDoc);
+ sc::CellStoreType::position_type aPos = maCells.position(rRange.aStart.Row());
+ sc::ProcessBlock(aPos.first, maCells, aHandler, rRange.aStart.Row(), rRange.aEnd.Row());
- // The formula groups at the top and bottom boundaries are expected to
- // have been split prior to this call. Here, we only do the joining.
+ // The formula groups at the top and bottom boundaries are expected to
+ // have been split prior to this call. Here, we only do the joining.
+ JoinFormulaCellAbove(aPos);
+ if (rRange.aEnd.Row() < MAXROW)
+ {
+ aPos = maCells.position(aPos.first, rRange.aEnd.Row()+1);
JoinFormulaCellAbove(aPos);
- if (rRange.aEnd.Row() < MAXROW)
- {
- aPos = maCells.position(aPos.first, rRange.aEnd.Row()+1);
- JoinFormulaCellAbove(aPos);
- }
-
- return aHandler.isUpdated();
}
+ return aHandler.isUpdated();
+}
+
+bool ScColumn::UpdateReference(
+ UpdateRefMode eUpdateRefMode, const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+ ScDocument* pUndoDoc )
+{
+ if (eUpdateRefMode == URM_COPY)
+ return UpdateReferenceOnCopy(rRange, nDx, nDy, nDz, pUndoDoc);
+
bool bThisColShifted = (rRange.aStart.Tab() <= nTab && nTab <= rRange.aEnd.Tab() && rRange.aStart.Col() <= nCol && nCol <= rRange.aEnd.Col());
if (bThisColShifted)
{
commit e0ed6225ae313566c15034968f0f63f44c9846b9
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 15:19:04 2013 -0400
Re-group formula cells on paste.
Change-Id: Ia5251a3bc8387289056abacbb4836b77262aad12
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 28ae418..5bf6c21 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2267,9 +2267,23 @@ bool ScColumn::UpdateReference(
{
if (eUpdateRefMode == URM_COPY)
{
+ // When copying, the range equals the destination range where cells
+ // are pasted, and the dx, dy, dz refer to the distance from the
+ // source range.
+
UpdateRefOnCopy aHandler(rRange, nDx, nDy, nDz, pUndoDoc);
- FormulaCellsUndecided(rRange.aStart.Row(), rRange.aEnd.Row());
- sc::ProcessBlock(maCells.begin(), maCells, aHandler, rRange.aStart.Row(), rRange.aEnd.Row());
+ sc::CellStoreType::position_type aPos = maCells.position(rRange.aStart.Row());
+ sc::ProcessBlock(aPos.first, maCells, aHandler, rRange.aStart.Row(), rRange.aEnd.Row());
+
+ // The formula groups at the top and bottom boundaries are expected to
+ // have been split prior to this call. Here, we only do the joining.
+ JoinFormulaCellAbove(aPos);
+ if (rRange.aEnd.Row() < MAXROW)
+ {
+ aPos = maCells.position(aPos.first, rRange.aEnd.Row()+1);
+ JoinFormulaCellAbove(aPos);
+ }
+
return aHandler.isUpdated();
}
commit abb21f46f7b770a95f29abc73adab3fd6d32e241
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 13:50:23 2013 -0400
Remove this marker.
Change-Id: Iab8695f579abb009f12aa76f4e161f106527f493
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index dd05798..28ae418 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2293,7 +2293,6 @@ bool ScColumn::UpdateReference(
}
UpdateRefOnNonCopy aHandler(nCol, nTab, rRange, nDx, nDy, nDz, eUpdateRefMode, pUndoDoc);
- FormulaCellsUndecided(0, MAXROW);
sc::ProcessFormula(maCells, aHandler);
return aHandler.isUpdated();
}
commit 63689b5560e6672983735f2a2be7cd9778458252
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 13:48:07 2013 -0400
Adjust formula grouping in InsertRow().
Change-Id: I82723a30edc361b627246b66d21dc04cd639caa6
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index d854c59..c96d5b6 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -6517,8 +6517,20 @@ void Test::testSharedFormulas()
CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
- m_pDoc->DeleteTab(0);
+ // Insert 2 rows at row 4, to split it into B2:B3 and B6:B7.
+ m_pDoc->InsertRow(ScRange(0,3,0,MAXCOL,4,0));
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+ aPos.SetRow(5);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B6 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(5), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
+ m_pDoc->DeleteTab(0);
}
namespace {
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 91b3b75..dd05798 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2273,6 +2273,25 @@ bool ScColumn::UpdateReference(
return aHandler.isUpdated();
}
+ bool bThisColShifted = (rRange.aStart.Tab() <= nTab && nTab <= rRange.aEnd.Tab() && rRange.aStart.Col() <= nCol && nCol <= rRange.aEnd.Col());
+ if (bThisColShifted)
+ {
+ // Cells in this column is being shifted. Split formula grouping at
+ // the top and bottom boundaries before they get shifted.
+ SCROW nSplitPos = rRange.aStart.Row();
+ if (ValidRow(nSplitPos))
+ {
+ sc::CellStoreType::position_type aPos = maCells.position(nSplitPos);
+ SplitFormulaCellGroup(aPos);
+ nSplitPos = rRange.aEnd.Row() + 1;
+ if (ValidRow(nSplitPos))
+ {
+ aPos = maCells.position(aPos.first, nSplitPos);
+ SplitFormulaCellGroup(aPos);
+ }
+ }
+ }
+
UpdateRefOnNonCopy aHandler(nCol, nTab, rRange, nDx, nDy, nDz, eUpdateRefMode, pUndoDoc);
FormulaCellsUndecided(0, MAXROW);
sc::ProcessFormula(maCells, aHandler);
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 8d84221..288eaeb 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -2084,6 +2084,9 @@ bool ScFormulaCell::UpdateReference(
// This formula cell itself is being shifted during cell range
// insertion or deletion. Update its position.
aPos.Move(nDx, nDy, nDz);
+ if (xGroup && xGroup->mnStart == aOldPos.Row())
+ xGroup->mnStart += nDy;
+
bCellStateChanged = aPos != aOldPos;
}
else if (rRange.In(aPos))
commit 8dd012e6314421b66a9affb427c106f52443a848
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 11:48:00 2013 -0400
Add test for re-grouping of formulas in DeleteRow().
Change-Id: Iea7fafedc2a5f1549a701d1fa768c127e3236246
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index baf957f..d854c59 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -6508,6 +6508,15 @@ void Test::testSharedFormulas()
CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+ // Delete rows 4:8 and shift row 9 and below up to row 4. This should
+ // re-merge the two into a group of B2:B5.
+ m_pDoc->DeleteRow(ScRange(0,3,0,MAXCOL,7,0));
+ aPos.SetRow(1);
+ pFC = m_pDoc->GetFormulaCell(aPos);
+ CPPUNIT_ASSERT_MESSAGE("B2 should be a formula cell.", pFC);
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(4), pFC->GetSharedLength());
+
m_pDoc->DeleteTab(0);
}
commit 92c35ab58dd5eaa6680f32796b5df2756a312dbe
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 11:09:00 2013 -0400
Always use DoubleVectorRefToken when resolving a range reference.
ResolveStaticReference is reserved for calculating invariant formula
groups.
Change-Id: I58aeabb01f11f98a5c300780734b31079417f4c7
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index f8928e5..8d84221 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3021,49 +3021,34 @@ public:
{
ScComplexRefData aRef = pToken->GetDoubleRef();
aRef.CalcAbsIfRel(mrCell.aPos);
- if (aRef.Ref1.IsRowRel() || aRef.Ref2.IsRowRel())
- {
- // Row reference is relative.
- bool bAbsFirst = !aRef.Ref1.IsRowRel();
- bool bAbsLast = !aRef.Ref2.IsRowRel();
- ScAddress aRefPos(aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab);
- size_t nCols = aRef.Ref2.nCol - aRef.Ref1.nCol + 1;
- std::vector<const double*> aArrays;
- aArrays.reserve(nCols);
- SCROW nArrayLength = mrCell.GetCellGroup()->mnLength;
- SCROW nRefRowSize = aRef.Ref2.nRow - aRef.Ref1.nRow + 1;
- if (!bAbsLast)
- {
- // range end position is relative. Extend the array length.
- nArrayLength += nRefRowSize - 1;
- }
-
- for (SCCOL i = aRef.Ref1.nCol; i <= aRef.Ref2.nCol; ++i)
- {
- aRefPos.SetCol(i);
- const double* pArray = mrDoc.FetchDoubleArray(mrCxt, aRefPos, nArrayLength);
- if (!pArray)
- return false;
- aArrays.push_back(pArray);
- }
-
- formula::DoubleVectorRefToken aTok(aArrays, nArrayLength, nRefRowSize, bAbsFirst, bAbsLast);
- mrGroupTokens.AddToken(aTok);
- }
- else
+ // Row reference is relative.
+ bool bAbsFirst = !aRef.Ref1.IsRowRel();
+ bool bAbsLast = !aRef.Ref2.IsRowRel();
+ ScAddress aRefPos(aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab);
+ size_t nCols = aRef.Ref2.nCol - aRef.Ref1.nCol + 1;
+ std::vector<const double*> aArrays;
+ aArrays.reserve(nCols);
+ SCROW nArrayLength = mrCell.GetCellGroup()->mnLength;
+ SCROW nRefRowSize = aRef.Ref2.nRow - aRef.Ref1.nRow + 1;
+ if (!bAbsLast)
{
- // Absolute row reference.
- ScRange aRefRange(
- aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab,
- aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab);
+ // range end position is relative. Extend the array length.
+ nArrayLength += nRefRowSize - 1;
+ }
- formula::FormulaTokenRef pNewToken = mrDoc.ResolveStaticReference(aRefRange);
- if (!pNewToken)
+ for (SCCOL i = aRef.Ref1.nCol; i <= aRef.Ref2.nCol; ++i)
+ {
+ aRefPos.SetCol(i);
+ const double* pArray = mrDoc.FetchDoubleArray(mrCxt, aRefPos, nArrayLength);
+ if (!pArray)
return false;
- mrGroupTokens.AddToken(*pNewToken);
+ aArrays.push_back(pArray);
}
+
+ formula::DoubleVectorRefToken aTok(aArrays, nArrayLength, nRefRowSize, bAbsFirst, bAbsLast);
+ mrGroupTokens.AddToken(aTok);
}
break;
case svIndex:
commit adf63b4b8ad2459b43d0fd6e04dfdf6474a2f3da
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Jul 8 10:15:27 2013 -0400
Re-group formula cells in DeleteRow().
Change-Id: Ic67af048baa55cf1aee118ec741f140831127a95
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 8a54f50..d99a6ec 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -296,9 +296,14 @@ void ScColumn::DeleteRow( SCROW nStartRow, SCSIZE nSize )
maCells.erase(nStartRow, nEndRow);
maCells.resize(MAXROWCOUNT);
+ // Get the position again after the container change.
+ aPos = maCells.position(nStartRow);
+
// Shift the formula cell positions below the start row.
ShiftFormulaPosHandler aShiftFormulaFunc;
- sc::ProcessFormula(maCells.begin(), maCells, nStartRow, MAXROW, aShiftFormulaFunc);
+ sc::ProcessFormula(aPos.first, maCells, nStartRow, MAXROW, aShiftFormulaFunc);
+
+ JoinFormulaCellAbove(aPos);
// Single cell broadcasts on deleted cells.
BroadcastCells(aDeleteRowsFunc.getNonEmptyRows());
@@ -307,7 +312,6 @@ void ScColumn::DeleteRow( SCROW nStartRow, SCSIZE nSize )
maCellTextAttrs.erase(nStartRow, nEndRow);
maCellTextAttrs.resize(MAXROWCOUNT);
- RegroupFormulaCells(nStartRow);
CellStorageModified();
if (!bShiftCells)
@@ -598,8 +602,6 @@ void ScColumn::JoinFormulaCellAbove( const sc::CellStoreType::position_type& aPo
// cell is not a formula cell.
return;
- SCROW nRow = aPos.first->position + aPos.second;
-
ScFormulaCell& rPrev = *sc::formula_block::at(*aPos.first->data, aPos.second-1);
ScFormulaCell& rCell = *sc::formula_block::at(*aPos.first->data, aPos.second);
sc::CellStoreType::position_type aPosPrev = aPos;
commit 7a6d9eb7198a4a0c808db87a5496e07d46d89413
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Thu Jul 4 02:17:03 2013 -0400
More on regrouping of formula cells.
Change-Id: Icd3403e759841dce351c932ea8915ba9819e5a29
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 62e1ddf..6bbfb6a 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -505,6 +505,8 @@ public:
*/
void SplitFormulaCellGroup( const sc::CellStoreType::position_type& aPos ) const;
+ void JoinFormulaCellAbove( const sc::CellStoreType::position_type& aPos ) const;
+
/**
* Regroup formula cells for the entire column.
*/
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 095acce..91b3b75 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2127,13 +2127,29 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol)
sc::SingleColumnSpanSet::SpansType aRanges;
aNonEmpties.getSpans(aRanges);
+ // Split the formula grouping at the top and bottom boundaries.
+ sc::CellStoreType::position_type aPos = maCells.position(nStartRow);
+ SplitFormulaCellGroup(aPos);
+ aPos = maCells.position(aPos.first, nEndRow+1);
+ SplitFormulaCellGroup(aPos);
+
+ // Do the same with the destination column.
+ aPos = rCol.maCells.position(nStartRow);
+ rCol.SplitFormulaCellGroup(aPos);
+ aPos = rCol.maCells.position(aPos.first, nEndRow+1);
+ rCol.SplitFormulaCellGroup(aPos);
+
// Move the broadcasters to the destination column.
maBroadcasters.transfer(nStartRow, nEndRow, rCol.maBroadcasters, nStartRow);
maCells.transfer(nStartRow, nEndRow, rCol.maCells, nStartRow);
maCellTextAttrs.transfer(nStartRow, nEndRow, rCol.maCellTextAttrs, nStartRow);
- RegroupFormulaCells(nStartRow, nEndRow);
- rCol.RegroupFormulaCells(nStartRow, nEndRow);
+ // Re-group transferred formula cells.
+ aPos = rCol.maCells.position(nStartRow);
+ rCol.JoinFormulaCellAbove(aPos);
+ aPos = rCol.maCells.position(aPos.first, nEndRow+1);
+ rCol.JoinFormulaCellAbove(aPos);
+
CellStorageModified();
rCol.CellStorageModified();
@@ -2267,31 +2283,47 @@ namespace {
class UpdateTransHandler
{
+ ScColumn& mrColumn;
+ sc::CellStoreType::iterator miPos;
ScRange maSource;
ScAddress maDest;
ScDocument* mpUndoDoc;
public:
- UpdateTransHandler(const ScRange& rSource, const ScAddress& rDest, ScDocument* pUndoDoc) :
+ UpdateTransHandler(ScColumn& rColumn, const ScRange& rSource, const ScAddress& rDest, ScDocument* pUndoDoc) :
+ mrColumn(rColumn),
+ miPos(rColumn.GetCellStore().begin()),
maSource(rSource), maDest(rDest), mpUndoDoc(pUndoDoc) {}
- void operator() (size_t, ScFormulaCell* pCell)
+ void operator() (size_t nRow, ScFormulaCell* pCell)
{
+ sc::CellStoreType::position_type aPos = mrColumn.GetCellStore().position(miPos, nRow);
+ miPos = aPos.first;
+ mrColumn.UnshareFormulaCell(aPos, *pCell);
pCell->UpdateTranspose(maSource, maDest, mpUndoDoc);
+ mrColumn.JoinNewFormulaCell(aPos, *pCell);
}
};
class UpdateGrowHandler
{
+ ScColumn& mrColumn;
+ sc::CellStoreType::iterator miPos;
ScRange maArea;
SCCOL mnGrowX;
SCROW mnGrowY;
public:
- UpdateGrowHandler(const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY) :
+ UpdateGrowHandler(ScColumn& rColumn, const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY) :
+ mrColumn(rColumn),
+ miPos(rColumn.GetCellStore().begin()),
maArea(rArea), mnGrowX(nGrowX), mnGrowY(nGrowY) {}
- void operator() (size_t, ScFormulaCell* pCell)
+ void operator() (size_t nRow, ScFormulaCell* pCell)
{
+ sc::CellStoreType::position_type aPos = mrColumn.GetCellStore().position(miPos, nRow);
+ miPos = aPos.first;
+ mrColumn.UnshareFormulaCell(aPos, *pCell);
pCell->UpdateGrow(maArea, mnGrowX, mnGrowY);
+ mrColumn.JoinNewFormulaCell(aPos, *pCell);
}
};
@@ -2647,14 +2679,22 @@ public:
class CompileErrorCellsHandler
{
+ ScColumn& mrColumn;
+ sc::CellStoreType::iterator miPos;
sal_uInt16 mnErrCode;
FormulaGrammar::Grammar meGram;
bool mbCompiled;
public:
- CompileErrorCellsHandler(sal_uInt16 nErrCode, FormulaGrammar::Grammar eGram) :
- mnErrCode(nErrCode), meGram(eGram), mbCompiled(false) {}
+ CompileErrorCellsHandler(ScColumn& rColumn, sal_uInt16 nErrCode, FormulaGrammar::Grammar eGram) :
+ mrColumn(rColumn),
+ miPos(mrColumn.GetCellStore().begin()),
+ mnErrCode(nErrCode),
+ meGram(eGram),
+ mbCompiled(false)
+ {
+ }
- void operator() (size_t /*nRow*/, ScFormulaCell* pCell)
+ void operator() (size_t nRow, ScFormulaCell* pCell)
{
sal_uInt16 nCurError = pCell->GetRawError();
if (!nCurError)
@@ -2665,10 +2705,14 @@ public:
// Error code is specified, and it doesn't match. Skip it.
return;
+ sc::CellStoreType::position_type aPos = mrColumn.GetCellStore().position(miPos, nRow);
+ miPos = aPos.first;
+ mrColumn.UnshareFormulaCell(aPos, *pCell);
pCell->GetCode()->SetCodeError(0);
OUStringBuffer aBuf;
pCell->GetFormula(aBuf, meGram);
pCell->Compile(aBuf.makeStringAndClear(), false, meGram);
+ mrColumn.JoinNewFormulaCell(aPos, *pCell);
mbCompiled = true;
}
@@ -2743,17 +2787,15 @@ public:
void ScColumn::UpdateTranspose( const ScRange& rSource, const ScAddress& rDest,
ScDocument* pUndoDoc )
{
- UpdateTransHandler aFunc(rSource, rDest, pUndoDoc);
+ UpdateTransHandler aFunc(*this, rSource, rDest, pUndoDoc);
sc::ProcessFormula(maCells, aFunc);
- RegroupFormulaCells();
}
void ScColumn::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY )
{
- UpdateGrowHandler aFunc(rArea, nGrowX, nGrowY);
+ UpdateGrowHandler aFunc(*this, rArea, nGrowX, nGrowY);
sc::ProcessFormula(maCells, aFunc);
- RegroupFormulaCells();
}
@@ -2773,10 +2815,7 @@ void ScColumn::UpdateInsertTabOnlyCells(SCTAB nInsPos, SCTAB nNewSheets)
InsertTabUpdater aFunc(maCellTextAttrs, nTab, nInsPos, nNewSheets);
sc::ProcessFormulaEditText(maCells, aFunc);
if (aFunc.isModified())
- {
- RegroupFormulaCells();
CellStorageModified();
- }
}
void ScColumn::UpdateDeleteTab(SCTAB nDelPos, bool bIsMove, ScColumn* /*pRefUndo*/, SCTAB nSheets)
@@ -2919,12 +2958,8 @@ void ScColumn::CompileXML( ScProgress& rProgress )
bool ScColumn::CompileErrorCells(sal_uInt16 nErrCode)
{
- CompileErrorCellsHandler aHdl(nErrCode, pDocument->GetGrammar());
+ CompileErrorCellsHandler aHdl(*this, nErrCode, pDocument->GetGrammar());
sc::ProcessFormula(maCells, aHdl);
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list