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 <vcl/svapp.hxx> 27 #include <vos/mutex.hxx> 28 29 #define _SVSTDARR_sal_uIt16S 30 #include <svl/svstdarr.hxx> 31 32 #include <rtl/uuid.h> 33 #include <rtl/memory.h> 34 35 #include <editeng/eeitem.hxx> 36 #include <editeng/flditem.hxx> 37 #include <editeng/unofield.hxx> 38 #include <editeng/unotext.hxx> 39 #include <comphelper/serviceinfohelper.hxx> 40 41 using namespace ::rtl; 42 using namespace ::vos; 43 using namespace ::cppu; 44 using namespace ::com::sun::star; 45 46 #define QUERYINT( xint ) \ 47 if( rType == ::getCppuType((const uno::Reference< xint >*)0) ) \ 48 return uno::makeAny(uno::Reference< xint >(this)) 49 50 // ==================================================================== 51 // SvxUnoTextContentEnumeration 52 // ==================================================================== 53 54 SvxUnoTextContentEnumeration::SvxUnoTextContentEnumeration( const SvxUnoTextBase& _rText ) throw() 55 : mrText( _rText ) 56 { 57 mxParentText = const_cast<SvxUnoTextBase*>(&_rText); 58 if( mrText.GetEditSource() ) 59 mpEditSource = mrText.GetEditSource()->Clone(); 60 else 61 mpEditSource = NULL; 62 mnNextParagraph = 0; 63 } 64 65 SvxUnoTextContentEnumeration::~SvxUnoTextContentEnumeration() throw() 66 { 67 delete mpEditSource; 68 } 69 70 // container::XEnumeration 71 sal_Bool SAL_CALL SvxUnoTextContentEnumeration::hasMoreElements(void) 72 throw( uno::RuntimeException ) 73 { 74 OGuard aGuard( Application::GetSolarMutex() ); 75 if( mpEditSource && mpEditSource->GetTextForwarder() ) 76 return mnNextParagraph < mpEditSource->GetTextForwarder()->GetParagraphCount(); 77 else 78 return sal_False; 79 } 80 81 uno::Any SvxUnoTextContentEnumeration::nextElement(void) throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) 82 { 83 OGuard aGuard( Application::GetSolarMutex() ); 84 85 if(!hasMoreElements()) 86 throw container::NoSuchElementException(); 87 88 SvxUnoTextContent* pContent = 0; 89 90 const SvxUnoTextRangeBaseList& rRanges( mpEditSource->getRanges() ); 91 SvxUnoTextRangeBaseList::const_iterator aIter; 92 for( aIter = rRanges.begin(); (aIter != rRanges.end()) && (pContent == 0); aIter++ ) 93 { 94 SvxUnoTextContent* pIterContent = dynamic_cast< SvxUnoTextContent* >( (*aIter ) ); 95 if( pIterContent && (pIterContent->mnParagraph == mnNextParagraph) ) 96 pContent = pIterContent; 97 } 98 99 if( pContent == 0 ) 100 pContent = new SvxUnoTextContent( mrText, mnNextParagraph ); 101 102 mnNextParagraph++; 103 104 uno::Reference< text::XTextContent > xRef( pContent ); 105 return uno::makeAny( xRef ); 106 } 107 108 // ==================================================================== 109 // class SvxUnoTextContent 110 // ==================================================================== 111 uno::Reference< text::XText > xDummyText; 112 uno::Sequence< uno::Type > SvxUnoTextContent::maTypeSequence; 113 114 static SvxUnoText* getDummyText() throw() 115 { 116 if(!xDummyText.is()) 117 xDummyText = new SvxUnoText(); 118 119 return SvxUnoText::getImplementation( xDummyText ); 120 } 121 122 SvxUnoTextContent::SvxUnoTextContent() throw() 123 : SvxUnoTextRangeBase(*getDummyText()) 124 , mnParagraph(0) 125 , mrParentText(*getDummyText()) 126 , maDisposeListeners(maDisposeContainerMutex) 127 , mbDisposing( false ) 128 { 129 } 130 131 SvxUnoTextContent::SvxUnoTextContent( const SvxUnoTextBase& rText, sal_uInt16 nPara ) throw() 132 : SvxUnoTextRangeBase(rText) 133 , mnParagraph(nPara) 134 , mrParentText(rText) 135 , maDisposeListeners(maDisposeContainerMutex) 136 , mbDisposing( false ) 137 { 138 mxParentText = const_cast<SvxUnoTextBase*>(&rText); 139 if( GetEditSource() && GetEditSource()->GetTextForwarder() ) 140 SetSelection( ESelection( mnParagraph,0, mnParagraph, GetEditSource()->GetTextForwarder()->GetTextLen( mnParagraph ) ) ); 141 } 142 143 SvxUnoTextContent::SvxUnoTextContent( const SvxUnoTextContent& rContent ) throw() 144 : SvxUnoTextRangeBase(rContent) 145 , text::XTextContent() 146 , container::XEnumerationAccess() 147 , lang::XTypeProvider() 148 , cppu::OWeakAggObject() 149 , mrParentText(rContent.mrParentText) 150 , maDisposeListeners(maDisposeContainerMutex) 151 , mbDisposing( false ) 152 { 153 mxParentText = rContent.mxParentText; 154 mnParagraph = rContent.mnParagraph; 155 SetSelection( rContent.GetSelection() ); 156 } 157 158 SvxUnoTextContent::~SvxUnoTextContent() throw() 159 { 160 } 161 162 // uno::XInterface 163 uno::Any SAL_CALL SvxUnoTextContent::queryAggregation( const uno::Type & rType ) throw( uno::RuntimeException ) 164 { 165 QUERYINT( text::XTextRange ); 166 else QUERYINT( beans::XMultiPropertyStates ); 167 else QUERYINT( beans::XPropertySet ); 168 else QUERYINT( beans::XMultiPropertySet ); 169 else QUERYINT( beans::XPropertyState ); 170 else QUERYINT( text::XTextContent ); 171 else QUERYINT( text::XTextRangeCompare ); 172 else QUERYINT( lang::XComponent ); 173 else QUERYINT( container::XEnumerationAccess ); 174 else QUERYINT( container::XElementAccess ); 175 else QUERYINT( lang::XServiceInfo ); 176 else QUERYINT( lang::XTypeProvider ); 177 else QUERYINT( lang::XUnoTunnel ); 178 else 179 return OWeakAggObject::queryAggregation( rType ); 180 } 181 182 uno::Any SAL_CALL SvxUnoTextContent::queryInterface( const uno::Type & rType ) throw( uno::RuntimeException ) 183 { 184 return OWeakAggObject::queryInterface(rType); 185 } 186 187 void SAL_CALL SvxUnoTextContent::acquire() throw( ) 188 { 189 OWeakAggObject::acquire(); 190 } 191 192 void SAL_CALL SvxUnoTextContent::release() throw( ) 193 { 194 OWeakAggObject::release(); 195 } 196 197 // XTypeProvider 198 199 uno::Sequence< uno::Type > SAL_CALL SvxUnoTextContent::getTypes() 200 throw (uno::RuntimeException) 201 { 202 if( maTypeSequence.getLength() == 0 ) 203 { 204 maTypeSequence.realloc( 11 ); // !DANGER! keep this updated 205 uno::Type* pTypes = maTypeSequence.getArray(); 206 207 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRange >*)0); 208 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XPropertySet >*)0); 209 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XMultiPropertySet >*)0); 210 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XMultiPropertyStates >*)0); 211 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XPropertyState >*)0); 212 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeCompare >*)0); 213 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextContent >*)0); 214 *pTypes++ = ::getCppuType(( const uno::Reference< container::XEnumerationAccess >*)0); 215 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XServiceInfo >*)0); 216 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XTypeProvider >*)0); 217 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XUnoTunnel >*)0); 218 } 219 return maTypeSequence; 220 } 221 222 uno::Sequence< sal_Int8 > SAL_CALL SvxUnoTextContent::getImplementationId() 223 throw (uno::RuntimeException) 224 { 225 static uno::Sequence< sal_Int8 > aId; 226 if( aId.getLength() == 0 ) 227 { 228 aId.realloc( 16 ); 229 rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True ); 230 } 231 return aId; 232 } 233 234 // text::XTextRange 235 236 uno::Reference< text::XText > SAL_CALL SvxUnoTextContent::getText() 237 throw(uno::RuntimeException) 238 { 239 return mxParentText; 240 } 241 242 // text::XTextContent 243 void SAL_CALL SvxUnoTextContent::attach( const uno::Reference< text::XTextRange >& ) 244 throw(lang::IllegalArgumentException, uno::RuntimeException) 245 { 246 } 247 248 uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextContent::getAnchor() throw( uno::RuntimeException ) 249 { 250 return uno::Reference< text::XTextRange >::query( mxParentText ); 251 } 252 253 // XComponent 254 255 void SAL_CALL SvxUnoTextContent::dispose() 256 throw(uno::RuntimeException) 257 { 258 OGuard aGuard( Application::GetSolarMutex() ); 259 260 if( mbDisposing ) 261 return; // catched a recursion 262 263 mbDisposing = true; 264 265 lang::EventObject aEvt; 266 aEvt.Source = *(OWeakAggObject*) this; 267 maDisposeListeners.disposeAndClear(aEvt); 268 269 if( mxParentText.is() ) 270 mxParentText->removeTextContent( this ); 271 } 272 273 void SAL_CALL SvxUnoTextContent::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) 274 throw(uno::RuntimeException) 275 { 276 maDisposeListeners.addInterface(xListener); 277 } 278 279 void SAL_CALL SvxUnoTextContent::removeEventListener( const uno::Reference< lang::XEventListener >& aListener ) 280 throw(uno::RuntimeException) 281 { 282 maDisposeListeners.removeInterface(aListener); 283 } 284 285 // XEnumerationAccess 286 287 uno::Reference< container::XEnumeration > SAL_CALL SvxUnoTextContent::createEnumeration( ) 288 throw(uno::RuntimeException) 289 { 290 OGuard aGuard( Application::GetSolarMutex() ); 291 292 return new SvxUnoTextRangeEnumeration( mrParentText, mnParagraph ); 293 } 294 295 // XElementAccess ( container::XEnumerationAccess ) 296 297 uno::Type SAL_CALL SvxUnoTextContent::getElementType() 298 throw(uno::RuntimeException) 299 { 300 return ::getCppuType((const uno::Reference< text::XTextRange >*)0); 301 } 302 303 sal_Bool SAL_CALL SvxUnoTextContent::hasElements() 304 throw(uno::RuntimeException) 305 { 306 OGuard aGuard( Application::GetSolarMutex() ); 307 308 SvxTextForwarder* pForwarder = GetEditSource() ? GetEditSource()->GetTextForwarder() : NULL; 309 if( pForwarder ) 310 { 311 SvUShorts aPortions; 312 pForwarder->GetPortions( mnParagraph, aPortions ); 313 return aPortions.Count() > 0; 314 } 315 else 316 { 317 return 0; 318 } 319 } 320 321 // XPropertySet 322 323 void SAL_CALL SvxUnoTextContent::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue ) 324 throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 325 { 326 _setPropertyValue( aPropertyName, aValue, mnParagraph ); 327 } 328 329 uno::Any SAL_CALL SvxUnoTextContent::getPropertyValue( const OUString& PropertyName ) 330 throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 331 { 332 return _getPropertyValue( PropertyName, mnParagraph ); 333 } 334 335 // XMultiPropertySet 336 void SAL_CALL SvxUnoTextContent::setPropertyValues( const uno::Sequence< ::rtl::OUString >& aPropertyNames, const uno::Sequence< uno::Any >& aValues ) throw (beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 337 { 338 _setPropertyValues( aPropertyNames, aValues, mnParagraph ); 339 } 340 341 uno::Sequence< uno::Any > SAL_CALL SvxUnoTextContent::getPropertyValues( const uno::Sequence< ::rtl::OUString >& aPropertyNames ) throw (uno::RuntimeException) 342 { 343 return _getPropertyValues( aPropertyNames, mnParagraph ); 344 } 345 346 /*// XTolerantMultiPropertySet 347 uno::Sequence< beans::SetPropertyTolerantFailed > SAL_CALL SvxUnoTextContent::setPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames, const uno::Sequence< uno::Any >& aValues ) throw (lang::IllegalArgumentException, uno::RuntimeException) 348 { 349 return _setPropertyValuesTolerant(aPropertyNames, aValues, mnParagraph); 350 } 351 352 uno::Sequence< beans::GetPropertyTolerantResult > SAL_CALL SvxUnoTextContent::getPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames ) throw (uno::RuntimeException) 353 { 354 return _getPropertyValuesTolerant(aPropertyNames, mnParagraph); 355 } 356 357 uno::Sequence< beans::GetDirectPropertyTolerantResult > SAL_CALL SvxUnoTextContent::getDirectPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames ) 358 throw (uno::RuntimeException) 359 { 360 return _getDirectPropertyValuesTolerant(aPropertyNames, mnParagraph); 361 }*/ 362 363 // beans::XPropertyState 364 beans::PropertyState SAL_CALL SvxUnoTextContent::getPropertyState( const OUString& PropertyName ) 365 throw(beans::UnknownPropertyException, uno::RuntimeException) 366 { 367 return _getPropertyState( PropertyName, mnParagraph ); 368 } 369 370 uno::Sequence< beans::PropertyState > SAL_CALL SvxUnoTextContent::getPropertyStates( const uno::Sequence< OUString >& aPropertyName ) 371 throw(beans::UnknownPropertyException, uno::RuntimeException) 372 { 373 return _getPropertyStates( aPropertyName, mnParagraph ); 374 } 375 376 void SAL_CALL SvxUnoTextContent::setPropertyToDefault( const OUString& PropertyName ) 377 throw(beans::UnknownPropertyException, uno::RuntimeException) 378 { 379 _setPropertyToDefault( PropertyName, mnParagraph ); 380 } 381 382 // lang::XServiceInfo 383 384 OUString SAL_CALL SvxUnoTextContent::getImplementationName() 385 throw(uno::RuntimeException) 386 { 387 return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxUnoTextContent") ); 388 } 389 390 uno::Sequence< OUString > SAL_CALL SvxUnoTextContent::getSupportedServiceNames() 391 throw(uno::RuntimeException) 392 { 393 uno::Sequence< OUString > aSeq( SvxUnoTextRangeBase::getSupportedServiceNames() ); 394 comphelper::ServiceInfoHelper::addToSequence( aSeq, 5, "com.sun.star.style.ParagraphProperties", 395 "com.sun.star.style.ParagraphPropertiesComplex", 396 "com.sun.star.style.ParagraphPropertiesAsian", 397 "com.sun.star.text.TextContent", 398 "com.sun.star.text.Paragraph"); 399 return aSeq; 400 } 401 402 // ==================================================================== 403 // class SvxUnoTextRangeEnumeration 404 // ==================================================================== 405 406 SvxUnoTextRangeEnumeration::SvxUnoTextRangeEnumeration( const SvxUnoTextBase& rText, sal_uInt16 nPara ) throw() 407 : mxParentText( const_cast<SvxUnoTextBase*>(&rText) ), 408 mrParentText( rText ), 409 mnParagraph( nPara ), 410 mnNextPortion( 0 ) 411 { 412 mpEditSource = rText.GetEditSource() ? rText.GetEditSource()->Clone() : NULL; 413 414 if( mpEditSource && mpEditSource->GetTextForwarder() ) 415 { 416 mpPortions = new SvUShorts; 417 mpEditSource->GetTextForwarder()->GetPortions( nPara, *mpPortions ); 418 } 419 else 420 { 421 mpPortions = NULL; 422 } 423 } 424 425 SvxUnoTextRangeEnumeration::~SvxUnoTextRangeEnumeration() throw() 426 { 427 delete mpEditSource; 428 delete mpPortions; 429 } 430 431 // container::XEnumeration 432 433 sal_Bool SAL_CALL SvxUnoTextRangeEnumeration::hasMoreElements() 434 throw(uno::RuntimeException) 435 { 436 OGuard aGuard( Application::GetSolarMutex() ); 437 438 return mpPortions && mnNextPortion < mpPortions->Count(); 439 } 440 441 uno::Any SAL_CALL SvxUnoTextRangeEnumeration::nextElement() 442 throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 443 { 444 OGuard aGuard( Application::GetSolarMutex() ); 445 446 if( mpPortions == NULL || mnNextPortion >= mpPortions->Count() ) 447 throw container::NoSuchElementException(); 448 449 sal_uInt16 nStartPos = 0; 450 if (mnNextPortion > 0) 451 nStartPos = mpPortions->GetObject(mnNextPortion-1); 452 sal_uInt16 nEndPos = mpPortions->GetObject(mnNextPortion); 453 ESelection aSel( mnParagraph, nStartPos, mnParagraph, nEndPos ); 454 455 uno::Reference< text::XTextRange > xRange; 456 457 const SvxUnoTextRangeBaseList& rRanges( mpEditSource->getRanges() ); 458 459 SvxUnoTextRange* pRange = 0; 460 461 SvxUnoTextRangeBaseList::const_iterator aIter; 462 for( aIter = rRanges.begin(); (aIter != rRanges.end()) && (pRange == 0); aIter++ ) 463 { 464 SvxUnoTextRange* pIterRange = dynamic_cast< SvxUnoTextRange* >( (*aIter ) ); 465 if( pIterRange && pIterRange->mbPortion && (aSel.IsEqual( pIterRange->maSelection ) ) ) 466 pRange = pIterRange; 467 } 468 469 if( pRange == 0 ) 470 { 471 pRange = new SvxUnoTextRange( mrParentText, sal_True ); 472 pRange->SetSelection(aSel); 473 } 474 475 xRange = pRange; 476 477 mnNextPortion++; 478 479 return uno::makeAny( xRange ); 480 } 481 482 // ==================================================================== 483 // class SvxUnoTextCursor 484 // ==================================================================== 485 486 uno::Sequence< uno::Type > SvxUnoTextCursor::maTypeSequence; 487 488 uno::Reference< uno::XInterface > SvxUnoTextCursor_NewInstance() 489 { 490 SvxUnoText aText; 491 uno::Reference< text::XText > xText( (text::XText*)new SvxUnoTextCursor( aText ) ); 492 uno::Reference< uno::XInterface > xInt( xText, uno::UNO_QUERY ); 493 return xInt; 494 } 495 496 SvxUnoTextCursor::SvxUnoTextCursor( const SvxUnoTextBase& rText ) throw() 497 : SvxUnoTextRangeBase(rText), 498 mxParentText( const_cast<SvxUnoTextBase*>(&rText) ) 499 { 500 } 501 502 SvxUnoTextCursor::SvxUnoTextCursor( const SvxUnoTextCursor& rCursor ) throw() 503 : SvxUnoTextRangeBase(rCursor) 504 , text::XTextCursor() 505 , lang::XTypeProvider() 506 , cppu::OWeakAggObject() 507 , mxParentText(rCursor.mxParentText) 508 { 509 } 510 511 SvxUnoTextCursor::~SvxUnoTextCursor() throw() 512 { 513 } 514 515 // automatisch auskommentiert - [getIdlClass(es) or queryInterface] - Bitte XTypeProvider benutzen! 516 //sal_Bool SvxUnoTextCursor::queryInterface( uno::Uik aUIK, Reference< uno::XInterface > & xRef) 517 uno::Any SAL_CALL SvxUnoTextCursor::queryAggregation( const uno::Type & rType ) 518 throw(uno::RuntimeException) 519 { 520 if( rType == ::getCppuType((const uno::Reference< text::XTextRange >*)0) ) 521 return uno::makeAny(uno::Reference< text::XTextRange >((text::XText*)(this))); 522 else QUERYINT( text::XTextCursor ); 523 else QUERYINT( beans::XMultiPropertyStates ); 524 else QUERYINT( beans::XPropertySet ); 525 else QUERYINT( beans::XMultiPropertySet ); 526 else QUERYINT( beans::XPropertyState ); 527 else QUERYINT( text::XTextRangeCompare ); 528 else QUERYINT( lang::XServiceInfo ); 529 else QUERYINT( lang::XTypeProvider ); 530 else QUERYINT( lang::XUnoTunnel ); 531 else 532 return OWeakAggObject::queryAggregation( rType ); 533 } 534 535 uno::Any SAL_CALL SvxUnoTextCursor::queryInterface( const uno::Type & rType ) 536 throw(uno::RuntimeException) 537 { 538 return OWeakAggObject::queryInterface(rType); 539 } 540 541 void SAL_CALL SvxUnoTextCursor::acquire() throw ( ) 542 { 543 OWeakAggObject::acquire(); 544 } 545 546 void SAL_CALL SvxUnoTextCursor::release() throw ( ) 547 { 548 OWeakAggObject::release(); 549 } 550 551 // XTypeProvider 552 uno::Sequence< uno::Type > SAL_CALL SvxUnoTextCursor::getTypes() 553 throw(uno::RuntimeException) 554 { 555 if( maTypeSequence.getLength() == 0 ) 556 { 557 maTypeSequence.realloc( 10 ); // !DANGER! keep this updated 558 uno::Type* pTypes = maTypeSequence.getArray(); 559 560 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRange >*)0); 561 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextCursor >*)0); 562 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XPropertySet >*)0); 563 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XMultiPropertySet >*)0); 564 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XMultiPropertyStates >*)0); 565 *pTypes++ = ::getCppuType(( const uno::Reference< beans::XPropertyState >*)0); 566 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeCompare >*)0); 567 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XServiceInfo >*)0); 568 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XTypeProvider >*)0); 569 *pTypes++ = ::getCppuType(( const uno::Reference< lang::XUnoTunnel >*)0); 570 } 571 return maTypeSequence; 572 } 573 574 uno::Sequence< sal_Int8 > SAL_CALL SvxUnoTextCursor::getImplementationId() 575 throw (uno::RuntimeException) 576 { 577 static uno::Sequence< sal_Int8 > aId; 578 if( aId.getLength() == 0 ) 579 { 580 aId.realloc( 16 ); 581 rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True ); 582 } 583 return aId; 584 } 585 586 // text::XTextCursor 587 void SAL_CALL SvxUnoTextCursor::collapseToStart() 588 throw(uno::RuntimeException) 589 { 590 OGuard aGuard( Application::GetSolarMutex() ); 591 CollapseToStart(); 592 } 593 594 void SAL_CALL SvxUnoTextCursor::collapseToEnd() 595 throw(uno::RuntimeException) 596 { 597 OGuard aGuard( Application::GetSolarMutex() ); 598 CollapseToEnd(); 599 } 600 601 sal_Bool SAL_CALL SvxUnoTextCursor::isCollapsed() 602 throw(uno::RuntimeException) 603 { 604 OGuard aGuard( Application::GetSolarMutex() ); 605 return IsCollapsed(); 606 } 607 608 sal_Bool SAL_CALL SvxUnoTextCursor::goLeft( sal_Int16 nCount, sal_Bool bExpand ) 609 throw(uno::RuntimeException) 610 { 611 OGuard aGuard( Application::GetSolarMutex() ); 612 return GoLeft( nCount, bExpand ); 613 } 614 615 sal_Bool SAL_CALL SvxUnoTextCursor::goRight( sal_Int16 nCount, sal_Bool bExpand ) 616 throw(uno::RuntimeException) 617 { 618 OGuard aGuard( Application::GetSolarMutex() ); 619 return GoRight( nCount, bExpand ); 620 } 621 622 void SAL_CALL SvxUnoTextCursor::gotoStart( sal_Bool bExpand ) 623 throw(uno::RuntimeException) 624 { 625 OGuard aGuard( Application::GetSolarMutex() ); 626 GotoStart( bExpand ); 627 } 628 629 void SAL_CALL SvxUnoTextCursor::gotoEnd( sal_Bool bExpand ) 630 throw(uno::RuntimeException) 631 { 632 OGuard aGuard( Application::GetSolarMutex() ); 633 GotoEnd( bExpand ); 634 } 635 636 void SAL_CALL SvxUnoTextCursor::gotoRange( const uno::Reference< text::XTextRange >& xRange, sal_Bool bExpand ) 637 throw(uno::RuntimeException) 638 { 639 if( !xRange.is() ) 640 return; 641 642 SvxUnoTextRangeBase* pRange = SvxUnoTextRangeBase::getImplementation( xRange ); 643 644 if( pRange ) 645 { 646 ESelection aNewSel = pRange->GetSelection(); 647 648 if( bExpand ) 649 { 650 const ESelection& rOldSel = GetSelection(); 651 aNewSel.nStartPara = rOldSel.nStartPara; 652 aNewSel.nStartPos = rOldSel.nStartPos; 653 } 654 655 SetSelection( aNewSel ); 656 } 657 } 658 659 // text::XTextRange (rest in SvxTextRange) 660 uno::Reference< text::XText > SAL_CALL SvxUnoTextCursor::getText(void) throw( uno::RuntimeException ) 661 { 662 return mxParentText; 663 } 664 665 uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextCursor::getStart() 666 throw(uno::RuntimeException) 667 { 668 return SvxUnoTextRangeBase::getStart(); 669 } 670 671 uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextCursor::getEnd() 672 throw(uno::RuntimeException) 673 { 674 return SvxUnoTextRangeBase::getEnd(); 675 } 676 677 OUString SAL_CALL SvxUnoTextCursor::getString() throw( uno::RuntimeException ) 678 { 679 return SvxUnoTextRangeBase::getString(); 680 } 681 682 void SAL_CALL SvxUnoTextCursor::setString( const OUString& aString ) throw(uno::RuntimeException) 683 { 684 SvxUnoTextRangeBase::setString(aString); 685 } 686 // lang::XServiceInfo 687 OUString SAL_CALL SvxUnoTextCursor::getImplementationName() throw(uno::RuntimeException) 688 { 689 return OUString(RTL_CONSTASCII_USTRINGPARAM("SvxUnoTextCursor")); 690 } 691 692 sal_Bool SAL_CALL SvxUnoTextCursor::supportsService( const OUString& ServiceName ) throw(uno::RuntimeException) 693 { 694 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); 695 } 696 697 uno::Sequence< OUString > SAL_CALL SvxUnoTextCursor::getSupportedServiceNames() throw(uno::RuntimeException) 698 { 699 uno::Sequence< OUString > aSeq( SvxUnoTextRangeBase::getSupportedServiceNames() ); 700 comphelper::ServiceInfoHelper::addToSequence( aSeq, 4,"com.sun.star.style.ParagraphProperties", 701 "com.sun.star.style.ParagraphPropertiesComplex", 702 "com.sun.star.style.ParagraphPropertiesAsian", 703 "com.sun.star.text.TextCursor"); 704 return aSeq; 705 } 706 707 708