sc/inc/column.hxx | 7 +- sc/qa/unit/ucalc.cxx | 111 ++++++++++++++++++++++++++++++++++++++++ sc/qa/unit/ucalc.hxx | 2 sc/source/core/data/column2.cxx | 31 ++++++++++- sc/source/core/data/table1.cxx | 73 ++++++++++++-------------- 5 files changed, 184 insertions(+), 40 deletions(-)
New commits: commit 6669f4c85ce3b59c24b78f89c408650c7b26c1b9 Author: Laurent Godard <[email protected]> Date: Wed Oct 2 18:08:20 2013 +0200 refactor area calculations with notes - add ScColumn::GetCellNotesMaxRow helper - add ScColumn::GetCellNotesMinRow helper Change-Id: I0513d89d39fd45d4f6127658a39d17f716fb3d11 diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index d73e97a..24ba203 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -495,8 +495,11 @@ public: void DeleteCellNote( SCROW nRow ); bool HasCellNotes() const; void SetCellNote( SCROW nRow, ScPostIt* pNote); - // cell notes - void CopyCellNotesToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol, SCROW nRowOffsetDest=0); + + SCROW GetCellNotesMaxRow() const; + SCROW GetCellNotesMinRow() const; + + void CopyCellNotesToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol, SCROW nRowOffsetDest=0) const; void DuplicateNotes(SCROW nStartRow, size_t nDataSize, ScColumn& rDestCol, sc::ColumnBlockPosition& maDestBlockPos, SCROW nRowOffsetDest=0 ) const; void InterpretDirtyCells( SCROW nRow1, SCROW nRow2 ); diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index 3f45bef..ebfe925 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -4051,6 +4051,117 @@ void Test::testNoteDeleteCol() pDoc->DeleteTab(0); } +void Test::testNotesRowMinMax() +{ + + ScDocument* pDoc = getDocShell().GetDocument(); + OUString aSheet1("Sheet1"); + pDoc->InsertTab(0, aSheet1); + + OUString aHello("Hello"); + OUString aJimBob("Jim Bob"); + ScAddress rAddr(1, 5, 0); + ScPostIt* pNote = m_pDoc->GetOrCreateNote(rAddr); + pNote->SetText(rAddr, aHello); + pNote->SetAuthor(aJimBob); + ScAddress rAddrMin(2, 2, 0); + ScPostIt* pNoteMin = m_pDoc->GetOrCreateNote(rAddrMin); + pNoteMin->SetText(rAddrMin, aHello); + + SCCOL col; + SCROW row; + bool dataFound = false; + + // only cell notes (empty content) + + dataFound = pDoc->GetDataStart(0,col,row); + + CPPUNIT_ASSERT_MESSAGE("No DataStart found", dataFound); + CPPUNIT_ASSERT_MESSAGE("DataStart wrong col for notes", col == 1); + CPPUNIT_ASSERT_MESSAGE("DataStart wrong row for notes", row == 2); + + dataFound = pDoc->GetCellArea(0,col,row); + + CPPUNIT_ASSERT_MESSAGE("No CellArea found", dataFound); + CPPUNIT_ASSERT_MESSAGE("CellArea wrong col for notes", col == 2); + CPPUNIT_ASSERT_MESSAGE("CellArea wrong row for notes", row == 5); + + bool bNotes = true; + dataFound = pDoc->GetPrintArea(0,col,row, bNotes); + + CPPUNIT_ASSERT_MESSAGE("No PrintArea found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintArea wrong col for notes", col == 2); + CPPUNIT_ASSERT_MESSAGE("PrintArea wrong row for notes", row == 5); + + bNotes = false; + dataFound = pDoc->GetPrintArea(0,col,row, bNotes); + CPPUNIT_ASSERT_MESSAGE("No PrintArea should be found", !dataFound); + + bNotes = true; + dataFound = pDoc->GetPrintAreaVer(0,0,1,row, bNotes); // cols 0 & 1 + CPPUNIT_ASSERT_MESSAGE("No PrintAreaVer found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintAreaVer wrong row for notes", row == 5); + + dataFound = pDoc->GetPrintAreaVer(0,2,3,row, bNotes); // cols 2 & 3 + CPPUNIT_ASSERT_MESSAGE("No PrintAreaVer found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintAreaVer wrong row for notes", row == 2); + + bNotes = false; + dataFound = pDoc->GetPrintAreaVer(0,0,1,row, bNotes); // col 0 & 1 + CPPUNIT_ASSERT_MESSAGE("No PrintAreaVer should be found", !dataFound); + + // now add cells with value, check that notes are taken into accompt in good cases + + OUString aTestVal("Some Text"); + m_pDoc->SetString(0, 3, 0, aTestVal); + m_pDoc->SetString(3, 3, 0, aTestVal); + + dataFound = pDoc->GetDataStart(0,col,row); + + CPPUNIT_ASSERT_MESSAGE("No DataStart found", dataFound); + CPPUNIT_ASSERT_MESSAGE("DataStart wrong col", col == 0); + CPPUNIT_ASSERT_MESSAGE("DataStart wrong row", row == 2); + + dataFound = pDoc->GetCellArea(0,col,row); + + CPPUNIT_ASSERT_MESSAGE("No CellArea found", dataFound); + CPPUNIT_ASSERT_MESSAGE("CellArea wrong col", col == 3); + CPPUNIT_ASSERT_MESSAGE("CellArea wrong row", row == 5); + + bNotes = true; + dataFound = pDoc->GetPrintArea(0,col,row, bNotes); + + CPPUNIT_ASSERT_MESSAGE("No PrintArea found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintArea wrong col", col == 3); + CPPUNIT_ASSERT_MESSAGE("PrintArea wrong row", row == 5); + + bNotes = false; + dataFound = pDoc->GetPrintArea(0,col,row, bNotes); + CPPUNIT_ASSERT_MESSAGE("No PrintArea found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintArea wrong col", col == 3); + CPPUNIT_ASSERT_MESSAGE("PrintArea wrong row", row == 3); + + bNotes = true; + dataFound = pDoc->GetPrintAreaVer(0,0,1,row, bNotes); // cols 0 & 1 + CPPUNIT_ASSERT_MESSAGE("No PrintAreaVer found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintAreaVer wrong row", row == 5); + + dataFound = pDoc->GetPrintAreaVer(0,2,3,row, bNotes); // cols 2 & 3 + CPPUNIT_ASSERT_MESSAGE("No PrintAreaVer found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintAreaVer wrong row", row == 3); + + bNotes = false; + dataFound = pDoc->GetPrintAreaVer(0,0,1,row, bNotes); // cols 0 & 1 + CPPUNIT_ASSERT_MESSAGE("No PrintAreaVer found", dataFound); + CPPUNIT_ASSERT_MESSAGE("PrintAreaVer wrong row", row == 3); + + + std::cout << "cell area col " << col << std::endl; + std::cout << "cell area row " << row << std::endl; + + pDoc->DeleteTab(0); + +} /* TODO : notes - these are private methods :( void Test::testSwapCells() diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index ed2ae1f..f44d309 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -269,6 +269,7 @@ public: void testShiftCells(); void testNoteDeleteRow(); void testNoteDeleteCol(); + void testNotesRowMinMax(); // void testSwapCells(); void testAnchoredRotatedShape(); void testCellTextWidth(); @@ -372,6 +373,7 @@ public: CPPUNIT_TEST(testShiftCells); CPPUNIT_TEST(testNoteDeleteRow); CPPUNIT_TEST(testNoteDeleteCol); + CPPUNIT_TEST(testNotesRowMinMax); // CPPUNIT_TEST(testSwapCells); CPPUNIT_TEST(testAnchoredRotatedShape); CPPUNIT_TEST(testCellTextWidth); diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 56de103..7c2c565 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1617,7 +1617,7 @@ void ScColumn::CopyCellTextAttrsToDocument(SCROW nRow1, SCROW nRow2, ScColumn& r } //void ScColumn::CopyCellNotesToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol) const -void ScColumn::CopyCellNotesToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol, SCROW nRowOffsetDest) // TODO : notes promising factorisation +void ScColumn::CopyCellNotesToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol, SCROW nRowOffsetDest) const // TODO : notes promising factorisation { rDestCol.maCellNotes.set_empty(nRow1, nRow2); // Empty the destination range first. @@ -1911,6 +1911,35 @@ bool ScColumn::HasCellNotes() const return false; } +SCROW ScColumn::GetCellNotesMaxRow() const +{ + // hypothesis : the column has cell notes (should be checked before) + SCROW maxRow = 0; + sc::CellNoteStoreType::const_iterator it = maCellNotes.begin(), itEnd = maCellNotes.end(); + for (; it != itEnd; ++it) + { + if (it->type == sc::element_type_cellnote) + maxRow = it->position + it->size -1; + } + return maxRow; +} +SCROW ScColumn::GetCellNotesMinRow() const +{ + // hypothesis : the column has cell notes (should be checked before) + SCROW minRow = 0; + bool bFound = false; + sc::CellNoteStoreType::const_iterator it = maCellNotes.begin(), itEnd = maCellNotes.end(); + for (; it != itEnd && !bFound; ++it) + { + if (it->type == sc::element_type_cellnote) + { + bFound = true; + minRow = it->position; + } + } + return minRow; +} + sal_uInt16 ScColumn::GetTextWidth(SCROW nRow) const { return maCellTextAttrs.get<sc::CellTextAttr>(nRow).mnTextWidth; diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx index 8823d6c..184177c 100644 --- a/sc/source/core/data/table1.cxx +++ b/sc/source/core/data/table1.cxx @@ -528,20 +528,20 @@ bool ScTable::GetCellArea( SCCOL& rEndCol, SCROW& rEndRow ) const if (nRow > nMaxY) nMaxY = nRow; } - if ( pDocument->HasColNotes(i, nTab) ) + if ( aCol[i].HasCellNotes() ) { - sc::CellNoteStoreType& maCellNotes = pDocument->GetColNotes(i, nTab); - for (SCROW r=nMaxY; r <=MAXROW; r++) // TODO : notes suboptimal ? + SCROW maxNoteRow = aCol[i].GetCellNotesMaxRow(); + if (maxNoteRow >= nMaxY) { - ScPostIt* pNote = maCellNotes.get<ScPostIt*>(r); - if (pNote) - { - nMaxY = r; - if (i>nMaxX) - nMaxX = i; - } + bFound = true; + nMaxY = maxNoteRow; + } + if (i>nMaxX) + { + bFound = true; + nMaxX = i; } - } + } } rEndCol = nMaxX; @@ -584,18 +584,18 @@ bool ScTable::GetPrintArea( SCCOL& rEndCol, SCROW& rEndRow, bool bNotes, bool bF } if (bNotes) { - if ( pDocument->HasColNotes(i, nTab) ) + if ( aCol[i].HasCellNotes() ) { - sc::CellNoteStoreType& maCellNotes = pDocument->GetColNotes(i, nTab); - for (SCROW r=nMaxY; r <=MAXROW; r++) // TODO : notes suboptimal ? + SCROW maxNoteRow = aCol[i].GetCellNotesMaxRow(); + if (maxNoteRow >= nMaxY) { - ScPostIt* pNote = maCellNotes.get<ScPostIt*>(r); - if (pNote) - { - nMaxY = r; - if (i>nMaxX) - nMaxX = i; - } + bFound = true; + nMaxY = maxNoteRow; + } + if (i>nMaxX) + { + bFound = true; + nMaxX = i; } } } @@ -720,14 +720,13 @@ bool ScTable::GetPrintAreaVer( SCCOL nStartCol, SCCOL nEndCol, } if (bNotes) { - if ( pDocument->HasColNotes(i, nTab) ) + if ( aCol[i].HasCellNotes() ) { - sc::CellNoteStoreType& maCellNotes = pDocument->GetColNotes(i, nTab); - for (SCROW r=nMaxY; r <=MAXROW; r++) // TODO : notes suboptimal ? + SCROW maxNoteRow =aCol[i].GetCellNotesMaxRow(); + if (maxNoteRow > nMaxY) { - ScPostIt* pNote = maCellNotes.get<ScPostIt*>(r); - if (pNote) - nMaxY = r; + bFound = true; + nMaxY = maxNoteRow; } } } @@ -779,18 +778,18 @@ bool ScTable::GetDataStart( SCCOL& rStartCol, SCROW& rStartRow ) const if (nRow < nMinY) nMinY = nRow; } - if ( pDocument->HasColNotes(i, nTab) ) + if ( aCol[i].HasCellNotes() ) { - sc::CellNoteStoreType& maCellNotes = pDocument->GetColNotes(i, nTab); - for (SCROW r=0; r < nMinY; r++) // TODO : notes suboptimal ? + SCROW minNoteRow = aCol[i].GetCellNotesMinRow(); + if (minNoteRow <= nMinY) { - ScPostIt* pNote = maCellNotes.get<ScPostIt*>(r); - if (pNote) - { - nMinY = r; - if (i<nMinX) - nMinX = i; - } + bFound = true; + nMinY = minNoteRow; + } + if (i<nMinX) + { + bFound = true; + nMinX = i; } } } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
