sc/inc/document.hxx | 2 - sc/inc/mtvfunctions.hxx | 2 - sc/inc/table.hxx | 2 - sc/qa/unit/ucalc_column.cxx | 51 ++++++++++++++++++++++++++------------- sc/source/core/data/column.cxx | 8 +++--- sc/source/core/data/document.cxx | 6 ++-- sc/source/core/data/table2.cxx | 21 ++++++++++------ 7 files changed, 59 insertions(+), 33 deletions(-)
New commits: commit 3e2ffb053f9749c6f6990c5ce8f47dc63ea7c148 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Feb 3 14:42:30 2014 -0500 fdo#72470: Correctly calculate the first edit cell row position. Else it could go into an infinite loop. Change-Id: I269cd118dcb3ab83ea8a2243576a360d3d4bc142 diff --git a/sc/inc/mtvfunctions.hxx b/sc/inc/mtvfunctions.hxx index 3c2a940..6955d21 100644 --- a/sc/inc/mtvfunctions.hxx +++ b/sc/inc/mtvfunctions.hxx @@ -618,7 +618,7 @@ FindElement2( break; default: { - ElseRetType aRet = rFuncElse(it->type, nTopRow, nDataSize); + ElseRetType aRet = rFuncElse(*it, nOffset); if (aRet.second) return PositionType(it, aRet.first); } diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 7771f0e..f65c3c7 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -2956,16 +2956,16 @@ public: return const_cast<ScFormulaCell*>(p)->IsMultilineResult(); } - std::pair<size_t,bool> operator() (mdds::mtv::element_t type, size_t nTopRow, size_t nDataSize) + std::pair<size_t,bool> operator() (const sc::CellStoreType::value_type& node, size_t nOffset) { typedef std::pair<size_t,bool> RetType; - if (type == sc::element_type_empty) + if (node.type == sc::element_type_empty) return RetType(0, false); - for (size_t i = 0; i < nDataSize; ++i) + for (size_t i = nOffset; i < node.size; ++i) { - SCROW nRow = nTopRow + i; + SCROW nRow = node.position + i; sal_uInt8 nScriptType = mrColumn.GetRangeScriptType(miAttrPos, nRow, nRow, miCellPos); if (IsAmbiguousScriptNonZero(nScriptType)) // Return the offset from the first row. commit 99a262dc954c19ebd8d07fa8b0f9c9f9a45305a8 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Feb 3 14:39:51 2014 -0500 Finally found a way to get this test to fail. Change-Id: I67cf68ee7e51794de374581016ffb13ebdff59d3 diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 6ffcc69..98b40b0 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -802,7 +802,7 @@ public: SC_DLLPUBLIC void SetEditText( const ScAddress& rPos, const OUString& rStr ); - SC_DLLPUBLIC bool HasEditText( const ScRange& rRange ) const; + SC_DLLPUBLIC SCROW GetFirstEditTextRow( const ScRange& rRange ) const; /** * Call this if you are not sure whether to put this as an edit text or a diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 2b38473..52a6cf6 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -329,7 +329,7 @@ public: void SetEditText( SCCOL nCol, SCROW nRow, EditTextObject* pEditText ); void SetEditText( SCCOL nCol, SCROW nRow, const EditTextObject& rEditText, const SfxItemPool* pEditPool ); - bool HasEditText( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const; + SCROW GetFirstEditTextRow( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const; void SetEmptyCell( SCCOL nCol, SCROW nRow ); void SetFormula( diff --git a/sc/qa/unit/ucalc_column.cxx b/sc/qa/unit/ucalc_column.cxx index 0959ee1..0ed75b4 100644 --- a/sc/qa/unit/ucalc_column.cxx +++ b/sc/qa/unit/ucalc_column.cxx @@ -10,17 +10,20 @@ #include <ucalc.hxx> #include <editutil.hxx> #include <cellvalue.hxx> +#include <svl/languageoptions.hxx> void Test::testColumnFindEditCells() { m_pDoc->InsertTab(0, "Test"); - bool bRes = m_pDoc->HasEditText(ScRange(0,0,0,0,MAXROW,0)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cells.", !bRes); - bRes = m_pDoc->HasEditText(ScRange(0,0,0,0,0,0)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cells.", !bRes); - bRes = m_pDoc->HasEditText(ScRange(0,0,0,0,10,0)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cells.", !bRes); + // Test the basics with real edit cells, using Column A. + + SCROW nResRow = m_pDoc->GetFirstEditTextRow(ScRange(0,0,0,0,MAXROW,0)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cells.", nResRow == -1); + nResRow = m_pDoc->GetFirstEditTextRow(ScRange(0,0,0,0,0,0)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cells.", nResRow == -1); + nResRow = m_pDoc->GetFirstEditTextRow(ScRange(0,0,0,0,10,0)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cells.", nResRow == -1); ScFieldEditEngine& rEE = m_pDoc->GetEditEngine(); rEE.SetText("Test"); @@ -29,23 +32,23 @@ void Test::testColumnFindEditCells() CPPUNIT_ASSERT_MESSAGE("There should be an edit cell here.", pObj); ScRange aRange(0,0,0,0,0,0); - bRes = m_pDoc->HasEditText(aRange); - CPPUNIT_ASSERT_MESSAGE("There is an edit cell here.", bRes); + nResRow = m_pDoc->GetFirstEditTextRow(aRange); + CPPUNIT_ASSERT_MESSAGE("There is an edit cell here.", nResRow == 0); aRange.aStart.SetRow(1); aRange.aEnd.SetRow(1); - bRes = m_pDoc->HasEditText(aRange); - CPPUNIT_ASSERT_MESSAGE("There shouldn't be an edit cell in specified range.", !bRes); + nResRow = m_pDoc->GetFirstEditTextRow(aRange); + CPPUNIT_ASSERT_MESSAGE("There shouldn't be an edit cell in specified range.", nResRow == -1); aRange.aStart.SetRow(2); aRange.aEnd.SetRow(4); - bRes = m_pDoc->HasEditText(aRange); - CPPUNIT_ASSERT_MESSAGE("There shouldn't be an edit cell in specified range.", !bRes); + nResRow = m_pDoc->GetFirstEditTextRow(aRange); + CPPUNIT_ASSERT_MESSAGE("There shouldn't be an edit cell in specified range.", nResRow == -1); aRange.aStart.SetRow(0); aRange.aEnd.SetRow(MAXROW); - bRes = m_pDoc->HasEditText(aRange); - CPPUNIT_ASSERT_MESSAGE("There shouldn be an edit cell in specified range.", bRes); + nResRow = m_pDoc->GetFirstEditTextRow(aRange); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in specified range.", nResRow == 0); m_pDoc->SetString(ScAddress(0,0,0), "Test"); m_pDoc->SetValue(ScAddress(0,2,0), 1.0); @@ -61,8 +64,24 @@ void Test::testColumnFindEditCells() aRange.aStart.SetRow(1); aRange.aEnd.SetRow(1); - bRes = m_pDoc->HasEditText(aRange); - CPPUNIT_ASSERT_MESSAGE("There shouldn't be an edit cell in specified range.", !bRes); + nResRow = m_pDoc->GetFirstEditTextRow(aRange); + CPPUNIT_ASSERT_MESSAGE("There shouldn't be an edit cell in specified range.", nResRow == -1); + + // Test with non-edit cell but with ambiguous script type. + + m_pDoc->SetString(ScAddress(1,11,0), "Some text"); + m_pDoc->SetString(ScAddress(1,12,0), "Some text"); + m_pDoc->SetString(ScAddress(1,13,0), "Other text"); + + m_pDoc->SetScriptType(ScAddress(1,11,0), (SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN)); + m_pDoc->SetScriptType(ScAddress(1,12,0), (SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN)); + m_pDoc->SetScriptType(ScAddress(1,13,0), (SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN)); + + nResRow = m_pDoc->GetFirstEditTextRow(ScAddress(1,11,0)); + CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(11), nResRow); + CPPUNIT_ASSERT_MESSAGE("String with mixed script types is considered an edit cell.", nResRow == 11); + nResRow = m_pDoc->GetFirstEditTextRow(ScAddress(1,12,0)); + CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(12), nResRow); m_pDoc->DeleteTab(0); } diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index bbd3ce2..b2126b2 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -3210,13 +3210,13 @@ void ScDocument::SetEditText( const ScAddress& rPos, const OUString& rStr ) maTabs[rPos.Tab()]->SetEditText(rPos.Col(), rPos.Row(), rEngine.CreateTextObject()); } -bool ScDocument::HasEditText( const ScRange& rRange ) const +SCROW ScDocument::GetFirstEditTextRow( const ScRange& rRange ) const { const ScTable* pTab = FetchTable(rRange.aStart.Tab()); if (!pTab) - return false; + return -1; - return pTab->HasEditText(rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row()); + return pTab->GetFirstEditTextRow(rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row()); } void ScDocument::SetTextCell( const ScAddress& rPos, const OUString& rStr ) diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index af4587d..dc35b16 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -1347,23 +1347,30 @@ void ScTable::SetEditText( SCCOL nCol, SCROW nRow, const EditTextObject& rEditTe aCol[nCol].SetEditText(nRow, rEditText, pEditPool); } -bool ScTable::HasEditText( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const +SCROW ScTable::GetFirstEditTextRow( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const { if (!ValidCol(nCol1) || !ValidCol(nCol2) || nCol2 < nCol1) - return false; + return -1; if (!ValidRow(nRow1) || !ValidRow(nRow2) || nRow2 < nRow1) - return false; + return -1; - SCROW nFirst = -1; + SCROW nFirst = MAXROW+1; for (SCCOL i = nCol1; i <= nCol2; ++i) { const ScColumn& rCol = aCol[i]; - if (const_cast<ScColumn&>(rCol).HasEditCells(nRow1, nRow2, nFirst)) - return true; + SCROW nThisFirst = -1; + if (const_cast<ScColumn&>(rCol).HasEditCells(nRow1, nRow2, nThisFirst)) + { + if (nThisFirst == nRow1) + return nRow1; + + if (nThisFirst < nFirst) + nFirst = nThisFirst; + } } - return false; + return nFirst == (MAXROW+1) ? -1 : nFirst; } void ScTable::SetEmptyCell( SCCOL nCol, SCROW nRow ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits