sw/source/core/doc/DocumentFieldsManager.cxx | 308 ++++++++++++--------------- 1 file changed, 139 insertions(+), 169 deletions(-)
New commits: commit 64d1a735b2b371495bfd56faf7070fb3274533ad Author: Bjoern Michaelsen <bjoern.michael...@libreoffice.org> AuthorDate: Sat Mar 4 18:44:28 2023 +0100 Commit: Bjoern Michaelsen <bjoern.michael...@libreoffice.org> CommitDate: Mon Mar 20 21:35:46 2023 +0000 DocumentFieldsManager::UpdateFields refactoring - flatten preconditions - flatten conditionals Change-Id: I477220d66ff9fb4e05980a978dda8a7fab85caa4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148252 Tested-by: Jenkins Reviewed-by: Bjoern Michaelsen <bjoern.michael...@libreoffice.org> diff --git a/sw/source/core/doc/DocumentFieldsManager.cxx b/sw/source/core/doc/DocumentFieldsManager.cxx index 6c983e891544..3503ba053e68 100644 --- a/sw/source/core/doc/DocumentFieldsManager.cxx +++ b/sw/source/core/doc/DocumentFieldsManager.cxx @@ -600,51 +600,28 @@ void DocumentFieldsManager::UpdateTableFields( SfxPoolItem* pHt ) { OSL_ENSURE( !pHt || RES_TABLEFML_UPDATE == pHt->Which(), "What MessageItem is this?" ); - SwTableFormulaUpdate* pUpdateField = nullptr; - if( pHt && RES_TABLEFML_UPDATE == pHt->Which() ) + if(pHt && RES_TABLEFML_UPDATE == pHt->Which()) pUpdateField = static_cast<SwTableFormulaUpdate*>(pHt); assert(!pUpdateField || pUpdateField->m_eFlags != TBL_BOXPTR); // use SwTable::SwitchFormulasToInternalRepresentation auto pFieldType = GetFieldType( SwFieldIds::Table, OUString(), false ); - if(pFieldType) + if(pFieldType && (!pUpdateField || pUpdateField->m_eFlags == TBL_CALC)) { std::vector<SwFormatField*> vFields; pFieldType->GatherFields(vFields); for(auto pFormatField : vFields) { + if(!pFormatField->GetTextField()->GetTextNode().FindTableNode()) + continue; SwTableField* pField = static_cast<SwTableField*>(pFormatField->GetField()); - if( pUpdateField ) - { - // table where this field is located - const SwTableNode* pTableNd; - const SwTextNode& rTextNd = pFormatField->GetTextField()->GetTextNode(); - pTableNd = rTextNd.FindTableNode(); - if (pTableNd == nullptr) - continue; - - switch( pUpdateField->m_eFlags ) - { - case TBL_CALC: - // re-set the value flag - // JP 17.06.96: internal representation of all formulas - // (reference to other table!!!) - if( nsSwExtendedSubType::SUB_CMD & pField->GetSubType() ) - pField->PtrToBoxNm( pUpdateField->m_pTable ); - else - pField->ChgValid( false ); - break; - case TBL_BOXPTR: - case TBL_BOXNAME: - case TBL_RELBOXNAME: - assert(false); // use SwTable::SwitchTo... - break; - default: - break; - } - } + // re-set the value flag + // JP 17.06.96: internal representation of all formulas + // (reference to other table!!!) + if(pUpdateField && nsSwExtendedSubType::SUB_CMD & pField->GetSubType()) + pField->PtrToBoxNm(pUpdateField->m_pTable); else // reset the value flag for all - pField->ChgValid( false ); + pField->ChgValid(false); } } // process all table box formulas @@ -663,9 +640,8 @@ void DocumentFieldsManager::UpdateTableFields( SfxPoolItem* pHt ) } // all fields/boxes are now invalid, so we can start to calculate - if( pHt && ( RES_TABLEFML_UPDATE != pHt->Which() || - TBL_CALC != static_cast<SwTableFormulaUpdate*>(pHt)->m_eFlags )) - return ; + if(pHt && ( RES_TABLEFML_UPDATE != pHt->Which() || TBL_CALC != static_cast<SwTableFormulaUpdate*>(pHt)->m_eFlags)) + return; std::optional<SwCalc> oCalc; @@ -675,80 +651,79 @@ void DocumentFieldsManager::UpdateTableFields( SfxPoolItem* pHt ) pFieldType->GatherFields(vFields); for(SwFormatField* pFormatField: vFields) { - // start calculation at the end - // new fields are inserted at the beginning of the modify chain - // that gives faster calculation on import - // mba: do we really need this "optimization"? Is it still valid? - SwTableField *const pField(static_cast<SwTableField*>(pFormatField->GetField())); - if (nsSwExtendedSubType::SUB_CMD & pField->GetSubType()) + // start calculation at the end + // new fields are inserted at the beginning of the modify chain + // that gives faster calculation on import + // mba: do we really need this "optimization"? Is it still valid? + SwTableField *const pField(static_cast<SwTableField*>(pFormatField->GetField())); + if (nsSwExtendedSubType::SUB_CMD & pField->GetSubType()) + continue; + + // needs to be recalculated + if( !pField->IsValid() ) + { + // table where this field is located + const SwTextNode& rTextNd = pFormatField->GetTextField()->GetTextNode(); + const SwTableNode* pTableNd = rTextNd.FindTableNode(); + if( !pTableNd ) + continue; + + // if this field is not in the to-be-updated table, skip it + if( pHt && &pTableNd->GetTable() != pUpdateField->m_pTable ) continue; - // needs to be recalculated - if( !pField->IsValid() ) + if( !oCalc ) + oCalc.emplace( m_rDoc ); + + // get the values of all SetExpression fields that are valid + // until the table + SwFrame* pFrame = nullptr; + if( pTableNd->GetIndex() < m_rDoc.GetNodes().GetEndOfExtras().GetIndex() ) { - // table where this field is located - const SwTextNode& rTextNd = pFormatField->GetTextField()->GetTextNode(); - const SwTableNode* pTableNd = rTextNd.FindTableNode(); - if( !pTableNd ) - continue; - - // if this field is not in the to-be-updated table, skip it - if( pHt && &pTableNd->GetTable() != - static_cast<SwTableFormulaUpdate*>(pHt)->m_pTable ) - continue; - - if( !oCalc ) - oCalc.emplace( m_rDoc ); - - // get the values of all SetExpression fields that are valid - // until the table - SwFrame* pFrame = nullptr; - if( pTableNd->GetIndex() < m_rDoc.GetNodes().GetEndOfExtras().GetIndex() ) + // is in the special section, that's expensive! + Point aPt; // return the first frame of the layout - Tab.Headline!! + std::pair<Point, bool> const tmp(aPt, true); + pFrame = rTextNd.getLayoutFrame(pLayout, nullptr, &tmp); + if( pFrame ) { - // is in the special section, that's expensive! - Point aPt; // return the first frame of the layout - Tab.Headline!! - std::pair<Point, bool> const tmp(aPt, true); - pFrame = rTextNd.getLayoutFrame(pLayout, nullptr, &tmp); - if( pFrame ) + SwPosition aPos( *pTableNd ); + if( GetBodyTextNode( m_rDoc, aPos, *pFrame ) ) { - SwPosition aPos( *pTableNd ); - if( GetBodyTextNode( m_rDoc, aPos, *pFrame ) ) - { - FieldsToCalc( *oCalc, SetGetExpField( - aPos.GetNode(), pFormatField->GetTextField(), - aPos.GetContentIndex(), pFrame->GetPhyPageNum()), - pLayout); - } - else - pFrame = nullptr; + FieldsToCalc( *oCalc, SetGetExpField( + aPos.GetNode(), pFormatField->GetTextField(), + aPos.GetContentIndex(), pFrame->GetPhyPageNum()), + pLayout); } + else + pFrame = nullptr; } - if( !pFrame ) - { - // create index to determine the TextNode - SwFrame const*const pFrame2 = ::sw::FindNeighbourFrameForNode(rTextNd); - FieldsToCalc( *oCalc, - SetGetExpField(rTextNd, pFormatField->GetTextField(), - std::nullopt, - pFrame2 ? pFrame2->GetPhyPageNum() : 0), - pLayout); - } + } + if( !pFrame ) + { + // create index to determine the TextNode + SwFrame const*const pFrame2 = ::sw::FindNeighbourFrameForNode(rTextNd); + FieldsToCalc( *oCalc, + SetGetExpField(rTextNd, pFormatField->GetTextField(), + std::nullopt, + pFrame2 ? pFrame2->GetPhyPageNum() : 0), + pLayout); + } - SwTableCalcPara aPara(*oCalc, pTableNd->GetTable(), pLayout); - pField->CalcField( aPara ); - if( aPara.IsStackOverflow() ) + SwTableCalcPara aPara(*oCalc, pTableNd->GetTable(), pLayout); + pField->CalcField( aPara ); + if( aPara.IsStackOverflow() ) + { + bool const bResult = aPara.CalcWithStackOverflow(); + if (bResult) { - bool const bResult = aPara.CalcWithStackOverflow(); - if (bResult) - { - pField->CalcField( aPara ); - } - OSL_ENSURE(bResult, - "the chained formula could no be calculated"); + pField->CalcField( aPara ); } - oCalc->SetCalcError( SwCalcError::NONE ); + OSL_ENSURE(bResult, + "the chained formula could no be calculated"); } - pFormatField->UpdateTextNode(nullptr, pHt); + oCalc->SetCalcError( SwCalcError::NONE ); + } + pFormatField->UpdateTextNode(nullptr, pHt); } } @@ -756,87 +731,82 @@ void DocumentFieldsManager::UpdateTableFields( SfxPoolItem* pHt ) for (const SfxPoolItem* pItem : m_rDoc.GetAttrPool().GetItemSurrogates(RES_BOXATR_FORMULA)) { auto pFormula = const_cast<SwTableBoxFormula*>(dynamic_cast<const SwTableBoxFormula*>(pItem)); - if( pFormula && pFormula->GetDefinedIn() && !pFormula->IsValid() ) + if(!pFormula || !pFormula->GetDefinedIn() || pFormula->IsValid()) + continue; + SwTableBox* pBox = pFormula->GetTableBox(); + if(!pBox || !pBox->GetSttNd() || !pBox->GetSttNd()->GetNodes().IsDocNodes()) + continue; + const SwTableNode* pTableNd = pBox->GetSttNd()->FindTableNode(); + if(pHt && &pTableNd->GetTable() != pUpdateField->m_pTable) + continue; + double nValue; + if( !oCalc ) + oCalc.emplace( m_rDoc ); + + // get the values of all SetExpression fields that are valid + // until the table + SwFrame* pFrame = nullptr; + if( pTableNd->GetIndex() < m_rDoc.GetNodes().GetEndOfExtras().GetIndex() ) { - SwTableBox* pBox = pFormula->GetTableBox(); - if( pBox && pBox->GetSttNd() && - pBox->GetSttNd()->GetNodes().IsDocNodes() ) + // is in the special section, that's expensive! + SwNodeIndex aCNdIdx( *pTableNd, +2 ); + SwContentNode* pCNd = aCNdIdx.GetNode().GetContentNode(); + if( !pCNd ) + pCNd = m_rDoc.GetNodes().GoNext( &aCNdIdx ); + + if (pCNd) { - const SwTableNode* pTableNd = pBox->GetSttNd()->FindTableNode(); - if( !pHt || &pTableNd->GetTable() == - static_cast<SwTableFormulaUpdate*>(pHt)->m_pTable ) + Point aPt; // return the first frame of the layout - Tab.Headline!! + std::pair<Point, bool> const tmp(aPt, true); + pFrame = pCNd->getLayoutFrame(pLayout, nullptr, &tmp); + if( pFrame ) { - double nValue; - if( !oCalc ) - oCalc.emplace( m_rDoc ); - - // get the values of all SetExpression fields that are valid - // until the table - SwFrame* pFrame = nullptr; - if( pTableNd->GetIndex() < m_rDoc.GetNodes().GetEndOfExtras().GetIndex() ) + SwPosition aPos( *pCNd ); + if( GetBodyTextNode( m_rDoc, aPos, *pFrame ) ) { - // is in the special section, that's expensive! - SwNodeIndex aCNdIdx( *pTableNd, +2 ); - SwContentNode* pCNd = aCNdIdx.GetNode().GetContentNode(); - if( !pCNd ) - pCNd = m_rDoc.GetNodes().GoNext( &aCNdIdx ); - - if (pCNd) - { - Point aPt; // return the first frame of the layout - Tab.Headline!! - std::pair<Point, bool> const tmp(aPt, true); - pFrame = pCNd->getLayoutFrame(pLayout, nullptr, &tmp); - if( pFrame ) - { - SwPosition aPos( *pCNd ); - if( GetBodyTextNode( m_rDoc, aPos, *pFrame ) ) - { - FieldsToCalc(*oCalc, SetGetExpField(aPos.GetNode(), - nullptr, std::nullopt, pFrame->GetPhyPageNum()), - pLayout); - } - else - pFrame = nullptr; - } - } - } - if( !pFrame ) - { - // create index to determine the TextNode - SwFrame const*const pFrame2 = ::sw::FindNeighbourFrameForNode(*pTableNd); - FieldsToCalc(*oCalc, SetGetExpField(*pTableNd, nullptr, std::nullopt, - pFrame2 ? pFrame2->GetPhyPageNum() : 0), + FieldsToCalc(*oCalc, SetGetExpField(aPos.GetNode(), + nullptr, std::nullopt, pFrame->GetPhyPageNum()), pLayout); } + else + pFrame = nullptr; + } + } + } + if( !pFrame ) + { + // create index to determine the TextNode + SwFrame const*const pFrame2 = ::sw::FindNeighbourFrameForNode(*pTableNd); + FieldsToCalc(*oCalc, SetGetExpField(*pTableNd, nullptr, std::nullopt, + pFrame2 ? pFrame2->GetPhyPageNum() : 0), + pLayout); + } - SwTableCalcPara aPara(*oCalc, pTableNd->GetTable(), pLayout); - pFormula->Calc( aPara, nValue ); + SwTableCalcPara aPara(*oCalc, pTableNd->GetTable(), pLayout); + pFormula->Calc( aPara, nValue ); - if( aPara.IsStackOverflow() ) - { - bool const bResult = aPara.CalcWithStackOverflow(); - if (bResult) - { - pFormula->Calc( aPara, nValue ); - } - OSL_ENSURE(bResult, - "the chained formula could no be calculated"); - } + if( aPara.IsStackOverflow() ) + { + bool const bResult = aPara.CalcWithStackOverflow(); + if (bResult) + { + pFormula->Calc( aPara, nValue ); + } + OSL_ENSURE(bResult, + "the chained formula could no be calculated"); + } - SwFrameFormat* pFormat = pBox->ClaimFrameFormat(); - SfxItemSetFixed<RES_BOXATR_BEGIN,RES_BOXATR_END-1> aTmp( m_rDoc.GetAttrPool() ); + SwFrameFormat* pFormat = pBox->ClaimFrameFormat(); + SfxItemSetFixed<RES_BOXATR_BEGIN,RES_BOXATR_END-1> aTmp( m_rDoc.GetAttrPool() ); - if( oCalc->IsCalcError() ) - nValue = DBL_MAX; - aTmp.Put( SwTableBoxValue( nValue )); - if( SfxItemState::SET != pFormat->GetItemState( RES_BOXATR_FORMAT )) - aTmp.Put( SwTableBoxNumFormat( 0 )); - pFormat->SetFormatAttr( aTmp ); + if( oCalc->IsCalcError() ) + nValue = DBL_MAX; + aTmp.Put( SwTableBoxValue( nValue )); + if( SfxItemState::SET != pFormat->GetItemState( RES_BOXATR_FORMAT )) + aTmp.Put( SwTableBoxNumFormat( 0 )); + pFormat->SetFormatAttr( aTmp ); - oCalc->SetCalcError( SwCalcError::NONE ); - } - } - } + oCalc->SetCalcError( SwCalcError::NONE ); } }