1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sw.hxx" 30 31 #include <svl/zforlist.hxx> 32 #include <svl/zformat.hxx> 33 34 #include <svx/svdmodel.hxx> 35 36 #include <calbck.hxx> 37 #include <calc.hxx> 38 #include <usrfld.hxx> 39 #include <doc.hxx> 40 #include <IDocumentUndoRedo.hxx> 41 #include <editsh.hxx> 42 #include <dpage.hxx> 43 #include <unofldmid.h> 44 45 46 using namespace ::com::sun::star; 47 using ::rtl::OUString; 48 49 /*-------------------------------------------------------------------- 50 Beschreibung: Benutzerfelder 51 --------------------------------------------------------------------*/ 52 53 SwUserField::SwUserField(SwUserFieldType* pTyp, sal_uInt16 nSub, sal_uInt32 nFmt) 54 : SwValueField(pTyp, nFmt), 55 nSubType(nSub) 56 { 57 } 58 59 String SwUserField::Expand() const 60 { 61 String sStr; 62 if(!(nSubType & nsSwExtendedSubType::SUB_INVISIBLE)) 63 sStr = ((SwUserFieldType*)GetTyp())->Expand(GetFormat(), nSubType, GetLanguage()); 64 65 return sStr; 66 } 67 68 SwField* SwUserField::Copy() const 69 { 70 SwField* pTmp = new SwUserField((SwUserFieldType*)GetTyp(), nSubType, GetFormat()); 71 pTmp->SetAutomaticLanguage(IsAutomaticLanguage()); 72 return pTmp; 73 } 74 75 String SwUserField::GetFieldName() const 76 { 77 String aStr(SwFieldType::GetTypeStr(TYP_USERFLD)); 78 aStr += ' '; 79 aStr += GetTyp()->GetName(); 80 aStr.AppendAscii(" = "); 81 aStr += static_cast<SwUserFieldType*>(GetTyp())->GetContent(); 82 return aStr; 83 } 84 85 double SwUserField::GetValue() const 86 { 87 return ((SwUserFieldType*)GetTyp())->GetValue(); 88 } 89 90 void SwUserField::SetValue( const double& rVal ) 91 { 92 ((SwUserFieldType*)GetTyp())->SetValue(rVal); 93 } 94 95 /*-------------------------------------------------------------------- 96 Beschreibung: Name 97 --------------------------------------------------------------------*/ 98 99 const String& SwUserField::GetPar1() const 100 { 101 return ((SwUserFieldType*)GetTyp())->GetName(); 102 } 103 104 /*-------------------------------------------------------------------- 105 Beschreibung: Content 106 --------------------------------------------------------------------*/ 107 108 String SwUserField::GetPar2() const 109 { 110 return ((SwUserFieldType*)GetTyp())->GetContent(GetFormat()); 111 } 112 113 void SwUserField::SetPar2(const String& rStr) 114 { 115 ((SwUserFieldType*)GetTyp())->SetContent(rStr, GetFormat()); 116 } 117 118 sal_uInt16 SwUserField::GetSubType() const 119 { 120 return ((SwUserFieldType*)GetTyp())->GetType() | nSubType; 121 } 122 123 void SwUserField::SetSubType(sal_uInt16 nSub) 124 { 125 ((SwUserFieldType*)GetTyp())->SetType(nSub & 0x00ff); 126 nSubType = nSub & 0xff00; 127 } 128 129 /*-----------------09.03.98 08:04------------------- 130 131 --------------------------------------------------*/ 132 sal_Bool SwUserField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const 133 { 134 switch( nWhichId ) 135 { 136 case FIELD_PROP_BOOL2: 137 { 138 sal_Bool bTmp = 0 != (nSubType & nsSwExtendedSubType::SUB_CMD); 139 rAny.setValue(&bTmp, ::getBooleanCppuType()); 140 } 141 break; 142 case FIELD_PROP_BOOL1: 143 { 144 sal_Bool bTmp = 0 == (nSubType & nsSwExtendedSubType::SUB_INVISIBLE); 145 rAny.setValue(&bTmp, ::getBooleanCppuType()); 146 } 147 break; 148 case FIELD_PROP_FORMAT: 149 rAny <<= (sal_Int32)GetFormat(); 150 break; 151 default: 152 return SwField::QueryValue(rAny, nWhichId); 153 } 154 return sal_True; 155 } 156 /*-----------------09.03.98 08:04------------------- 157 158 --------------------------------------------------*/ 159 sal_Bool SwUserField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) 160 { 161 switch( nWhichId ) 162 { 163 case FIELD_PROP_BOOL1: 164 if(*(sal_Bool*) rAny.getValue()) 165 nSubType &= (~nsSwExtendedSubType::SUB_INVISIBLE); 166 else 167 nSubType |= nsSwExtendedSubType::SUB_INVISIBLE; 168 break; 169 case FIELD_PROP_BOOL2: 170 if(*(sal_Bool*) rAny.getValue()) 171 nSubType |= nsSwExtendedSubType::SUB_CMD; 172 else 173 nSubType &= (~nsSwExtendedSubType::SUB_CMD); 174 break; 175 case FIELD_PROP_FORMAT: 176 { 177 sal_Int32 nTmp = 0; 178 rAny >>= nTmp; 179 SetFormat(nTmp); 180 } 181 break; 182 default: 183 return SwField::PutValue(rAny, nWhichId); 184 } 185 return sal_True; 186 } 187 188 /*-------------------------------------------------------------------- 189 Beschreibung: Benutzerfeldtypen 190 --------------------------------------------------------------------*/ 191 192 SwUserFieldType::SwUserFieldType( SwDoc* pDocPtr, const String& aNam ) 193 : SwValueFieldType( pDocPtr, RES_USERFLD ), 194 nValue( 0 ), 195 nType(nsSwGetSetExpType::GSE_STRING) 196 { 197 bValidValue = bDeleted = sal_False; 198 aName = aNam; 199 200 if (nType & nsSwGetSetExpType::GSE_STRING) 201 EnableFormat(sal_False); // Numberformatter nicht einsetzen 202 } 203 204 String SwUserFieldType::Expand(sal_uInt32 nFmt, sal_uInt16 nSubType, sal_uInt16 nLng) 205 { 206 String aStr(aContent); 207 if((nType & nsSwGetSetExpType::GSE_EXPR) && !(nSubType & nsSwExtendedSubType::SUB_CMD)) 208 { 209 EnableFormat(sal_True); 210 aStr = ExpandValue(nValue, nFmt, nLng); 211 } 212 else 213 EnableFormat(sal_False); // Numberformatter nicht einsetzen 214 215 return aStr; 216 } 217 218 SwFieldType* SwUserFieldType::Copy() const 219 { 220 SwUserFieldType *pTmp = new SwUserFieldType( GetDoc(), aName ); 221 pTmp->aContent = aContent; 222 pTmp->nType = nType; 223 pTmp->bValidValue = bValidValue; 224 pTmp->nValue = nValue; 225 pTmp->bDeleted = bDeleted; 226 227 return pTmp; 228 } 229 230 const String& SwUserFieldType::GetName() const 231 { 232 return aName; 233 } 234 235 void SwUserFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) 236 { 237 if( !pOld && !pNew ) 238 ChgValid( sal_False ); 239 240 NotifyClients( pOld, pNew ); 241 // und ggfs. am UserFeld haengende InputFelder updaten! 242 GetDoc()->GetSysFldType( RES_INPUTFLD )->UpdateFlds(); 243 } 244 245 double SwUserFieldType::GetValue( SwCalc& rCalc ) 246 { 247 if(bValidValue) 248 return nValue; 249 250 if(!rCalc.Push( this )) 251 { 252 rCalc.SetCalcError( CALC_SYNTAX ); 253 return 0; 254 } 255 nValue = rCalc.Calculate( aContent ).GetDouble(); 256 rCalc.Pop( this ); 257 258 if( !rCalc.IsCalcError() ) 259 bValidValue = sal_True; 260 else 261 nValue = 0; 262 263 return nValue; 264 } 265 266 String SwUserFieldType::GetContent( sal_uInt32 nFmt ) 267 { 268 if (nFmt && nFmt != SAL_MAX_UINT32) 269 { 270 String sFormattedValue; 271 Color* pCol = 0; 272 273 SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter(); 274 275 pFormatter->GetOutputString(GetValue(), nFmt, sFormattedValue, &pCol); 276 return sFormattedValue; 277 } 278 else 279 return aContent; 280 } 281 282 void SwUserFieldType::SetContent( const String& rStr, sal_uInt32 nFmt ) 283 { 284 if( aContent != rStr ) 285 { 286 aContent = rStr; 287 288 if (nFmt && nFmt != SAL_MAX_UINT32) 289 { 290 double fValue; 291 292 SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter(); 293 294 if (pFormatter->IsNumberFormat(rStr, nFmt, fValue)) 295 { 296 SetValue(fValue); 297 aContent.Erase(); 298 DoubleToString(aContent, fValue, nFmt); 299 } 300 } 301 302 sal_Bool bModified = GetDoc()->IsModified(); 303 GetDoc()->SetModified(); 304 if( !bModified ) // Bug 57028 305 { 306 GetDoc()->GetIDocumentUndoRedo().SetUndoNoResetModified(); 307 } 308 } 309 } 310 311 /*-----------------04.03.98 17:05------------------- 312 313 --------------------------------------------------*/ 314 sal_Bool SwUserFieldType::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const 315 { 316 switch( nWhichId ) 317 { 318 case FIELD_PROP_DOUBLE: 319 rAny <<= (double) nValue; 320 break; 321 case FIELD_PROP_PAR2: 322 rAny <<= rtl::OUString(aContent); 323 break; 324 case FIELD_PROP_BOOL1: 325 { 326 sal_Bool bExpression = 0 != (nsSwGetSetExpType::GSE_EXPR&nType); 327 rAny.setValue(&bExpression, ::getBooleanCppuType()); 328 } 329 break; 330 default: 331 DBG_ERROR("illegal property"); 332 } 333 return sal_True; 334 } 335 /*-----------------04.03.98 17:05------------------- 336 337 --------------------------------------------------*/ 338 sal_Bool SwUserFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) 339 { 340 switch( nWhichId ) 341 { 342 case FIELD_PROP_DOUBLE: 343 { 344 double fVal = 0; 345 rAny >>= fVal; 346 nValue = fVal; 347 348 // Folgende Zeile ist eigentlich falsch, da die Sprache unbekannt ist 349 // (haengt am Feld) und aContent daher auch eigentlich ans Feld gehoeren 350 // muesste. Jedes Feld kann eine andere Sprache, aber den gleichen Inhalt 351 // haben, nur die Formatierung ist unterschiedlich. 352 DoubleToString(aContent, nValue, (sal_uInt16)LANGUAGE_SYSTEM); 353 } 354 break; 355 case FIELD_PROP_PAR2: 356 ::GetString( rAny, aContent ); 357 break; 358 case FIELD_PROP_BOOL1: 359 if(*(sal_Bool*)rAny.getValue()) 360 { 361 nType |= nsSwGetSetExpType::GSE_EXPR; 362 nType &= ~nsSwGetSetExpType::GSE_STRING; 363 } 364 else 365 { 366 nType &= ~nsSwGetSetExpType::GSE_EXPR; 367 nType |= nsSwGetSetExpType::GSE_STRING; 368 } 369 break; 370 default: 371 DBG_ERROR("illegal property"); 372 } 373 return sal_True; 374 } 375 376 377 378