/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include // fuer GetBodyTxtNode #include #include #include #include #include // fuer _SetGetExpFld #include using namespace ::com::sun::star; using ::rtl::OUString; SwTblFieldType::SwTblFieldType(SwDoc* pDocPtr) : SwValueFieldType( pDocPtr, RES_TABLEFLD ) {} SwFieldType* SwTblFieldType::Copy() const { return new SwTblFieldType(GetDoc()); } void SwTblField::CalcField( SwTblCalcPara& rCalcPara ) { if( rCalcPara.rCalc.IsCalcError() ) // ist schon Fehler gesetzt ? return; // erzeuge aus den BoxNamen die Pointer BoxNmToPtr( rCalcPara.pTbl ); String sFml( MakeFormel( rCalcPara )); SetValue( rCalcPara.rCalc.Calculate( sFml ).GetDouble() ); ChgValid( !rCalcPara.IsStackOverFlow() ); // ist der Wert wieder gueltig? } SwTblField::SwTblField( SwTblFieldType* pInitType, const String& rFormel, sal_uInt16 nType, sal_uLong nFmt ) : SwValueField( pInitType, nFmt ), SwTableFormula( rFormel ), sExpand( '0' ), nSubType(nType) { } SwField* SwTblField::Copy() const { SwTblField* pTmp = new SwTblField( (SwTblFieldType*)GetTyp(), SwTableFormula::GetFormula(), nSubType, GetFormat() ); pTmp->sExpand = sExpand; pTmp->SwValueField::SetValue(GetValue()); pTmp->SwTableFormula::operator=( *this ); pTmp->SetAutomaticLanguage(IsAutomaticLanguage()); return pTmp; } String SwTblField::GetFieldName() const { String aStr(GetTyp()->GetName()); aStr += ' '; aStr += const_cast(this)->GetCommand(); return aStr; } // suche den TextNode, in dem das Feld steht const SwNode* SwTblField::GetNodeOfFormula() const { if( !GetTyp()->GetDepends() ) return 0; SwIterator aIter( *GetTyp() ); for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) if( this == pFmtFld->GetField() ) return (SwTxtNode*)&pFmtFld->GetTxtFld()->GetTxtNode(); return 0; } String SwTblField::GetCommand() { if (EXTRNL_NAME != GetNameType()) { SwNode const*const pNd = GetNodeOfFormula(); SwTableNode const*const pTblNd = (pNd) ? pNd->FindTableNode() : 0; if (pTblNd) { PtrToBoxNm( &pTblNd->GetTable() ); } } return (EXTRNL_NAME == GetNameType()) ? SwTableFormula::GetFormula() : String(); } String SwTblField::Expand() const { String aStr; if (nSubType & nsSwExtendedSubType::SUB_CMD) { aStr = const_cast(this)->GetCommand(); } else { aStr = sExpand; if(nSubType & nsSwGetSetExpType::GSE_STRING) { // es ist ein String aStr = sExpand; aStr.Erase( 0,1 ); aStr.Erase( aStr.Len()-1, 1 ); } } return aStr; } sal_uInt16 SwTblField::GetSubType() const { return nSubType; } void SwTblField::SetSubType(sal_uInt16 nType) { nSubType = nType; } void SwTblField::SetValue( const double& rVal ) { SwValueField::SetValue(rVal); sExpand = ((SwValueFieldType*)GetTyp())->ExpandValue(rVal, GetFormat(), GetLanguage()); } /*-------------------------------------------------------------------- Beschreibung: Parameter setzen --------------------------------------------------------------------*/ String SwTblField::GetPar2() const { return SwTableFormula::GetFormula(); } void SwTblField::SetPar2(const String& rStr) { SetFormula( rStr ); } sal_Bool SwTblField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const { sal_Bool bRet = sal_True; switch ( nWhichId ) { case FIELD_PROP_PAR2: { sal_uInt16 nOldSubType = nSubType; SwTblField* pThis = (SwTblField*)this; pThis->nSubType |= nsSwExtendedSubType::SUB_CMD; rAny <<= rtl::OUString( Expand() ); pThis->nSubType = nOldSubType; } break; case FIELD_PROP_BOOL1: { sal_Bool bFormula = 0 != (nsSwExtendedSubType::SUB_CMD & nSubType); rAny.setValue(&bFormula, ::getBooleanCppuType()); } break; case FIELD_PROP_PAR1: rAny <<= rtl::OUString(GetExpStr()); break; case FIELD_PROP_FORMAT: rAny <<= (sal_Int32)GetFormat(); break; default: bRet = sal_False; } return bRet; } sal_Bool SwTblField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) { sal_Bool bRet = sal_True; String sTmp; switch ( nWhichId ) { case FIELD_PROP_PAR2: SetFormula( ::GetString( rAny, sTmp )); break; case FIELD_PROP_BOOL1: if(*(sal_Bool*)rAny.getValue()) nSubType = nsSwGetSetExpType::GSE_FORMULA|nsSwExtendedSubType::SUB_CMD; else nSubType = nsSwGetSetExpType::GSE_FORMULA; break; case FIELD_PROP_PAR1: ChgExpStr( ::GetString( rAny, sTmp )); break; case FIELD_PROP_FORMAT: { sal_Int32 nTmp = 0; rAny >>= nTmp; SetFormat(nTmp); } break; default: bRet = sal_False; } return bRet; }