sc/source/core/tool/interpr4.cxx | 140 +++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 70 deletions(-)
New commits: commit 9e0663d0f0fbe03917669c346604ec46f3e8b532 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Jul 16 12:28:31 2013 -0400 ScColRowNameAuto to avoid calling CalcAbsIfRel. Change-Id: If0e7797ce33fa183ad95ad539caf7751ce71bad4 diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index d45cc2a..f55d22f 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -3619,82 +3619,82 @@ void ScInterpreter::ScColRowNameAuto() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScColRowNameAuto" ); ScComplexRefData aRefData( static_cast<const ScToken*>(pCur)->GetDoubleRef() ); - aRefData.CalcAbsIfRel( aPos ); - if ( aRefData.Valid() ) + ScRange aAbs = aRefData.toAbs(aPos); + if (!ValidRange(aAbs)) { - SCsCOL nStartCol; - SCsROW nStartRow; - SCsCOL nCol2; - SCsROW nRow2; - // evtl. Begrenzung durch definierte ColRowNameRanges merken - nCol2 = aRefData.Ref2.nCol; - nRow2 = aRefData.Ref2.nRow; - // DataArea der ersten Zelle - nStartCol = aRefData.Ref2.nCol = aRefData.Ref1.nCol; - nStartRow = aRefData.Ref2.nRow = aRefData.Ref1.nRow; - aRefData.Ref2.nTab = aRefData.Ref1.nTab; - pDok->GetDataArea( (SCTAB&) aRefData.Ref1.nTab, - (SCCOL&) aRefData.Ref1.nCol, - (SCROW&) aRefData.Ref1.nRow, - (SCCOL&) aRefData.Ref2.nCol, - (SCROW&) aRefData.Ref2.nRow, - true, false ); - // DataArea im Ursprung begrenzen - aRefData.Ref1.nCol = nStartCol; - aRefData.Ref1.nRow = nStartRow; - - //! korrespondiert mit ScCompiler::GetToken - if ( aRefData.Ref1.IsColRel() ) - { // ColName - aRefData.Ref2.nCol = nStartCol; - // evtl. vorherige Begrenzung durch definierte ColRowNameRanges erhalten - if ( aRefData.Ref2.nRow > nRow2 ) - aRefData.Ref2.nRow = nRow2; - SCROW nMyRow; - if ( aPos.Col() == nStartCol - && nStartRow <= (nMyRow = aPos.Row()) && nMyRow <= aRefData.Ref2.nRow ) - { // Formel in gleicher Spalte und innerhalb des Range - if ( nMyRow == nStartRow ) - { // direkt unter dem Namen den Rest nehmen - nStartRow++; - if ( nStartRow > MAXROW ) - nStartRow = MAXROW; - aRefData.Ref1.nRow = nStartRow; - } - else - { // weiter unten vom Namen bis zur Formelzelle - aRefData.Ref2.nRow = nMyRow - 1; - } + PushError( errNoRef ); + return; + } + + SCsCOL nStartCol; + SCsROW nStartRow; + + // evtl. Begrenzung durch definierte ColRowNameRanges merken + SCsCOL nCol2 = aAbs.aEnd.Col(); + SCsROW nRow2 = aAbs.aEnd.Row(); + // DataArea of the first cell + nStartCol = aAbs.aStart.Col(); + nStartRow = aAbs.aStart.Row(); + aAbs.aEnd = aAbs.aStart; // Shrink to the top-left cell. + + { + // Expand to the data area. Only modify the end position. + SCCOL nDACol1 = aAbs.aStart.Col(), nDACol2 = aAbs.aEnd.Col(); + SCROW nDARow1 = aAbs.aStart.Row(), nDARow2 = aAbs.aEnd.Row(); + pDok->GetDataArea(aAbs.aStart.Tab(), nDACol1, nDARow1, nDACol2, nDARow2, true, false); + aAbs.aEnd.SetCol(nDACol2); + aAbs.aEnd.SetRow(nDARow2); + } + + //! korrespondiert mit ScCompiler::GetToken + if ( aRefData.Ref1.IsColRel() ) + { // ColName + aAbs.aEnd.SetCol(nStartCol); + // evtl. vorherige Begrenzung durch definierte ColRowNameRanges erhalten + if (aAbs.aEnd.Row() > nRow2) + aAbs.aEnd.SetRow(nRow2); + SCROW nMyRow; + if ( aPos.Col() == nStartCol + && nStartRow <= (nMyRow = aPos.Row()) && nMyRow <= aAbs.aEnd.Row()) + { // Formel in gleicher Spalte und innerhalb des Range + if ( nMyRow == nStartRow ) + { // direkt unter dem Namen den Rest nehmen + nStartRow++; + if ( nStartRow > MAXROW ) + nStartRow = MAXROW; + aAbs.aStart.SetRow(nStartRow); } - } - else - { // RowName - aRefData.Ref2.nRow = nStartRow; - // evtl. vorherige Begrenzung durch definierte ColRowNameRanges erhalten - if ( aRefData.Ref2.nCol > nCol2 ) - aRefData.Ref2.nCol = nCol2; - SCCOL nMyCol; - if ( aPos.Row() == nStartRow - && nStartCol <= (nMyCol = aPos.Col()) && nMyCol <= aRefData.Ref2.nCol ) - { // Formel in gleicher Zeile und innerhalb des Range - if ( nMyCol == nStartCol ) - { // direkt neben dem Namen den Rest nehmen - nStartCol++; - if ( nStartCol > MAXCOL ) - nStartCol = MAXCOL; - aRefData.Ref1.nCol = nStartCol; - } - else - { // weiter rechts vom Namen bis zur Formelzelle - aRefData.Ref2.nCol = nMyCol - 1; - } + else + { // weiter unten vom Namen bis zur Formelzelle + aAbs.aEnd.SetRow(nMyRow - 1); } } - aRefData.CalcRelFromAbs( aPos ); - PushTempToken( new ScDoubleRefToken( aRefData ) ); } else - PushError( errNoRef ); + { // RowName + aAbs.aEnd.SetRow(nStartRow); + // evtl. vorherige Begrenzung durch definierte ColRowNameRanges erhalten + if (aAbs.aEnd.Col() > nCol2) + aAbs.aEnd.SetCol(nCol2); + SCCOL nMyCol; + if ( aPos.Row() == nStartRow + && nStartCol <= (nMyCol = aPos.Col()) && nMyCol <= aAbs.aEnd.Col()) + { // Formel in gleicher Zeile und innerhalb des Range + if ( nMyCol == nStartCol ) + { // direkt neben dem Namen den Rest nehmen + nStartCol++; + if ( nStartCol > MAXCOL ) + nStartCol = MAXCOL; + aAbs.aStart.SetCol(nStartCol); + } + else + { // weiter rechts vom Namen bis zur Formelzelle + aAbs.aEnd.SetCol(nMyCol - 1); + } + } + } + aRefData.SetRange(aAbs, aPos); + PushTempToken( new ScDoubleRefToken( aRefData ) ); } // --- internals ------------------------------------------------------------ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits