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_editeng.hxx" 26 #include <com/sun/star/util/DateTime.hpp> 27 #include <com/sun/star/text/FilenameDisplayFormat.hpp> 28 #include <com/sun/star/lang/NoSupportException.hpp> 29 #include <com/sun/star/beans/PropertyAttribute.hpp> 30 #include <vcl/svapp.hxx> 31 #include <vos/mutex.hxx> 32 33 #include <rtl/uuid.h> 34 #include <rtl/memory.h> 35 36 #include <editeng/eeitem.hxx> 37 #include <editeng/flditem.hxx> 38 #include <editeng/measfld.hxx> 39 #include <editeng/unofield.hxx> 40 #include <editeng/unotext.hxx> 41 #include <comphelper/serviceinfohelper.hxx> 42 43 using namespace ::rtl; 44 using namespace ::vos; 45 using namespace ::cppu; 46 using namespace ::com::sun::star; 47 48 #define QUERYINT( xint ) \ 49 if( rType == ::getCppuType((const uno::Reference< xint >*)0) ) \ 50 aAny <<= uno::Reference< xint >(this) 51 52 53 #define WID_DATE 0 54 #define WID_BOOL1 1 55 #define WID_BOOL2 2 56 #define WID_INT32 3 57 #define WID_INT16 4 58 #define WID_STRING1 5 59 #define WID_STRING2 6 60 #define WID_STRING3 7 61 62 class SvxUnoFieldData_Impl 63 { 64 public: 65 sal_Bool mbBoolean1; 66 sal_Bool mbBoolean2; 67 sal_Int32 mnInt32; 68 sal_Int16 mnInt16; 69 OUString msString1; 70 OUString msString2; 71 OUString msString3; 72 util::DateTime maDateTime; 73 74 OUString msPresentation; 75 }; 76 77 const SfxItemPropertySet* ImplGetFieldItemPropertySet( sal_Int32 mnId ) 78 { 79 static SfxItemPropertyMapEntry aExDateTimeFieldPropertyMap_Impl[] = 80 { 81 { MAP_CHAR_LEN("DateTime"), WID_DATE, &::getCppuType((const util::DateTime*)0), 0, 0 }, 82 { MAP_CHAR_LEN("IsFixed"), WID_BOOL1, &::getBooleanCppuType(), 0, 0 }, 83 { MAP_CHAR_LEN("IsDate"), WID_BOOL2, &::getBooleanCppuType(), 0, 0 }, 84 { MAP_CHAR_LEN("NumberFormat"), WID_INT32, &::getCppuType((const sal_Int16*)0), 0, 0 }, 85 {0,0,0,0,0,0} 86 }; 87 static SfxItemPropertySet aExDateTimeFieldPropertySet_Impl(aExDateTimeFieldPropertyMap_Impl); 88 89 static SfxItemPropertyMapEntry aDateTimeFieldPropertyMap_Impl[] = 90 { 91 { MAP_CHAR_LEN("IsDate"), WID_BOOL2, &::getBooleanCppuType(), 0, 0 }, 92 {0,0,0,0,0,0} 93 }; 94 static SfxItemPropertySet aDateTimeFieldPropertySet_Impl(aDateTimeFieldPropertyMap_Impl); 95 96 static SfxItemPropertyMapEntry aUrlFieldPropertyMap_Impl[] = 97 { 98 99 { MAP_CHAR_LEN("Format"), WID_INT16, &::getCppuType((const sal_Int16*)0), 0, 0 }, 100 { MAP_CHAR_LEN("Representation"), WID_STRING1, &::getCppuType((const OUString*)0), 0, 0 }, 101 { MAP_CHAR_LEN("TargetFrame"), WID_STRING2, &::getCppuType((const OUString*)0), 0, 0 }, 102 { MAP_CHAR_LEN("URL"), WID_STRING3, &::getCppuType((const OUString*)0), 0, 0 }, 103 {0,0,0,0,0,0} 104 }; 105 static SfxItemPropertySet aUrlFieldPropertySet_Impl(aUrlFieldPropertyMap_Impl); 106 107 static SfxItemPropertyMapEntry aEmptyPropertyMap_Impl[] = 108 { 109 {0,0,0,0,0,0} 110 }; 111 static SfxItemPropertySet aEmptyPropertySet_Impl(aEmptyPropertyMap_Impl); 112 113 static SfxItemPropertyMapEntry aExtFileFieldPropertyMap_Impl[] = 114 { 115 { MAP_CHAR_LEN("IsFixed"), WID_BOOL1, &::getBooleanCppuType(), 0, 0 }, 116 { MAP_CHAR_LEN("FileFormat"), WID_INT16, &::getCppuType((const sal_Int16*)0), 0, 0 }, 117 { MAP_CHAR_LEN("CurrentPresentation"), WID_STRING1,&::getCppuType((const OUString*)0), 0, 0 }, 118 {0,0,0,0,0,0} 119 }; 120 static SfxItemPropertySet aExtFileFieldPropertySet_Impl(aExtFileFieldPropertyMap_Impl); 121 122 static SfxItemPropertyMapEntry aAuthorFieldPropertyMap_Impl[] = 123 { 124 { MAP_CHAR_LEN("IsFixed"), WID_BOOL1, &::getBooleanCppuType(), 0, 0 }, 125 { MAP_CHAR_LEN("CurrentPresentation"), WID_STRING1,&::getCppuType((const OUString*)0), 0, 0 }, 126 { MAP_CHAR_LEN("Content"), WID_STRING2,&::getCppuType((const OUString*)0), 0, 0 }, 127 { MAP_CHAR_LEN("AuthorFormat"), WID_INT16, &::getCppuType((const sal_Int16*)0), 0, 0 }, 128 { MAP_CHAR_LEN("FullName"), WID_BOOL2, &::getBooleanCppuType(), 0, 0 }, 129 {0,0,0,0,0,0} 130 }; 131 static SfxItemPropertySet aAuthorFieldPropertySet_Impl(aAuthorFieldPropertyMap_Impl); 132 133 static SfxItemPropertyMapEntry aMeasureFieldPropertyMap_Impl[] = 134 { 135 { MAP_CHAR_LEN("Kind"), WID_INT16, &::getCppuType((const sal_Int16*)0), 0, 0 }, 136 {0,0,0,0,0,0} 137 }; 138 static SfxItemPropertySet aMeasureFieldPropertySet_Impl(aMeasureFieldPropertyMap_Impl); 139 140 switch( mnId ) 141 { 142 case ID_EXT_DATEFIELD: 143 case ID_EXT_TIMEFIELD: 144 return &aExDateTimeFieldPropertySet_Impl; 145 case ID_URLFIELD: 146 return &aUrlFieldPropertySet_Impl; 147 case ID_DATEFIELD: 148 case ID_TIMEFIELD: 149 return &aDateTimeFieldPropertySet_Impl; 150 case ID_EXT_FILEFIELD: 151 return &aExtFileFieldPropertySet_Impl; 152 case ID_AUTHORFIELD: 153 return &aAuthorFieldPropertySet_Impl; 154 case ID_MEASUREFIELD: 155 return &aMeasureFieldPropertySet_Impl; 156 // case ID_PAGEFIELD: 157 // case ID_PAGESFIELD: 158 // case ID_FILEFIELD: 159 // case ID_TABLEFIELD: 160 // case ID_HEADERFIELD: 161 // case ID_FOOTERFIELD: 162 // case ID_DATETIMEFIELD:: 163 default: 164 return &aEmptyPropertySet_Impl; 165 } 166 } 167 168 static sal_Char const* aFieldItemNameMap_Impl[] = 169 { 170 "Date", 171 "URL", 172 "Page", 173 "Pages", 174 "Time", 175 "File", 176 "Table", 177 "ExtTime", 178 "ExtFile", 179 "Author", 180 "Measure", 181 "ExtDate", 182 "Header", 183 "Footer", 184 "DateTime", 185 "Unknown" 186 }; 187 188 /* conversion routines */ 189 190 static sal_Int16 getFileNameDisplayFormat( SvxFileFormat nFormat ) 191 { 192 switch( nFormat ) 193 { 194 case SVXFILEFORMAT_NAME_EXT: return text::FilenameDisplayFormat::NAME_AND_EXT; 195 case SVXFILEFORMAT_FULLPATH: return text::FilenameDisplayFormat::FULL; 196 case SVXFILEFORMAT_PATH: return text::FilenameDisplayFormat::PATH; 197 // case SVXFILEFORMAT_NAME: 198 default: return text::FilenameDisplayFormat::NAME; 199 } 200 } 201 202 static SvxFileFormat setFileNameDisplayFormat( sal_Int16 nFormat ) 203 { 204 switch( nFormat ) 205 { 206 case text::FilenameDisplayFormat::FULL: return SVXFILEFORMAT_FULLPATH; 207 case text::FilenameDisplayFormat::PATH: return SVXFILEFORMAT_PATH; 208 case text::FilenameDisplayFormat::NAME: return SVXFILEFORMAT_NAME; 209 // case text::FilenameDisplayFormat::NAME_AND_EXT: 210 default: 211 return SVXFILEFORMAT_NAME_EXT; 212 } 213 } 214 215 static util::DateTime getDate( sal_uLong nDate ) 216 { 217 util::DateTime aDate; 218 memset( &aDate, 0, sizeof( util::DateTime ) ); 219 220 Date aTempDate( nDate ); 221 222 aDate.Day = aTempDate.GetDay(); 223 aDate.Month = aTempDate.GetMonth(); 224 aDate.Year = aTempDate.GetYear(); 225 226 return aDate; 227 } 228 229 inline Date setDate( util::DateTime& rDate ) 230 { 231 return Date( rDate.Day, rDate.Month, rDate.Year ); 232 } 233 234 static util::DateTime getTime( long nTime ) 235 { 236 util::DateTime aTime; 237 memset( &aTime, 0, sizeof( util::DateTime ) ); 238 239 Time aTempTime( nTime ); 240 241 aTime.HundredthSeconds = aTempTime.Get100Sec(); 242 aTime.Seconds = aTempTime.GetSec(); 243 aTime.Minutes = aTempTime.GetMin(); 244 aTime.Hours = aTempTime.GetHour(); 245 246 return aTime; 247 } 248 249 inline Time setTime( util::DateTime& rDate ) 250 { 251 return Time( rDate.Hours, rDate.Minutes, rDate.Seconds, rDate.HundredthSeconds ); 252 } 253 254 // ==================================================================== 255 // class SvxUnoTextField 256 // ==================================================================== 257 UNO3_GETIMPLEMENTATION_IMPL( SvxUnoTextField ); 258 259 SvxUnoTextField::SvxUnoTextField( sal_Int32 nServiceId ) throw() 260 : OComponentHelper( getMutex() ) 261 , mpPropSet(NULL) 262 , mnServiceId(nServiceId) 263 , mpImpl( new SvxUnoFieldData_Impl ) 264 { 265 mpPropSet = ImplGetFieldItemPropertySet(mnServiceId); 266 267 memset( &(mpImpl->maDateTime), 0, sizeof( util::DateTime ) ); 268 269 switch( nServiceId ) 270 { 271 case ID_EXT_DATEFIELD: 272 case ID_DATEFIELD: 273 mpImpl->mbBoolean2 = sal_True; 274 mpImpl->mnInt32 = SVXDATEFORMAT_STDSMALL; 275 mpImpl->mbBoolean1 = sal_False; 276 break; 277 278 case ID_EXT_TIMEFIELD: 279 case ID_TIMEFIELD: 280 mpImpl->mbBoolean2 = sal_False; 281 mpImpl->mbBoolean1 = sal_False; 282 mpImpl->mnInt32 = SVXTIMEFORMAT_STANDARD; 283 break; 284 285 case ID_URLFIELD: 286 mpImpl->mnInt16 = SVXURLFORMAT_REPR; 287 break; 288 289 case ID_EXT_FILEFIELD: 290 mpImpl->mbBoolean1 = sal_False; 291 mpImpl->mnInt16 = text::FilenameDisplayFormat::FULL; 292 break; 293 294 case ID_AUTHORFIELD: 295 mpImpl->mnInt16 = SVXAUTHORFORMAT_FULLNAME; 296 mpImpl->mbBoolean1 = sal_False; 297 mpImpl->mbBoolean2 = sal_True; 298 break; 299 300 case ID_MEASUREFIELD: 301 mpImpl->mnInt16 = SDRMEASUREFIELD_VALUE; 302 break; 303 304 default: 305 mpImpl->mbBoolean1 = sal_False; 306 mpImpl->mbBoolean2 = sal_False; 307 mpImpl->mnInt32 = 0; 308 mpImpl->mnInt16 = 0; 309 310 } 311 } 312 313 SvxUnoTextField::SvxUnoTextField( uno::Reference< text::XTextRange > xAnchor, const OUString& rPresentation, const SvxFieldData* pData ) throw() 314 : OComponentHelper( getMutex() ) 315 , mxAnchor( xAnchor ) 316 , mpPropSet(NULL) 317 , mnServiceId(ID_UNKNOWN) 318 , mpImpl( new SvxUnoFieldData_Impl ) 319 { 320 DBG_ASSERT(pData, "pFieldData == NULL! [CL]" ); 321 322 mpImpl->msPresentation = rPresentation; 323 324 if(pData) 325 { 326 mnServiceId = GetFieldId(pData); 327 DBG_ASSERT(mnServiceId != ID_UNKNOWN, "unknown SvxFieldData! [CL]"); 328 if(mnServiceId != ID_UNKNOWN) 329 { 330 // extract field properties from data class 331 switch( mnServiceId ) 332 { 333 case ID_DATEFIELD: 334 case ID_EXT_DATEFIELD: 335 { 336 mpImpl->mbBoolean2 = sal_True; 337 // #i35416# for variable date field, don't use invalid "0000-00-00" date, 338 // use current date instead 339 sal_Bool bFixed = ((SvxDateField*)pData)->GetType() == SVXDATETYPE_FIX; 340 mpImpl->maDateTime = getDate( bFixed ? 341 ((SvxDateField*)pData)->GetFixDate() : 342 Date().GetDate() ); 343 mpImpl->mnInt32 = ((SvxDateField*)pData)->GetFormat(); 344 mpImpl->mbBoolean1 = bFixed; 345 } 346 break; 347 348 case ID_TIMEFIELD: 349 mpImpl->mbBoolean2 = sal_False; 350 mpImpl->mbBoolean1 = sal_False; 351 mpImpl->mnInt32 = SVXTIMEFORMAT_STANDARD; 352 break; 353 354 case ID_EXT_TIMEFIELD: 355 mpImpl->mbBoolean2 = sal_False; 356 mpImpl->maDateTime = getTime( ((SvxExtTimeField*)pData)->GetFixTime() ); 357 mpImpl->mbBoolean1 = ((SvxExtTimeField*)pData)->GetType() == SVXTIMETYPE_FIX; 358 mpImpl->mnInt32 = ((SvxExtTimeField*)pData)->GetFormat(); 359 break; 360 361 case ID_URLFIELD: 362 mpImpl->msString1 = ((SvxURLField*)pData)->GetRepresentation(); 363 mpImpl->msString2 = ((SvxURLField*)pData)->GetTargetFrame(); 364 mpImpl->msString3 = ((SvxURLField*)pData)->GetURL(); 365 mpImpl->mnInt16 = sal::static_int_cast< sal_Int16 >( 366 ((SvxURLField*)pData)->GetFormat()); 367 break; 368 369 case ID_EXT_FILEFIELD: 370 mpImpl->msString1 = ((SvxExtFileField*)pData)->GetFile(); 371 mpImpl->mbBoolean1 = ((SvxExtFileField*)pData)->GetType() == SVXFILETYPE_FIX; 372 mpImpl->mnInt16 = getFileNameDisplayFormat(((SvxExtFileField*)pData)->GetFormat()); 373 break; 374 375 case ID_AUTHORFIELD: 376 mpImpl->msString1 = ((SvxAuthorField*)pData)->GetFormatted(); 377 mpImpl->msString2 = ((SvxAuthorField*)pData)->GetFormatted(); 378 mpImpl->mnInt16 = sal::static_int_cast< sal_Int16 >( 379 ((SvxAuthorField*)pData)->GetFormat()); 380 mpImpl->mbBoolean1 = ((SvxAuthorField*)pData)->GetType() == SVXAUTHORTYPE_FIX; 381 mpImpl->mbBoolean2 = ((SvxAuthorField*)pData)->GetFormat() != SVXAUTHORFORMAT_SHORTNAME; 382 break; 383 384 case ID_MEASUREFIELD: 385 mpImpl->mnInt16 = sal::static_int_cast< sal_Int16 >(((SdrMeasureField*)pData)->GetMeasureFieldKind()); 386 break; 387 } 388 } 389 } 390 391 mpPropSet = ImplGetFieldItemPropertySet(mnServiceId); 392 } 393 394 SvxUnoTextField::~SvxUnoTextField() throw() 395 { 396 delete mpImpl; 397 } 398 399 SvxFieldData* SvxUnoTextField::CreateFieldData() const throw() 400 { 401 SvxFieldData* pData = NULL; 402 403 switch( mnServiceId ) 404 { 405 case ID_TIMEFIELD: 406 case ID_EXT_TIMEFIELD: 407 case ID_DATEFIELD: 408 case ID_EXT_DATEFIELD: 409 { 410 if( mpImpl->mbBoolean2 ) // IsDate? 411 { 412 Date aDate( setDate( mpImpl->maDateTime ) ); 413 pData = new SvxDateField( aDate, mpImpl->mbBoolean1?SVXDATETYPE_FIX:SVXDATETYPE_VAR ); 414 if( mpImpl->mnInt32 >= SVXDATEFORMAT_APPDEFAULT && mpImpl->mnInt32 <= SVXDATEFORMAT_F ) 415 ((SvxDateField*)pData)->SetFormat( (SvxDateFormat)mpImpl->mnInt32 ); 416 } 417 else 418 { 419 if( mnServiceId != ID_TIMEFIELD && mnServiceId != ID_DATEFIELD ) 420 { 421 Time aTime( setTime( mpImpl->maDateTime ) ); 422 pData = new SvxExtTimeField( aTime, mpImpl->mbBoolean1?SVXTIMETYPE_FIX:SVXTIMETYPE_VAR ); 423 424 if( mpImpl->mnInt32 >= SVXTIMEFORMAT_APPDEFAULT && mpImpl->mnInt32 <= SVXTIMEFORMAT_AM_HMSH ) 425 ((SvxExtTimeField*)pData)->SetFormat( (SvxTimeFormat)mpImpl->mnInt32 ); 426 } 427 else 428 { 429 pData = new SvxTimeField(); 430 } 431 } 432 433 } 434 break; 435 436 case ID_URLFIELD: 437 pData = new SvxURLField( mpImpl->msString3, mpImpl->msString1, mpImpl->msString1.getLength() ? SVXURLFORMAT_REPR : SVXURLFORMAT_URL ); 438 ((SvxURLField*)pData)->SetTargetFrame( mpImpl->msString2 ); 439 if( mpImpl->mnInt16 >= SVXURLFORMAT_APPDEFAULT && mpImpl->mnInt16 <= SVXURLFORMAT_REPR ) 440 ((SvxURLField*)pData)->SetFormat( (SvxURLFormat)mpImpl->mnInt16 ); 441 break; 442 443 case ID_PAGEFIELD: 444 pData = new SvxPageField(); 445 break; 446 447 case ID_PAGESFIELD: 448 pData = new SvxPagesField(); 449 break; 450 451 case ID_FILEFIELD: 452 pData = new SvxFileField(); 453 break; 454 455 case ID_TABLEFIELD: 456 pData = new SvxTableField(); 457 break; 458 459 case ID_EXT_FILEFIELD: 460 { 461 // #92009# pass fixed attribute to constructor 462 pData = new SvxExtFileField( mpImpl->msString1, 463 mpImpl->mbBoolean1 ? SVXFILETYPE_FIX : SVXFILETYPE_VAR, 464 setFileNameDisplayFormat(mpImpl->mnInt16 ) ); 465 break; 466 } 467 468 case ID_AUTHORFIELD: 469 { 470 ::rtl::OUString aContent; 471 String aFirstName; 472 String aLastName; 473 String aEmpty; 474 475 // do we have CurrentPresentation given? 476 // mimic behaviour of writer, which means: 477 // prefer CurrentPresentation over Content 478 // if both are given. 479 if( mpImpl->msString1.getLength() ) 480 aContent = mpImpl->msString1; 481 else 482 aContent = mpImpl->msString2; 483 484 sal_Int32 nPos = aContent.lastIndexOf( sal_Char(' '), 0 ); 485 if( nPos > 0 ) 486 { 487 aFirstName = aContent.copy( 0, nPos ); 488 aLastName = aContent.copy( nPos + 1 ); 489 } 490 else 491 { 492 aLastName = aContent; 493 } 494 495 // #92009# pass fixed attribute to constructor 496 pData = new SvxAuthorField( aFirstName, aLastName, aEmpty, 497 mpImpl->mbBoolean1 ? SVXAUTHORTYPE_FIX : SVXAUTHORTYPE_VAR ); 498 499 if( !mpImpl->mbBoolean2 ) 500 { 501 ((SvxAuthorField*)pData)->SetFormat( SVXAUTHORFORMAT_SHORTNAME ); 502 } 503 else if( mpImpl->mnInt16 >= SVXAUTHORFORMAT_FULLNAME || mpImpl->mnInt16 <= SVXAUTHORFORMAT_SHORTNAME ) 504 { 505 ((SvxAuthorField*)pData)->SetFormat( (SvxAuthorFormat) mpImpl->mnInt16 ); 506 } 507 508 break; 509 } 510 511 case ID_MEASUREFIELD: 512 { 513 SdrMeasureFieldKind eKind = SDRMEASUREFIELD_VALUE; 514 if( mpImpl->mnInt16 == (sal_Int16)SDRMEASUREFIELD_UNIT || mpImpl->mnInt16 == (sal_Int16)SDRMEASUREFIELD_ROTA90BLANCS ) 515 eKind = (SdrMeasureFieldKind) mpImpl->mnInt16; 516 pData = new SdrMeasureField( eKind); 517 break; 518 } 519 case ID_HEADERFIELD: 520 pData = new SvxHeaderField(); 521 break; 522 case ID_FOOTERFIELD: 523 pData = new SvxFooterField(); 524 break; 525 case ID_DATETIMEFIELD: 526 pData = new SvxDateTimeField(); 527 break; 528 }; 529 530 return pData; 531 } 532 533 // uno::XInterface 534 uno::Any SAL_CALL SvxUnoTextField::queryAggregation( const uno::Type & rType ) 535 throw(uno::RuntimeException) 536 { 537 uno::Any aAny; 538 539 QUERYINT( beans::XPropertySet ); 540 else QUERYINT( text::XTextContent ); 541 else QUERYINT( text::XTextField ); 542 else QUERYINT( lang::XServiceInfo ); 543 else QUERYINT( lang::XUnoTunnel ); 544 else 545 return OComponentHelper::queryAggregation( rType ); 546 547 return aAny; 548 } 549 550 // XTypeProvider 551 552 uno::Sequence< uno::Type > SAL_CALL SvxUnoTextField::getTypes() 553 throw (uno::RuntimeException) 554 { 555 if( maTypeSequence.getLength() == 0 ) 556 { 557 maTypeSequence = OComponentHelper::getTypes(); 558 sal_Int32 nOldCount = maTypeSequence.getLength(); 559 560 maTypeSequence.realloc( nOldCount + 4 ); // !DANGER! keep this updated 561 uno::Type* pTypes = &maTypeSequence.getArray()[nOldCount]; 562 563 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextField >*)0); 564 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XPropertySet >*)0); 565 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XServiceInfo >*)0); 566 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XUnoTunnel >*)0); 567 } 568 return maTypeSequence; 569 } 570 571 uno::Sequence< sal_Int8 > SAL_CALL SvxUnoTextField::getImplementationId() 572 throw (uno::RuntimeException) 573 { 574 static uno::Sequence< sal_Int8 > aId; 575 if( aId.getLength() == 0 ) 576 { 577 aId.realloc( 16 ); 578 rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True ); 579 } 580 return aId; 581 } 582 583 uno::Any SAL_CALL SvxUnoTextField::queryInterface( const uno::Type & rType ) 584 throw(uno::RuntimeException) 585 { 586 return OComponentHelper::queryInterface(rType); 587 } 588 589 void SAL_CALL SvxUnoTextField::acquire() throw( ) 590 { 591 OComponentHelper::acquire(); 592 } 593 594 void SAL_CALL SvxUnoTextField::release() throw( ) 595 { 596 OComponentHelper::release(); 597 } 598 599 // Interface text::XTextField 600 OUString SAL_CALL SvxUnoTextField::getPresentation( sal_Bool bShowCommand ) 601 throw(uno::RuntimeException) 602 { 603 OGuard aGuard( Application::GetSolarMutex() ); 604 605 if(bShowCommand) 606 { 607 DBG_ASSERT( ((sal_uInt32)mnServiceId) < ID_UNKNOWN, "Unknown field type" ); 608 return OUString::createFromAscii( aFieldItemNameMap_Impl[(((sal_uInt32)mnServiceId) > ID_UNKNOWN)? ID_UNKNOWN : mnServiceId ] ); 609 } 610 else 611 { 612 return mpImpl->msPresentation; 613 } 614 } 615 616 // Interface text::XTextContent 617 void SAL_CALL SvxUnoTextField::attach( const uno::Reference< text::XTextRange >& xTextRange ) 618 throw(lang::IllegalArgumentException, uno::RuntimeException) 619 { 620 SvxUnoTextRangeBase* pRange = SvxUnoTextRange::getImplementation( xTextRange ); 621 if(pRange == NULL) 622 throw lang::IllegalArgumentException(); 623 624 SvxFieldData* pData = CreateFieldData(); 625 if( pData ) 626 pRange->attachField( pData ); 627 628 delete pData; 629 } 630 631 uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextField::getAnchor() 632 throw(uno::RuntimeException) 633 { 634 return mxAnchor; 635 } 636 637 // lang::XComponent 638 void SAL_CALL SvxUnoTextField::dispose() 639 throw(uno::RuntimeException) 640 { 641 OComponentHelper::dispose(); 642 } 643 644 void SAL_CALL SvxUnoTextField::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) 645 throw(uno::RuntimeException) 646 { 647 OComponentHelper::addEventListener(xListener); 648 } 649 650 void SAL_CALL SvxUnoTextField::removeEventListener( const uno::Reference< lang::XEventListener >& aListener ) 651 throw(uno::RuntimeException) 652 { 653 OComponentHelper::removeEventListener(aListener); 654 } 655 656 657 // Interface beans::XPropertySet 658 uno::Reference< beans::XPropertySetInfo > SAL_CALL SvxUnoTextField::getPropertySetInfo( ) 659 throw(uno::RuntimeException) 660 { 661 OGuard aGuard( Application::GetSolarMutex() ); 662 return mpPropSet->getPropertySetInfo(); 663 } 664 665 void SAL_CALL SvxUnoTextField::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue ) 666 throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 667 { 668 OGuard aGuard( Application::GetSolarMutex() ); 669 670 if( mpImpl == NULL ) 671 throw uno::RuntimeException(); 672 673 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMap()->getByName( aPropertyName ); 674 if ( !pMap ) 675 throw beans::UnknownPropertyException(); 676 677 switch( pMap->nWID ) 678 { 679 case WID_DATE: 680 if(aValue >>= mpImpl->maDateTime) 681 return; 682 break; 683 case WID_BOOL1: 684 if(aValue >>= mpImpl->mbBoolean1) 685 return; 686 break; 687 case WID_BOOL2: 688 if(aValue >>= mpImpl->mbBoolean2) 689 return; 690 break; 691 case WID_INT16: 692 if(aValue >>= mpImpl->mnInt16) 693 return; 694 break; 695 case WID_INT32: 696 if(aValue >>= mpImpl->mnInt32) 697 return; 698 break; 699 case WID_STRING1: 700 if(aValue >>= mpImpl->msString1) 701 return; 702 break; 703 case WID_STRING2: 704 if(aValue >>= mpImpl->msString2) 705 return; 706 break; 707 case WID_STRING3: 708 if(aValue >>= mpImpl->msString3) 709 return; 710 break; 711 } 712 713 throw lang::IllegalArgumentException(); 714 715 /* 716 case WID_FORMAT: 717 { 718 sal_Int32 nFormat; 719 720 switch( mnId ) 721 { 722 case ID_DATEFIELD: 723 { 724 SvxDateField* pDate = PTR_CAST( SvxDateField, aFieldItem.GetField() ); 725 if(pDate) 726 pDate->SetFormat( (SvxDateFormat)nFormat ); 727 break; 728 } 729 case ID_URLFIELD: 730 { 731 SvxURLField* pURL = PTR_CAST( SvxURLField, aFieldItem.GetField() ); 732 if(pURL) 733 pURL->SetFormat( (SvxURLFormat)nFormat ); 734 break; 735 } 736 case ID_EXT_TIMEFIELD: 737 { 738 SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, aFieldItem.GetField() ); 739 if(pTime) 740 pTime->SetFormat( (SvxTimeFormat)nFormat ); 741 break; 742 } 743 case ID_EXT_FILEFIELD: 744 { 745 SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, aFieldItem.GetField() ); 746 if(pFile) 747 pFile->SetFormat( (SvxFileFormat)nFormat ); 748 break; 749 } 750 case ID_AUTHORFIELD: 751 { 752 SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, aFieldItem.GetField() ); 753 if(pAuthor) 754 pAuthor->SetFormat( (SvxAuthorFormat)nFormat ); 755 break; 756 } 757 default: 758 throw beans::UnknownPropertyException(); 759 } 760 } 761 break; 762 case WID_FIX: 763 { 764 if( aValue.hasValue() || aValue.getValueType() != ::getCppuBooleanType() ) 765 throw lang::IllegalArgumentException(); 766 sal_Bool bFix( *(sal_Bool*)aValue.getValue() ); 767 switch( mnId ) 768 { 769 case ID_EXT_TIMEFIELD: 770 { 771 SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, aFieldItem.GetField() ); 772 if(pTime) 773 pTime->SetType( (SvxTimeType)bFix?SVXTIMETYPE_FIX:SVXTIMETYPE_VAR ); 774 break; 775 } 776 case ID_DATEFIELD: 777 { 778 SvxDateField* pDate = PTR_CAST( SvxDateField, aFieldItem.GetField() ); 779 if(pDate) 780 pDate->SetType( (SvxDateType)bFix?SVXDATETYPE_FIX:SVXDATETYPE_VAR ); 781 break; 782 } 783 case ID_EXT_FILEFIELD: 784 { 785 SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, aFieldItem.GetField() ); 786 if(pFile) 787 pFile->SetType( (SvxFileType)bFix?SVXFILETYPE_FIX:SVXFILETYPE_VAR ); 788 break; 789 } 790 case ID_AUTHORFIELD: 791 { 792 SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, aFieldItem.GetField() ); 793 if(pAuthor) 794 pAuthor->SetType( (SvxAuthorType)bFix?SVXAUTHORTYPE_FIX:SVXAUTHORTYPE_VAR ); 795 break; 796 } 797 default: 798 throw beans::UnknownPropertyException(); 799 } 800 } 801 break; 802 case WID_PRES: 803 case WID_URL: 804 case WID_TARGET: 805 { 806 SvxURLField* pURL = PTR_CAST( SvxURLField, aFieldItem.GetField() ); 807 if(pURL) 808 { 809 OUString aUnoStr; 810 if(!(aValue >>= aUnoStr)) 811 throw lang::IllegalArgumentException(); 812 813 switch( pMap->nWID ) 814 { 815 case WID_PRES: 816 pURL->SetRepresentation( aUnoStr ); 817 break; 818 case WID_URL: 819 pURL->SetURL( aUnoStr ); 820 break; 821 case WID_TARGET: 822 pURL->SetTargetFrame( aUnoStr ); 823 break; 824 } 825 } 826 break; 827 } 828 } 829 830 SfxItemSet aSet = pForwarder->GetAttribs( GetSelection() ); 831 aSet.Put( aFieldItem ); 832 */ 833 } 834 835 uno::Any SAL_CALL SvxUnoTextField::getPropertyValue( const OUString& PropertyName ) 836 throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 837 { 838 OGuard aGuard( Application::GetSolarMutex() ); 839 840 uno::Any aValue; 841 842 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMap()->getByName( PropertyName ); 843 if ( !pMap ) 844 throw beans::UnknownPropertyException(); 845 846 switch( pMap->nWID ) 847 { 848 case WID_DATE: 849 aValue <<= mpImpl->maDateTime; 850 break; 851 case WID_BOOL1: 852 aValue <<= mpImpl->mbBoolean1; 853 break; 854 case WID_BOOL2: 855 aValue <<= mpImpl->mbBoolean2; 856 break; 857 case WID_INT16: 858 aValue <<= mpImpl->mnInt16; 859 break; 860 case WID_INT32: 861 aValue <<= mpImpl->mnInt32; 862 break; 863 case WID_STRING1: 864 aValue <<= mpImpl->msString1; 865 break; 866 case WID_STRING2: 867 aValue <<= mpImpl->msString2; 868 break; 869 case WID_STRING3: 870 aValue <<= mpImpl->msString3; 871 break; 872 } 873 874 return aValue; 875 876 /* 877 switch(pMap->nWID) 878 { 879 case WID_FORMAT: 880 switch( mnId ) 881 { 882 case ID_DATEFIELD: 883 { 884 SvxDateField* pDate = PTR_CAST( SvxDateField, pFieldItem->GetField() ); 885 if(pDate) 886 aValue <<= (sal_Int32)pDate->GetFormat(); 887 break; 888 } 889 case ID_URLFIELD: 890 { 891 SvxURLField* pURL = PTR_CAST( SvxURLField, pFieldItem->GetField() ); 892 if(pURL) 893 aValue <<= (sal_Int32)pURL->GetFormat(); 894 break; 895 } 896 case ID_EXT_TIMEFIELD: 897 { 898 SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, pFieldItem->GetField() ); 899 if(pTime) 900 aValue <<= (sal_Int32)pTime->GetFormat(); 901 break; 902 } 903 case ID_EXT_FILEFIELD: 904 { 905 SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, pFieldItem->GetField() ); 906 if(pFile) 907 aValue <<= (sal_Int32)pFile->GetFormat(); 908 break; 909 } 910 case ID_AUTHORFIELD: 911 { 912 SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, pFieldItem->GetField() ); 913 if(pAuthor) 914 aValue <<= (sal_Int32)pAuthor->GetFormat(); 915 break; 916 } 917 default: 918 throw beans::UnknownPropertyException(); 919 } 920 break; 921 case WID_FIX: 922 { 923 sal_Bool bFix = sal_False; 924 switch( mnId ) 925 { 926 case ID_EXT_TIMEFIELD: 927 { 928 SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, pFieldItem->GetField() ); 929 if(pTime) 930 bFix = pTime->GetType() == SVXTIMETYPE_FIX; 931 break; 932 } 933 case ID_DATEFIELD: 934 { 935 SvxDateField* pDate = PTR_CAST( SvxDateField, pFieldItem->GetField() ); 936 if(pDate) 937 bFix = pDate->GetType() == SVXDATETYPE_FIX; 938 break; 939 } 940 case ID_EXT_FILEFIELD: 941 { 942 SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, pFieldItem->GetField() ); 943 if(pFile) 944 bFix = pFile->GetType() == SVXFILETYPE_FIX; 945 break; 946 } 947 case ID_AUTHORFIELD: 948 { 949 SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, pFieldItem->GetField() ); 950 if(pAuthor) 951 bFix = pAuthor->GetType() == SVXAUTHORTYPE_FIX; 952 break; 953 } 954 default: 955 throw beans::UnknownPropertyException(); 956 } 957 aValue.setValue( &bFix, ::getCppuBooleanType() ); 958 } 959 break; 960 case WID_PRES: 961 case WID_URL: 962 case WID_TARGET: 963 { 964 SvxURLField* pURL = PTR_CAST( SvxURLField, pFieldItem->GetField() ); 965 if(pURL) 966 { 967 OUString aStr; 968 switch( pMap->nWID ) 969 { 970 case WID_PRES: 971 aStr = pURL->GetRepresentation(); 972 break; 973 case WID_URL: 974 aStr = pURL->GetURL(); 975 break; 976 case WID_TARGET: 977 aStr = pURL->GetTargetFrame(); 978 break; 979 } 980 aValue <<= aStr; 981 } 982 break; 983 } 984 case WID_FCOLOR: 985 case WID_TCOLOR: 986 { 987 Color* pFColor = NULL; 988 Color* pTColor = NULL; 989 const ESelection aSel = GetSelection(); 990 991 pForwarder->CalcFieldValue( *pFieldItem, aSel.nStartPara, aSel.nStartPos, pTColor, pFColor ); 992 993 if( pMap->nWID == WID_FCOLOR ) 994 aValue <<= (sal_Int32)pFColor->GetColor(); 995 else 996 aValue <<= (sal_Int32)pTColor->GetColor(); 997 break; 998 999 delete pTColor; 1000 delete pFColor; 1001 } 1002 } 1003 return aValue; 1004 */ 1005 } 1006 1007 void SAL_CALL SvxUnoTextField::addPropertyChangeListener( const OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 1008 void SAL_CALL SvxUnoTextField::removePropertyChangeListener( const OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 1009 void SAL_CALL SvxUnoTextField::addVetoableChangeListener( const OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 1010 void SAL_CALL SvxUnoTextField::removeVetoableChangeListener( const OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 1011 1012 // OComponentHelper 1013 void SvxUnoTextField::disposing() 1014 { 1015 // nothing to do 1016 } 1017 1018 sal_Int32 SvxUnoTextField::GetFieldId( const SvxFieldData* pFieldData ) const throw() 1019 { 1020 if( pFieldData->ISA( SvxURLField ) ) 1021 return ID_URLFIELD; 1022 else if( pFieldData->ISA( SvxPageField ) ) 1023 return ID_PAGEFIELD; 1024 else if( pFieldData->ISA( SvxPagesField ) ) 1025 return ID_PAGESFIELD; 1026 else if( pFieldData->ISA( SvxTimeField ) ) 1027 return ID_TIMEFIELD; 1028 else if( pFieldData->ISA( SvxFileField ) ) 1029 return ID_FILEFIELD; 1030 else if( pFieldData->ISA( SvxTableField ) ) 1031 return ID_TABLEFIELD; 1032 else if( pFieldData->ISA( SvxExtTimeField ) ) 1033 return ID_EXT_TIMEFIELD; 1034 else if( pFieldData->ISA( SvxExtFileField ) ) 1035 return ID_EXT_FILEFIELD; 1036 else if( pFieldData->ISA( SvxAuthorField ) ) 1037 return ID_AUTHORFIELD; 1038 else if( pFieldData->ISA( SvxDateField ) ) 1039 return ID_EXT_DATEFIELD; 1040 else if( pFieldData->ISA( SdrMeasureField ) ) 1041 return ID_MEASUREFIELD; 1042 else if( pFieldData->ISA( SvxHeaderField ) ) 1043 return ID_HEADERFIELD; 1044 else if( pFieldData->ISA( SvxFooterField ) ) 1045 return ID_FOOTERFIELD; 1046 else if( pFieldData->ISA( SvxDateTimeField ) ) 1047 return ID_DATETIMEFIELD; 1048 1049 return ID_UNKNOWN; 1050 } 1051 1052 // lang::XServiceInfo 1053 OUString SAL_CALL SvxUnoTextField::getImplementationName() throw(uno::RuntimeException) 1054 { 1055 return OUString(RTL_CONSTASCII_USTRINGPARAM("SvxUnoTextField")); 1056 } 1057 1058 static const sal_Char* pOldServiceNames[] = 1059 { 1060 "com.sun.star.text.TextField.DateTime", 1061 "com.sun.star.text.TextField.URL", 1062 "com.sun.star.text.TextField.PageNumber", 1063 "com.sun.star.text.TextField.PageCount", 1064 "com.sun.star.text.TextField.DateTime", 1065 "com.sun.star.text.TextField.DocInfo.Title", // SvxFileField is used for title 1066 "com.sun.star.text.TextField.SheetName", 1067 "com.sun.star.text.TextField.DateTime", 1068 "com.sun.star.text.TextField.FileName", 1069 "com.sun.star.text.TextField.Author", 1070 "com.sun.star.text.TextField.Measure", 1071 "com.sun.star.text.TextField.DateTime", 1072 "com.sun.star.presentation.TextField.Header", 1073 "com.sun.star.presentation.TextField.Footer", 1074 "com.sun.star.presentation.TextField.DateTime" 1075 }; 1076 1077 static const sal_Char* pNewServiceNames[] = 1078 { 1079 "com.sun.star.text.textfield.DateTime", 1080 "com.sun.star.text.textfield.URL", 1081 "com.sun.star.text.textfield.PageNumber", 1082 "com.sun.star.text.textfield.PageCount", 1083 "com.sun.star.text.textfield.DateTime", 1084 "com.sun.star.text.textfield.docinfo.Title", // SvxFileField is used for title 1085 "com.sun.star.text.textfield.SheetName", 1086 "com.sun.star.text.textfield.DateTime", 1087 "com.sun.star.text.textfield.FileName", 1088 "com.sun.star.text.textfield.Author", 1089 "com.sun.star.text.textfield.Measure", 1090 "com.sun.star.text.textfield.DateTime", 1091 "com.sun.star.presentation.textfield.Header", 1092 "com.sun.star.presentation.textfield.Footer", 1093 "com.sun.star.presentation.textfield.DateTime" 1094 }; 1095 1096 uno::Sequence< OUString > SAL_CALL SvxUnoTextField::getSupportedServiceNames() 1097 throw(uno::RuntimeException) 1098 { 1099 uno::Sequence< OUString > aSeq( 4 ); 1100 OUString* pServices = aSeq.getArray(); 1101 pServices[0] = OUString::createFromAscii( pNewServiceNames[mnServiceId] ); 1102 pServices[1] = OUString::createFromAscii( pOldServiceNames[mnServiceId] ); 1103 pServices[2] = OUString::createFromAscii( "com.sun.star.text.TextContent" ), 1104 pServices[3] = OUString::createFromAscii( "com.sun.star.text.TextField" ); 1105 1106 return aSeq; 1107 } 1108 1109 sal_Bool SAL_CALL SvxUnoTextField::supportsService( const OUString& ServiceName ) throw( uno::RuntimeException ) 1110 { 1111 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); 1112 } 1113 1114 uno::Reference< uno::XInterface > SAL_CALL SvxUnoTextCreateTextField( const ::rtl::OUString& ServiceSpecifier ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) 1115 { 1116 uno::Reference< uno::XInterface > xRet; 1117 1118 const OUString aTextFieldPrexit( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.textfield.") ); 1119 1120 // #i93308# up to OOo 3.2 we used this wrong namespace name with the capital T & F. This is 1121 // fixed since OOo 3.2 but for compatibility we will still provide support for the wrong notation. 1122 const OUString aTextFieldPrexit2( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextField.") ); 1123 1124 if( (ServiceSpecifier.compareTo( aTextFieldPrexit, aTextFieldPrexit.getLength() ) == 0) || 1125 (ServiceSpecifier.compareTo( aTextFieldPrexit2, aTextFieldPrexit2.getLength() ) == 0) ) 1126 { 1127 OUString aFieldType( ServiceSpecifier.copy( aTextFieldPrexit.getLength() ) ); 1128 1129 sal_Int32 nId = ID_UNKNOWN; 1130 1131 if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("DateTime") ) ) 1132 { 1133 nId = ID_DATEFIELD; 1134 } 1135 else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("URL") ) ) 1136 { 1137 nId = ID_URLFIELD; 1138 } 1139 else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("PageNumber") ) ) 1140 { 1141 nId = ID_PAGEFIELD; 1142 } 1143 else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("PageCount") ) ) 1144 { 1145 nId = ID_PAGESFIELD; 1146 } 1147 else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("SheetName") ) ) 1148 { 1149 nId = ID_TABLEFIELD; 1150 } 1151 else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("FileName") ) ) 1152 { 1153 nId = ID_EXT_FILEFIELD; 1154 } 1155 else if (aFieldType.equalsAsciiL( 1156 RTL_CONSTASCII_STRINGPARAM("docinfo.Title") ) || 1157 aFieldType.equalsAsciiL( 1158 RTL_CONSTASCII_STRINGPARAM("DocInfo.Title") ) ) 1159 { 1160 nId = ID_FILEFIELD; 1161 } 1162 else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Author") ) ) 1163 { 1164 nId = ID_AUTHORFIELD; 1165 } 1166 else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Measure") ) ) 1167 { 1168 nId = ID_MEASUREFIELD; 1169 } 1170 1171 if( nId != ID_UNKNOWN ) 1172 xRet = (::cppu::OWeakObject * )new SvxUnoTextField( nId ); 1173 } 1174 1175 return xRet; 1176 } 1177