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 );
         }
     }
 }


Reply via email to