Author: orw Date: Mon Jul 14 13:36:56 2014 New Revision: 1610411 URL: http://svn.apache.org/r1610411 Log: 125228: correct consideration of InputFields in table cells are part of table formulas
Modified: openoffice/trunk/main/sw/source/core/fields/cellfml.cxx openoffice/trunk/main/sw/source/core/txtnode/atrfld.cxx Modified: openoffice/trunk/main/sw/source/core/fields/cellfml.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/fields/cellfml.cxx?rev=1610411&r1=1610410&r2=1610411&view=diff ============================================================================== --- openoffice/trunk/main/sw/source/core/fields/cellfml.cxx (original) +++ openoffice/trunk/main/sw/source/core/fields/cellfml.cxx Mon Jul 14 13:36:56 2014 @@ -156,53 +156,61 @@ double SwTableBox::GetValue( SwTblCalcPa if ( nSttPos < rTxt.Len() && ( CH_TXTATR_BREAKWORD == Char || CH_TXTATR_INWORD == Char ) ) { - SwIndex aIdx( pTxtNd, nSttPos ); - SwTxtFld * const pTxtFld = static_cast<SwTxtFld*>( - pTxtNd->GetTxtAttrForCharAt(aIdx.GetIndex(), RES_TXTATR_FIELD)); - if( !pTxtFld ) - break; - - rCalcPara.rCalc.SetCalcError( CALC_NOERR ); // wieder zuruecksetzen - - const SwField* pFld = pTxtFld->GetFmtFld().GetField(); - switch( pFld->GetTyp()->Which() ) - { - case RES_SETEXPFLD: - nRet = ((SwSetExpField*)pFld)->GetValue(); - break; - case RES_USERFLD: - nRet = ((SwUserFieldType*)pFld)->GetValue(); - break; - case RES_TABLEFLD: - { - SwTblField* pTblFld = (SwTblField*)pFld; - if( !pTblFld->IsValid() ) // ist der Wert gueltig ?? - { - // die richtige Tabelle mitgeben! - const SwTable* pTmp = rCalcPara.pTbl; - rCalcPara.pTbl = &pTxtNd->FindTableNode()->GetTable(); - pTblFld->CalcField( rCalcPara ); - rCalcPara.pTbl = pTmp; - } - nRet = pTblFld->GetValue(); - } - break; - - case RES_DATETIMEFLD: - nRet = ((SwDateTimeField*)pFld)->GetValue(); - break; + SwTxtFld * const pTxtFld = + static_cast<SwTxtFld*>( pTxtNd->GetTxtAttrForCharAt( nSttPos, RES_TXTATR_FIELD ) ); + if ( pTxtFld == NULL ) + break; - case RES_JUMPEDITFLD: - //JP 14.09.98: Bug 56112 - der Platzhalter kann nie einen - // gueltigen Inhalt haben! - nRet = 0; - break; + rCalcPara.rCalc.SetCalcError( CALC_NOERR ); // wieder zuruecksetzen - default: - String const value(pFld->ExpandField(true)); - nRet = rCalcPara.rCalc.Calculate(value).GetDouble(); - } - } + const SwField* pFld = pTxtFld->GetFmtFld().GetField(); + switch ( pFld->GetTyp()->Which() ) + { + case RES_SETEXPFLD: + nRet = ( (SwSetExpField*) pFld )->GetValue(); + break; + case RES_USERFLD: + nRet = ( (SwUserFieldType*) pFld )->GetValue(); + break; + case RES_TABLEFLD: + { + SwTblField* pTblFld = (SwTblField*) pFld; + if ( !pTblFld->IsValid() ) // ist der Wert gueltig ?? + { + // die richtige Tabelle mitgeben! + const SwTable* pTmp = rCalcPara.pTbl; + rCalcPara.pTbl = &pTxtNd->FindTableNode()->GetTable(); + pTblFld->CalcField( rCalcPara ); + rCalcPara.pTbl = pTmp; + } + nRet = pTblFld->GetValue(); + } + break; + + case RES_DATETIMEFLD: + nRet = ( (SwDateTimeField*) pFld )->GetValue(); + break; + + case RES_JUMPEDITFLD: + // placeholder does not have valid content + nRet = 0; + break; + + default: + String const value( pFld->ExpandField( true ) ); + nRet = rCalcPara.rCalc.Calculate( value ).GetDouble(); + } + } + else if ( nSttPos < rTxt.Len() + && Char == CH_TXT_ATR_INPUTFIELDSTART ) + { + const SwTxtInputFld * pTxtInputFld = + dynamic_cast< const SwTxtInputFld* >( + pTxtNd->GetTxtAttrAt( nSttPos, RES_TXTATR_INPUTFIELD, SwTxtNode::DEFAULT ) ); + if ( pTxtInputFld == NULL ) + break; + nRet = rCalcPara.rCalc.Calculate( pTxtInputFld->GetFieldContent() ).GetDouble(); + } else { // Ergebnis ist 0 und kein Fehler! Modified: openoffice/trunk/main/sw/source/core/txtnode/atrfld.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/txtnode/atrfld.cxx?rev=1610411&r1=1610410&r2=1610411&view=diff ============================================================================== --- openoffice/trunk/main/sw/source/core/txtnode/atrfld.cxx (original) +++ openoffice/trunk/main/sw/source/core/txtnode/atrfld.cxx Mon Jul 14 13:36:56 2014 @@ -28,6 +28,7 @@ #include <fmtfld.hxx> #include <txtfld.hxx> #include <txtannotationfld.hxx> +#include <docfld.hxx> #include <docufld.hxx> #include <doc.hxx> @@ -573,6 +574,8 @@ void SwTxtInputFld::UpdateFieldContent() if ( pInputFld != NULL ) { const_cast<SwInputField*>(pInputFld)->applyFieldContent( aNewFieldContent ); + // trigger update of fields for scenarios in which the Input Field's content is part of e.g. a table formula + GetTxtNode().GetDoc()->GetUpdtFlds().SetFieldsDirty( sal_True ); } } }