/************************************************************** * * 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 #include #include #include #include #include #include #include using namespace ::com::sun::star; using ::rtl::OUString; /*-------------------------------------------------------------------- Beschreibung: Benutzerfelder --------------------------------------------------------------------*/ SwUserField::SwUserField(SwUserFieldType* pTyp, sal_uInt16 nSub, sal_uInt32 nFmt) : SwValueField(pTyp, nFmt), nSubType(nSub) { } String SwUserField::Expand() const { String sStr; if(!(nSubType & nsSwExtendedSubType::SUB_INVISIBLE)) sStr = ((SwUserFieldType*)GetTyp())->Expand(GetFormat(), nSubType, GetLanguage()); return sStr; } SwField* SwUserField::Copy() const { SwField* pTmp = new SwUserField((SwUserFieldType*)GetTyp(), nSubType, GetFormat()); pTmp->SetAutomaticLanguage(IsAutomaticLanguage()); return pTmp; } String SwUserField::GetFieldName() const { String aStr(SwFieldType::GetTypeStr(TYP_USERFLD)); aStr += ' '; aStr += GetTyp()->GetName(); aStr.AppendAscii(" = "); aStr += static_cast(GetTyp())->GetContent(); return aStr; } double SwUserField::GetValue() const { return ((SwUserFieldType*)GetTyp())->GetValue(); } void SwUserField::SetValue( const double& rVal ) { ((SwUserFieldType*)GetTyp())->SetValue(rVal); } /*-------------------------------------------------------------------- Beschreibung: Name --------------------------------------------------------------------*/ const String& SwUserField::GetPar1() const { return ((SwUserFieldType*)GetTyp())->GetName(); } /*-------------------------------------------------------------------- Beschreibung: Content --------------------------------------------------------------------*/ String SwUserField::GetPar2() const { return ((SwUserFieldType*)GetTyp())->GetContent(GetFormat()); } void SwUserField::SetPar2(const String& rStr) { ((SwUserFieldType*)GetTyp())->SetContent(rStr, GetFormat()); } sal_uInt16 SwUserField::GetSubType() const { return ((SwUserFieldType*)GetTyp())->GetType() | nSubType; } void SwUserField::SetSubType(sal_uInt16 nSub) { ((SwUserFieldType*)GetTyp())->SetType(nSub & 0x00ff); nSubType = nSub & 0xff00; } /*-----------------09.03.98 08:04------------------- --------------------------------------------------*/ sal_Bool SwUserField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const { switch( nWhichId ) { case FIELD_PROP_BOOL2: { sal_Bool bTmp = 0 != (nSubType & nsSwExtendedSubType::SUB_CMD); rAny.setValue(&bTmp, ::getBooleanCppuType()); } break; case FIELD_PROP_BOOL1: { sal_Bool bTmp = 0 == (nSubType & nsSwExtendedSubType::SUB_INVISIBLE); rAny.setValue(&bTmp, ::getBooleanCppuType()); } break; case FIELD_PROP_FORMAT: rAny <<= (sal_Int32)GetFormat(); break; default: return SwField::QueryValue(rAny, nWhichId); } return sal_True; } /*-----------------09.03.98 08:04------------------- --------------------------------------------------*/ sal_Bool SwUserField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) { switch( nWhichId ) { case FIELD_PROP_BOOL1: if(*(sal_Bool*) rAny.getValue()) nSubType &= (~nsSwExtendedSubType::SUB_INVISIBLE); else nSubType |= nsSwExtendedSubType::SUB_INVISIBLE; break; case FIELD_PROP_BOOL2: if(*(sal_Bool*) rAny.getValue()) nSubType |= nsSwExtendedSubType::SUB_CMD; else nSubType &= (~nsSwExtendedSubType::SUB_CMD); break; case FIELD_PROP_FORMAT: { sal_Int32 nTmp = 0; rAny >>= nTmp; SetFormat(nTmp); } break; default: return SwField::PutValue(rAny, nWhichId); } return sal_True; } /*-------------------------------------------------------------------- Beschreibung: Benutzerfeldtypen --------------------------------------------------------------------*/ SwUserFieldType::SwUserFieldType( SwDoc* pDocPtr, const String& aNam ) : SwValueFieldType( pDocPtr, RES_USERFLD ), nValue( 0 ), nType(nsSwGetSetExpType::GSE_STRING) { bValidValue = bDeleted = sal_False; aName = aNam; if (nType & nsSwGetSetExpType::GSE_STRING) EnableFormat(sal_False); // Numberformatter nicht einsetzen } String SwUserFieldType::Expand(sal_uInt32 nFmt, sal_uInt16 nSubType, sal_uInt16 nLng) { String aStr(aContent); if((nType & nsSwGetSetExpType::GSE_EXPR) && !(nSubType & nsSwExtendedSubType::SUB_CMD)) { EnableFormat(sal_True); aStr = ExpandValue(nValue, nFmt, nLng); } else EnableFormat(sal_False); // Numberformatter nicht einsetzen return aStr; } SwFieldType* SwUserFieldType::Copy() const { SwUserFieldType *pTmp = new SwUserFieldType( GetDoc(), aName ); pTmp->aContent = aContent; pTmp->nType = nType; pTmp->bValidValue = bValidValue; pTmp->nValue = nValue; pTmp->bDeleted = bDeleted; return pTmp; } const String& SwUserFieldType::GetName() const { return aName; } void SwUserFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( !pOld && !pNew ) ChgValid( sal_False ); NotifyClients( pOld, pNew ); // update Input Fields as there might be Input Fields depending on this User Field if ( !IsModifyLocked() ) { LockModify(); GetDoc()->GetSysFldType( RES_INPUTFLD )->UpdateFlds(); UnlockModify(); } } double SwUserFieldType::GetValue( SwCalc& rCalc ) { if(bValidValue) return nValue; if(!rCalc.Push( this )) { rCalc.SetCalcError( CALC_SYNTAX ); return 0; } nValue = rCalc.Calculate( aContent ).GetDouble(); rCalc.Pop( this ); if( !rCalc.IsCalcError() ) bValidValue = sal_True; else nValue = 0; return nValue; } String SwUserFieldType::GetContent( sal_uInt32 nFmt ) { if (nFmt && nFmt != SAL_MAX_UINT32) { String sFormattedValue; Color* pCol = 0; SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter(); pFormatter->GetOutputString(GetValue(), nFmt, sFormattedValue, &pCol); return sFormattedValue; } else return aContent; } void SwUserFieldType::SetContent( const String& rStr, sal_uInt32 nFmt ) { if( aContent != rStr ) { aContent = rStr; if (nFmt && nFmt != SAL_MAX_UINT32) { double fValue; SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter(); if (pFormatter->IsNumberFormat(rStr, nFmt, fValue)) { SetValue(fValue); aContent.Erase(); DoubleToString(aContent, fValue, nFmt); } } sal_Bool bModified = GetDoc()->IsModified(); GetDoc()->SetModified(); if( !bModified ) // Bug 57028 { GetDoc()->GetIDocumentUndoRedo().SetUndoNoResetModified(); } } } /*-----------------04.03.98 17:05------------------- --------------------------------------------------*/ sal_Bool SwUserFieldType::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const { switch( nWhichId ) { case FIELD_PROP_DOUBLE: rAny <<= (double) nValue; break; case FIELD_PROP_PAR2: rAny <<= rtl::OUString(aContent); break; case FIELD_PROP_BOOL1: { sal_Bool bExpression = 0 != (nsSwGetSetExpType::GSE_EXPR&nType); rAny.setValue(&bExpression, ::getBooleanCppuType()); } break; default: DBG_ERROR("illegal property"); } return sal_True; } /*-----------------04.03.98 17:05------------------- --------------------------------------------------*/ sal_Bool SwUserFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) { switch( nWhichId ) { case FIELD_PROP_DOUBLE: { double fVal = 0; rAny >>= fVal; nValue = fVal; // Folgende Zeile ist eigentlich falsch, da die Sprache unbekannt ist // (haengt am Feld) und aContent daher auch eigentlich ans Feld gehoeren // muesste. Jedes Feld kann eine andere Sprache, aber den gleichen Inhalt // haben, nur die Formatierung ist unterschiedlich. DoubleToString(aContent, nValue, (sal_uInt16)LANGUAGE_SYSTEM); } break; case FIELD_PROP_PAR2: ::GetString( rAny, aContent ); break; case FIELD_PROP_BOOL1: if(*(sal_Bool*)rAny.getValue()) { nType |= nsSwGetSetExpType::GSE_EXPR; nType &= ~nsSwGetSetExpType::GSE_STRING; } else { nType &= ~nsSwGetSetExpType::GSE_EXPR; nType |= nsSwGetSetExpType::GSE_STRING; } break; default: DBG_ERROR("illegal property"); } return sal_True; }