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_sw.hxx"
26
27 #include <rtl/uuid.h>
28
29 #include <vos/mutex.hxx>
30 #include <vcl/svapp.hxx>
31 #include <comphelper/sequence.hxx>
32
33 #include <unomid.h>
34 #include <unofootnote.hxx>
35 #include <unotextrange.hxx>
36 #include <unotextcursor.hxx>
37 #include <unoparagraph.hxx>
38 #include <unomap.hxx>
39 #include <unoprnms.hxx>
40 #include <unoevtlstnr.hxx>
41 #include <doc.hxx>
42 #include <ftnidx.hxx>
43 #include <fmtftn.hxx>
44 #include <txtftn.hxx>
45 #include <ndtxt.hxx>
46 #include <unocrsr.hxx>
47 #include <hints.hxx>
48
49
50 using namespace ::com::sun::star;
51 using ::rtl::OUString;
52
53 /******************************************************************
54 * SwXFootnote
55 ******************************************************************/
56
57 class SwXFootnote::Impl
58 : public SwClient
59 {
60
61 public:
62
63 SwXFootnote & m_rThis;
64 const bool m_bIsEndnote;
65 SwEventListenerContainer m_ListenerContainer;
66 bool m_bIsDescriptor;
67 const SwFmtFtn * m_pFmtFtn;
68 ::rtl::OUString m_sLabel;
69
Impl(SwXFootnote & rThis,SwDoc * const pDoc,SwFmtFtn const * const pFootnote,const bool bIsEndnote)70 Impl( SwXFootnote & rThis,
71 SwDoc *const pDoc, SwFmtFtn const*const pFootnote,
72 const bool bIsEndnote)
73 : SwClient((pDoc) ? pDoc->GetUnoCallBack() : 0)
74 , m_rThis(rThis)
75 , m_bIsEndnote(bIsEndnote)
76 , m_ListenerContainer(static_cast< ::cppu::OWeakObject* >(&rThis))
77 // #i111177#: unxsols4 (Sun C++ 5.9 SunOS_sparc) generates wrong code for this
78 // , m_bIsDescriptor(0 == pFootnote)
79 , m_bIsDescriptor((0 == pFootnote) ? true : false)
80 , m_pFmtFtn(pFootnote)
81 {
82 }
83
GetFootnoteFormat() const84 const SwFmtFtn* GetFootnoteFormat() const {
85 return m_rThis.GetDoc() ? m_pFmtFtn : 0;
86 }
87
GetFootnoteFormatOrThrow()88 SwFmtFtn const& GetFootnoteFormatOrThrow() {
89 SwFmtFtn const*const pFootnote( GetFootnoteFormat() );
90 if (!pFootnote) {
91 throw uno::RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM(
92 "SwXFootnote: disposed or invalid")), 0);
93 }
94 return *pFootnote;
95 }
96
97 void Invalidate();
98 protected:
99 // SwClient
100 virtual void Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew);
101
102 };
103
104 /* -----------------------------07.01.00 12:39--------------------------------
105
106 ---------------------------------------------------------------------------*/
Invalidate()107 void SwXFootnote::Impl::Invalidate()
108 {
109 if (GetRegisteredIn())
110 {
111 const_cast<SwModify*>(GetRegisteredIn())->Remove(this);
112 }
113 m_ListenerContainer.Disposing();
114 m_pFmtFtn = 0;
115 m_rThis.SetDoc(0);
116 }
117
118 /* -----------------18.01.99 09:12-------------------
119 *
120 * --------------------------------------------------*/
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)121 void SwXFootnote::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew)
122 {
123 ClientModify(this, pOld, pNew);
124
125 if (!GetRegisteredIn()) // removed => dispose
126 {
127 Invalidate();
128 }
129 else if (pOld)
130 {
131 switch (pOld->Which())
132 {
133 case RES_FOOTNOTE_DELETED:
134 if (static_cast<const void*>(m_pFmtFtn) ==
135 static_cast<const SwPtrMsgPoolItem *>(pOld)->pObject)
136 {
137 Invalidate();
138 }
139 break;
140 }
141 }
142 }
143
144 /*-- 10.12.98 15:31:44---------------------------------------------------
145
146 -----------------------------------------------------------------------*/
SwXFootnote(const bool bEndnote)147 SwXFootnote::SwXFootnote(const bool bEndnote)
148 : SwXText(0, CURSOR_FOOTNOTE)
149 , m_pImpl( new SwXFootnote::Impl(*this, 0, 0, bEndnote) )
150 {
151 }
152 /*-- 10.12.98 15:31:45---------------------------------------------------
153
154 -----------------------------------------------------------------------*/
SwXFootnote(SwDoc & rDoc,const SwFmtFtn & rFmt)155 SwXFootnote::SwXFootnote(SwDoc & rDoc, const SwFmtFtn& rFmt)
156 : SwXText(& rDoc, CURSOR_FOOTNOTE)
157 , m_pImpl( new SwXFootnote::Impl(*this, &rDoc, &rFmt, rFmt.IsEndNote()) )
158 {
159 }
160 /*-- 10.12.98 15:31:45---------------------------------------------------
161
162 -----------------------------------------------------------------------*/
~SwXFootnote()163 SwXFootnote::~SwXFootnote()
164 {
165 }
166
167 SwXFootnote *
GetXFootnote(SwModify const &,SwFmtFtn const &)168 SwXFootnote::GetXFootnote(
169 SwModify const& /*rUnoCB*/, SwFmtFtn const& /*rFootnoteFmt*/)
170 {
171 // re-use existing SwXFootnote
172 // #i105557#: do not iterate over the registered clients: race condition
173 // to do this properly requires the SwXFootnote to register at the
174 // SwFmtFtn directly, not at the unocallback
175 // also this function must return a uno Reference!
176 return 0;
177 }
178
179 SwXFootnote *
CreateXFootnote(SwDoc & rDoc,SwFmtFtn const & rFootnoteFmt)180 SwXFootnote::CreateXFootnote(SwDoc & rDoc, SwFmtFtn const& rFootnoteFmt)
181 {
182 SwXFootnote *const pXFootnote(
183 GetXFootnote(*rDoc.GetUnoCallBack(), rFootnoteFmt));
184 return (pXFootnote)
185 ? pXFootnote
186 : new SwXFootnote(rDoc, rFootnoteFmt);
187 }
188
189 /* -----------------------------13.03.00 12:15--------------------------------
190
191 ---------------------------------------------------------------------------*/
getUnoTunnelId()192 const uno::Sequence< sal_Int8 > & SwXFootnote::getUnoTunnelId()
193 {
194 static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
195 return aSeq;
196 }
197 /* -----------------------------10.03.00 18:04--------------------------------
198
199 ---------------------------------------------------------------------------*/
200 sal_Int64 SAL_CALL
getSomething(const uno::Sequence<sal_Int8> & rId)201 SwXFootnote::getSomething(const uno::Sequence< sal_Int8 >& rId)
202 throw (uno::RuntimeException)
203 {
204 const sal_Int64 nRet( ::sw::UnoTunnelImpl<SwXFootnote>(rId, this) );
205 return (nRet) ? nRet : SwXText::getSomething(rId);
206 }
207
208 /* -----------------------------06.04.00 16:36--------------------------------
209
210 ---------------------------------------------------------------------------*/
211 OUString SAL_CALL
getImplementationName()212 SwXFootnote::getImplementationName() throw (uno::RuntimeException)
213 {
214 return C2U("SwXFootnote");
215 }
216
217 /* -----------------------------06.04.00 16:36--------------------------------
218
219 ---------------------------------------------------------------------------*/
220 static char const*const g_ServicesFootnote[] =
221 {
222 "com.sun.star.text.TextContent",
223 "com.sun.star.text.Footnote",
224 "com.sun.star.text.Text",
225 "com.sun.star.text.Endnote", // NB: only supported for endnotes!
226 };
227 static const size_t g_nServicesEndnote(
228 sizeof(g_ServicesFootnote)/sizeof(g_ServicesFootnote[0]));
229 static const size_t g_nServicesFootnote( g_nServicesEndnote - 1 ); // NB: omit!
230
supportsService(const OUString & rServiceName)231 sal_Bool SAL_CALL SwXFootnote::supportsService(const OUString& rServiceName)
232 throw (uno::RuntimeException)
233 {
234 vos::OGuard g(Application::GetSolarMutex());
235 return ::sw::SupportsServiceImpl(
236 (m_pImpl->m_bIsEndnote) ? g_nServicesEndnote : g_nServicesFootnote,
237 g_ServicesFootnote, rServiceName);
238 }
239
240 uno::Sequence< OUString > SAL_CALL
getSupportedServiceNames()241 SwXFootnote::getSupportedServiceNames() throw (uno::RuntimeException)
242 {
243 vos::OGuard g(Application::GetSolarMutex());
244 return ::sw::GetSupportedServiceNamesImpl(
245 (m_pImpl->m_bIsEndnote) ? g_nServicesEndnote : g_nServicesFootnote,
246 g_ServicesFootnote);
247 }
248
249 /* -----------------------------21.03.00 15:39--------------------------------
250
251 ---------------------------------------------------------------------------*/
252 uno::Sequence< uno::Type > SAL_CALL
getTypes()253 SwXFootnote::getTypes() throw (uno::RuntimeException)
254 {
255 const uno::Sequence< uno::Type > aTypes = SwXFootnote_Base::getTypes();
256 const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
257 return ::comphelper::concatSequences(aTypes, aTextTypes);
258 }
259
260 /* -----------------------------21.03.00 15:39--------------------------------
261
262 ---------------------------------------------------------------------------*/
263 uno::Sequence< sal_Int8 > SAL_CALL
getImplementationId()264 SwXFootnote::getImplementationId() throw (uno::RuntimeException)
265 {
266 vos::OGuard aGuard(Application::GetSolarMutex());
267 static uno::Sequence< sal_Int8 > aId( 16 );
268 static sal_Bool bInit = sal_False;
269 if(!bInit)
270 {
271 rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
272 bInit = sal_True;
273 }
274 return aId;
275 }
276 /* -----------------------------21.03.00 15:46--------------------------------
277
278 ---------------------------------------------------------------------------*/
279 uno::Any SAL_CALL
queryInterface(const uno::Type & rType)280 SwXFootnote::queryInterface(const uno::Type& rType)
281 throw (uno::RuntimeException)
282 {
283 const uno::Any ret = SwXFootnote_Base::queryInterface(rType);
284 return (ret.getValueType() == ::getCppuVoidType())
285 ? SwXText::queryInterface(rType)
286 : ret;
287 }
288
289 /*-- 10.12.98 15:31:47---------------------------------------------------
290
291 -----------------------------------------------------------------------*/
getLabel()292 OUString SAL_CALL SwXFootnote::getLabel() throw (uno::RuntimeException)
293 {
294 vos::OGuard aGuard(Application::GetSolarMutex());
295
296 ::rtl::OUString sRet;
297 SwFmtFtn const*const pFmt = m_pImpl->GetFootnoteFormat();
298 if(pFmt)
299 {
300 sRet = pFmt->GetNumStr();
301 }
302 else if (m_pImpl->m_bIsDescriptor)
303 {
304 sRet = m_pImpl->m_sLabel;
305 }
306 else
307 {
308 throw uno::RuntimeException();
309 }
310 return sRet;
311 }
312
313 /*-- 10.12.98 15:31:48---------------------------------------------------
314
315 -----------------------------------------------------------------------*/
316 void SAL_CALL
setLabel(const OUString & aLabel)317 SwXFootnote::setLabel(const OUString& aLabel) throw (uno::RuntimeException)
318 {
319 vos::OGuard aGuard(Application::GetSolarMutex());
320
321 SwFmtFtn const*const pFmt = m_pImpl->GetFootnoteFormat();
322 if(pFmt)
323 {
324 const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn();
325 DBG_ASSERT(pTxtFtn, "kein TextNode?");
326 SwTxtNode& rTxtNode = (SwTxtNode&)pTxtFtn->GetTxtNode();
327
328 SwPaM aPam(rTxtNode, *pTxtFtn->GetStart());
329 GetDoc()->SetCurFtn(aPam, aLabel, pFmt->GetNumber(), pFmt->IsEndNote());
330 }
331 else if (m_pImpl->m_bIsDescriptor)
332 {
333 m_pImpl->m_sLabel = String(aLabel);
334 }
335 else
336 {
337 throw uno::RuntimeException();
338 }
339 }
340
341 /* -----------------18.02.99 13:32-------------------
342 *
343 * --------------------------------------------------*/
344 void SAL_CALL
attach(const uno::Reference<text::XTextRange> & xTextRange)345 SwXFootnote::attach(const uno::Reference< text::XTextRange > & xTextRange)
346 throw (lang::IllegalArgumentException, uno::RuntimeException)
347 {
348 vos::OGuard aGuard(Application::GetSolarMutex());
349
350 if (!m_pImpl->m_bIsDescriptor)
351 {
352 throw uno::RuntimeException();
353 }
354 const uno::Reference<lang::XUnoTunnel> xRangeTunnel(
355 xTextRange, uno::UNO_QUERY);
356 SwXTextRange *const pRange =
357 ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
358 OTextCursorHelper *const pCursor =
359 ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
360 SwDoc *const pNewDoc =
361 (pRange) ? pRange->GetDoc() : ((pCursor) ? pCursor->GetDoc() : 0);
362 if (!pNewDoc)
363 {
364 throw lang::IllegalArgumentException();
365 }
366
367 SwUnoInternalPaM aPam(*pNewDoc);
368 //das muss jetzt sal_True liefern
369 ::sw::XTextRangeToSwPaM(aPam, xTextRange);
370
371 UnoActionContext aCont(pNewDoc);
372 pNewDoc->DeleteAndJoin(aPam);
373 aPam.DeleteMark();
374 SwFmtFtn aFootNote(m_pImpl->m_bIsEndnote);
375 if (m_pImpl->m_sLabel.getLength())
376 {
377 aFootNote.SetNumStr(m_pImpl->m_sLabel);
378 }
379
380 SwXTextCursor const*const pTextCursor(
381 dynamic_cast<SwXTextCursor*>(pCursor));
382 const bool bForceExpandHints( (pTextCursor)
383 ? pTextCursor->IsAtEndOfMeta() : false );
384 const SetAttrMode nInsertFlags = (bForceExpandHints)
385 ? nsSetAttrMode::SETATTR_FORCEHINTEXPAND
386 : nsSetAttrMode::SETATTR_DEFAULT;
387
388 pNewDoc->InsertPoolItem(aPam, aFootNote, nInsertFlags);
389
390 SwTxtFtn *const pTxtAttr = static_cast<SwTxtFtn*>(
391 aPam.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
392 aPam.GetPoint()->nContent.GetIndex()-1, RES_TXTATR_FTN ));
393
394 if (pTxtAttr)
395 {
396 const SwFmtFtn& rFtn = pTxtAttr->GetFtn();
397 m_pImpl->m_pFmtFtn = &rFtn;
398 pNewDoc->GetUnoCallBack()->Add(m_pImpl.get());
399 // force creation of sequence id - is used for references
400 if (pNewDoc->IsInReading())
401 {
402 pTxtAttr->SetSeqNo(pNewDoc->GetFtnIdxs().Count());
403 }
404 else
405 {
406 pTxtAttr->SetSeqRefNo();
407 }
408 }
409 m_pImpl->m_bIsDescriptor = sal_False;
410 SetDoc(pNewDoc);
411 }
412
413 /*-- 10.12.98 15:31:48---------------------------------------------------
414
415 -----------------------------------------------------------------------*/
416 uno::Reference< text::XTextRange > SAL_CALL
getAnchor()417 SwXFootnote::getAnchor() throw (uno::RuntimeException)
418 {
419 vos::OGuard aGuard(Application::GetSolarMutex());
420
421 SwFmtFtn const& rFmt( m_pImpl->GetFootnoteFormatOrThrow() );
422
423 SwTxtFtn const*const pTxtFtn = rFmt.GetTxtFtn();
424 SwPaM aPam( pTxtFtn->GetTxtNode(), *pTxtFtn->GetStart() );
425 SwPosition aMark( *aPam.Start() );
426 aPam.SetMark();
427 aPam.GetMark()->nContent++;
428 const uno::Reference< text::XTextRange > xRet =
429 SwXTextRange::CreateXTextRange(*GetDoc(), *aPam.Start(), aPam.End());
430 return xRet;
431 }
432 /*-- 10.12.98 15:31:49---------------------------------------------------
433
434 -----------------------------------------------------------------------*/
dispose()435 void SAL_CALL SwXFootnote::dispose() throw (uno::RuntimeException)
436 {
437 vos::OGuard aGuard(Application::GetSolarMutex());
438
439 SwFmtFtn const& rFmt( m_pImpl->GetFootnoteFormatOrThrow() );
440
441 SwTxtFtn const*const pTxtFtn = rFmt.GetTxtFtn();
442 DBG_ASSERT(pTxtFtn, "no TextNode?");
443 SwTxtNode& rTxtNode = const_cast<SwTxtNode&>(pTxtFtn->GetTxtNode());
444 const xub_StrLen nPos = *pTxtFtn->GetStart();
445 SwPaM aPam(rTxtNode, nPos, rTxtNode, nPos+1);
446 GetDoc()->DeleteAndJoin( aPam );
447 }
448
449 /*-- 10.12.98 15:31:49---------------------------------------------------
450
451 -----------------------------------------------------------------------*/
452 void SAL_CALL
addEventListener(const uno::Reference<lang::XEventListener> & xListener)453 SwXFootnote::addEventListener(
454 const uno::Reference< lang::XEventListener > & xListener)
455 throw (uno::RuntimeException)
456 {
457 vos::OGuard g(Application::GetSolarMutex());
458
459 if (!m_pImpl->GetFootnoteFormat())
460 {
461 throw uno::RuntimeException();
462 }
463 m_pImpl->m_ListenerContainer.AddListener(xListener);
464 }
465 /*-- 10.12.98 15:31:50---------------------------------------------------
466
467 -----------------------------------------------------------------------*/
468 void SAL_CALL
removeEventListener(const uno::Reference<lang::XEventListener> & xListener)469 SwXFootnote::removeEventListener(
470 const uno::Reference< lang::XEventListener > & xListener)
471 throw (uno::RuntimeException)
472 {
473 vos::OGuard g(Application::GetSolarMutex());
474
475 if (!m_pImpl->GetFootnoteFormat() ||
476 !m_pImpl->m_ListenerContainer.RemoveListener(xListener))
477 {
478 throw uno::RuntimeException();
479 }
480 }
481
482 /* -----------------06.05.99 15:31-------------------
483 *
484 * --------------------------------------------------*/
GetStartNode() const485 const SwStartNode *SwXFootnote::GetStartNode() const
486 {
487 SwFmtFtn const*const pFmt = m_pImpl->GetFootnoteFormat();
488 if(pFmt)
489 {
490 const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn();
491 if( pTxtFtn )
492 {
493 return pTxtFtn->GetStartNode()->GetNode().GetStartNode();
494 }
495 }
496 return 0;
497 }
498
499 uno::Reference< text::XTextCursor >
CreateCursor()500 SwXFootnote::CreateCursor() throw (uno::RuntimeException)
501 {
502 return createTextCursor();
503 }
504
505 /*-- 10.12.98 15:31:50---------------------------------------------------
506
507 -----------------------------------------------------------------------*/
508 uno::Reference< text::XTextCursor > SAL_CALL
createTextCursor()509 SwXFootnote::createTextCursor() throw (uno::RuntimeException)
510 {
511 vos::OGuard aGuard(Application::GetSolarMutex());
512
513 SwFmtFtn const& rFmt( m_pImpl->GetFootnoteFormatOrThrow() );
514
515 SwTxtFtn const*const pTxtFtn = rFmt.GetTxtFtn();
516 SwPosition aPos( *pTxtFtn->GetStartNode() );
517 SwXTextCursor *const pXCursor =
518 new SwXTextCursor(*GetDoc(), this, CURSOR_FOOTNOTE, aPos);
519 SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
520 pUnoCrsr->Move(fnMoveForward, fnGoNode);
521 const uno::Reference< text::XTextCursor > xRet =
522 static_cast<text::XWordCursor*>(pXCursor);
523 return xRet;
524 }
525
526 /*-- 10.12.98 15:31:51---------------------------------------------------
527
528 -----------------------------------------------------------------------*/
529 uno::Reference< text::XTextCursor > SAL_CALL
createTextCursorByRange(const uno::Reference<text::XTextRange> & xTextPosition)530 SwXFootnote::createTextCursorByRange(
531 const uno::Reference< text::XTextRange > & xTextPosition)
532 throw (uno::RuntimeException)
533 {
534 vos::OGuard aGuard(Application::GetSolarMutex());
535
536 SwFmtFtn const& rFmt( m_pImpl->GetFootnoteFormatOrThrow() );
537
538 SwUnoInternalPaM aPam(*GetDoc());
539 if (!::sw::XTextRangeToSwPaM(aPam, xTextPosition))
540 {
541 throw uno::RuntimeException();
542 }
543
544 SwTxtFtn const*const pTxtFtn = rFmt.GetTxtFtn();
545 SwNode const*const pFtnStartNode = &pTxtFtn->GetStartNode()->GetNode();
546
547 const SwNode* pStart = aPam.GetNode()->FindFootnoteStartNode();
548 if (pStart != pFtnStartNode)
549 {
550 throw uno::RuntimeException();
551 }
552
553 const uno::Reference< text::XTextCursor > xRet =
554 static_cast<text::XWordCursor*>(
555 new SwXTextCursor(*GetDoc(), this, CURSOR_FOOTNOTE,
556 *aPam.GetPoint(), aPam.GetMark()));
557 return xRet;
558 }
559
560 /*-- 13.06.00 14:28:23---------------------------------------------------
561
562 -----------------------------------------------------------------------*/
563 uno::Reference< container::XEnumeration > SAL_CALL
createEnumeration()564 SwXFootnote::createEnumeration() throw (uno::RuntimeException)
565 {
566 vos::OGuard aGuard(Application::GetSolarMutex());
567
568 SwFmtFtn const& rFmt( m_pImpl->GetFootnoteFormatOrThrow() );
569
570 SwTxtFtn const*const pTxtFtn = rFmt.GetTxtFtn();
571 SwPosition aPos( *pTxtFtn->GetStartNode() );
572 ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
573 GetDoc()->CreateUnoCrsr(aPos, sal_False));
574 pUnoCursor->Move(fnMoveForward, fnGoNode);
575 const uno::Reference< container::XEnumeration > xRet =
576 new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_FOOTNOTE);
577 return xRet;
578 }
579
580 /*-- 13.06.00 14:28:24---------------------------------------------------
581
582 -----------------------------------------------------------------------*/
getElementType()583 uno::Type SAL_CALL SwXFootnote::getElementType() throw (uno::RuntimeException)
584 {
585 return text::XTextRange::static_type();
586 }
587 /*-- 13.06.00 14:28:24---------------------------------------------------
588
589 -----------------------------------------------------------------------*/
hasElements()590 sal_Bool SAL_CALL SwXFootnote::hasElements() throw (uno::RuntimeException)
591 {
592 return sal_True;
593 }
594
595 /*-- 11.09.00 13:12:03---------------------------------------------------
596
597 -----------------------------------------------------------------------*/
598 uno::Reference< beans::XPropertySetInfo > SAL_CALL
getPropertySetInfo()599 SwXFootnote::getPropertySetInfo()
600 throw (uno::RuntimeException)
601 {
602 vos::OGuard g(Application::GetSolarMutex());
603 static uno::Reference< beans::XPropertySetInfo > xRet =
604 aSwMapProvider.GetPropertySet(PROPERTY_MAP_FOOTNOTE)
605 ->getPropertySetInfo();
606 return xRet;
607 }
608
609 /*-- 11.09.00 13:12:04---------------------------------------------------
610
611 -----------------------------------------------------------------------*/
612 void SAL_CALL
setPropertyValue(const::rtl::OUString &,const uno::Any &)613 SwXFootnote::setPropertyValue(const ::rtl::OUString&, const uno::Any&)
614 throw (beans::UnknownPropertyException, beans::PropertyVetoException,
615 lang::IllegalArgumentException, lang::WrappedTargetException,
616 uno::RuntimeException)
617 {
618 //no values to be set
619 throw lang::IllegalArgumentException();
620 }
621 /*-- 11.09.00 13:12:04---------------------------------------------------
622
623 -----------------------------------------------------------------------*/
624 uno::Any SAL_CALL
getPropertyValue(const OUString & rPropertyName)625 SwXFootnote::getPropertyValue(const OUString& rPropertyName)
626 throw (beans::UnknownPropertyException, lang::WrappedTargetException,
627 uno::RuntimeException)
628 {
629 vos::OGuard aGuard(Application::GetSolarMutex());
630
631 uno::Any aRet;
632 if (! ::sw::GetDefaultTextContentValue(aRet, rPropertyName))
633 {
634 if (rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_START_REDLINE)) ||
635 rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_END_REDLINE)))
636 {
637 //redline can only be returned if it's a living object
638 if (!m_pImpl->m_bIsDescriptor)
639 {
640 aRet = SwXText::getPropertyValue(rPropertyName);
641 }
642 }
643 else if (rPropertyName.equalsAsciiL(
644 SW_PROP_NAME(UNO_NAME_REFERENCE_ID)))
645 {
646 SwFmtFtn const*const pFmt = m_pImpl->GetFootnoteFormat();
647 if (pFmt)
648 {
649 SwTxtFtn const*const pTxtFtn = pFmt->GetTxtFtn();
650 DBG_ASSERT(pTxtFtn, "no TextNode?");
651 aRet <<= static_cast<sal_Int16>(pTxtFtn->GetSeqRefNo());
652 }
653 }
654 else
655 {
656 beans::UnknownPropertyException aExcept;
657 aExcept.Message = rPropertyName;
658 throw aExcept;
659 }
660 }
661 return aRet;
662 }
663
664 /*-- 11.09.00 13:12:04---------------------------------------------------
665
666 -----------------------------------------------------------------------*/
667 void SAL_CALL
addPropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)668 SwXFootnote::addPropertyChangeListener(
669 const ::rtl::OUString& /*rPropertyName*/,
670 const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
671 throw (beans::UnknownPropertyException, lang::WrappedTargetException,
672 uno::RuntimeException)
673 {
674 OSL_ENSURE(false,
675 "SwXFootnote::addPropertyChangeListener(): not implemented");
676 }
677
678 void SAL_CALL
removePropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)679 SwXFootnote::removePropertyChangeListener(
680 const ::rtl::OUString& /*rPropertyName*/,
681 const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
682 throw (beans::UnknownPropertyException, lang::WrappedTargetException,
683 uno::RuntimeException)
684 {
685 OSL_ENSURE(false,
686 "SwXFootnote::removePropertyChangeListener(): not implemented");
687 }
688
689 void SAL_CALL
addVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)690 SwXFootnote::addVetoableChangeListener(
691 const ::rtl::OUString& /*rPropertyName*/,
692 const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
693 throw (beans::UnknownPropertyException, lang::WrappedTargetException,
694 uno::RuntimeException)
695 {
696 OSL_ENSURE(false,
697 "SwXFootnote::addVetoableChangeListener(): not implemented");
698 }
699
700 void SAL_CALL
removeVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)701 SwXFootnote::removeVetoableChangeListener(
702 const ::rtl::OUString& /*rPropertyName*/,
703 const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
704 throw (beans::UnknownPropertyException, lang::WrappedTargetException,
705 uno::RuntimeException)
706 {
707 OSL_ENSURE(false,
708 "SwXFootnote::removeVetoableChangeListener(): not implemented");
709 }
710
711