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
SvxUnoTextContentEnumeration(const SvxUnoTextBase & _rText)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
~SvxUnoTextContentEnumeration()65 SvxUnoTextContentEnumeration::~SvxUnoTextContentEnumeration() throw()
66 {
67 delete mpEditSource;
68 }
69
70 // container::XEnumeration
hasMoreElements(void)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
nextElement(void)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
getDummyText()114 static SvxUnoText* getDummyText() throw()
115 {
116 if(!xDummyText.is())
117 xDummyText = new SvxUnoText();
118
119 return SvxUnoText::getImplementation( xDummyText );
120 }
121
SvxUnoTextContent()122 SvxUnoTextContent::SvxUnoTextContent() throw()
123 : SvxUnoTextRangeBase(*getDummyText())
124 , mnParagraph(0)
125 , mrParentText(*getDummyText())
126 , maDisposeListeners(maDisposeContainerMutex)
127 , mbDisposing( false )
128 {
129 }
130
SvxUnoTextContent(const SvxUnoTextBase & rText,sal_uInt32 nPara)131 SvxUnoTextContent::SvxUnoTextContent( const SvxUnoTextBase& rText, sal_uInt32 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
SvxUnoTextContent(const SvxUnoTextContent & rContent)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
~SvxUnoTextContent()158 SvxUnoTextContent::~SvxUnoTextContent() throw()
159 {
160 }
161
162 // uno::XInterface
queryAggregation(const uno::Type & rType)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
queryInterface(const uno::Type & rType)182 uno::Any SAL_CALL SvxUnoTextContent::queryInterface( const uno::Type & rType ) throw( uno::RuntimeException )
183 {
184 return OWeakAggObject::queryInterface(rType);
185 }
186
acquire()187 void SAL_CALL SvxUnoTextContent::acquire() throw( )
188 {
189 OWeakAggObject::acquire();
190 }
191
release()192 void SAL_CALL SvxUnoTextContent::release() throw( )
193 {
194 OWeakAggObject::release();
195 }
196
197 // XTypeProvider
198
getTypes()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
getImplementationId()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
getText()236 uno::Reference< text::XText > SAL_CALL SvxUnoTextContent::getText()
237 throw(uno::RuntimeException)
238 {
239 return mxParentText;
240 }
241
242 // text::XTextContent
attach(const uno::Reference<text::XTextRange> &)243 void SAL_CALL SvxUnoTextContent::attach( const uno::Reference< text::XTextRange >& )
244 throw(lang::IllegalArgumentException, uno::RuntimeException)
245 {
246 }
247
getAnchor()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
dispose()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
addEventListener(const uno::Reference<lang::XEventListener> & xListener)273 void SAL_CALL SvxUnoTextContent::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
274 throw(uno::RuntimeException)
275 {
276 maDisposeListeners.addInterface(xListener);
277 }
278
removeEventListener(const uno::Reference<lang::XEventListener> & aListener)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
createEnumeration()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
getElementType()297 uno::Type SAL_CALL SvxUnoTextContent::getElementType()
298 throw(uno::RuntimeException)
299 {
300 return ::getCppuType((const uno::Reference< text::XTextRange >*)0);
301 }
302
hasElements()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
setPropertyValue(const OUString & aPropertyName,const uno::Any & aValue)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
getPropertyValue(const OUString & PropertyName)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
setPropertyValues(const uno::Sequence<::rtl::OUString> & aPropertyNames,const uno::Sequence<uno::Any> & aValues)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
getPropertyValues(const uno::Sequence<::rtl::OUString> & aPropertyNames)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
getPropertyState(const OUString & PropertyName)364 beans::PropertyState SAL_CALL SvxUnoTextContent::getPropertyState( const OUString& PropertyName )
365 throw(beans::UnknownPropertyException, uno::RuntimeException)
366 {
367 return _getPropertyState( PropertyName, mnParagraph );
368 }
369
getPropertyStates(const uno::Sequence<OUString> & aPropertyName)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
setPropertyToDefault(const OUString & PropertyName)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
getImplementationName()384 OUString SAL_CALL SvxUnoTextContent::getImplementationName()
385 throw(uno::RuntimeException)
386 {
387 return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxUnoTextContent") );
388 }
389
getSupportedServiceNames()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
SvxUnoTextRangeEnumeration(const SvxUnoTextBase & rText,sal_uInt32 nPara)406 SvxUnoTextRangeEnumeration::SvxUnoTextRangeEnumeration( const SvxUnoTextBase& rText, sal_uInt32 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
~SvxUnoTextRangeEnumeration()425 SvxUnoTextRangeEnumeration::~SvxUnoTextRangeEnumeration() throw()
426 {
427 delete mpEditSource;
428 delete mpPortions;
429 }
430
431 // container::XEnumeration
432
hasMoreElements()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
nextElement()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
SvxUnoTextCursor_NewInstance()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
SvxUnoTextCursor(const SvxUnoTextBase & rText)496 SvxUnoTextCursor::SvxUnoTextCursor( const SvxUnoTextBase& rText ) throw()
497 : SvxUnoTextRangeBase(rText),
498 mxParentText( const_cast<SvxUnoTextBase*>(&rText) )
499 {
500 }
501
SvxUnoTextCursor(const SvxUnoTextCursor & rCursor)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
~SvxUnoTextCursor()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)
queryAggregation(const uno::Type & rType)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
queryInterface(const uno::Type & rType)535 uno::Any SAL_CALL SvxUnoTextCursor::queryInterface( const uno::Type & rType )
536 throw(uno::RuntimeException)
537 {
538 return OWeakAggObject::queryInterface(rType);
539 }
540
acquire()541 void SAL_CALL SvxUnoTextCursor::acquire() throw ( )
542 {
543 OWeakAggObject::acquire();
544 }
545
release()546 void SAL_CALL SvxUnoTextCursor::release() throw ( )
547 {
548 OWeakAggObject::release();
549 }
550
551 // XTypeProvider
getTypes()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
getImplementationId()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
collapseToStart()587 void SAL_CALL SvxUnoTextCursor::collapseToStart()
588 throw(uno::RuntimeException)
589 {
590 OGuard aGuard( Application::GetSolarMutex() );
591 CollapseToStart();
592 }
593
collapseToEnd()594 void SAL_CALL SvxUnoTextCursor::collapseToEnd()
595 throw(uno::RuntimeException)
596 {
597 OGuard aGuard( Application::GetSolarMutex() );
598 CollapseToEnd();
599 }
600
isCollapsed()601 sal_Bool SAL_CALL SvxUnoTextCursor::isCollapsed()
602 throw(uno::RuntimeException)
603 {
604 OGuard aGuard( Application::GetSolarMutex() );
605 return IsCollapsed();
606 }
607
goLeft(sal_Int16 nCount,sal_Bool bExpand)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
goRight(sal_Int16 nCount,sal_Bool bExpand)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
gotoStart(sal_Bool bExpand)622 void SAL_CALL SvxUnoTextCursor::gotoStart( sal_Bool bExpand )
623 throw(uno::RuntimeException)
624 {
625 OGuard aGuard( Application::GetSolarMutex() );
626 GotoStart( bExpand );
627 }
628
gotoEnd(sal_Bool bExpand)629 void SAL_CALL SvxUnoTextCursor::gotoEnd( sal_Bool bExpand )
630 throw(uno::RuntimeException)
631 {
632 OGuard aGuard( Application::GetSolarMutex() );
633 GotoEnd( bExpand );
634 }
635
gotoRange(const uno::Reference<text::XTextRange> & xRange,sal_Bool bExpand)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)
getText(void)660 uno::Reference< text::XText > SAL_CALL SvxUnoTextCursor::getText(void) throw( uno::RuntimeException )
661 {
662 return mxParentText;
663 }
664
getStart()665 uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextCursor::getStart()
666 throw(uno::RuntimeException)
667 {
668 return SvxUnoTextRangeBase::getStart();
669 }
670
getEnd()671 uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextCursor::getEnd()
672 throw(uno::RuntimeException)
673 {
674 return SvxUnoTextRangeBase::getEnd();
675 }
676
getString()677 OUString SAL_CALL SvxUnoTextCursor::getString() throw( uno::RuntimeException )
678 {
679 return SvxUnoTextRangeBase::getString();
680 }
681
setString(const OUString & aString)682 void SAL_CALL SvxUnoTextCursor::setString( const OUString& aString ) throw(uno::RuntimeException)
683 {
684 SvxUnoTextRangeBase::setString(aString);
685 }
686 // lang::XServiceInfo
getImplementationName()687 OUString SAL_CALL SvxUnoTextCursor::getImplementationName() throw(uno::RuntimeException)
688 {
689 return OUString(RTL_CONSTASCII_USTRINGPARAM("SvxUnoTextCursor"));
690 }
691
supportsService(const OUString & ServiceName)692 sal_Bool SAL_CALL SvxUnoTextCursor::supportsService( const OUString& ServiceName ) throw(uno::RuntimeException)
693 {
694 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
695 }
696
getSupportedServiceNames()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