1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svl.hxx" 26 #ifndef GCC 27 #endif 28 29 #include <tools/color.hxx> 30 #include <tools/debug.hxx> 31 #include <i18npool/mslangid.hxx> 32 #include <vos/mutex.hxx> 33 #include <rtl/ustring.hxx> 34 35 #include <com/sun/star/util/Date.hpp> 36 #include <com/sun/star/beans/PropertyAttribute.hpp> 37 38 #include "numfmuno.hxx" 39 #include <svl/numuno.hxx> 40 #include <svl/zforlist.hxx> 41 #include <svl/zformat.hxx> 42 #include <svl/itemprop.hxx> 43 44 using namespace com::sun::star; 45 46 //------------------------------------------------------------------------ 47 48 #define SERVICENAME_NUMBERFORMATTER "com.sun.star.util.NumberFormatter" 49 #define SERVICENAME_NUMBERSETTINGS "com.sun.star.util.NumberFormatSettings" 50 #define SERVICENAME_NUMBERFORMATS "com.sun.star.util.NumberFormats" 51 #define SERVICENAME_NUMBERFORMAT "com.sun.star.util.NumberFormatProperties" 52 53 //------------------------------------------------------------------------ 54 55 #define PROPERTYNAME_FMTSTR "FormatString" 56 #define PROPERTYNAME_LOCALE "Locale" 57 #define PROPERTYNAME_TYPE "Type" 58 #define PROPERTYNAME_COMMENT "Comment" 59 #define PROPERTYNAME_CURREXT "CurrencyExtension" 60 #define PROPERTYNAME_CURRSYM "CurrencySymbol" 61 #define PROPERTYNAME_CURRABB "CurrencyAbbreviation" 62 #define PROPERTYNAME_DECIMALS "Decimals" 63 #define PROPERTYNAME_LEADING "LeadingZeros" 64 #define PROPERTYNAME_NEGRED "NegativeRed" 65 #define PROPERTYNAME_STDFORM "StandardFormat" 66 #define PROPERTYNAME_THOUS "ThousandsSeparator" 67 #define PROPERTYNAME_USERDEF "UserDefined" 68 69 #define PROPERTYNAME_NOZERO "NoZero" 70 #define PROPERTYNAME_NULLDATE "NullDate" 71 #define PROPERTYNAME_STDDEC "StandardDecimals" 72 #define PROPERTYNAME_TWODIGIT "TwoDigitDateStart" 73 74 //------------------------------------------------------------------------ 75 76 // alles ohne Which-ID, Map nur fuer PropertySetInfo 77 78 const SfxItemPropertyMapEntry* lcl_GetNumberFormatPropertyMap() 79 { 80 static SfxItemPropertyMapEntry aNumberFormatPropertyMap_Impl[] = 81 { 82 {MAP_CHAR_LEN(PROPERTYNAME_FMTSTR), 0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 83 {MAP_CHAR_LEN(PROPERTYNAME_LOCALE), 0, &getCppuType((lang::Locale*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 84 {MAP_CHAR_LEN(PROPERTYNAME_TYPE), 0, &getCppuType((sal_Int16*)0), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 85 {MAP_CHAR_LEN(PROPERTYNAME_COMMENT), 0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 86 {MAP_CHAR_LEN(PROPERTYNAME_CURREXT), 0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 87 {MAP_CHAR_LEN(PROPERTYNAME_CURRSYM), 0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 88 {MAP_CHAR_LEN(PROPERTYNAME_DECIMALS), 0, &getCppuType((sal_Int16*)0), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 89 {MAP_CHAR_LEN(PROPERTYNAME_LEADING), 0, &getCppuType((sal_Int16*)0), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 90 {MAP_CHAR_LEN(PROPERTYNAME_NEGRED), 0, &getBooleanCppuType(), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 91 {MAP_CHAR_LEN(PROPERTYNAME_STDFORM), 0, &getBooleanCppuType(), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 92 {MAP_CHAR_LEN(PROPERTYNAME_THOUS), 0, &getBooleanCppuType(), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 93 {MAP_CHAR_LEN(PROPERTYNAME_USERDEF), 0, &getBooleanCppuType(), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 94 {MAP_CHAR_LEN(PROPERTYNAME_CURRABB), 0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0}, 95 {0,0,0,0,0,0} 96 }; 97 return aNumberFormatPropertyMap_Impl; 98 } 99 100 const SfxItemPropertyMapEntry* lcl_GetNumberSettingsPropertyMap() 101 { 102 static SfxItemPropertyMapEntry aNumberSettingsPropertyMap_Impl[] = 103 { 104 {MAP_CHAR_LEN(PROPERTYNAME_NOZERO), 0, &getBooleanCppuType(), beans::PropertyAttribute::BOUND, 0}, 105 {MAP_CHAR_LEN(PROPERTYNAME_NULLDATE), 0, &getCppuType((util::Date*)0), beans::PropertyAttribute::BOUND, 0}, 106 {MAP_CHAR_LEN(PROPERTYNAME_STDDEC), 0, &getCppuType((sal_Int16*)0), beans::PropertyAttribute::BOUND, 0}, 107 {MAP_CHAR_LEN(PROPERTYNAME_TWODIGIT), 0, &getCppuType((sal_Int16*)0), beans::PropertyAttribute::BOUND, 0}, 108 {0,0,0,0,0,0} 109 }; 110 return aNumberSettingsPropertyMap_Impl; 111 } 112 113 //---------------------------------------------------------------------------------------- 114 115 LanguageType lcl_GetLanguage( const lang::Locale& rLocale ) 116 { 117 // empty language -> LANGUAGE_SYSTEM 118 if ( rLocale.Language.getLength() == 0 ) 119 return LANGUAGE_SYSTEM; 120 121 LanguageType eRet = MsLangId::convertLocaleToLanguage( rLocale ); 122 if ( eRet == LANGUAGE_NONE ) 123 eRet = LANGUAGE_SYSTEM; //! or throw an exception? 124 125 return eRet; 126 } 127 128 //---------------------------------------------------------------------------------------- 129 130 SvNumberFormatterServiceObj::SvNumberFormatterServiceObj() 131 :m_aMutex() 132 { 133 } 134 135 SvNumberFormatterServiceObj::~SvNumberFormatterServiceObj() 136 { 137 } 138 139 com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvNumberFormatterServiceObj_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ) 140 { 141 return ::com::sun::star::uno::Reference < ::com::sun::star::uno::XInterface >( ( ::cppu::OWeakObject* ) new SvNumberFormatterServiceObj ); 142 } 143 144 // XNumberFormatter 145 146 void SAL_CALL SvNumberFormatterServiceObj::attachNumberFormatsSupplier( 147 const uno::Reference<util::XNumberFormatsSupplier>& _xSupplier ) 148 throw(uno::RuntimeException) 149 { 150 ::rtl::Reference< SvNumberFormatsSupplierObj > xAutoReleaseOld; 151 152 // SYNCHRONIZED -> 153 { 154 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 155 156 SvNumberFormatsSupplierObj* pNew = SvNumberFormatsSupplierObj::getImplementation( _xSupplier ); 157 if (!pNew) 158 throw uno::RuntimeException(); // wrong object 159 160 xAutoReleaseOld = xSupplier; 161 162 xSupplier = pNew; 163 m_aMutex = xSupplier->getSharedMutex(); 164 } 165 // <- SYNCHRONIZED 166 } 167 168 uno::Reference<util::XNumberFormatsSupplier> SAL_CALL 169 SvNumberFormatterServiceObj::getNumberFormatsSupplier() 170 throw(uno::RuntimeException) 171 { 172 ::osl::MutexGuard aGuard( m_aMutex ); 173 return xSupplier.get(); 174 } 175 176 sal_Int32 SAL_CALL SvNumberFormatterServiceObj::detectNumberFormat( 177 sal_Int32 nKey, const rtl::OUString& aString ) 178 throw(util::NotNumericException, uno::RuntimeException) 179 { 180 ::osl::MutexGuard aGuard( m_aMutex ); 181 182 sal_Int32 nRet = 0; 183 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 184 if (pFormatter) 185 { 186 String aTemp = aString; 187 sal_uInt32 nUKey = nKey; 188 double fValue = 0.0; 189 if ( pFormatter->IsNumberFormat(aTemp, nUKey, fValue) ) 190 nRet = nUKey; 191 else 192 throw util::NotNumericException(); 193 } 194 else 195 throw uno::RuntimeException(); 196 197 return nRet; 198 } 199 200 double SAL_CALL SvNumberFormatterServiceObj::convertStringToNumber( 201 sal_Int32 nKey, const rtl::OUString& aString ) 202 throw(util::NotNumericException, uno::RuntimeException) 203 { 204 ::osl::MutexGuard aGuard( m_aMutex ); 205 206 double fRet = 0.0; 207 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 208 if (pFormatter) 209 { 210 String aTemp = aString; 211 sal_uInt32 nUKey = nKey; 212 double fValue = 0.0; 213 if ( pFormatter->IsNumberFormat(aTemp, nUKey, fValue) ) 214 fRet = fValue; 215 else 216 throw util::NotNumericException(); 217 } 218 else 219 throw uno::RuntimeException(); 220 221 return fRet; 222 } 223 224 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::convertNumberToString( 225 sal_Int32 nKey, double fValue ) throw(uno::RuntimeException) 226 { 227 ::osl::MutexGuard aGuard( m_aMutex ); 228 229 String aRet; 230 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 231 if (pFormatter) 232 { 233 Color* pColor = NULL; 234 pFormatter->GetOutputString(fValue, nKey, aRet, &pColor); 235 } 236 else 237 throw uno::RuntimeException(); 238 239 return aRet; 240 } 241 242 util::Color SAL_CALL SvNumberFormatterServiceObj::queryColorForNumber( sal_Int32 nKey, 243 double fValue, util::Color aDefaultColor ) 244 throw(uno::RuntimeException) 245 { 246 ::osl::MutexGuard aGuard( m_aMutex ); 247 248 util::Color nRet = aDefaultColor; // color = sal_Int32 249 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 250 if (pFormatter) 251 { 252 String aStr; 253 Color* pColor = NULL; 254 pFormatter->GetOutputString(fValue, nKey, aStr, &pColor); 255 if (pColor) 256 nRet = pColor->GetColor(); 257 // sonst Default behalten 258 } 259 else 260 throw uno::RuntimeException(); 261 262 return nRet; 263 } 264 265 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::formatString( sal_Int32 nKey, 266 const rtl::OUString& aString ) throw(uno::RuntimeException) 267 { 268 ::osl::MutexGuard aGuard( m_aMutex ); 269 270 String aRet; 271 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 272 if (pFormatter) 273 { 274 String aTemp = aString; 275 Color* pColor = NULL; 276 pFormatter->GetOutputString(aTemp, nKey, aRet, &pColor); 277 } 278 else 279 throw uno::RuntimeException(); 280 281 return aRet; 282 } 283 284 util::Color SAL_CALL SvNumberFormatterServiceObj::queryColorForString( sal_Int32 nKey, 285 const rtl::OUString& aString,util::Color aDefaultColor ) 286 throw(uno::RuntimeException) 287 { 288 ::osl::MutexGuard aGuard( m_aMutex ); 289 290 util::Color nRet = aDefaultColor; // color = sal_Int32 291 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 292 if (pFormatter) 293 { 294 String aTemp = aString; 295 String aStr; 296 Color* pColor = NULL; 297 pFormatter->GetOutputString(aTemp, nKey, aStr, &pColor); 298 if (pColor) 299 nRet = pColor->GetColor(); 300 // sonst Default behalten 301 } 302 else 303 throw uno::RuntimeException(); 304 305 return nRet; 306 } 307 308 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::getInputString( sal_Int32 nKey, double fValue ) 309 throw(uno::RuntimeException) 310 { 311 ::osl::MutexGuard aGuard( m_aMutex ); 312 313 String aRet; 314 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 315 if (pFormatter) 316 pFormatter->GetInputLineString(fValue, nKey, aRet); 317 else 318 throw uno::RuntimeException(); 319 320 return aRet; 321 } 322 323 // XNumberFormatPreviewer 324 325 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::convertNumberToPreviewString( 326 const rtl::OUString& aFormat, double fValue, 327 const lang::Locale& nLocale, sal_Bool bAllowEnglish ) 328 throw(util::MalformedNumberFormatException, uno::RuntimeException) 329 { 330 ::osl::MutexGuard aGuard( m_aMutex ); 331 332 String aRet; 333 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 334 if (pFormatter) 335 { 336 String aOutString; 337 String aFormString = aFormat; 338 LanguageType eLang = lcl_GetLanguage( nLocale ); 339 Color* pColor = NULL; 340 341 sal_Bool bOk; 342 if ( bAllowEnglish ) 343 bOk = pFormatter->GetPreviewStringGuess( 344 aFormString, fValue, aOutString, &pColor, eLang ); 345 else 346 bOk = pFormatter->GetPreviewString( 347 aFormString, fValue, aOutString, &pColor, eLang ); 348 349 if (bOk) 350 aRet = aOutString; 351 else 352 throw util::MalformedNumberFormatException(); 353 } 354 else 355 throw uno::RuntimeException(); 356 357 return aRet; 358 } 359 360 util::Color SAL_CALL SvNumberFormatterServiceObj::queryPreviewColorForNumber( 361 const rtl::OUString& aFormat, double fValue, 362 const lang::Locale& nLocale, sal_Bool bAllowEnglish, 363 util::Color aDefaultColor ) 364 throw(util::MalformedNumberFormatException, uno::RuntimeException) 365 { 366 ::osl::MutexGuard aGuard( m_aMutex ); 367 368 util::Color nRet = aDefaultColor; // color = sal_Int32 369 SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL; 370 if (pFormatter) 371 { 372 String aOutString; 373 String aFormString = aFormat; 374 LanguageType eLang = lcl_GetLanguage( nLocale ); 375 Color* pColor = NULL; 376 377 sal_Bool bOk; 378 if ( bAllowEnglish ) 379 bOk = pFormatter->GetPreviewStringGuess( 380 aFormString, fValue, aOutString, &pColor, eLang ); 381 else 382 bOk = pFormatter->GetPreviewString( 383 aFormString, fValue, aOutString, &pColor, eLang ); 384 385 if (bOk) 386 { 387 if (pColor) 388 nRet = pColor->GetColor(); 389 // sonst Default behalten 390 } 391 else 392 throw util::MalformedNumberFormatException(); 393 } 394 else 395 throw uno::RuntimeException(); 396 397 return nRet; 398 } 399 400 // XServiceInfo 401 402 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::getImplementationName() 403 throw(uno::RuntimeException) 404 { 405 return rtl::OUString::createFromAscii("com.sun.star.uno.util.numbers.SvNumberFormatterServiceObject"); 406 } 407 408 sal_Bool SAL_CALL SvNumberFormatterServiceObj::supportsService( const rtl::OUString& ServiceName ) 409 throw(uno::RuntimeException) 410 { 411 return ( ServiceName.compareToAscii(SERVICENAME_NUMBERFORMATTER) == 0 ); 412 } 413 414 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatterServiceObj::getSupportedServiceNames() 415 throw(uno::RuntimeException) 416 { 417 uno::Sequence<rtl::OUString> aRet(1); 418 rtl::OUString* pArray = aRet.getArray(); 419 pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERFORMATTER); 420 return aRet; 421 } 422 423 //------------------------------------------------------------------------ 424 425 SvNumberFormatsObj::SvNumberFormatsObj( SvNumberFormatsSupplierObj& _rParent, ::comphelper::SharedMutex& _rMutex ) 426 :rSupplier( _rParent ) 427 ,m_aMutex( _rMutex ) 428 { 429 rSupplier.acquire(); 430 } 431 432 SvNumberFormatsObj::~SvNumberFormatsObj() 433 { 434 rSupplier.release(); 435 } 436 437 // XNumberFormats 438 439 uno::Reference<beans::XPropertySet> SAL_CALL SvNumberFormatsObj::getByKey( sal_Int32 nKey ) 440 throw(uno::RuntimeException) 441 { 442 ::osl::MutexGuard aGuard( m_aMutex ); 443 444 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 445 const SvNumberformat* pFormat = pFormatter ? pFormatter->GetEntry(nKey) : NULL; 446 if (pFormat) 447 return new SvNumberFormatObj( rSupplier, nKey, m_aMutex ); 448 else 449 throw uno::RuntimeException(); 450 } 451 452 uno::Sequence<sal_Int32> SAL_CALL SvNumberFormatsObj::queryKeys( sal_Int16 nType, 453 const lang::Locale& nLocale, sal_Bool bCreate ) 454 throw(uno::RuntimeException) 455 { 456 ::osl::MutexGuard aGuard( m_aMutex ); 457 458 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 459 if ( pFormatter ) 460 { 461 sal_uInt32 nIndex = 0; 462 LanguageType eLang = lcl_GetLanguage( nLocale ); 463 SvNumberFormatTable& rTable = bCreate ? 464 pFormatter->ChangeCL( nType, nIndex, eLang ) : 465 pFormatter->GetEntryTable( nType, nIndex, eLang ); 466 sal_uInt32 nCount = rTable.Count(); 467 uno::Sequence<sal_Int32> aSeq(nCount); 468 sal_Int32* pAry = aSeq.getArray(); 469 for (sal_uInt32 i=0; i<nCount; i++) 470 pAry[i] = rTable.GetObjectKey( i ); 471 472 return aSeq; 473 } 474 else 475 throw uno::RuntimeException(); 476 } 477 478 sal_Int32 SAL_CALL SvNumberFormatsObj::queryKey( const rtl::OUString& aFormat, 479 const lang::Locale& nLocale, sal_Bool bScan ) 480 throw(uno::RuntimeException) 481 { 482 ::osl::MutexGuard aGuard( m_aMutex ); 483 484 sal_Int32 nRet = 0; 485 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 486 if (pFormatter) 487 { 488 String aFormStr = aFormat; 489 LanguageType eLang = lcl_GetLanguage( nLocale ); 490 if (bScan) 491 { 492 //! irgendwas muss hier noch passieren... 493 } 494 nRet = pFormatter->GetEntryKey( aFormat, eLang ); 495 } 496 else 497 throw uno::RuntimeException(); 498 499 return nRet; 500 } 501 502 sal_Int32 SAL_CALL SvNumberFormatsObj::addNew( const rtl::OUString& aFormat, 503 const lang::Locale& nLocale ) 504 throw(util::MalformedNumberFormatException, uno::RuntimeException) 505 { 506 ::osl::MutexGuard aGuard( m_aMutex ); 507 508 sal_Int32 nRet = 0; 509 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 510 if (pFormatter) 511 { 512 String aFormStr = aFormat; 513 LanguageType eLang = lcl_GetLanguage( nLocale ); 514 sal_uInt32 nKey = 0; 515 xub_StrLen nCheckPos = 0; 516 short nType = 0; 517 sal_Bool bOk = pFormatter->PutEntry( aFormStr, nCheckPos, nType, nKey, eLang ); 518 if (bOk) 519 nRet = nKey; 520 else if (nCheckPos) 521 { 522 throw util::MalformedNumberFormatException(); // ungueltiges Format 523 } 524 else 525 throw uno::RuntimeException(); // anderer Fehler (z.B. schon vorhanden) 526 } 527 else 528 throw uno::RuntimeException(); 529 530 return nRet; 531 } 532 533 sal_Int32 SAL_CALL SvNumberFormatsObj::addNewConverted( const rtl::OUString& aFormat, 534 const lang::Locale& nLocale, const lang::Locale& nNewLocale ) 535 throw(util::MalformedNumberFormatException, uno::RuntimeException) 536 { 537 ::osl::MutexGuard aGuard( m_aMutex ); 538 539 sal_Int32 nRet = 0; 540 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 541 if (pFormatter) 542 { 543 String aFormStr = aFormat; 544 LanguageType eLang = lcl_GetLanguage( nLocale ); 545 LanguageType eNewLang = lcl_GetLanguage( nNewLocale ); 546 sal_uInt32 nKey = 0; 547 xub_StrLen nCheckPos = 0; 548 short nType = 0; 549 sal_Bool bOk = pFormatter->PutandConvertEntry( aFormStr, nCheckPos, nType, nKey, eLang, eNewLang ); 550 if (bOk || nKey > 0) 551 nRet = nKey; 552 else if (nCheckPos) 553 { 554 throw util::MalformedNumberFormatException(); // ungueltiges Format 555 } 556 else 557 throw uno::RuntimeException(); // anderer Fehler (z.B. schon vorhanden) 558 } 559 else 560 throw uno::RuntimeException(); 561 562 return nRet; 563 } 564 565 void SAL_CALL SvNumberFormatsObj::removeByKey( sal_Int32 nKey ) throw(uno::RuntimeException) 566 { 567 ::osl::MutexGuard aGuard( m_aMutex ); 568 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 569 570 if (pFormatter) 571 { 572 pFormatter->DeleteEntry(nKey); 573 rSupplier.NumberFormatDeleted(nKey); // Benachrichtigung fuers Dokument 574 } 575 } 576 577 rtl::OUString SAL_CALL SvNumberFormatsObj::generateFormat( sal_Int32 nBaseKey, 578 const lang::Locale& nLocale, sal_Bool bThousands, 579 sal_Bool bRed, sal_Int16 nDecimals, sal_Int16 nLeading ) 580 throw(uno::RuntimeException) 581 { 582 ::osl::MutexGuard aGuard( m_aMutex ); 583 584 String aRet; 585 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 586 if (pFormatter) 587 { 588 LanguageType eLang = lcl_GetLanguage( nLocale ); 589 pFormatter->GenerateFormat( aRet, nBaseKey, eLang, bThousands, bRed, nDecimals, nLeading ); 590 } 591 else 592 throw uno::RuntimeException(); 593 594 return aRet; 595 } 596 597 // XNumberFormatTypes 598 599 sal_Int32 SAL_CALL SvNumberFormatsObj::getStandardIndex( const lang::Locale& nLocale ) 600 throw(uno::RuntimeException) 601 { 602 ::osl::MutexGuard aGuard( m_aMutex ); 603 604 sal_Int32 nRet = 0; 605 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 606 if (pFormatter) 607 { 608 LanguageType eLang = lcl_GetLanguage( nLocale ); 609 nRet = pFormatter->GetStandardIndex(eLang); 610 } 611 else 612 throw uno::RuntimeException(); 613 614 return nRet; 615 } 616 617 sal_Int32 SAL_CALL SvNumberFormatsObj::getStandardFormat( sal_Int16 nType, const lang::Locale& nLocale ) 618 throw(uno::RuntimeException) 619 { 620 ::osl::MutexGuard aGuard( m_aMutex ); 621 622 sal_Int32 nRet = 0; 623 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 624 if (pFormatter) 625 { 626 LanguageType eLang = lcl_GetLanguage( nLocale ); 627 // mask out "defined" bit, so type from an existing number format 628 // can directly be used for getStandardFormat 629 nType &= ~NUMBERFORMAT_DEFINED; 630 nRet = pFormatter->GetStandardFormat(nType, eLang); 631 } 632 else 633 throw uno::RuntimeException(); 634 635 return nRet; 636 } 637 638 sal_Int32 SAL_CALL SvNumberFormatsObj::getFormatIndex( sal_Int16 nIndex, const lang::Locale& nLocale ) 639 throw(uno::RuntimeException) 640 { 641 ::osl::MutexGuard aGuard( m_aMutex ); 642 643 sal_Int32 nRet = 0; 644 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 645 if (pFormatter) 646 { 647 LanguageType eLang = lcl_GetLanguage( nLocale ); 648 nRet = pFormatter->GetFormatIndex( (NfIndexTableOffset)nIndex, eLang ); 649 } 650 else 651 throw uno::RuntimeException(); 652 653 return nRet; 654 } 655 656 sal_Bool SAL_CALL SvNumberFormatsObj::isTypeCompatible( sal_Int16 nOldType, sal_Int16 nNewType ) 657 throw(uno::RuntimeException) 658 { 659 ::osl::MutexGuard aGuard( m_aMutex ); 660 661 sal_Bool bRet = sal_False; 662 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 663 if (pFormatter) 664 bRet = pFormatter->IsCompatible( nOldType, nNewType ); 665 else 666 throw uno::RuntimeException(); 667 668 return bRet; 669 } 670 671 sal_Int32 SAL_CALL SvNumberFormatsObj::getFormatForLocale( sal_Int32 nKey, const lang::Locale& nLocale ) 672 throw(uno::RuntimeException) 673 { 674 ::osl::MutexGuard aGuard( m_aMutex ); 675 676 sal_Int32 nRet = 0; 677 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 678 if (pFormatter) 679 { 680 LanguageType eLang = lcl_GetLanguage( nLocale ); 681 nRet = pFormatter->GetFormatForLanguageIfBuiltIn(nKey, eLang); 682 } 683 else 684 throw uno::RuntimeException(); 685 686 return nRet; 687 } 688 689 // XServiceInfo 690 691 rtl::OUString SAL_CALL SvNumberFormatsObj::getImplementationName() 692 throw(uno::RuntimeException) 693 { 694 return rtl::OUString::createFromAscii("SvNumberFormatsObj"); 695 } 696 697 sal_Bool SAL_CALL SvNumberFormatsObj::supportsService( const rtl::OUString& ServiceName ) 698 throw(uno::RuntimeException) 699 { 700 return ( ServiceName.compareToAscii(SERVICENAME_NUMBERFORMATS) == 0 ); 701 } 702 703 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatsObj::getSupportedServiceNames() 704 throw(uno::RuntimeException) 705 { 706 uno::Sequence<rtl::OUString> aRet(1); 707 rtl::OUString* pArray = aRet.getArray(); 708 pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERFORMATS); 709 return aRet; 710 } 711 712 //------------------------------------------------------------------------ 713 714 SvNumberFormatObj::SvNumberFormatObj( SvNumberFormatsSupplierObj& rParent, sal_uLong nK, const ::comphelper::SharedMutex& _rMutex ) 715 :rSupplier( rParent ) 716 ,nKey( nK ) 717 ,m_aMutex( _rMutex ) 718 { 719 rSupplier.acquire(); 720 } 721 722 SvNumberFormatObj::~SvNumberFormatObj() 723 { 724 rSupplier.release(); 725 } 726 727 // XPropertySet 728 729 uno::Reference<beans::XPropertySetInfo> SAL_CALL SvNumberFormatObj::getPropertySetInfo() 730 throw(uno::RuntimeException) 731 { 732 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 733 static uno::Reference<beans::XPropertySetInfo> aRef = 734 new SfxItemPropertySetInfo( lcl_GetNumberFormatPropertyMap() ); 735 return aRef; 736 } 737 738 void SAL_CALL SvNumberFormatObj::setPropertyValue( const rtl::OUString&, 739 const uno::Any& ) 740 throw(beans::UnknownPropertyException, beans::PropertyVetoException, 741 lang::IllegalArgumentException, lang::WrappedTargetException, 742 uno::RuntimeException) 743 { 744 throw beans::UnknownPropertyException(); // everything is read-only 745 } 746 747 uno::Any SAL_CALL SvNumberFormatObj::getPropertyValue( const rtl::OUString& aPropertyName ) 748 throw(beans::UnknownPropertyException, lang::WrappedTargetException, 749 uno::RuntimeException) 750 { 751 ::osl::MutexGuard aGuard( m_aMutex ); 752 753 uno::Any aRet; 754 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 755 const SvNumberformat* pFormat = pFormatter ? pFormatter->GetEntry(nKey) : NULL; 756 if (pFormat) 757 { 758 sal_Bool bThousand, bRed; 759 sal_uInt16 nDecimals, nLeading; 760 761 String aString = aPropertyName; 762 if (aString.EqualsAscii( PROPERTYNAME_FMTSTR )) 763 { 764 aRet <<= rtl::OUString( pFormat->GetFormatstring() ); 765 } 766 else if (aString.EqualsAscii( PROPERTYNAME_LOCALE )) 767 { 768 lang::Locale aLocale( MsLangId::convertLanguageToLocale( 769 pFormat->GetLanguage())); 770 aRet <<= aLocale; 771 } 772 else if (aString.EqualsAscii( PROPERTYNAME_TYPE )) 773 { 774 aRet <<= (sal_Int16)( pFormat->GetType() ); 775 } 776 else if (aString.EqualsAscii( PROPERTYNAME_COMMENT )) 777 { 778 aRet <<= rtl::OUString( pFormat->GetComment() ); 779 } 780 else if (aString.EqualsAscii( PROPERTYNAME_STDFORM )) 781 { 782 //! SvNumberformat Member bStandard rausreichen? 783 sal_Bool bStandard = ( ( nKey % SV_COUNTRY_LANGUAGE_OFFSET ) == 0 ); 784 aRet.setValue( &bStandard, getBooleanCppuType() ); 785 } 786 else if (aString.EqualsAscii( PROPERTYNAME_USERDEF )) 787 { 788 sal_Bool bUserDef = ( ( pFormat->GetType() & NUMBERFORMAT_DEFINED ) != 0 ); 789 aRet.setValue( &bUserDef, getBooleanCppuType() ); 790 } 791 else if (aString.EqualsAscii( PROPERTYNAME_DECIMALS )) 792 { 793 pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading ); 794 aRet <<= (sal_Int16)( nDecimals ); 795 } 796 else if (aString.EqualsAscii( PROPERTYNAME_LEADING )) 797 { 798 pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading ); 799 aRet <<= (sal_Int16)( nLeading ); 800 } 801 else if (aString.EqualsAscii( PROPERTYNAME_NEGRED )) 802 { 803 pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading ); 804 aRet.setValue( &bRed, getBooleanCppuType() ); 805 } 806 else if (aString.EqualsAscii( PROPERTYNAME_THOUS )) 807 { 808 pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading ); 809 aRet.setValue( &bThousand, getBooleanCppuType() ); 810 } 811 else if (aString.EqualsAscii( PROPERTYNAME_CURRSYM )) 812 { 813 String aSymbol, aExt; 814 pFormat->GetNewCurrencySymbol( aSymbol, aExt ); 815 aRet <<= rtl::OUString( aSymbol ); 816 } 817 else if (aString.EqualsAscii( PROPERTYNAME_CURREXT )) 818 { 819 String aSymbol, aExt; 820 pFormat->GetNewCurrencySymbol( aSymbol, aExt ); 821 aRet <<= rtl::OUString( aExt ); 822 } 823 else if (aString.EqualsAscii( PROPERTYNAME_CURRABB )) 824 { 825 String aSymbol, aExt; 826 sal_Bool bBank = sal_False; 827 pFormat->GetNewCurrencySymbol( aSymbol, aExt ); 828 const NfCurrencyEntry* pCurr = pFormatter->GetCurrencyEntry( bBank, 829 aSymbol, aExt, pFormat->GetLanguage() ); 830 if ( pCurr ) 831 aRet <<= rtl::OUString( pCurr->GetBankSymbol() ); 832 else 833 aRet <<= rtl::OUString(); 834 } 835 else 836 throw beans::UnknownPropertyException(); 837 } 838 else 839 throw uno::RuntimeException(); 840 841 return aRet; 842 } 843 844 void SAL_CALL SvNumberFormatObj::addPropertyChangeListener( const rtl::OUString&, 845 const uno::Reference<beans::XPropertyChangeListener>&) 846 throw(beans::UnknownPropertyException, 847 lang::WrappedTargetException, uno::RuntimeException) 848 { 849 DBG_ERROR("not implemented"); 850 } 851 852 void SAL_CALL SvNumberFormatObj::removePropertyChangeListener( const rtl::OUString&, 853 const uno::Reference<beans::XPropertyChangeListener>&) 854 throw(beans::UnknownPropertyException, 855 lang::WrappedTargetException, uno::RuntimeException) 856 { 857 DBG_ERROR("not implemented"); 858 } 859 860 void SAL_CALL SvNumberFormatObj::addVetoableChangeListener( const rtl::OUString&, 861 const uno::Reference<beans::XVetoableChangeListener>&) 862 throw(beans::UnknownPropertyException, 863 lang::WrappedTargetException, uno::RuntimeException) 864 { 865 DBG_ERROR("not implemented"); 866 } 867 868 void SAL_CALL SvNumberFormatObj::removeVetoableChangeListener( const rtl::OUString&, 869 const uno::Reference<beans::XVetoableChangeListener>&) 870 throw(beans::UnknownPropertyException, 871 lang::WrappedTargetException, uno::RuntimeException) 872 { 873 DBG_ERROR("not implemented"); 874 } 875 876 // XPropertyAccess 877 878 uno::Sequence<beans::PropertyValue> SAL_CALL SvNumberFormatObj::getPropertyValues() 879 throw(uno::RuntimeException) 880 { 881 ::osl::MutexGuard aGuard( m_aMutex ); 882 883 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 884 const SvNumberformat* pFormat = pFormatter ? pFormatter->GetEntry(nKey) : NULL; 885 if (pFormat) 886 { 887 String aSymbol, aExt, aAbb; 888 sal_Bool bBank = sal_False; 889 pFormat->GetNewCurrencySymbol( aSymbol, aExt ); 890 const NfCurrencyEntry* pCurr = pFormatter->GetCurrencyEntry( bBank, 891 aSymbol, aExt, pFormat->GetLanguage() ); 892 if ( pCurr ) 893 aAbb = pCurr->GetBankSymbol(); 894 895 String aFmtStr = pFormat->GetFormatstring(); 896 String aComment = pFormat->GetComment(); 897 sal_Bool bStandard = ( ( nKey % SV_COUNTRY_LANGUAGE_OFFSET ) == 0 ); 898 //! SvNumberformat Member bStandard rausreichen? 899 sal_Bool bUserDef = ( ( pFormat->GetType() & NUMBERFORMAT_DEFINED ) != 0 ); 900 sal_Bool bThousand, bRed; 901 sal_uInt16 nDecimals, nLeading; 902 pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading ); 903 lang::Locale aLocale( MsLangId::convertLanguageToLocale( 904 pFormat->GetLanguage())); 905 906 uno::Sequence<beans::PropertyValue> aSeq(13); 907 beans::PropertyValue* pArray = aSeq.getArray(); 908 909 pArray[0].Name = rtl::OUString::createFromAscii( PROPERTYNAME_FMTSTR ); 910 pArray[0].Value <<= rtl::OUString( aFmtStr ); 911 pArray[1].Name = rtl::OUString::createFromAscii( PROPERTYNAME_LOCALE ); 912 pArray[1].Value <<= aLocale; 913 pArray[2].Name = rtl::OUString::createFromAscii( PROPERTYNAME_TYPE ); 914 pArray[2].Value <<= (sal_Int16)( pFormat->GetType() ); 915 pArray[3].Name = rtl::OUString::createFromAscii( PROPERTYNAME_COMMENT ); 916 pArray[3].Value <<= rtl::OUString( aComment ); 917 pArray[4].Name = rtl::OUString::createFromAscii( PROPERTYNAME_STDFORM ); 918 pArray[4].Value.setValue( &bStandard, getBooleanCppuType() ); 919 pArray[5].Name = rtl::OUString::createFromAscii( PROPERTYNAME_USERDEF ); 920 pArray[5].Value.setValue( &bUserDef, getBooleanCppuType() ); 921 pArray[6].Name = rtl::OUString::createFromAscii( PROPERTYNAME_DECIMALS ); 922 pArray[6].Value <<= (sal_Int16)( nDecimals ); 923 pArray[7].Name = rtl::OUString::createFromAscii( PROPERTYNAME_LEADING ); 924 pArray[7].Value <<= (sal_Int16)( nLeading ); 925 pArray[8].Name = rtl::OUString::createFromAscii( PROPERTYNAME_NEGRED ); 926 pArray[8].Value.setValue( &bRed, getBooleanCppuType() ); 927 pArray[9].Name = rtl::OUString::createFromAscii( PROPERTYNAME_THOUS ); 928 pArray[9].Value.setValue( &bThousand, getBooleanCppuType() ); 929 pArray[10].Name = rtl::OUString::createFromAscii( PROPERTYNAME_CURRSYM ); 930 pArray[10].Value <<= rtl::OUString( aSymbol ); 931 pArray[11].Name = rtl::OUString::createFromAscii( PROPERTYNAME_CURREXT ); 932 pArray[11].Value <<= rtl::OUString( aExt ); 933 pArray[12].Name = rtl::OUString::createFromAscii( PROPERTYNAME_CURRABB ); 934 pArray[12].Value <<= rtl::OUString( aAbb ); 935 936 return aSeq; 937 } 938 else 939 throw uno::RuntimeException(); 940 } 941 942 void SAL_CALL SvNumberFormatObj::setPropertyValues( const uno::Sequence<beans::PropertyValue>& ) 943 throw(beans::UnknownPropertyException, beans::PropertyVetoException, 944 lang::IllegalArgumentException, lang::WrappedTargetException, 945 uno::RuntimeException) 946 { 947 throw beans::UnknownPropertyException(); // everything is read-only 948 } 949 950 // XServiceInfo 951 952 rtl::OUString SAL_CALL SvNumberFormatObj::getImplementationName() 953 throw(uno::RuntimeException) 954 { 955 return rtl::OUString::createFromAscii("SvNumberFormatObj"); 956 } 957 958 sal_Bool SAL_CALL SvNumberFormatObj::supportsService( const rtl::OUString& ServiceName ) 959 throw(uno::RuntimeException) 960 { 961 return ( ServiceName.compareToAscii(SERVICENAME_NUMBERFORMAT) == 0 ); 962 } 963 964 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatObj::getSupportedServiceNames() 965 throw(uno::RuntimeException) 966 { 967 uno::Sequence<rtl::OUString> aRet(1); 968 rtl::OUString* pArray = aRet.getArray(); 969 pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERFORMAT); 970 return aRet; 971 } 972 973 //------------------------------------------------------------------------ 974 975 SvNumberFormatSettingsObj::SvNumberFormatSettingsObj( SvNumberFormatsSupplierObj& rParent, const ::comphelper::SharedMutex& _rMutex ) 976 :rSupplier( rParent ) 977 ,m_aMutex( _rMutex ) 978 { 979 rSupplier.acquire(); 980 } 981 982 SvNumberFormatSettingsObj::~SvNumberFormatSettingsObj() 983 { 984 rSupplier.release(); 985 } 986 987 // XPropertySet 988 989 uno::Reference<beans::XPropertySetInfo> SAL_CALL SvNumberFormatSettingsObj::getPropertySetInfo() 990 throw(uno::RuntimeException) 991 { 992 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 993 static uno::Reference<beans::XPropertySetInfo> aRef = 994 new SfxItemPropertySetInfo( lcl_GetNumberSettingsPropertyMap() ); 995 return aRef; 996 } 997 998 void SAL_CALL SvNumberFormatSettingsObj::setPropertyValue( const rtl::OUString& aPropertyName, 999 const uno::Any& aValue ) 1000 throw(beans::UnknownPropertyException, beans::PropertyVetoException, 1001 lang::IllegalArgumentException, lang::WrappedTargetException, 1002 uno::RuntimeException) 1003 { 1004 ::osl::MutexGuard aGuard( m_aMutex ); 1005 1006 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 1007 if (pFormatter) 1008 { 1009 String aString = aPropertyName; 1010 if (aString.EqualsAscii( PROPERTYNAME_NOZERO )) 1011 { 1012 // operator >>= shouldn't be used for bool (?) 1013 if ( aValue.getValueTypeClass() == uno::TypeClass_BOOLEAN ) 1014 pFormatter->SetNoZero( *(sal_Bool*)aValue.getValue() ); 1015 } 1016 else if (aString.EqualsAscii( PROPERTYNAME_NULLDATE )) 1017 { 1018 util::Date aDate; 1019 if ( aValue >>= aDate ) 1020 pFormatter->ChangeNullDate( aDate.Day, aDate.Month, aDate.Year ); 1021 } 1022 else if (aString.EqualsAscii( PROPERTYNAME_STDDEC )) 1023 { 1024 sal_Int16 nInt16 = sal_Int16(); 1025 if ( aValue >>= nInt16 ) 1026 pFormatter->ChangeStandardPrec( nInt16 ); 1027 } 1028 else if (aString.EqualsAscii( PROPERTYNAME_TWODIGIT )) 1029 { 1030 sal_Int16 nInt16 = sal_Int16(); 1031 if ( aValue >>= nInt16 ) 1032 pFormatter->SetYear2000( nInt16 ); 1033 } 1034 else 1035 throw beans::UnknownPropertyException(); 1036 1037 rSupplier.SettingsChanged(); 1038 } 1039 else 1040 throw uno::RuntimeException(); 1041 } 1042 1043 uno::Any SAL_CALL SvNumberFormatSettingsObj::getPropertyValue( const rtl::OUString& aPropertyName ) 1044 throw(beans::UnknownPropertyException, lang::WrappedTargetException, 1045 uno::RuntimeException) 1046 { 1047 ::osl::MutexGuard aGuard( m_aMutex ); 1048 1049 uno::Any aRet; 1050 SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter(); 1051 if (pFormatter) 1052 { 1053 String aString = aPropertyName; 1054 if (aString.EqualsAscii( PROPERTYNAME_NOZERO )) 1055 { 1056 sal_Bool bNoZero = pFormatter->GetNoZero(); 1057 aRet.setValue( &bNoZero, getBooleanCppuType() ); 1058 } 1059 else if (aString.EqualsAscii( PROPERTYNAME_NULLDATE )) 1060 { 1061 Date* pDate = pFormatter->GetNullDate(); 1062 if (pDate) 1063 { 1064 util::Date aUnoDate( pDate->GetDay(), pDate->GetMonth(), pDate->GetYear() ); 1065 aRet <<= aUnoDate; 1066 } 1067 } 1068 else if (aString.EqualsAscii( PROPERTYNAME_STDDEC )) 1069 aRet <<= (sal_Int16)( pFormatter->GetStandardPrec() ); 1070 else if (aString.EqualsAscii( PROPERTYNAME_TWODIGIT )) 1071 aRet <<= (sal_Int16)( pFormatter->GetYear2000() ); 1072 else 1073 throw beans::UnknownPropertyException(); 1074 } 1075 else 1076 throw uno::RuntimeException(); 1077 1078 return aRet; 1079 } 1080 1081 void SAL_CALL SvNumberFormatSettingsObj::addPropertyChangeListener( const rtl::OUString&, 1082 const uno::Reference<beans::XPropertyChangeListener>&) 1083 throw(beans::UnknownPropertyException, 1084 lang::WrappedTargetException, uno::RuntimeException) 1085 { 1086 DBG_ERROR("not implemented"); 1087 } 1088 1089 void SAL_CALL SvNumberFormatSettingsObj::removePropertyChangeListener( const rtl::OUString&, 1090 const uno::Reference<beans::XPropertyChangeListener>&) 1091 throw(beans::UnknownPropertyException, 1092 lang::WrappedTargetException, uno::RuntimeException) 1093 { 1094 DBG_ERROR("not implemented"); 1095 } 1096 1097 void SAL_CALL SvNumberFormatSettingsObj::addVetoableChangeListener( const rtl::OUString&, 1098 const uno::Reference<beans::XVetoableChangeListener>&) 1099 throw(beans::UnknownPropertyException, 1100 lang::WrappedTargetException, uno::RuntimeException) 1101 { 1102 DBG_ERROR("not implemented"); 1103 } 1104 1105 void SAL_CALL SvNumberFormatSettingsObj::removeVetoableChangeListener( const rtl::OUString&, 1106 const uno::Reference<beans::XVetoableChangeListener>&) 1107 throw(beans::UnknownPropertyException, 1108 lang::WrappedTargetException, uno::RuntimeException) 1109 { 1110 DBG_ERROR("not implemented"); 1111 } 1112 1113 // XServiceInfo 1114 1115 rtl::OUString SAL_CALL SvNumberFormatSettingsObj::getImplementationName() 1116 throw(uno::RuntimeException) 1117 { 1118 return rtl::OUString::createFromAscii("SvNumberFormatSettingsObj"); 1119 } 1120 1121 sal_Bool SAL_CALL SvNumberFormatSettingsObj::supportsService( const rtl::OUString& ServiceName ) 1122 throw(uno::RuntimeException) 1123 { 1124 return ( ServiceName.compareToAscii(SERVICENAME_NUMBERSETTINGS) == 0 ); 1125 } 1126 1127 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatSettingsObj::getSupportedServiceNames() 1128 throw(uno::RuntimeException) 1129 { 1130 uno::Sequence<rtl::OUString> aRet(1); 1131 rtl::OUString* pArray = aRet.getArray(); 1132 pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERSETTINGS); 1133 return aRet; 1134 } 1135 1136 1137