Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <unoidx.hxx>
21 : #include <unoidxcoll.hxx>
22 :
23 : #include <com/sun/star/beans/PropertyAttribute.hpp>
24 : #include <com/sun/star/container/XIndexReplace.hpp>
25 : #include <com/sun/star/frame/XModel.hpp>
26 : #include <com/sun/star/text/ChapterFormat.hpp>
27 : #include <com/sun/star/text/ReferenceFieldPart.hpp>
28 : #include <com/sun/star/text/BibliographyDataField.hpp>
29 : #include <com/sun/star/text/XTextDocument.hpp>
30 :
31 : #include <osl/mutex.hxx>
32 : #include <cppuhelper/interfacecontainer.h>
33 : #include <cppuhelper/supportsservice.hxx>
34 : #include <vcl/svapp.hxx>
35 : #include <editeng/unolingu.hxx>
36 : #include <hints.hxx>
37 : #include <cmdid.h>
38 : #include <swtypes.hxx>
39 : #include <shellres.hxx>
40 : #include <viewsh.hxx>
41 : #include <doc.hxx>
42 : #include <IDocumentLayoutAccess.hxx>
43 : #include <docary.hxx>
44 : #include <poolfmt.hxx>
45 : #include <poolfmt.hrc>
46 : #include <pagedesc.hxx>
47 : #include <fmtcntnt.hxx>
48 : #include <unomap.hxx>
49 : #include <unotextrange.hxx>
50 : #include <unotextcursor.hxx>
51 : #include <unosection.hxx>
52 : #include <doctxm.hxx>
53 : #include <txttxmrk.hxx>
54 : #include <unocrsr.hxx>
55 : #include <unostyle.hxx>
56 : #include <ndtxt.hxx>
57 : #include <docsh.hxx>
58 : #include <chpfld.hxx>
59 : #include <editsh.hxx>
60 : #include <SwStyleNameMapper.hxx>
61 : #include <comphelper/servicehelper.hxx>
62 : #include <comphelper/string.hxx>
63 : #include <cppuhelper/implbase.hxx>
64 :
65 : using namespace ::com::sun::star;
66 :
67 : static OUString
68 8565 : lcl_AnyToString(uno::Any const& rVal) throw (lang::IllegalArgumentException)
69 : {
70 8565 : OUString sRet;
71 8565 : if(!(rVal >>= sRet))
72 : {
73 0 : throw lang::IllegalArgumentException();
74 : }
75 8565 : return sRet;
76 : }
77 :
78 : static sal_Int16
79 70 : lcl_AnyToInt16(uno::Any const& rVal) throw (lang::IllegalArgumentException)
80 : {
81 70 : sal_Int16 nRet = 0;
82 70 : if(!(rVal >>= nRet))
83 : {
84 0 : throw lang::IllegalArgumentException();
85 : }
86 70 : return nRet;
87 : }
88 :
89 : static bool
90 1700 : lcl_AnyToBool(uno::Any const& rVal) throw (lang::IllegalArgumentException)
91 : {
92 1700 : bool bRet = false;
93 1700 : if(!(rVal >>= bRet))
94 : {
95 0 : throw lang::IllegalArgumentException();
96 : }
97 1700 : return bRet;
98 : }
99 :
100 : static void
101 398 : lcl_AnyToBitMask(uno::Any const& rValue,
102 : sal_uInt16 & rBitMask, const sal_uInt16 nBit)
103 : throw (lang::IllegalArgumentException)
104 : {
105 398 : rBitMask = lcl_AnyToBool(rValue)
106 : ? (rBitMask | nBit)
107 398 : : (rBitMask & ~nBit);
108 398 : }
109 :
110 : static void
111 47 : lcl_BitMaskToAny(uno::Any & o_rValue,
112 : const sal_uInt16 nBitMask, const sal_uInt16 nBit)
113 : {
114 47 : const bool bRet = 0 != (nBitMask & nBit);
115 47 : o_rValue <<= bRet;
116 47 : }
117 :
118 : static void
119 0 : lcl_ReAssignTOXType(SwDoc* pDoc, SwTOXBase& rTOXBase, const OUString& rNewName)
120 : {
121 0 : const sal_uInt16 nUserCount = pDoc->GetTOXTypeCount( TOX_USER );
122 0 : const SwTOXType* pNewType = 0;
123 0 : for(sal_uInt16 nUser = 0; nUser < nUserCount; nUser++)
124 : {
125 0 : const SwTOXType* pType = pDoc->GetTOXType( TOX_USER, nUser );
126 0 : if (pType->GetTypeName()==rNewName)
127 : {
128 0 : pNewType = pType;
129 0 : break;
130 : }
131 : }
132 0 : if(!pNewType)
133 : {
134 0 : SwTOXType aNewType(TOX_USER, rNewName);
135 0 : pNewType = pDoc->InsertTOXType( aNewType );
136 : }
137 :
138 0 : rTOXBase.RegisterToTOXType( *const_cast<SwTOXType*>(pNewType) );
139 0 : }
140 :
141 : static const char cUserDefined[] = "User-Defined";
142 : static const char cUserSuffix[] = " (user)";
143 : #define USER_LEN 12
144 : #define USER_AND_SUFFIXLEN 19
145 :
146 1 : static void lcl_ConvertTOUNameToProgrammaticName(OUString& rTmp)
147 : {
148 1 : ShellResource* pShellRes = SwViewShell::GetShellRes();
149 :
150 1 : if(rTmp==pShellRes->aTOXUserName)
151 : {
152 1 : rTmp = cUserDefined;
153 : }
154 : // if the version is not English but the alternative index's name is
155 : // "User-Defined" a " (user)" is appended
156 0 : else if(rTmp == cUserDefined)
157 : {
158 0 : rTmp += cUserSuffix;
159 : }
160 1 : }
161 :
162 : static void
163 2 : lcl_ConvertTOUNameToUserName(OUString& rTmp)
164 : {
165 2 : ShellResource* pShellRes = SwViewShell::GetShellRes();
166 2 : if (rTmp == cUserDefined)
167 : {
168 2 : rTmp = pShellRes->aTOXUserName;
169 : }
170 0 : else if (pShellRes->aTOXUserName != cUserDefined &&
171 0 : USER_AND_SUFFIXLEN == rTmp.getLength())
172 : {
173 : //make sure that in non-English versions the " (user)" suffix is removed
174 0 : if (rTmp.matchAsciiL(cUserDefined, sizeof(cUserDefined)) &&
175 0 : rTmp.matchAsciiL(cUserSuffix, sizeof(cUserSuffix), USER_LEN))
176 : {
177 0 : rTmp = cUserDefined;
178 : }
179 : }
180 2 : }
181 :
182 : typedef ::cppu::WeakImplHelper
183 : < lang::XServiceInfo
184 : , container::XIndexReplace
185 : > SwXDocumentIndexStyleAccess_Base;
186 :
187 : class SwXDocumentIndex::StyleAccess_Impl
188 : : public SwXDocumentIndexStyleAccess_Base
189 : {
190 :
191 : private:
192 : /// can be destroyed threadsafely, so no UnoImplPtr here
193 : ::rtl::Reference<SwXDocumentIndex> m_xParent;
194 :
195 : virtual ~StyleAccess_Impl();
196 :
197 : public:
198 : explicit StyleAccess_Impl(SwXDocumentIndex& rParentIdx);
199 :
200 : // XServiceInfo
201 : virtual OUString SAL_CALL getImplementationName()
202 : throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
203 : virtual sal_Bool SAL_CALL
204 : supportsService(const OUString& rServiceName)
205 : throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
206 : virtual uno::Sequence< OUString > SAL_CALL
207 : getSupportedServiceNames() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
208 :
209 : // XElementAccess
210 : virtual uno::Type SAL_CALL getElementType() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
211 : virtual sal_Bool SAL_CALL hasElements() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
212 :
213 : // XIndexAccess
214 : virtual sal_Int32 SAL_CALL getCount() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
215 : virtual uno::Any SAL_CALL getByIndex(sal_Int32 nIndex)
216 : throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException,
217 : uno::RuntimeException, std::exception) SAL_OVERRIDE;
218 :
219 : // XIndexReplace
220 : virtual void SAL_CALL
221 : replaceByIndex(sal_Int32 Index, const uno::Any& rElement)
222 : throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException,
223 : lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
224 :
225 : };
226 :
227 : typedef ::cppu::WeakImplHelper
228 : < lang::XServiceInfo
229 : , container::XIndexReplace
230 : > SwXDocumentIndexTokenAccess_Base;
231 :
232 : class SwXDocumentIndex::TokenAccess_Impl
233 : : public SwXDocumentIndexTokenAccess_Base
234 : {
235 :
236 : private:
237 : /// can be destroyed threadsafely, so no UnoImplPtr here
238 : ::rtl::Reference<SwXDocumentIndex> m_xParent;
239 :
240 : virtual ~TokenAccess_Impl();
241 :
242 : public:
243 :
244 : explicit TokenAccess_Impl(SwXDocumentIndex& rParentIdx);
245 :
246 : // XServiceInfo
247 : virtual OUString SAL_CALL getImplementationName()
248 : throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
249 : virtual sal_Bool SAL_CALL
250 : supportsService(const OUString& rServiceName)
251 : throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
252 : virtual uno::Sequence< OUString > SAL_CALL
253 : getSupportedServiceNames() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
254 :
255 : // XElementAccess
256 : virtual uno::Type SAL_CALL getElementType() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
257 : virtual sal_Bool SAL_CALL hasElements() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
258 :
259 : // XIndexAccess
260 : virtual sal_Int32 SAL_CALL getCount() throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
261 : virtual uno::Any SAL_CALL getByIndex(sal_Int32 nIndex)
262 : throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException,
263 : uno::RuntimeException, std::exception) SAL_OVERRIDE;
264 :
265 : // XIndexReplace
266 : virtual void SAL_CALL
267 : replaceByIndex(sal_Int32 Index, const uno::Any& rElement)
268 : throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException,
269 : lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
270 :
271 : };
272 :
273 119 : class SwDocIndexDescriptorProperties_Impl
274 : {
275 : private:
276 : ::std::unique_ptr<SwTOXBase> m_pTOXBase;
277 : OUString m_sUserTOXTypeName;
278 :
279 : public:
280 : explicit SwDocIndexDescriptorProperties_Impl(SwTOXType const*const pType);
281 :
282 1804 : SwTOXBase & GetTOXBase() { return *m_pTOXBase; }
283 2 : const OUString& GetTypeName() const { return m_sUserTOXTypeName; }
284 0 : void SetTypeName(const OUString& rSet) { m_sUserTOXTypeName = rSet; }
285 : };
286 :
287 119 : SwDocIndexDescriptorProperties_Impl::SwDocIndexDescriptorProperties_Impl(
288 119 : SwTOXType const*const pType)
289 : {
290 119 : SwForm aForm(pType->GetType());
291 : m_pTOXBase.reset(new SwTOXBase(pType, aForm,
292 119 : nsSwTOXElement::TOX_MARK, pType->GetTypeName()));
293 119 : if(pType->GetType() == TOX_CONTENT || pType->GetType() == TOX_USER)
294 : {
295 65 : m_pTOXBase->SetLevel(MAXLEVEL);
296 : }
297 119 : m_sUserTOXTypeName = pType->GetTypeName();
298 119 : }
299 :
300 : static sal_uInt16
301 142 : lcl_TypeToPropertyMap_Index(const TOXTypes eType)
302 : {
303 142 : switch (eType)
304 : {
305 25 : case TOX_INDEX: return PROPERTY_MAP_INDEX_IDX;
306 74 : case TOX_CONTENT: return PROPERTY_MAP_INDEX_CNTNT;
307 4 : case TOX_TABLES: return PROPERTY_MAP_INDEX_TABLES;
308 11 : case TOX_ILLUSTRATIONS: return PROPERTY_MAP_INDEX_ILLUSTRATIONS;
309 4 : case TOX_OBJECTS: return PROPERTY_MAP_INDEX_OBJECTS;
310 20 : case TOX_AUTHORITIES: return PROPERTY_MAP_BIBLIOGRAPHY;
311 : //case TOX_USER:
312 : default:
313 4 : return PROPERTY_MAP_INDEX_USER;
314 : }
315 : }
316 :
317 284 : class SwXDocumentIndex::Impl
318 : : public SwClient
319 : {
320 : private:
321 : ::osl::Mutex m_Mutex; // just for OInterfaceContainerHelper
322 :
323 : public:
324 : uno::WeakReference<uno::XInterface> m_wThis;
325 : ::cppu::OMultiTypeInterfaceContainerHelper m_Listeners;
326 : SfxItemPropertySet const& m_rPropSet;
327 : const TOXTypes m_eTOXType;
328 : bool m_bIsDescriptor;
329 : SwDoc * m_pDoc;
330 : ::std::unique_ptr<SwDocIndexDescriptorProperties_Impl> m_pProps;
331 : uno::WeakReference<container::XIndexReplace> m_wStyleAccess;
332 : uno::WeakReference<container::XIndexReplace> m_wTokenAccess;
333 :
334 142 : Impl( SwDoc & rDoc,
335 : const TOXTypes eType,
336 : SwTOXBaseSection *const pBaseSection)
337 23 : : SwClient((pBaseSection) ? pBaseSection->GetFormat() : 0)
338 : , m_Listeners(m_Mutex)
339 : , m_rPropSet(
340 142 : *aSwMapProvider.GetPropertySet(lcl_TypeToPropertyMap_Index(eType)))
341 : , m_eTOXType(eType)
342 142 : , m_bIsDescriptor(0 == pBaseSection)
343 : , m_pDoc(&rDoc)
344 : , m_pProps((m_bIsDescriptor)
345 119 : ? new SwDocIndexDescriptorProperties_Impl(rDoc.GetTOXType(eType, 0))
346 568 : : 0)
347 : {
348 142 : }
349 :
350 3714 : SwSectionFormat * GetSectionFormat() const {
351 : return static_cast<SwSectionFormat *>(
352 3714 : const_cast<SwModify *>(GetRegisteredIn()));
353 : }
354 :
355 2233 : SwTOXBase & GetTOXSectionOrThrow() const
356 : {
357 2233 : SwSectionFormat *const pSectionFormat(GetSectionFormat());
358 : SwTOXBase *const pTOXSection( (m_bIsDescriptor)
359 1513 : ? &m_pProps->GetTOXBase()
360 : : ((pSectionFormat)
361 720 : ? static_cast<SwTOXBaseSection*>(pSectionFormat->GetSection())
362 4466 : : 0));
363 2233 : if (!pTOXSection)
364 : {
365 : throw uno::RuntimeException(
366 0 : "SwXDocumentIndex: disposed or invalid", 0);
367 : }
368 2233 : return *pTOXSection;
369 : }
370 :
371 72 : sal_Int32 GetFormMax() const
372 : {
373 72 : SwTOXBase & rSection( GetTOXSectionOrThrow() );
374 : return (m_bIsDescriptor)
375 49 : ? SwForm::GetFormMaxLevel(m_eTOXType)
376 121 : : rSection.GetTOXForm().GetFormMax();
377 : }
378 : protected:
379 : // SwClient
380 : virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
381 :
382 : };
383 :
384 219 : void SwXDocumentIndex::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew)
385 : {
386 219 : ClientModify(this, pOld, pNew);
387 219 : if (GetRegisteredIn())
388 : {
389 402 : return; // core object still alive
390 : }
391 :
392 18 : uno::Reference<uno::XInterface> const xThis(m_wThis);
393 18 : if (!xThis.is())
394 : { // fdo#72695: if UNO object is already dead, don't revive it with event
395 0 : return;
396 : }
397 36 : lang::EventObject const ev(xThis);
398 36 : m_Listeners.disposeAndClear(ev);
399 : }
400 :
401 23 : SwXDocumentIndex::SwXDocumentIndex(
402 : SwTOXBaseSection & rBaseSection, SwDoc & rDoc)
403 : : m_pImpl( new SwXDocumentIndex::Impl(
404 23 : rDoc, rBaseSection.SwTOXBase::GetType(), & rBaseSection) )
405 : {
406 23 : }
407 :
408 119 : SwXDocumentIndex::SwXDocumentIndex(const TOXTypes eType, SwDoc& rDoc)
409 119 : : m_pImpl( new SwXDocumentIndex::Impl(rDoc, eType, 0) )
410 : {
411 119 : }
412 :
413 284 : SwXDocumentIndex::~SwXDocumentIndex()
414 : {
415 284 : }
416 :
417 : uno::Reference<text::XDocumentIndex>
418 174 : SwXDocumentIndex::CreateXDocumentIndex(
419 : SwDoc & rDoc, SwTOXBaseSection * pSection, TOXTypes const eTypes)
420 : {
421 : // re-use existing SwXDocumentIndex
422 : // #i105557#: do not iterate over the registered clients: race condition
423 174 : uno::Reference<text::XDocumentIndex> xIndex;
424 174 : if (pSection)
425 : {
426 55 : SwSectionFormat const *const pFormat = pSection->GetFormat();
427 55 : xIndex.set(pFormat->GetXObject(), uno::UNO_QUERY);
428 : }
429 174 : if (!xIndex.is())
430 : {
431 : SwXDocumentIndex *const pIndex((pSection)
432 23 : ? new SwXDocumentIndex(*pSection, rDoc)
433 165 : : new SwXDocumentIndex(eTypes, rDoc));
434 142 : xIndex.set(pIndex);
435 142 : if (pSection)
436 : {
437 23 : pSection->GetFormat()->SetXObject(xIndex);
438 : }
439 : // need a permanent Reference to initialize m_wThis
440 142 : pIndex->m_pImpl->m_wThis = xIndex;
441 : }
442 174 : return xIndex;
443 : }
444 :
445 : namespace
446 : {
447 : class theSwXDocumentIndexUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSwXDocumentIndexUnoTunnelId > {};
448 : }
449 :
450 709 : const uno::Sequence< sal_Int8 > & SwXDocumentIndex::getUnoTunnelId()
451 : {
452 709 : return theSwXDocumentIndexUnoTunnelId::get().getSeq();
453 : }
454 :
455 : sal_Int64 SAL_CALL
456 709 : SwXDocumentIndex::getSomething(const uno::Sequence< sal_Int8 >& rId)
457 : throw (uno::RuntimeException, std::exception)
458 : {
459 709 : return ::sw::UnoTunnelImpl<SwXDocumentIndex>(rId, this);
460 : }
461 :
462 : OUString SAL_CALL
463 0 : SwXDocumentIndex::getImplementationName() throw (uno::RuntimeException, std::exception)
464 : {
465 0 : return OUString("SwXDocumentIndex");
466 : }
467 :
468 : sal_Bool SAL_CALL
469 2 : SwXDocumentIndex::supportsService(const OUString& rServiceName)
470 : throw (uno::RuntimeException, std::exception)
471 : {
472 2 : return cppu::supportsService(this, rServiceName);
473 : }
474 :
475 : uno::Sequence< OUString > SAL_CALL
476 2 : SwXDocumentIndex::getSupportedServiceNames() throw (uno::RuntimeException, std::exception)
477 : {
478 2 : SolarMutexGuard g;
479 :
480 2 : uno::Sequence< OUString > aRet(2);
481 2 : OUString* pArray = aRet.getArray();
482 2 : pArray[0] = "com.sun.star.text.BaseIndex";
483 2 : switch (m_pImpl->m_eTOXType)
484 : {
485 : case TOX_INDEX:
486 2 : pArray[1] = "com.sun.star.text.DocumentIndex";
487 2 : break;
488 : case TOX_CONTENT:
489 0 : pArray[1] = "com.sun.star.text.ContentIndex";
490 0 : break;
491 : case TOX_TABLES:
492 0 : pArray[1] = "com.sun.star.text.TableIndex";
493 0 : break;
494 : case TOX_ILLUSTRATIONS:
495 0 : pArray[1] = "com.sun.star.text.IllustrationsIndex";
496 0 : break;
497 : case TOX_OBJECTS:
498 0 : pArray[1] = "com.sun.star.text.ObjectIndex";
499 0 : break;
500 : case TOX_AUTHORITIES:
501 0 : pArray[1] = "com.sun.star.text.Bibliography";
502 0 : break;
503 : //case TOX_USER:
504 : default:
505 0 : pArray[1] = "com.sun.star.text.UserDefinedIndex";
506 : }
507 2 : return aRet;
508 : }
509 :
510 19 : OUString SAL_CALL SwXDocumentIndex::getServiceName()
511 : throw (uno::RuntimeException, std::exception)
512 : {
513 19 : SolarMutexGuard g;
514 :
515 19 : sal_uInt16 nObjectType = SW_SERVICE_TYPE_INDEX;
516 19 : switch (m_pImpl->m_eTOXType)
517 : {
518 2 : case TOX_USER: nObjectType = SW_SERVICE_USER_INDEX;
519 2 : break;
520 6 : case TOX_CONTENT: nObjectType = SW_SERVICE_CONTENT_INDEX;
521 6 : break;
522 2 : case TOX_ILLUSTRATIONS: nObjectType = SW_SERVICE_INDEX_ILLUSTRATIONS;
523 2 : break;
524 2 : case TOX_OBJECTS: nObjectType = SW_SERVICE_INDEX_OBJECTS;
525 2 : break;
526 2 : case TOX_TABLES: nObjectType = SW_SERVICE_INDEX_TABLES;
527 2 : break;
528 2 : case TOX_AUTHORITIES: nObjectType = SW_SERVICE_INDEX_BIBLIOGRAPHY;
529 2 : break;
530 : default:
531 3 : break;
532 : }
533 19 : return SwXServiceProvider::GetProviderName(nObjectType);
534 : }
535 :
536 2 : void SAL_CALL SwXDocumentIndex::update() throw (uno::RuntimeException, std::exception)
537 : {
538 2 : return refresh(); // update is from deprecated XDocumentIndex
539 : }
540 :
541 : uno::Reference< beans::XPropertySetInfo > SAL_CALL
542 85 : SwXDocumentIndex::getPropertySetInfo() throw (uno::RuntimeException, std::exception)
543 : {
544 85 : SolarMutexGuard g;
545 :
546 : const uno::Reference< beans::XPropertySetInfo > xRef =
547 85 : m_pImpl->m_rPropSet.getPropertySetInfo();
548 85 : return xRef;
549 : }
550 :
551 : void SAL_CALL
552 862 : SwXDocumentIndex::setPropertyValue(
553 : const OUString& rPropertyName, const uno::Any& rValue)
554 : throw (beans::UnknownPropertyException, beans::PropertyVetoException,
555 : lang::IllegalArgumentException, lang::WrappedTargetException,
556 : uno::RuntimeException, std::exception)
557 : {
558 862 : SolarMutexGuard aGuard;
559 :
560 : SfxItemPropertySimpleEntry const*const pEntry =
561 862 : m_pImpl->m_rPropSet.getPropertyMap().getByName(rPropertyName);
562 862 : if (!pEntry)
563 : {
564 : throw beans::UnknownPropertyException(
565 0 : "Unknown property: " + rPropertyName,
566 0 : static_cast<cppu::OWeakObject *>(this));
567 : }
568 862 : if (pEntry->nFlags & beans::PropertyAttribute::READONLY)
569 : {
570 : throw beans::PropertyVetoException(
571 4 : "Property is read-only: " + rPropertyName,
572 6 : static_cast<cppu::OWeakObject *>(this));
573 : }
574 :
575 860 : SwSectionFormat *const pSectionFormat(m_pImpl->GetSectionFormat());
576 860 : SwTOXBase & rTOXBase( m_pImpl->GetTOXSectionOrThrow() );
577 :
578 860 : sal_uInt16 nCreate = rTOXBase.GetCreateType();
579 860 : sal_uInt16 nOLEOptions = rTOXBase.GetOLEOptions();
580 860 : const TOXTypes eTxBaseType = rTOXBase.GetTOXType()->GetType();
581 : sal_uInt16 nTOIOptions = (eTxBaseType == TOX_INDEX)
582 860 : ? rTOXBase.GetOptions() : 0;
583 1720 : SwForm aForm(rTOXBase.GetTOXForm());
584 860 : bool bForm = false;
585 860 : switch (pEntry->nWID)
586 : {
587 : case WID_IDX_TITLE:
588 : {
589 116 : OUString sNewName;
590 116 : if (!(rValue >>= sNewName))
591 : {
592 0 : throw lang::IllegalArgumentException();
593 : }
594 116 : rTOXBase.SetTitle(sNewName);
595 : }
596 116 : break;
597 : case WID_IDX_NAME:
598 : {
599 23 : OUString sNewName;
600 23 : if (!(rValue >>= sNewName))
601 : {
602 0 : throw lang::IllegalArgumentException();
603 : }
604 23 : rTOXBase.SetTOXName(sNewName);
605 : }
606 23 : break;
607 : case WID_USER_IDX_NAME:
608 : {
609 2 : OUString sNewName;
610 2 : if (!(rValue >>= sNewName))
611 : {
612 0 : throw lang::IllegalArgumentException();
613 : }
614 2 : lcl_ConvertTOUNameToUserName(sNewName);
615 : OSL_ENSURE(TOX_USER == eTxBaseType,
616 : "tox type name can only be changed for user indexes");
617 2 : if (pSectionFormat)
618 : {
619 2 : if (rTOXBase.GetTOXType()->GetTypeName() != sNewName)
620 : {
621 : lcl_ReAssignTOXType(pSectionFormat->GetDoc(),
622 0 : rTOXBase, sNewName);
623 : }
624 : }
625 : else
626 : {
627 0 : m_pImpl->m_pProps->SetTypeName(sNewName);
628 2 : }
629 : }
630 2 : break;
631 : case WID_IDX_LOCALE:
632 : {
633 4 : lang::Locale aLocale;
634 4 : if (!(rValue>>= aLocale))
635 : {
636 0 : throw lang::IllegalArgumentException();
637 : }
638 4 : rTOXBase.SetLanguage( LanguageTag::convertToLanguageType(aLocale));
639 : }
640 4 : break;
641 : case WID_IDX_SORT_ALGORITHM:
642 : {
643 4 : OUString sTmp;
644 4 : if (!(rValue >>= sTmp))
645 : {
646 0 : throw lang::IllegalArgumentException();
647 : }
648 4 : rTOXBase.SetSortAlgorithm(sTmp);
649 : }
650 4 : break;
651 : case WID_LEVEL:
652 : {
653 61 : rTOXBase.SetLevel(lcl_AnyToInt16(rValue));
654 : }
655 61 : break;
656 : case WID_TOC_BOOKMARK:
657 : {
658 3 : rTOXBase.SetBookmarkName(lcl_AnyToString(rValue));
659 3 : nCreate = nsSwTOXElement::TOX_BOOKMARK;
660 3 : rTOXBase.SetCreate(nCreate);
661 : }
662 3 : break;
663 : case WID_INDEX_ENTRY_TYPE:
664 : {
665 3 : rTOXBase.SetEntryTypeName(lcl_AnyToString(rValue));
666 3 : nCreate = nsSwTOXElement::TOX_INDEX_ENTRY_TYPE;
667 3 : rTOXBase.SetCreate(nCreate);
668 : }
669 3 : break;
670 : case WID_CREATE_FROM_MARKS:
671 63 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_MARK);
672 63 : break;
673 : case WID_CREATE_FROM_OUTLINE:
674 62 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_OUTLINELEVEL);
675 62 : break;
676 : case WID_TOC_PARAGRAPH_OUTLINE_LEVEL:
677 53 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_PARAGRAPH_OUTLINE_LEVEL);
678 53 : break;
679 : case WID_TAB_IN_TOC:
680 53 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_TAB_IN_TOC);
681 53 : break;
682 : case WID_TOC_NEWLINE:
683 53 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_NEWLINE);
684 53 : break;
685 : // case WID_PARAGRAPH_STYLE_NAMES :OSL_FAIL("not implemented")
686 : // break;
687 : case WID_HIDE_TABLEADER_PAGENUMBERS:
688 53 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_TABLEADER);
689 53 : break ;
690 : case WID_CREATE_FROM_CHAPTER:
691 21 : rTOXBase.SetFromChapter(lcl_AnyToBool(rValue));
692 21 : break;
693 : case WID_CREATE_FROM_LABELS:
694 5 : rTOXBase.SetFromObjectNames(! lcl_AnyToBool(rValue));
695 5 : break;
696 : case WID_PROTECTED:
697 : {
698 24 : bool bSet = lcl_AnyToBool(rValue);
699 24 : rTOXBase.SetProtected(bSet);
700 24 : if (pSectionFormat)
701 : {
702 24 : static_cast<SwTOXBaseSection &>(rTOXBase).SetProtect(bSet);
703 : }
704 : }
705 24 : break;
706 : case WID_USE_ALPHABETICAL_SEPARATORS:
707 : lcl_AnyToBitMask(rValue, nTOIOptions,
708 7 : nsSwTOIOptions::TOI_ALPHA_DELIMITTER);
709 7 : break;
710 : case WID_USE_KEY_AS_ENTRY:
711 : lcl_AnyToBitMask(rValue, nTOIOptions,
712 4 : nsSwTOIOptions::TOI_KEY_AS_ENTRY);
713 4 : break;
714 : case WID_USE_COMBINED_ENTRIES:
715 : lcl_AnyToBitMask(rValue, nTOIOptions,
716 4 : nsSwTOIOptions::TOI_SAME_ENTRY);
717 4 : break;
718 : case WID_IS_CASE_SENSITIVE:
719 : lcl_AnyToBitMask(rValue, nTOIOptions,
720 4 : nsSwTOIOptions::TOI_CASE_SENSITIVE);
721 4 : break;
722 : case WID_USE_P_P:
723 4 : lcl_AnyToBitMask(rValue, nTOIOptions, nsSwTOIOptions::TOI_FF);
724 4 : break;
725 : case WID_USE_DASH:
726 4 : lcl_AnyToBitMask(rValue, nTOIOptions, nsSwTOIOptions::TOI_DASH);
727 4 : break;
728 : case WID_USE_UPPER_CASE:
729 : lcl_AnyToBitMask(rValue, nTOIOptions,
730 4 : nsSwTOIOptions::TOI_INITIAL_CAPS);
731 4 : break;
732 : case WID_IS_COMMA_SEPARATED:
733 3 : bForm = true;
734 3 : aForm.SetCommaSeparated(lcl_AnyToBool(rValue));
735 3 : break;
736 : case WID_LABEL_CATEGORY:
737 : {
738 : // convert file-format/API/external programmatic english name
739 : // to internal UI name before usage
740 : rTOXBase.SetSequenceName( SwStyleNameMapper::GetSpecialExtraUIName(
741 8 : lcl_AnyToString(rValue) ) );
742 : }
743 8 : break;
744 : case WID_LABEL_DISPLAY_TYPE:
745 : {
746 5 : const sal_Int16 nVal = lcl_AnyToInt16(rValue);
747 5 : sal_uInt16 nSet = CAPTION_COMPLETE;
748 5 : switch (nVal)
749 : {
750 : case text::ReferenceFieldPart::TEXT:
751 5 : nSet = CAPTION_COMPLETE;
752 5 : break;
753 : case text::ReferenceFieldPart::CATEGORY_AND_NUMBER:
754 0 : nSet = CAPTION_NUMBER;
755 0 : break;
756 : case text::ReferenceFieldPart::ONLY_CAPTION:
757 0 : nSet = CAPTION_TEXT;
758 0 : break;
759 : default:
760 0 : throw lang::IllegalArgumentException();
761 : }
762 5 : rTOXBase.SetCaptionDisplay(static_cast<SwCaptionDisplay>(nSet));
763 : }
764 5 : break;
765 : case WID_USE_LEVEL_FROM_SOURCE:
766 2 : rTOXBase.SetLevelFromChapter(lcl_AnyToBool(rValue));
767 2 : break;
768 : case WID_MAIN_ENTRY_CHARACTER_STYLE_NAME:
769 : {
770 2 : OUString aString;
771 : SwStyleNameMapper::FillUIName(lcl_AnyToString(rValue),
772 2 : aString, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true);
773 2 : rTOXBase.SetMainEntryCharStyle( aString );
774 : }
775 2 : break;
776 : case WID_CREATE_FROM_TABLES:
777 2 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_TABLE);
778 2 : break;
779 : case WID_CREATE_FROM_TEXT_FRAMES:
780 2 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_FRAME);
781 2 : break;
782 : case WID_CREATE_FROM_GRAPHIC_OBJECTS:
783 2 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_GRAPHIC);
784 2 : break;
785 : case WID_CREATE_FROM_EMBEDDED_OBJECTS:
786 2 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_OLE);
787 2 : break;
788 : case WID_CREATE_FROM_STAR_MATH:
789 2 : lcl_AnyToBitMask(rValue, nOLEOptions, nsSwTOOElements::TOO_MATH);
790 2 : break;
791 : case WID_CREATE_FROM_STAR_CHART:
792 2 : lcl_AnyToBitMask(rValue, nOLEOptions, nsSwTOOElements::TOO_CHART);
793 2 : break;
794 : case WID_CREATE_FROM_STAR_CALC:
795 2 : lcl_AnyToBitMask(rValue, nOLEOptions, nsSwTOOElements::TOO_CALC);
796 2 : break;
797 : case WID_CREATE_FROM_STAR_DRAW:
798 : lcl_AnyToBitMask(rValue, nOLEOptions,
799 2 : nsSwTOOElements::TOO_DRAW_IMPRESS);
800 2 : break;
801 : case WID_CREATE_FROM_OTHER_EMBEDDED_OBJECTS:
802 2 : lcl_AnyToBitMask(rValue, nOLEOptions, nsSwTOOElements::TOO_OTHER);
803 2 : break;
804 : case WID_PARA_HEAD:
805 : {
806 23 : OUString aString;
807 : SwStyleNameMapper::FillUIName( lcl_AnyToString(rValue),
808 23 : aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true);
809 23 : bForm = true;
810 : // Header is on Pos 0
811 23 : aForm.SetTemplate( 0, aString );
812 : }
813 23 : break;
814 : case WID_IS_RELATIVE_TABSTOPS:
815 20 : bForm = true;
816 20 : aForm.SetRelTabPos(lcl_AnyToBool(rValue));
817 20 : break;
818 : case WID_PARA_SEP:
819 : {
820 1 : OUString aString;
821 1 : bForm = true;
822 : SwStyleNameMapper::FillUIName( lcl_AnyToString(rValue),
823 1 : aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true);
824 1 : aForm.SetTemplate( 1, aString );
825 : }
826 1 : break;
827 : case WID_CREATE_FROM_PARAGRAPH_STYLES:
828 12 : lcl_AnyToBitMask(rValue, nCreate, nsSwTOXElement::TOX_TEMPLATE);
829 12 : break;
830 :
831 : case WID_PARA_LEV1:
832 : case WID_PARA_LEV2:
833 : case WID_PARA_LEV3:
834 : case WID_PARA_LEV4:
835 : case WID_PARA_LEV5:
836 : case WID_PARA_LEV6:
837 : case WID_PARA_LEV7:
838 : case WID_PARA_LEV8:
839 : case WID_PARA_LEV9:
840 : case WID_PARA_LEV10:
841 : {
842 58 : bForm = true;
843 : // in sdbcx::Index Label 1 begins at Pos 2 otherwise at Pos 1
844 58 : const sal_uInt16 nLPos = rTOXBase.GetType() == TOX_INDEX ? 2 : 1;
845 58 : OUString aString;
846 : SwStyleNameMapper::FillUIName( lcl_AnyToString(rValue),
847 58 : aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true);
848 58 : aForm.SetTemplate(nLPos + pEntry->nWID - WID_PARA_LEV1, aString );
849 : }
850 58 : break;
851 : default:
852 : //this is for items only
853 74 : if (WID_PRIMARY_KEY > pEntry->nWID)
854 : {
855 : const SwAttrSet& rSet =
856 73 : SwDoc::GetTOXBaseAttrSet(rTOXBase);
857 73 : SfxItemSet aAttrSet(rSet);
858 73 : m_pImpl->m_rPropSet.setPropertyValue(
859 73 : rPropertyName, rValue, aAttrSet);
860 :
861 73 : const SwSectionFormats& rSects = m_pImpl->m_pDoc->GetSections();
862 270 : for (size_t i = 0; i < rSects.size(); ++i)
863 : {
864 270 : const SwSectionFormat* pTmpFormat = rSects[ i ];
865 270 : if (pTmpFormat == pSectionFormat)
866 : {
867 : SwSectionData tmpData(
868 73 : static_cast<SwTOXBaseSection&>(rTOXBase));
869 73 : m_pImpl->m_pDoc->UpdateSection(i, tmpData, & aAttrSet);
870 73 : break;
871 : }
872 73 : }
873 : }
874 : }
875 860 : rTOXBase.SetCreate(nCreate);
876 860 : rTOXBase.SetOLEOptions(nOLEOptions);
877 860 : if (rTOXBase.GetTOXType()->GetType() == TOX_INDEX)
878 : {
879 139 : rTOXBase.SetOptions(nTOIOptions);
880 : }
881 860 : if (bForm)
882 : {
883 105 : rTOXBase.SetTOXForm(aForm);
884 862 : }
885 860 : }
886 :
887 : uno::Any SAL_CALL
888 581 : SwXDocumentIndex::getPropertyValue(const OUString& rPropertyName)
889 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
890 : uno::RuntimeException, std::exception)
891 : {
892 581 : SolarMutexGuard aGuard;
893 :
894 581 : uno::Any aRet;
895 : SfxItemPropertySimpleEntry const*const pEntry =
896 581 : m_pImpl->m_rPropSet.getPropertyMap().getByName(rPropertyName);
897 581 : if (!pEntry)
898 : {
899 : throw beans::UnknownPropertyException(
900 0 : "Unknown property: " + rPropertyName,
901 0 : static_cast< cppu::OWeakObject * >(this));
902 : }
903 :
904 581 : SwSectionFormat *const pSectionFormat( m_pImpl->GetSectionFormat() );
905 581 : SwTOXBase* pTOXBase = 0;
906 581 : if (pSectionFormat)
907 : {
908 528 : pTOXBase = static_cast<SwTOXBaseSection*>(pSectionFormat->GetSection());
909 : }
910 53 : else if (m_pImpl->m_bIsDescriptor)
911 : {
912 53 : pTOXBase = &m_pImpl->m_pProps->GetTOXBase();
913 : }
914 581 : if(pTOXBase)
915 : {
916 581 : const sal_uInt16 nCreate = pTOXBase->GetCreateType();
917 581 : const sal_uInt16 nOLEOptions = pTOXBase->GetOLEOptions();
918 : const sal_uInt16 nTOIOptions =
919 581 : (pTOXBase->GetTOXType()->GetType() == TOX_INDEX)
920 : ? pTOXBase->GetOptions()
921 581 : : 0U;
922 581 : const SwForm& rForm = pTOXBase->GetTOXForm();
923 581 : switch(pEntry->nWID)
924 : {
925 : case WID_IDX_CONTENT_SECTION:
926 : case WID_IDX_HEADER_SECTION :
927 71 : if(WID_IDX_CONTENT_SECTION == pEntry->nWID)
928 : {
929 : const uno::Reference <text::XTextSection> xContentSect =
930 36 : SwXTextSection::CreateXTextSection( pSectionFormat );
931 36 : aRet <<= xContentSect;
932 : }
933 35 : else if (pSectionFormat)
934 : {
935 35 : SwSections aSectArr;
936 : pSectionFormat->GetChildSections(aSectArr,
937 35 : SORTSECT_NOT, false);
938 35 : for(size_t i = 0; i < aSectArr.size(); ++i)
939 : {
940 32 : SwSection* pSect = aSectArr[i];
941 32 : if(pSect->GetType() == TOX_HEADER_SECTION)
942 : {
943 : const uno::Reference <text::XTextSection> xHeader =
944 : SwXTextSection::CreateXTextSection(
945 32 : pSect->GetFormat() );
946 32 : aRet <<= xHeader;
947 32 : break;
948 : }
949 35 : }
950 : }
951 71 : break;
952 : case WID_IDX_TITLE :
953 : {
954 11 : aRet <<= pTOXBase->GetTitle();
955 11 : break;
956 : }
957 : case WID_IDX_NAME:
958 9 : aRet <<= pTOXBase->GetTOXName();
959 9 : break;
960 : case WID_USER_IDX_NAME:
961 : {
962 1 : OUString sTmp((!m_pImpl->m_bIsDescriptor)
963 : ? pTOXBase->GetTOXType()->GetTypeName()
964 1 : : m_pImpl->m_pProps->GetTypeName());
965 : //I18N
966 1 : lcl_ConvertTOUNameToProgrammaticName(sTmp);
967 1 : aRet <<= sTmp;
968 : }
969 1 : break;
970 : case WID_IDX_LOCALE:
971 3 : aRet <<= LanguageTag(pTOXBase->GetLanguage()).getLocale();
972 3 : break;
973 : case WID_IDX_SORT_ALGORITHM:
974 3 : aRet <<= pTOXBase->GetSortAlgorithm();
975 3 : break;
976 : case WID_LEVEL :
977 3 : aRet <<= static_cast<sal_Int16>(pTOXBase->GetLevel());
978 3 : break;
979 : case WID_TOC_BOOKMARK :
980 0 : aRet <<= pTOXBase->GetBookmarkName();
981 0 : break;
982 : case WID_INDEX_ENTRY_TYPE :
983 0 : aRet <<= pTOXBase->GetEntryTypeName();
984 0 : break;
985 : case WID_CREATE_FROM_MARKS:
986 6 : lcl_BitMaskToAny(aRet, nCreate, nsSwTOXElement::TOX_MARK);
987 6 : break;
988 : case WID_CREATE_FROM_OUTLINE:
989 : lcl_BitMaskToAny(aRet, nCreate,
990 5 : nsSwTOXElement::TOX_OUTLINELEVEL);
991 5 : break;
992 : case WID_CREATE_FROM_CHAPTER:
993 : {
994 10 : const bool bRet = pTOXBase->IsFromChapter();
995 10 : aRet <<= bRet;
996 : }
997 10 : break;
998 : case WID_CREATE_FROM_LABELS:
999 : {
1000 2 : const bool bRet = ! pTOXBase->IsFromObjectNames();
1001 2 : aRet <<= bRet;
1002 : }
1003 2 : break;
1004 : case WID_PROTECTED:
1005 : {
1006 11 : const bool bRet = pTOXBase->IsProtected();
1007 11 : aRet <<= bRet;
1008 : }
1009 11 : break;
1010 : case WID_USE_ALPHABETICAL_SEPARATORS:
1011 : lcl_BitMaskToAny(aRet, nTOIOptions,
1012 3 : nsSwTOIOptions::TOI_ALPHA_DELIMITTER);
1013 3 : break;
1014 : case WID_USE_KEY_AS_ENTRY:
1015 : lcl_BitMaskToAny(aRet, nTOIOptions,
1016 3 : nsSwTOIOptions::TOI_KEY_AS_ENTRY);
1017 3 : break;
1018 : case WID_USE_COMBINED_ENTRIES:
1019 : lcl_BitMaskToAny(aRet, nTOIOptions,
1020 3 : nsSwTOIOptions::TOI_SAME_ENTRY);
1021 3 : break;
1022 : case WID_IS_CASE_SENSITIVE:
1023 : lcl_BitMaskToAny(aRet, nTOIOptions,
1024 3 : nsSwTOIOptions::TOI_CASE_SENSITIVE);
1025 3 : break;
1026 : case WID_USE_P_P:
1027 3 : lcl_BitMaskToAny(aRet, nTOIOptions, nsSwTOIOptions::TOI_FF);
1028 3 : break;
1029 : case WID_USE_DASH:
1030 3 : lcl_BitMaskToAny(aRet, nTOIOptions, nsSwTOIOptions::TOI_DASH);
1031 3 : break;
1032 : case WID_USE_UPPER_CASE:
1033 : lcl_BitMaskToAny(aRet, nTOIOptions,
1034 3 : nsSwTOIOptions::TOI_INITIAL_CAPS);
1035 3 : break;
1036 : case WID_IS_COMMA_SEPARATED:
1037 : {
1038 1 : const bool bRet = rForm.IsCommaSeparated();
1039 1 : aRet <<= bRet;
1040 : }
1041 1 : break;
1042 : case WID_LABEL_CATEGORY:
1043 : {
1044 : // convert internal UI name to
1045 : // file-format/API/external programmatic english name
1046 : // before usage
1047 4 : aRet <<= SwStyleNameMapper::GetSpecialExtraProgName(
1048 2 : pTOXBase->GetSequenceName() );
1049 : }
1050 2 : break;
1051 : case WID_LABEL_DISPLAY_TYPE:
1052 : {
1053 2 : sal_Int16 nSet = text::ReferenceFieldPart::TEXT;
1054 2 : switch (pTOXBase->GetCaptionDisplay())
1055 : {
1056 : case CAPTION_COMPLETE:
1057 2 : nSet = text::ReferenceFieldPart::TEXT;
1058 2 : break;
1059 : case CAPTION_NUMBER:
1060 0 : nSet = text::ReferenceFieldPart::CATEGORY_AND_NUMBER;
1061 0 : break;
1062 : case CAPTION_TEXT:
1063 0 : nSet = text::ReferenceFieldPart::ONLY_CAPTION;
1064 0 : break;
1065 : }
1066 2 : aRet <<= nSet;
1067 : }
1068 2 : break;
1069 : case WID_USE_LEVEL_FROM_SOURCE:
1070 : {
1071 1 : const bool bRet = pTOXBase->IsLevelFromChapter();
1072 1 : aRet <<= bRet;
1073 : }
1074 1 : break;
1075 : case WID_LEVEL_FORMAT:
1076 : {
1077 : uno::Reference< container::XIndexReplace > xTokenAccess(
1078 247 : m_pImpl->m_wTokenAccess);
1079 247 : if (!xTokenAccess.is())
1080 : {
1081 246 : xTokenAccess = new TokenAccess_Impl(*this);
1082 246 : m_pImpl->m_wTokenAccess = xTokenAccess;
1083 : }
1084 247 : aRet <<= xTokenAccess;
1085 : }
1086 247 : break;
1087 : case WID_LEVEL_PARAGRAPH_STYLES:
1088 : {
1089 : uno::Reference< container::XIndexReplace > xStyleAccess(
1090 12 : m_pImpl->m_wStyleAccess);
1091 12 : if (!xStyleAccess.is())
1092 : {
1093 12 : xStyleAccess = new StyleAccess_Impl(*this);
1094 12 : m_pImpl->m_wStyleAccess = xStyleAccess;
1095 : }
1096 12 : aRet <<= xStyleAccess;
1097 : }
1098 12 : break;
1099 : case WID_MAIN_ENTRY_CHARACTER_STYLE_NAME:
1100 : {
1101 3 : OUString aString;
1102 : SwStyleNameMapper::FillProgName(
1103 : pTOXBase->GetMainEntryCharStyle(),
1104 : aString,
1105 : nsSwGetPoolIdFromName::GET_POOLID_CHRFMT,
1106 3 : true);
1107 3 : aRet <<= aString;
1108 : }
1109 3 : break;
1110 : case WID_CREATE_FROM_TABLES:
1111 1 : lcl_BitMaskToAny(aRet, nCreate, nsSwTOXElement::TOX_TABLE);
1112 1 : break;
1113 : case WID_CREATE_FROM_TEXT_FRAMES:
1114 1 : lcl_BitMaskToAny(aRet, nCreate, nsSwTOXElement::TOX_FRAME);
1115 1 : break;
1116 : case WID_CREATE_FROM_GRAPHIC_OBJECTS:
1117 1 : lcl_BitMaskToAny(aRet, nCreate, nsSwTOXElement::TOX_GRAPHIC);
1118 1 : break;
1119 : case WID_CREATE_FROM_EMBEDDED_OBJECTS:
1120 1 : lcl_BitMaskToAny(aRet, nCreate, nsSwTOXElement::TOX_OLE);
1121 1 : break;
1122 : case WID_CREATE_FROM_STAR_MATH:
1123 1 : lcl_BitMaskToAny(aRet, nOLEOptions, nsSwTOOElements::TOO_MATH);
1124 1 : break;
1125 : case WID_CREATE_FROM_STAR_CHART:
1126 1 : lcl_BitMaskToAny(aRet, nOLEOptions, nsSwTOOElements::TOO_CHART);
1127 1 : break;
1128 : case WID_CREATE_FROM_STAR_CALC:
1129 1 : lcl_BitMaskToAny(aRet, nOLEOptions, nsSwTOOElements::TOO_CALC);
1130 1 : break;
1131 : case WID_CREATE_FROM_STAR_DRAW:
1132 : lcl_BitMaskToAny(aRet, nOLEOptions,
1133 1 : nsSwTOOElements::TOO_DRAW_IMPRESS);
1134 1 : break;
1135 : case WID_CREATE_FROM_OTHER_EMBEDDED_OBJECTS:
1136 1 : lcl_BitMaskToAny(aRet, nOLEOptions, nsSwTOOElements::TOO_OTHER);
1137 1 : break;
1138 : case WID_CREATE_FROM_PARAGRAPH_STYLES:
1139 6 : lcl_BitMaskToAny(aRet, nCreate, nsSwTOXElement::TOX_TEMPLATE);
1140 6 : break;
1141 : case WID_PARA_HEAD:
1142 : {
1143 : //Header steht an Pos 0
1144 11 : OUString aString;
1145 : SwStyleNameMapper::FillProgName(rForm.GetTemplate( 0 ), aString,
1146 11 : nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true );
1147 11 : aRet <<= aString;
1148 : }
1149 11 : break;
1150 : case WID_PARA_SEP:
1151 : {
1152 3 : OUString aString;
1153 : SwStyleNameMapper::FillProgName(
1154 : rForm.GetTemplate( 1 ),
1155 : aString,
1156 : nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL,
1157 3 : true);
1158 3 : aRet <<= aString;
1159 : }
1160 3 : break;
1161 : case WID_PARA_LEV1:
1162 : case WID_PARA_LEV2:
1163 : case WID_PARA_LEV3:
1164 : case WID_PARA_LEV4:
1165 : case WID_PARA_LEV5:
1166 : case WID_PARA_LEV6:
1167 : case WID_PARA_LEV7:
1168 : case WID_PARA_LEV8:
1169 : case WID_PARA_LEV9:
1170 : case WID_PARA_LEV10:
1171 : {
1172 : // in sdbcx::Index Label 1 begins at Pos 2 otherwise at Pos 1
1173 74 : const sal_uInt16 nLPos = pTOXBase->GetType() == TOX_INDEX ? 2 : 1;
1174 74 : OUString aString;
1175 : SwStyleNameMapper::FillProgName(
1176 : rForm.GetTemplate(nLPos + pEntry->nWID - WID_PARA_LEV1),
1177 : aString,
1178 : nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL,
1179 74 : true);
1180 74 : aRet <<= aString;
1181 : }
1182 74 : break;
1183 : case WID_IS_RELATIVE_TABSTOPS:
1184 : {
1185 8 : const bool bRet = rForm.IsRelTabPos();
1186 8 : aRet <<= bRet;
1187 : }
1188 8 : break;
1189 : case WID_INDEX_MARKS:
1190 : {
1191 2 : SwTOXMarks aMarks;
1192 2 : const SwTOXType* pType = pTOXBase->GetTOXType();
1193 2 : SwTOXMark::InsertTOXMarks( aMarks, *pType );
1194 4 : uno::Sequence< uno::Reference<text::XDocumentIndexMark> > aXMarks(aMarks.size());
1195 2 : uno::Reference<text::XDocumentIndexMark>* pxMarks = aXMarks.getArray();
1196 2 : for(size_t i = 0; i < aMarks.size(); ++i)
1197 : {
1198 0 : SwTOXMark* pMark = aMarks[i];
1199 0 : pxMarks[i] = SwXDocumentIndexMark::CreateXDocumentIndexMark(
1200 0 : *m_pImpl->m_pDoc, pMark);
1201 : }
1202 4 : aRet <<= aXMarks;
1203 : }
1204 2 : break;
1205 : default:
1206 : //this is for items only
1207 44 : if(WID_PRIMARY_KEY > pEntry->nWID)
1208 : {
1209 : const SwAttrSet& rSet =
1210 44 : SwDoc::GetTOXBaseAttrSet(*pTOXBase);
1211 88 : aRet = m_pImpl->m_rPropSet.getPropertyValue(
1212 44 : rPropertyName, rSet);
1213 : }
1214 : }
1215 : }
1216 581 : return aRet;
1217 : }
1218 :
1219 : void SAL_CALL
1220 0 : SwXDocumentIndex::addPropertyChangeListener(
1221 : const OUString& /*rPropertyName*/,
1222 : const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
1223 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1224 : uno::RuntimeException, std::exception)
1225 : {
1226 : OSL_FAIL("SwXDocumentIndex::addPropertyChangeListener(): not implemented");
1227 0 : }
1228 :
1229 : void SAL_CALL
1230 0 : SwXDocumentIndex::removePropertyChangeListener(
1231 : const OUString& /*rPropertyName*/,
1232 : const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
1233 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1234 : uno::RuntimeException, std::exception)
1235 : {
1236 : OSL_FAIL("SwXDocumentIndex::removePropertyChangeListener(): not implemented");
1237 0 : }
1238 :
1239 : void SAL_CALL
1240 0 : SwXDocumentIndex::addVetoableChangeListener(
1241 : const OUString& /*rPropertyName*/,
1242 : const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
1243 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1244 : uno::RuntimeException, std::exception)
1245 : {
1246 : OSL_FAIL("SwXDocumentIndex::addVetoableChangeListener(): not implemented");
1247 0 : }
1248 :
1249 : void SAL_CALL
1250 0 : SwXDocumentIndex::removeVetoableChangeListener(
1251 : const OUString& /*rPropertyName*/,
1252 : const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
1253 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1254 : uno::RuntimeException, std::exception)
1255 : {
1256 : OSL_FAIL("SwXDocumentIndex::removeVetoableChangeListener(): not implemented");
1257 0 : }
1258 :
1259 4 : void lcl_CalcLayout(SwDoc *pDoc)
1260 : {
1261 4 : SwViewShell *pViewShell = 0;
1262 4 : SwEditShell* pEditShell = 0;
1263 4 : if( pDoc )
1264 : {
1265 4 : pViewShell = pDoc->getIDocumentLayoutAccess().GetCurrentViewShell();
1266 4 : pEditShell = pDoc->GetEditShell();
1267 : }
1268 :
1269 4 : if (pEditShell)
1270 : {
1271 4 : pEditShell->CalcLayout();
1272 : }
1273 0 : else if (pViewShell)
1274 : {
1275 0 : pViewShell->CalcLayout();
1276 : }
1277 4 : }
1278 :
1279 : // XRefreshable
1280 4 : void SAL_CALL SwXDocumentIndex::refresh() throw (uno::RuntimeException, std::exception)
1281 : {
1282 : {
1283 4 : SolarMutexGuard g;
1284 :
1285 4 : SwSectionFormat *const pFormat = m_pImpl->GetSectionFormat();
1286 : SwTOXBaseSection *const pTOXBase = (pFormat) ?
1287 4 : static_cast<SwTOXBaseSection*>(pFormat->GetSection()) : 0;
1288 4 : if (!pTOXBase)
1289 : {
1290 : throw uno::RuntimeException(
1291 : "SwXDocumentIndex::refresh: must be in attached state",
1292 0 : static_cast< ::cppu::OWeakObject*>(this));
1293 : }
1294 4 : pTOXBase->Update();
1295 :
1296 : // the insertion of TOC will affect the document layout
1297 4 : lcl_CalcLayout(m_pImpl->m_pDoc);
1298 :
1299 : // page numbers
1300 4 : pTOXBase->UpdatePageNum();
1301 : }
1302 :
1303 : ::cppu::OInterfaceContainerHelper *const pContainer(
1304 4 : m_pImpl->m_Listeners.getContainer(
1305 8 : cppu::UnoType<util::XRefreshListener>::get()));
1306 4 : if (pContainer)
1307 : {
1308 3 : lang::EventObject const event(static_cast< ::cppu::OWeakObject*>(this));
1309 3 : pContainer->notifyEach(& util::XRefreshListener::refreshed, event);
1310 : }
1311 4 : }
1312 :
1313 1 : void SAL_CALL SwXDocumentIndex::addRefreshListener(
1314 : const uno::Reference<util::XRefreshListener>& xListener)
1315 : throw (uno::RuntimeException, std::exception)
1316 : {
1317 : // no need to lock here as m_pImpl is const and container threadsafe
1318 1 : m_pImpl->m_Listeners.addInterface(
1319 2 : cppu::UnoType<util::XRefreshListener>::get(), xListener);
1320 1 : }
1321 :
1322 0 : void SAL_CALL SwXDocumentIndex::removeRefreshListener(
1323 : const uno::Reference<util::XRefreshListener>& xListener)
1324 : throw (uno::RuntimeException, std::exception)
1325 : {
1326 : // no need to lock here as m_pImpl is const and container threadsafe
1327 0 : m_pImpl->m_Listeners.removeInterface(
1328 0 : cppu::UnoType<util::XRefreshListener>::get(), xListener);
1329 0 : }
1330 :
1331 : void SAL_CALL
1332 119 : SwXDocumentIndex::attach(const uno::Reference< text::XTextRange > & xTextRange)
1333 : throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception)
1334 : {
1335 119 : SolarMutexGuard aGuard;
1336 :
1337 119 : if (!m_pImpl->m_bIsDescriptor)
1338 : {
1339 0 : throw uno::RuntimeException();
1340 : }
1341 238 : const uno::Reference<XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
1342 : SwXTextRange *const pRange =
1343 119 : ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
1344 : OTextCursorHelper *const pCursor =
1345 119 : ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
1346 :
1347 : SwDoc *const pDoc =
1348 119 : (pRange) ? pRange->GetDoc() : ((pCursor) ? pCursor->GetDoc() : 0);
1349 119 : if (!pDoc)
1350 : {
1351 0 : throw lang::IllegalArgumentException();
1352 : }
1353 :
1354 238 : SwUnoInternalPaM aPam(*pDoc);
1355 : // this now needs to return TRUE
1356 119 : ::sw::XTextRangeToSwPaM(aPam, xTextRange);
1357 :
1358 119 : const SwTOXBase* pOld = SwDoc::GetCurTOX( *aPam.Start() );
1359 119 : if (pOld)
1360 : {
1361 0 : throw lang::IllegalArgumentException();
1362 : }
1363 :
1364 238 : UnoActionContext aAction(pDoc);
1365 119 : if (aPam.HasMark())
1366 : {
1367 0 : pDoc->getIDocumentContentOperations().DeleteAndJoin(aPam);
1368 : }
1369 :
1370 119 : SwTOXBase & rTOXBase = m_pImpl->m_pProps->GetTOXBase();
1371 119 : SwTOXType const*const pTOXType = rTOXBase.GetTOXType();
1372 359 : if ((TOX_USER == pTOXType->GetType()) &&
1373 125 : !m_pImpl->m_pProps->GetTypeName().equals(pTOXType->GetTypeName()))
1374 : {
1375 0 : lcl_ReAssignTOXType(pDoc, rTOXBase, m_pImpl->m_pProps->GetTypeName());
1376 : }
1377 : //TODO: apply Section attributes (columns and background)
1378 : SwTOXBaseSection *const pTOX =
1379 119 : pDoc->InsertTableOf( *aPam.GetPoint(), rTOXBase, 0, false );
1380 :
1381 119 : pDoc->SetTOXBaseName(*pTOX, m_pImpl->m_pProps->GetTOXBase().GetTOXName());
1382 :
1383 : // update page numbers
1384 119 : pTOX->GetFormat()->Add(m_pImpl.get());
1385 119 : pTOX->GetFormat()->SetXObject(static_cast< ::cppu::OWeakObject*>(this));
1386 119 : pTOX->UpdatePageNum();
1387 :
1388 119 : m_pImpl->m_pProps.reset();
1389 119 : m_pImpl->m_pDoc = pDoc;
1390 238 : m_pImpl->m_bIsDescriptor = false;
1391 119 : }
1392 :
1393 : uno::Reference< text::XTextRange > SAL_CALL
1394 6 : SwXDocumentIndex::getAnchor() throw (uno::RuntimeException, std::exception)
1395 : {
1396 6 : SolarMutexGuard aGuard;
1397 :
1398 6 : SwSectionFormat *const pSectionFormat( m_pImpl->GetSectionFormat() );
1399 6 : if (!pSectionFormat)
1400 : {
1401 0 : throw uno::RuntimeException();
1402 : }
1403 :
1404 6 : uno::Reference< text::XTextRange > xRet;
1405 6 : SwNodeIndex const*const pIdx( pSectionFormat->GetContent().GetContentIdx() );
1406 6 : if (pIdx && pIdx->GetNode().GetNodes().IsDocNodes())
1407 : {
1408 6 : SwPaM aPaM(*pIdx);
1409 6 : aPaM.Move( fnMoveForward, fnGoContent );
1410 6 : aPaM.SetMark();
1411 6 : aPaM.GetPoint()->nNode = *pIdx->GetNode().EndOfSectionNode();
1412 6 : aPaM.Move( fnMoveBackward, fnGoContent );
1413 12 : xRet = SwXTextRange::CreateXTextRange(*pSectionFormat->GetDoc(),
1414 18 : *aPaM.GetMark(), aPaM.GetPoint());
1415 : }
1416 6 : return xRet;
1417 : }
1418 :
1419 2 : void SAL_CALL SwXDocumentIndex::dispose() throw (uno::RuntimeException, std::exception)
1420 : {
1421 2 : SolarMutexGuard aGuard;
1422 :
1423 2 : SwSectionFormat *const pSectionFormat( m_pImpl->GetSectionFormat() );
1424 2 : if (pSectionFormat)
1425 : {
1426 : pSectionFormat->GetDoc()->DeleteTOX(
1427 2 : *static_cast<SwTOXBaseSection*>(pSectionFormat->GetSection()),
1428 2 : true);
1429 2 : }
1430 2 : }
1431 :
1432 : void SAL_CALL
1433 2 : SwXDocumentIndex::addEventListener(
1434 : const uno::Reference< lang::XEventListener > & xListener)
1435 : throw (uno::RuntimeException, std::exception)
1436 : {
1437 : // no need to lock here as m_pImpl is const and container threadsafe
1438 2 : m_pImpl->m_Listeners.addInterface(
1439 4 : cppu::UnoType<lang::XEventListener>::get(), xListener);
1440 2 : }
1441 :
1442 : void SAL_CALL
1443 1 : SwXDocumentIndex::removeEventListener(
1444 : const uno::Reference< lang::XEventListener > & xListener)
1445 : throw (uno::RuntimeException, std::exception)
1446 : {
1447 : // no need to lock here as m_pImpl is const and container threadsafe
1448 1 : m_pImpl->m_Listeners.removeInterface(
1449 2 : cppu::UnoType<lang::XEventListener>::get(), xListener);
1450 1 : }
1451 :
1452 0 : OUString SAL_CALL SwXDocumentIndex::getName() throw (uno::RuntimeException, std::exception)
1453 : {
1454 0 : SolarMutexGuard g;
1455 :
1456 0 : OUString uRet;
1457 0 : SwSectionFormat *const pSectionFormat( m_pImpl->GetSectionFormat() );
1458 0 : if (m_pImpl->m_bIsDescriptor)
1459 : {
1460 0 : uRet = m_pImpl->m_pProps->GetTOXBase().GetTOXName();
1461 : }
1462 0 : else if(pSectionFormat)
1463 : {
1464 0 : uRet = pSectionFormat->GetSection()->GetSectionName();
1465 : }
1466 : else
1467 : {
1468 0 : throw uno::RuntimeException();
1469 : }
1470 0 : return uRet;
1471 : }
1472 :
1473 : void SAL_CALL
1474 0 : SwXDocumentIndex::setName(const OUString& rName) throw (uno::RuntimeException, std::exception)
1475 : {
1476 0 : SolarMutexGuard g;
1477 :
1478 0 : if (rName.isEmpty())
1479 : {
1480 0 : throw uno::RuntimeException();
1481 : }
1482 :
1483 0 : SwSectionFormat *const pSectionFormat( m_pImpl->GetSectionFormat() );
1484 0 : if (m_pImpl->m_bIsDescriptor)
1485 : {
1486 0 : m_pImpl->m_pProps->GetTOXBase().SetTOXName(rName);
1487 : }
1488 0 : else if (pSectionFormat)
1489 : {
1490 : const bool bSuccess = pSectionFormat->GetDoc()->SetTOXBaseName(
1491 0 : *static_cast<SwTOXBaseSection*>(pSectionFormat->GetSection()), rName);
1492 0 : if (!bSuccess)
1493 : {
1494 0 : throw uno::RuntimeException();
1495 : }
1496 : }
1497 : else
1498 : {
1499 0 : throw uno::RuntimeException();
1500 0 : }
1501 0 : }
1502 :
1503 : // MetadatableMixin
1504 28 : ::sfx2::Metadatable* SwXDocumentIndex::GetCoreObject()
1505 : {
1506 28 : SwSectionFormat *const pSectionFormat( m_pImpl->GetSectionFormat() );
1507 28 : return pSectionFormat;
1508 : }
1509 :
1510 0 : uno::Reference<frame::XModel> SwXDocumentIndex::GetModel()
1511 : {
1512 0 : SwSectionFormat *const pSectionFormat( m_pImpl->GetSectionFormat() );
1513 0 : if (pSectionFormat)
1514 : {
1515 0 : SwDocShell const*const pShell( pSectionFormat->GetDoc()->GetDocShell() );
1516 0 : return (pShell) ? pShell->GetModel() : 0;
1517 : }
1518 0 : return 0;
1519 : }
1520 :
1521 : static sal_uInt16
1522 203 : lcl_TypeToPropertyMap_Mark(const TOXTypes eType)
1523 : {
1524 203 : switch (eType)
1525 : {
1526 201 : case TOX_INDEX: return PROPERTY_MAP_INDEX_MARK;
1527 2 : case TOX_CONTENT: return PROPERTY_MAP_CNTIDX_MARK;
1528 0 : case TOX_CITATION : return PROPERTY_MAP_FLDTYP_BIBLIOGRAPHY;
1529 : //case TOX_USER:
1530 : default:
1531 0 : return PROPERTY_MAP_USER_MARK;
1532 : }
1533 : }
1534 :
1535 406 : class SwXDocumentIndexMark::Impl
1536 : : public SwClient
1537 : {
1538 : private:
1539 : ::osl::Mutex m_Mutex; // just for OInterfaceContainerHelper
1540 : SwXDocumentIndexMark & m_rThis;
1541 : bool m_bInReplaceMark;
1542 :
1543 : public:
1544 :
1545 : uno::WeakReference<uno::XInterface> m_wThis;
1546 : SfxItemPropertySet const& m_rPropSet;
1547 : const TOXTypes m_eTOXType;
1548 : ::cppu::OInterfaceContainerHelper m_EventListeners;
1549 : bool m_bIsDescriptor;
1550 : SwDepend m_TypeDepend;
1551 : const SwTOXMark * m_pTOXMark;
1552 : SwDoc * m_pDoc;
1553 :
1554 : bool m_bMainEntry;
1555 : sal_uInt16 m_nLevel;
1556 : OUString m_aBookmarkName;
1557 : OUString m_aEntryTypeName;
1558 : OUString m_sAltText;
1559 : OUString m_sPrimaryKey;
1560 : OUString m_sSecondaryKey;
1561 : OUString m_sTextReading;
1562 : OUString m_sPrimaryKeyReading;
1563 : OUString m_sSecondaryKeyReading;
1564 : OUString m_sUserIndexName;
1565 : OUString m_sCitaitonText;
1566 :
1567 203 : Impl( SwXDocumentIndexMark & rThis,
1568 : SwDoc *const pDoc,
1569 : const enum TOXTypes eType,
1570 : SwTOXType *const pType, SwTOXMark const*const pMark)
1571 : : SwClient(const_cast<SwTOXMark*>(pMark))
1572 : , m_rThis(rThis)
1573 : , m_bInReplaceMark(false)
1574 : , m_rPropSet(
1575 203 : *aSwMapProvider.GetPropertySet(lcl_TypeToPropertyMap_Mark(eType)))
1576 : , m_eTOXType(eType)
1577 : , m_EventListeners(m_Mutex)
1578 203 : , m_bIsDescriptor(0 == pMark)
1579 : , m_TypeDepend(this, pType)
1580 : , m_pTOXMark(pMark)
1581 : , m_pDoc(pDoc)
1582 : , m_bMainEntry(false)
1583 609 : , m_nLevel(0)
1584 : {
1585 203 : }
1586 :
1587 226 : SwTOXType * GetTOXType() const {
1588 : return static_cast<SwTOXType*>(
1589 226 : const_cast<SwModify *>(m_TypeDepend.GetRegisteredIn()));
1590 : }
1591 :
1592 5 : void DeleteTOXMark()
1593 : {
1594 5 : m_pDoc->DeleteTOXMark(m_pTOXMark); // calls Invalidate() via Modify!
1595 5 : m_pTOXMark = 0;
1596 5 : }
1597 :
1598 : void InsertTOXMark(SwTOXType & rTOXType, SwTOXMark & rMark, SwPaM & rPam,
1599 : SwXTextCursor const*const pTextCursor);
1600 :
1601 4 : void ReplaceTOXMark(SwTOXType & rTOXType, SwTOXMark & rMark, SwPaM & rPam)
1602 : {
1603 4 : m_bInReplaceMark = true;
1604 4 : DeleteTOXMark();
1605 4 : m_bInReplaceMark = false;
1606 : try {
1607 4 : InsertTOXMark(rTOXType, rMark, rPam, 0);
1608 0 : } catch (...) {
1609 : OSL_FAIL("ReplaceTOXMark() failed!");
1610 : lang::EventObject const ev(
1611 0 : static_cast< ::cppu::OWeakObject&>(m_rThis));
1612 0 : m_EventListeners.disposeAndClear(ev);
1613 0 : throw;
1614 : }
1615 4 : }
1616 :
1617 : void Invalidate();
1618 : protected:
1619 : // SwClient
1620 : virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
1621 : };
1622 :
1623 71 : void SwXDocumentIndexMark::Impl::Invalidate()
1624 : {
1625 71 : if (GetRegisteredIn())
1626 : {
1627 0 : GetRegisteredIn()->Remove(this);
1628 0 : if (m_TypeDepend.GetRegisteredIn())
1629 : {
1630 : m_TypeDepend.GetRegisteredIn()->Remove(
1631 0 : &m_TypeDepend);
1632 : }
1633 : }
1634 71 : if (!m_bInReplaceMark) // #i109983# only dispose on delete, not on replace!
1635 : {
1636 67 : uno::Reference<uno::XInterface> const xThis(m_wThis);
1637 : // fdo#72695: if UNO object is already dead, don't revive it with event
1638 67 : if (xThis.is())
1639 : {
1640 67 : lang::EventObject const ev(xThis);
1641 67 : m_EventListeners.disposeAndClear(ev);
1642 67 : }
1643 : }
1644 71 : m_pDoc = 0;
1645 71 : m_pTOXMark = 0;
1646 71 : }
1647 :
1648 71 : void SwXDocumentIndexMark::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew)
1649 : {
1650 71 : ClientModify(this, pOld, pNew);
1651 :
1652 71 : if (!GetRegisteredIn()) // removed => dispose
1653 : {
1654 71 : Invalidate();
1655 : }
1656 71 : }
1657 :
1658 169 : SwXDocumentIndexMark::SwXDocumentIndexMark(const TOXTypes eToxType)
1659 169 : : m_pImpl( new SwXDocumentIndexMark::Impl(*this, 0, eToxType, 0, 0) )
1660 : {
1661 169 : }
1662 :
1663 34 : SwXDocumentIndexMark::SwXDocumentIndexMark(SwDoc & rDoc,
1664 : SwTOXType & rType, SwTOXMark & rMark)
1665 : : m_pImpl( new SwXDocumentIndexMark::Impl(*this, &rDoc, rType.GetType(),
1666 34 : &rType, &rMark) )
1667 : {
1668 34 : }
1669 :
1670 406 : SwXDocumentIndexMark::~SwXDocumentIndexMark()
1671 : {
1672 406 : }
1673 :
1674 : uno::Reference<text::XDocumentIndexMark>
1675 216 : SwXDocumentIndexMark::CreateXDocumentIndexMark(
1676 : SwDoc & rDoc, SwTOXMark *const pMark, TOXTypes const eType)
1677 : {
1678 : // re-use existing SwXDocumentIndexMark
1679 : // NB: xmloff depends on this caching to generate ID from the address!
1680 : // #i105557#: do not iterate over the registered clients: race condition
1681 216 : uno::Reference<text::XDocumentIndexMark> xTOXMark;
1682 216 : if (pMark)
1683 : {
1684 47 : xTOXMark = pMark->GetXTOXMark();
1685 : }
1686 216 : if (!xTOXMark.is())
1687 : {
1688 : SwXDocumentIndexMark *const pNew((pMark)
1689 : ? new SwXDocumentIndexMark(rDoc,
1690 34 : *const_cast<SwTOXType*>(pMark->GetTOXType()), *pMark)
1691 237 : : new SwXDocumentIndexMark(eType));
1692 203 : xTOXMark.set(pNew);
1693 203 : if (pMark)
1694 : {
1695 34 : pMark->SetXTOXMark(xTOXMark);
1696 : }
1697 : // need a permanent Reference to initialize m_wThis
1698 203 : pNew->m_pImpl->m_wThis = xTOXMark;
1699 : }
1700 216 : return xTOXMark;
1701 : }
1702 :
1703 : namespace
1704 : {
1705 : class theSwXDocumentIndexMarkUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSwXDocumentIndexMarkUnoTunnelId > {};
1706 : }
1707 :
1708 11345 : const uno::Sequence< sal_Int8 > & SwXDocumentIndexMark::getUnoTunnelId()
1709 : {
1710 11345 : return theSwXDocumentIndexMarkUnoTunnelId::get().getSeq();
1711 : }
1712 :
1713 : sal_Int64 SAL_CALL
1714 852 : SwXDocumentIndexMark::getSomething(const uno::Sequence< sal_Int8 >& rId)
1715 : throw (uno::RuntimeException, std::exception)
1716 : {
1717 852 : return ::sw::UnoTunnelImpl<SwXDocumentIndexMark>(rId, this);
1718 : }
1719 :
1720 : static const sal_Char cBaseMark[] = "com.sun.star.text.BaseIndexMark";
1721 : static const sal_Char cContentMark[] = "com.sun.star.text.ContentIndexMark";
1722 : static const sal_Char cIdxMark[] = "com.sun.star.text.DocumentIndexMark";
1723 : static const sal_Char cIdxMarkAsian[] = "com.sun.star.text.DocumentIndexMarkAsian";
1724 : static const sal_Char cUserMark[] = "com.sun.star.text.UserIndexMark";
1725 : static const sal_Char cTextContent[] = "com.sun.star.text.TextContent";
1726 :
1727 : OUString SAL_CALL
1728 0 : SwXDocumentIndexMark::getImplementationName() throw (uno::RuntimeException, std::exception)
1729 : {
1730 0 : return OUString("SwXDocumentIndexMark");
1731 : }
1732 :
1733 4 : sal_Bool SAL_CALL SwXDocumentIndexMark::supportsService(const OUString& rServiceName)
1734 : throw (uno::RuntimeException, std::exception)
1735 : {
1736 4 : return cppu::supportsService(this, rServiceName);
1737 : }
1738 :
1739 : uno::Sequence< OUString > SAL_CALL
1740 4 : SwXDocumentIndexMark::getSupportedServiceNames() throw (uno::RuntimeException, std::exception)
1741 : {
1742 4 : SolarMutexGuard g;
1743 :
1744 4 : const sal_Int32 nCnt = (m_pImpl->m_eTOXType == TOX_INDEX) ? 4 : 3;
1745 4 : uno::Sequence< OUString > aRet(nCnt);
1746 4 : OUString* pArray = aRet.getArray();
1747 4 : pArray[0] = cBaseMark;
1748 4 : pArray[1] = cTextContent;
1749 4 : switch (m_pImpl->m_eTOXType)
1750 : {
1751 : case TOX_USER:
1752 0 : pArray[2] = cUserMark;
1753 0 : break;
1754 : case TOX_CONTENT:
1755 1 : pArray[2] = cContentMark;
1756 1 : break;
1757 : case TOX_INDEX:
1758 3 : pArray[2] = cIdxMark;
1759 3 : pArray[3] = cIdxMarkAsian;
1760 3 : break;
1761 :
1762 : default:
1763 : ;
1764 : }
1765 4 : return aRet;
1766 : }
1767 :
1768 : OUString SAL_CALL
1769 0 : SwXDocumentIndexMark::getMarkEntry() throw (uno::RuntimeException, std::exception)
1770 : {
1771 0 : SolarMutexGuard aGuard;
1772 :
1773 0 : OUString sRet;
1774 0 : SwTOXType *const pType = m_pImpl->GetTOXType();
1775 0 : if (pType && m_pImpl->m_pTOXMark)
1776 : {
1777 0 : sRet = m_pImpl->m_pTOXMark->GetAlternativeText();
1778 : }
1779 0 : else if (m_pImpl->m_bIsDescriptor)
1780 : {
1781 0 : sRet = m_pImpl->m_sAltText;
1782 : }
1783 : else
1784 : {
1785 0 : throw uno::RuntimeException();
1786 : }
1787 0 : return sRet;
1788 : }
1789 :
1790 : void SAL_CALL
1791 0 : SwXDocumentIndexMark::setMarkEntry(const OUString& rIndexEntry)
1792 : throw (uno::RuntimeException, std::exception)
1793 : {
1794 0 : SolarMutexGuard aGuard;
1795 :
1796 0 : SwTOXType *const pType = m_pImpl->GetTOXType();
1797 0 : if (pType && m_pImpl->m_pTOXMark)
1798 : {
1799 0 : SwTOXMark aMark(*m_pImpl->m_pTOXMark);
1800 0 : aMark.SetAlternativeText(rIndexEntry);
1801 : SwTextTOXMark const*const pTextMark =
1802 0 : m_pImpl->m_pTOXMark->GetTextTOXMark();
1803 0 : SwPaM aPam(pTextMark->GetTextNode(), pTextMark->GetStart());
1804 0 : aPam.SetMark();
1805 0 : if(pTextMark->End())
1806 : {
1807 0 : aPam.GetPoint()->nContent = *pTextMark->End();
1808 : }
1809 : else
1810 0 : ++aPam.GetPoint()->nContent;
1811 :
1812 0 : m_pImpl->ReplaceTOXMark(*pType, aMark, aPam);
1813 : }
1814 0 : else if (m_pImpl->m_bIsDescriptor)
1815 : {
1816 0 : m_pImpl->m_sAltText = rIndexEntry;
1817 : }
1818 : else
1819 : {
1820 0 : throw uno::RuntimeException();
1821 0 : }
1822 0 : }
1823 :
1824 : void SAL_CALL
1825 169 : SwXDocumentIndexMark::attach(
1826 : const uno::Reference< text::XTextRange > & xTextRange)
1827 : throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception)
1828 : {
1829 169 : SolarMutexGuard aGuard;
1830 :
1831 169 : if (!m_pImpl->m_bIsDescriptor)
1832 : {
1833 0 : throw uno::RuntimeException();
1834 : }
1835 :
1836 338 : const uno::Reference<XUnoTunnel> xRangeTunnel(xTextRange, uno::UNO_QUERY);
1837 : SwXTextRange *const pRange =
1838 169 : ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
1839 : OTextCursorHelper *const pCursor =
1840 169 : ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
1841 : SwDoc *const pDoc =
1842 169 : (pRange) ? pRange->GetDoc() : ((pCursor) ? pCursor->GetDoc() : 0);
1843 169 : if (!pDoc)
1844 : {
1845 0 : throw lang::IllegalArgumentException();
1846 : }
1847 :
1848 169 : const SwTOXType* pTOXType = 0;
1849 169 : switch (m_pImpl->m_eTOXType)
1850 : {
1851 : case TOX_INDEX:
1852 : case TOX_CONTENT:
1853 : case TOX_CITATION:
1854 169 : pTOXType = pDoc->GetTOXType( m_pImpl->m_eTOXType, 0 );
1855 169 : break;
1856 : case TOX_USER:
1857 : {
1858 0 : if (m_pImpl->m_sUserIndexName.isEmpty())
1859 : {
1860 0 : pTOXType = pDoc->GetTOXType( m_pImpl->m_eTOXType, 0 );
1861 : }
1862 : else
1863 : {
1864 : const sal_uInt16 nCount =
1865 0 : pDoc->GetTOXTypeCount(m_pImpl->m_eTOXType);
1866 0 : for (sal_uInt16 i = 0; i < nCount; i++)
1867 : {
1868 : SwTOXType const*const pTemp =
1869 0 : pDoc->GetTOXType( m_pImpl->m_eTOXType, i );
1870 0 : if (m_pImpl->m_sUserIndexName == pTemp->GetTypeName())
1871 : {
1872 0 : pTOXType = pTemp;
1873 0 : break;
1874 : }
1875 : }
1876 0 : if (!pTOXType)
1877 : {
1878 0 : SwTOXType aUserType(TOX_USER, m_pImpl->m_sUserIndexName);
1879 0 : pTOXType = pDoc->InsertTOXType(aUserType);
1880 : }
1881 : }
1882 : }
1883 0 : break;
1884 :
1885 : default:
1886 0 : break;
1887 : }
1888 169 : if (!pTOXType)
1889 : {
1890 0 : throw lang::IllegalArgumentException();
1891 : }
1892 :
1893 169 : SwUnoInternalPaM aPam(*pDoc);
1894 : // this now needs to return TRUE
1895 169 : ::sw::XTextRangeToSwPaM(aPam, xTextRange);
1896 338 : SwTOXMark aMark (pTOXType);
1897 169 : if (!m_pImpl->m_sAltText.isEmpty())
1898 : {
1899 1 : aMark.SetAlternativeText(m_pImpl->m_sAltText);
1900 : }
1901 169 : switch (m_pImpl->m_eTOXType)
1902 : {
1903 : case TOX_INDEX:
1904 168 : if (!m_pImpl->m_sPrimaryKey.isEmpty())
1905 : {
1906 165 : aMark.SetPrimaryKey(m_pImpl->m_sPrimaryKey);
1907 : }
1908 168 : if (!m_pImpl->m_sSecondaryKey.isEmpty())
1909 : {
1910 0 : aMark.SetSecondaryKey(m_pImpl->m_sSecondaryKey);
1911 : }
1912 168 : if (!m_pImpl->m_sTextReading.isEmpty())
1913 : {
1914 0 : aMark.SetTextReading(m_pImpl->m_sTextReading);
1915 : }
1916 168 : if (!m_pImpl->m_sPrimaryKeyReading.isEmpty())
1917 : {
1918 0 : aMark.SetPrimaryKeyReading(m_pImpl->m_sPrimaryKeyReading);
1919 : }
1920 168 : if (!m_pImpl->m_sSecondaryKeyReading.isEmpty())
1921 : {
1922 0 : aMark.SetSecondaryKeyReading(m_pImpl->m_sSecondaryKeyReading);
1923 : }
1924 168 : aMark.SetMainEntry(m_pImpl->m_bMainEntry);
1925 168 : break;
1926 : case TOX_CITATION:
1927 0 : if (!m_pImpl->m_sCitaitonText.isEmpty())
1928 : {
1929 0 : aMark.SetCitationKeyReading(m_pImpl->m_sCitaitonText);
1930 : }
1931 0 : aMark.SetMainEntry(m_pImpl->m_bMainEntry);
1932 0 : break;
1933 : case TOX_USER:
1934 : case TOX_CONTENT:
1935 1 : if (USHRT_MAX != m_pImpl->m_nLevel)
1936 : {
1937 1 : aMark.SetLevel(m_pImpl->m_nLevel+1);
1938 : }
1939 1 : break;
1940 :
1941 : default:
1942 0 : break;
1943 : }
1944 :
1945 : m_pImpl->InsertTOXMark(*const_cast<SwTOXType *>(pTOXType), aMark, aPam,
1946 169 : dynamic_cast<SwXTextCursor const*>(pCursor));
1947 :
1948 507 : m_pImpl->m_bIsDescriptor = false;
1949 169 : }
1950 :
1951 : template<typename T> struct NotContainedIn
1952 : {
1953 : ::std::vector<T> const& m_rVector;
1954 28 : explicit NotContainedIn(::std::vector<T> const& rVector)
1955 28 : : m_rVector(rVector) { }
1956 28 : bool operator() (T const& rT) {
1957 28 : return ::std::find(m_rVector.begin(), m_rVector.end(), rT)
1958 56 : == m_rVector.end();
1959 : }
1960 : };
1961 :
1962 173 : void SwXDocumentIndexMark::Impl::InsertTOXMark(
1963 : SwTOXType & rTOXType, SwTOXMark & rMark, SwPaM & rPam,
1964 : SwXTextCursor const*const pTextCursor)
1965 : {
1966 173 : SwDoc *const pDoc( rPam.GetDoc() );
1967 173 : UnoActionContext aAction(pDoc);
1968 173 : bool bMark = *rPam.GetPoint() != *rPam.GetMark();
1969 : // n.b.: toxmarks must have either alternative text or an extent
1970 173 : if (bMark && !rMark.GetAlternativeText().isEmpty())
1971 : {
1972 0 : rPam.Normalize(true);
1973 0 : rPam.DeleteMark();
1974 0 : bMark = false;
1975 : }
1976 : // Marks without alternative text and without selected text cannot be inserted,
1977 : // thus use a space - is this really the ideal solution?
1978 173 : if (!bMark && rMark.GetAlternativeText().isEmpty())
1979 : {
1980 154 : rMark.SetAlternativeText( OUString(' ') );
1981 : }
1982 :
1983 173 : const bool bForceExpandHints( !bMark && pTextCursor && pTextCursor->IsAtEndOfMeta() );
1984 : const SetAttrMode nInsertFlags = (bForceExpandHints)
1985 : ? ( SetAttrMode::FORCEHINTEXPAND
1986 183 : | SetAttrMode::DONTEXPAND)
1987 346 : : SetAttrMode::DONTEXPAND;
1988 :
1989 346 : ::std::vector<SwTextAttr *> oldMarks;
1990 173 : if (bMark)
1991 : {
1992 28 : oldMarks = rPam.GetNode().GetTextNode()->GetTextAttrsAt(
1993 28 : rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_TOXMARK);
1994 : }
1995 :
1996 173 : pDoc->getIDocumentContentOperations().InsertPoolItem(rPam, rMark, nInsertFlags);
1997 173 : if (bMark && *rPam.GetPoint() > *rPam.GetMark())
1998 : {
1999 13 : rPam.Exchange();
2000 : }
2001 :
2002 : // rMark was copied into the document pool; now retrieve real format...
2003 173 : SwTextAttr * pTextAttr(0);
2004 173 : if (bMark)
2005 : {
2006 : // #i107672#
2007 : // ensure that we do not retrieve a different mark at the same position
2008 : ::std::vector<SwTextAttr *> const newMarks(
2009 14 : rPam.GetNode().GetTextNode()->GetTextAttrsAt(
2010 28 : rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_TOXMARK));
2011 : ::std::vector<SwTextAttr *>::const_iterator const iter(
2012 : ::std::find_if(newMarks.begin(), newMarks.end(),
2013 14 : NotContainedIn<SwTextAttr *>(oldMarks)));
2014 : OSL_ASSERT(newMarks.end() != iter);
2015 14 : if (newMarks.end() != iter)
2016 : {
2017 14 : pTextAttr = *iter;
2018 14 : }
2019 : }
2020 : else
2021 : {
2022 159 : pTextAttr = rPam.GetNode().GetTextNode()->GetTextAttrForCharAt(
2023 318 : rPam.GetPoint()->nContent.GetIndex()-1, RES_TXTATR_TOXMARK );
2024 : }
2025 :
2026 173 : if (!pTextAttr)
2027 : {
2028 : throw uno::RuntimeException(
2029 : "SwXDocumentIndexMark::InsertTOXMark(): cannot insert attribute",
2030 0 : 0);
2031 : }
2032 :
2033 173 : m_pDoc = pDoc;
2034 173 : m_pTOXMark = & pTextAttr->GetTOXMark();
2035 173 : const_cast<SwTOXMark*>(m_pTOXMark)->Add(this);
2036 346 : const_cast<SwTOXType &>(rTOXType).Add(& m_TypeDepend);
2037 173 : }
2038 :
2039 : uno::Reference< text::XTextRange > SAL_CALL
2040 1 : SwXDocumentIndexMark::getAnchor() throw (uno::RuntimeException, std::exception)
2041 : {
2042 1 : SolarMutexGuard aGuard;
2043 :
2044 1 : SwTOXType *const pType = m_pImpl->GetTOXType();
2045 1 : if (!pType || !m_pImpl->m_pTOXMark)
2046 : {
2047 0 : throw uno::RuntimeException();
2048 : }
2049 1 : if (!m_pImpl->m_pTOXMark->GetTextTOXMark())
2050 : {
2051 0 : throw uno::RuntimeException();
2052 : }
2053 1 : const SwTextTOXMark* pTextMark = m_pImpl->m_pTOXMark->GetTextTOXMark();
2054 2 : SwPaM aPam(pTextMark->GetTextNode(), pTextMark->GetStart());
2055 1 : aPam.SetMark();
2056 1 : if(pTextMark->End())
2057 : {
2058 0 : aPam.GetPoint()->nContent = *pTextMark->End();
2059 : }
2060 : else
2061 : {
2062 1 : ++aPam.GetPoint()->nContent;
2063 : }
2064 : const uno::Reference< frame::XModel > xModel =
2065 2 : m_pImpl->m_pDoc->GetDocShell()->GetBaseModel();
2066 2 : const uno::Reference< text::XTextDocument > xTDoc(xModel, uno::UNO_QUERY);
2067 : const uno::Reference< text::XTextRange > xRet =
2068 1 : new SwXTextRange(aPam, xTDoc->getText());
2069 :
2070 2 : return xRet;
2071 : }
2072 :
2073 : void SAL_CALL
2074 1 : SwXDocumentIndexMark::dispose() throw (uno::RuntimeException, std::exception)
2075 : {
2076 1 : SolarMutexGuard aGuard;
2077 :
2078 1 : SwTOXType *const pType = m_pImpl->GetTOXType();
2079 1 : if (pType && m_pImpl->m_pTOXMark)
2080 : {
2081 1 : m_pImpl->DeleteTOXMark(); // call Invalidate() via modify!
2082 1 : }
2083 1 : }
2084 :
2085 : void SAL_CALL
2086 2 : SwXDocumentIndexMark::addEventListener(
2087 : const uno::Reference< lang::XEventListener > & xListener)
2088 : throw (uno::RuntimeException, std::exception)
2089 : {
2090 : // no need to lock here as m_pImpl is const and container threadsafe
2091 2 : m_pImpl->m_EventListeners.addInterface(xListener);
2092 2 : }
2093 :
2094 : void SAL_CALL
2095 1 : SwXDocumentIndexMark::removeEventListener(
2096 : const uno::Reference< lang::XEventListener > & xListener)
2097 : throw (uno::RuntimeException, std::exception)
2098 : {
2099 : // no need to lock here as m_pImpl is const and container threadsafe
2100 1 : m_pImpl->m_EventListeners.removeInterface(xListener);
2101 1 : }
2102 :
2103 : uno::Reference< beans::XPropertySetInfo > SAL_CALL
2104 14 : SwXDocumentIndexMark::getPropertySetInfo() throw (uno::RuntimeException, std::exception)
2105 : {
2106 14 : SolarMutexGuard g;
2107 :
2108 15 : static uno::Reference< beans::XPropertySetInfo > xInfos[3];
2109 14 : int nPos = 0;
2110 14 : switch (m_pImpl->m_eTOXType)
2111 : {
2112 14 : case TOX_INDEX: nPos = 0; break;
2113 0 : case TOX_CONTENT: nPos = 1; break;
2114 0 : case TOX_USER: nPos = 2; break;
2115 : default:
2116 : ;
2117 : }
2118 14 : if(!xInfos[nPos].is())
2119 : {
2120 : const uno::Reference< beans::XPropertySetInfo > xInfo =
2121 1 : m_pImpl->m_rPropSet.getPropertySetInfo();
2122 : // extend PropertySetInfo!
2123 2 : const uno::Sequence<beans::Property> aPropSeq = xInfo->getProperties();
2124 2 : xInfos[nPos] = new SfxExtItemPropertySetInfo(
2125 : aSwMapProvider.GetPropertyMapEntries(
2126 : PROPERTY_MAP_PARAGRAPH_EXTENSIONS),
2127 3 : aPropSeq );
2128 : }
2129 14 : return xInfos[nPos];
2130 : }
2131 :
2132 : void SAL_CALL
2133 173 : SwXDocumentIndexMark::setPropertyValue(
2134 : const OUString& rPropertyName, const uno::Any& rValue)
2135 : throw (beans::UnknownPropertyException, beans::PropertyVetoException,
2136 : lang::IllegalArgumentException, lang::WrappedTargetException,
2137 : uno::RuntimeException, std::exception)
2138 : {
2139 173 : SolarMutexGuard aGuard;
2140 :
2141 : SfxItemPropertySimpleEntry const*const pEntry =
2142 173 : m_pImpl->m_rPropSet.getPropertyMap().getByName(rPropertyName);
2143 173 : if (!pEntry)
2144 : {
2145 : throw beans::UnknownPropertyException(
2146 0 : "Unknown property: " + rPropertyName,
2147 0 : static_cast<cppu::OWeakObject *>(this));
2148 : }
2149 173 : if (pEntry->nFlags & beans::PropertyAttribute::READONLY)
2150 : {
2151 : throw beans::PropertyVetoException(
2152 6 : "Property is read-only: " + rPropertyName,
2153 9 : static_cast<cppu::OWeakObject *>(this));
2154 : }
2155 :
2156 170 : SwTOXType *const pType = m_pImpl->GetTOXType();
2157 170 : if (pType && m_pImpl->m_pTOXMark)
2158 : {
2159 4 : SwTOXMark aMark(*m_pImpl->m_pTOXMark);
2160 4 : switch(pEntry->nWID)
2161 : {
2162 : case WID_ALT_TEXT:
2163 1 : aMark.SetAlternativeText(lcl_AnyToString(rValue));
2164 1 : break;
2165 : case WID_LEVEL:
2166 : aMark.SetLevel(std::min( static_cast<sal_Int8>( MAXLEVEL ),
2167 0 : static_cast<sal_Int8>(lcl_AnyToInt16(rValue)+1)));
2168 0 : break;
2169 : case WID_TOC_BOOKMARK :
2170 0 : aMark.SetBookmarkName(lcl_AnyToString(rValue));
2171 0 : break;
2172 : case WID_INDEX_ENTRY_TYPE :
2173 0 : aMark.SetEntryTypeName(lcl_AnyToString(rValue));
2174 0 : break;
2175 : case WID_PRIMARY_KEY :
2176 1 : aMark.SetPrimaryKey(lcl_AnyToString(rValue));
2177 1 : break;
2178 : case WID_SECONDARY_KEY:
2179 1 : aMark.SetSecondaryKey(lcl_AnyToString(rValue));
2180 1 : break;
2181 : case WID_MAIN_ENTRY:
2182 1 : aMark.SetMainEntry(lcl_AnyToBool(rValue));
2183 1 : break;
2184 : case WID_TEXT_READING:
2185 0 : aMark.SetTextReading(lcl_AnyToString(rValue));
2186 0 : break;
2187 : case WID_PRIMARY_KEY_READING:
2188 0 : aMark.SetPrimaryKeyReading(lcl_AnyToString(rValue));
2189 0 : break;
2190 : case WID_SECONDARY_KEY_READING:
2191 0 : aMark.SetSecondaryKeyReading(lcl_AnyToString(rValue));
2192 0 : break;
2193 : }
2194 : SwTextTOXMark const*const pTextMark =
2195 4 : m_pImpl->m_pTOXMark->GetTextTOXMark();
2196 4 : SwPaM aPam(pTextMark->GetTextNode(), pTextMark->GetStart());
2197 4 : aPam.SetMark();
2198 4 : if(pTextMark->End())
2199 : {
2200 0 : aPam.GetPoint()->nContent = *pTextMark->End();
2201 : }
2202 : else
2203 : {
2204 4 : ++aPam.GetPoint()->nContent;
2205 : }
2206 :
2207 4 : m_pImpl->ReplaceTOXMark(*pType, aMark, aPam);
2208 : }
2209 166 : else if (m_pImpl->m_bIsDescriptor)
2210 : {
2211 166 : switch(pEntry->nWID)
2212 : {
2213 : case WID_ALT_TEXT:
2214 1 : m_pImpl->m_sAltText = lcl_AnyToString(rValue);
2215 1 : break;
2216 : case WID_LEVEL:
2217 : {
2218 0 : const sal_Int16 nVal = lcl_AnyToInt16(rValue);
2219 0 : if(nVal >= 0 && nVal < MAXLEVEL)
2220 : {
2221 0 : m_pImpl->m_nLevel = nVal;
2222 : }
2223 : else
2224 : {
2225 0 : throw lang::IllegalArgumentException();
2226 : }
2227 : }
2228 0 : break;
2229 : case WID_TOC_BOOKMARK :
2230 : {
2231 0 : m_pImpl->m_aBookmarkName = lcl_AnyToString(rValue);
2232 : }
2233 0 : break;
2234 : case WID_INDEX_ENTRY_TYPE :
2235 : {
2236 0 : m_pImpl->m_aEntryTypeName = lcl_AnyToString(rValue);
2237 : }
2238 0 : break;
2239 : case WID_PRIMARY_KEY:
2240 165 : m_pImpl->m_sPrimaryKey = lcl_AnyToString(rValue);
2241 165 : break;
2242 : case WID_SECONDARY_KEY:
2243 0 : m_pImpl->m_sSecondaryKey = lcl_AnyToString(rValue);
2244 0 : break;
2245 : case WID_TEXT_READING:
2246 0 : m_pImpl->m_sTextReading = lcl_AnyToString(rValue);
2247 0 : break;
2248 : case WID_PRIMARY_KEY_READING:
2249 0 : m_pImpl->m_sPrimaryKeyReading = lcl_AnyToString(rValue);
2250 0 : break;
2251 : case WID_SECONDARY_KEY_READING:
2252 0 : m_pImpl->m_sSecondaryKeyReading = lcl_AnyToString(rValue);
2253 0 : break;
2254 : case WID_USER_IDX_NAME:
2255 : {
2256 0 : OUString sTmp(lcl_AnyToString(rValue));
2257 0 : lcl_ConvertTOUNameToUserName(sTmp);
2258 0 : m_pImpl->m_sUserIndexName = sTmp;
2259 : }
2260 0 : break;
2261 : case WID_MAIN_ENTRY:
2262 0 : m_pImpl->m_bMainEntry = lcl_AnyToBool(rValue);
2263 0 : break;
2264 : case PROPERTY_MAP_INDEX_OBJECTS:
2265 : {
2266 0 : uno::Sequence<com::sun::star::beans::PropertyValue> aValues(1);
2267 0 : com::sun::star::beans::PropertyValue propertyVal;
2268 0 : rValue >>= aValues;
2269 0 : propertyVal = aValues[0];
2270 0 : m_pImpl->m_sCitaitonText = lcl_AnyToString(propertyVal.Value);
2271 : }
2272 0 : break;
2273 : }
2274 : }
2275 : else
2276 : {
2277 0 : throw uno::RuntimeException();
2278 173 : }
2279 170 : }
2280 :
2281 : uno::Any SAL_CALL
2282 60 : SwXDocumentIndexMark::getPropertyValue(const OUString& rPropertyName)
2283 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
2284 : uno::RuntimeException, std::exception)
2285 : {
2286 60 : SolarMutexGuard aGuard;
2287 :
2288 60 : uno::Any aRet;
2289 : SfxItemPropertySimpleEntry const*const pEntry =
2290 60 : m_pImpl->m_rPropSet.getPropertyMap().getByName(rPropertyName);
2291 60 : if (!pEntry)
2292 : {
2293 : throw beans::UnknownPropertyException(
2294 0 : "Unknown property: " + rPropertyName,
2295 0 : static_cast<cppu::OWeakObject *>(this));
2296 : }
2297 60 : if (::sw::GetDefaultTextContentValue(aRet, rPropertyName, pEntry->nWID))
2298 : {
2299 6 : return aRet;
2300 : }
2301 :
2302 54 : SwTOXType *const pType = m_pImpl->GetTOXType();
2303 54 : if (pType && m_pImpl->m_pTOXMark)
2304 : {
2305 54 : switch(pEntry->nWID)
2306 : {
2307 : case WID_ALT_TEXT:
2308 2 : aRet <<= m_pImpl->m_pTOXMark->GetAlternativeText();
2309 2 : break;
2310 : case WID_LEVEL:
2311 0 : aRet <<= static_cast<sal_Int16>(
2312 0 : m_pImpl->m_pTOXMark->GetLevel() - 1);
2313 0 : break;
2314 : case WID_TOC_BOOKMARK :
2315 0 : aRet <<= m_pImpl->m_pTOXMark->GetBookmarkName();
2316 0 : break;
2317 : case WID_INDEX_ENTRY_TYPE :
2318 0 : aRet <<= m_pImpl->m_pTOXMark->GetEntryTypeName();
2319 0 : break;
2320 : case WID_PRIMARY_KEY :
2321 48 : aRet <<= m_pImpl->m_pTOXMark->GetPrimaryKey();
2322 48 : break;
2323 : case WID_SECONDARY_KEY:
2324 2 : aRet <<= m_pImpl->m_pTOXMark->GetSecondaryKey();
2325 2 : break;
2326 : case WID_TEXT_READING:
2327 0 : aRet <<= m_pImpl->m_pTOXMark->GetTextReading();
2328 0 : break;
2329 : case WID_PRIMARY_KEY_READING:
2330 0 : aRet <<= m_pImpl->m_pTOXMark->GetPrimaryKeyReading();
2331 0 : break;
2332 : case WID_SECONDARY_KEY_READING:
2333 0 : aRet <<= m_pImpl->m_pTOXMark->GetSecondaryKeyReading();
2334 0 : break;
2335 : case WID_USER_IDX_NAME :
2336 : {
2337 0 : OUString sTmp(pType->GetTypeName());
2338 0 : lcl_ConvertTOUNameToProgrammaticName(sTmp);
2339 0 : aRet <<= sTmp;
2340 : }
2341 0 : break;
2342 : case WID_MAIN_ENTRY:
2343 : {
2344 2 : const bool bTemp = m_pImpl->m_pTOXMark->IsMainEntry();
2345 2 : aRet <<= bTemp;
2346 : }
2347 2 : break;
2348 : }
2349 : }
2350 0 : else if (m_pImpl->m_bIsDescriptor)
2351 : {
2352 0 : switch(pEntry->nWID)
2353 : {
2354 : case WID_ALT_TEXT:
2355 0 : aRet <<= m_pImpl->m_sAltText;
2356 0 : break;
2357 : case WID_LEVEL:
2358 0 : aRet <<= static_cast<sal_Int16>(m_pImpl->m_nLevel);
2359 0 : break;
2360 : case WID_TOC_BOOKMARK :
2361 0 : aRet <<= m_pImpl->m_aBookmarkName;
2362 0 : break;
2363 : case WID_INDEX_ENTRY_TYPE :
2364 0 : aRet <<= m_pImpl->m_aEntryTypeName;
2365 0 : break;
2366 : case WID_PRIMARY_KEY:
2367 0 : aRet <<= m_pImpl->m_sPrimaryKey;
2368 0 : break;
2369 : case WID_SECONDARY_KEY:
2370 0 : aRet <<= m_pImpl->m_sSecondaryKey;
2371 0 : break;
2372 : case WID_TEXT_READING:
2373 0 : aRet <<= m_pImpl->m_sTextReading;
2374 0 : break;
2375 : case WID_PRIMARY_KEY_READING:
2376 0 : aRet <<= m_pImpl->m_sPrimaryKeyReading;
2377 0 : break;
2378 : case WID_SECONDARY_KEY_READING:
2379 0 : aRet <<= m_pImpl->m_sSecondaryKeyReading;
2380 0 : break;
2381 : case WID_USER_IDX_NAME :
2382 0 : aRet <<= m_pImpl->m_sUserIndexName;
2383 0 : break;
2384 : case WID_MAIN_ENTRY:
2385 0 : aRet <<= m_pImpl->m_bMainEntry;
2386 0 : break;
2387 : }
2388 : }
2389 : else
2390 : {
2391 0 : throw uno::RuntimeException();
2392 : }
2393 54 : return aRet;
2394 : }
2395 :
2396 : void SAL_CALL
2397 0 : SwXDocumentIndexMark::addPropertyChangeListener(
2398 : const OUString& /*rPropertyName*/,
2399 : const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
2400 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
2401 : uno::RuntimeException, std::exception)
2402 : {
2403 : OSL_FAIL("SwXDocumentIndexMark::addPropertyChangeListener(): not implemented");
2404 0 : }
2405 :
2406 : void SAL_CALL
2407 0 : SwXDocumentIndexMark::removePropertyChangeListener(
2408 : const OUString& /*rPropertyName*/,
2409 : const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
2410 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
2411 : uno::RuntimeException, std::exception)
2412 : {
2413 : OSL_FAIL("SwXDocumentIndexMark::removePropertyChangeListener(): not implemented");
2414 0 : }
2415 :
2416 : void SAL_CALL
2417 0 : SwXDocumentIndexMark::addVetoableChangeListener(
2418 : const OUString& /*rPropertyName*/,
2419 : const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
2420 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
2421 : uno::RuntimeException, std::exception)
2422 : {
2423 : OSL_FAIL("SwXDocumentIndexMark::addVetoableChangeListener(): not implemented");
2424 0 : }
2425 :
2426 : void SAL_CALL
2427 0 : SwXDocumentIndexMark::removeVetoableChangeListener(
2428 : const OUString& /*rPropertyName*/,
2429 : const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
2430 : throw (beans::UnknownPropertyException, lang::WrappedTargetException,
2431 : uno::RuntimeException, std::exception)
2432 : {
2433 : OSL_FAIL("SwXDocumentIndexMark::removeVetoableChangeListener(): not implemented");
2434 0 : }
2435 :
2436 1956 : SwXDocumentIndexes::SwXDocumentIndexes(SwDoc *const _pDoc)
2437 1956 : : SwUnoCollection(_pDoc)
2438 : {
2439 1956 : }
2440 :
2441 3912 : SwXDocumentIndexes::~SwXDocumentIndexes()
2442 : {
2443 3912 : }
2444 :
2445 : OUString SAL_CALL
2446 0 : SwXDocumentIndexes::getImplementationName() throw (uno::RuntimeException, std::exception)
2447 : {
2448 0 : return OUString("SwXDocumentIndexes");
2449 : }
2450 :
2451 : static char const*const g_ServicesDocumentIndexes[] =
2452 : {
2453 : "com.sun.star.text.DocumentIndexes",
2454 : };
2455 :
2456 0 : sal_Bool SAL_CALL SwXDocumentIndexes::supportsService(const OUString& rServiceName)
2457 : throw (uno::RuntimeException, std::exception)
2458 : {
2459 0 : return cppu::supportsService(this, rServiceName);
2460 : }
2461 :
2462 : uno::Sequence< OUString > SAL_CALL
2463 0 : SwXDocumentIndexes::getSupportedServiceNames() throw (uno::RuntimeException, std::exception)
2464 : {
2465 : return ::sw::GetSupportedServiceNamesImpl(
2466 0 : SAL_N_ELEMENTS(g_ServicesDocumentIndexes), g_ServicesDocumentIndexes);
2467 : }
2468 :
2469 : sal_Int32 SAL_CALL
2470 1960 : SwXDocumentIndexes::getCount() throw (uno::RuntimeException, std::exception)
2471 : {
2472 1960 : SolarMutexGuard aGuard;
2473 :
2474 1960 : if(!IsValid())
2475 0 : throw uno::RuntimeException();
2476 :
2477 1960 : sal_uInt32 nRet = 0;
2478 1960 : const SwSectionFormats& rFormats = GetDoc()->GetSections();
2479 2166 : for( size_t n = 0; n < rFormats.size(); ++n )
2480 : {
2481 206 : const SwSection* pSect = rFormats[ n ]->GetSection();
2482 300 : if( TOX_CONTENT_SECTION == pSect->GetType() &&
2483 94 : pSect->GetFormat()->GetSectionNode() )
2484 : {
2485 94 : ++nRet;
2486 : }
2487 : }
2488 1960 : return nRet;
2489 : }
2490 :
2491 : uno::Any SAL_CALL
2492 7 : SwXDocumentIndexes::getByIndex(sal_Int32 nIndex)
2493 : throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException,
2494 : uno::RuntimeException, std::exception)
2495 : {
2496 7 : SolarMutexGuard aGuard;
2497 :
2498 7 : if(!IsValid())
2499 0 : throw uno::RuntimeException();
2500 :
2501 7 : sal_Int32 nIdx = 0;
2502 :
2503 7 : const SwSectionFormats& rFormats = GetDoc()->GetSections();
2504 8 : for( size_t n = 0; n < rFormats.size(); ++n )
2505 : {
2506 7 : SwSection* pSect = rFormats[ n ]->GetSection();
2507 21 : if( TOX_CONTENT_SECTION == pSect->GetType() &&
2508 14 : pSect->GetFormat()->GetSectionNode() &&
2509 7 : nIdx++ == nIndex )
2510 : {
2511 : const uno::Reference< text::XDocumentIndex > xTmp =
2512 : SwXDocumentIndex::CreateXDocumentIndex(
2513 6 : *GetDoc(), static_cast<SwTOXBaseSection *>(pSect));
2514 12 : uno::Any aRet;
2515 6 : aRet <<= xTmp;
2516 18 : return aRet;
2517 : }
2518 : }
2519 :
2520 7 : throw lang::IndexOutOfBoundsException();
2521 : }
2522 :
2523 : uno::Any SAL_CALL
2524 16 : SwXDocumentIndexes::getByName(const OUString& rName)
2525 : throw (container::NoSuchElementException, lang::WrappedTargetException,
2526 : uno::RuntimeException, std::exception)
2527 : {
2528 16 : SolarMutexGuard aGuard;
2529 :
2530 16 : if(!IsValid())
2531 0 : throw uno::RuntimeException();
2532 :
2533 16 : const SwSectionFormats& rFormats = GetDoc()->GetSections();
2534 129 : for( size_t n = 0; n < rFormats.size(); ++n )
2535 : {
2536 128 : SwSection* pSect = rFormats[ n ]->GetSection();
2537 512 : if( TOX_CONTENT_SECTION == pSect->GetType() &&
2538 372 : pSect->GetFormat()->GetSectionNode() &&
2539 : (static_cast<SwTOXBaseSection const*>(pSect)->GetTOXName()
2540 302 : == rName))
2541 : {
2542 : const uno::Reference< text::XDocumentIndex > xTmp =
2543 : SwXDocumentIndex::CreateXDocumentIndex(
2544 15 : *GetDoc(), static_cast<SwTOXBaseSection *>(pSect));
2545 30 : uno::Any aRet;
2546 15 : aRet <<= xTmp;
2547 45 : return aRet;
2548 : }
2549 : }
2550 16 : throw container::NoSuchElementException();
2551 : }
2552 :
2553 : uno::Sequence< OUString > SAL_CALL
2554 1 : SwXDocumentIndexes::getElementNames() throw (uno::RuntimeException, std::exception)
2555 : {
2556 1 : SolarMutexGuard aGuard;
2557 :
2558 1 : if(!IsValid())
2559 0 : throw uno::RuntimeException();
2560 :
2561 1 : const SwSectionFormats& rFormats = GetDoc()->GetSections();
2562 1 : sal_Int32 nCount = 0;
2563 2 : for( size_t n = 0; n < rFormats.size(); ++n )
2564 : {
2565 1 : SwSection const*const pSect = rFormats[ n ]->GetSection();
2566 2 : if( TOX_CONTENT_SECTION == pSect->GetType() &&
2567 1 : pSect->GetFormat()->GetSectionNode() )
2568 : {
2569 1 : ++nCount;
2570 : }
2571 : }
2572 :
2573 1 : uno::Sequence< OUString > aRet(nCount);
2574 1 : OUString* pArray = aRet.getArray();
2575 1 : sal_Int32 nCnt = 0;
2576 2 : for( size_t n = 0; n < rFormats.size(); ++n )
2577 : {
2578 1 : SwSection const*const pSect = rFormats[ n ]->GetSection();
2579 2 : if( TOX_CONTENT_SECTION == pSect->GetType() &&
2580 1 : pSect->GetFormat()->GetSectionNode())
2581 : {
2582 1 : pArray[nCnt++] = static_cast<SwTOXBaseSection const*>(pSect)->GetTOXName();
2583 : }
2584 : }
2585 1 : return aRet;
2586 : }
2587 :
2588 : sal_Bool SAL_CALL
2589 2 : SwXDocumentIndexes::hasByName(const OUString& rName)
2590 : throw (uno::RuntimeException, std::exception)
2591 : {
2592 2 : SolarMutexGuard aGuard;
2593 :
2594 2 : if(!IsValid())
2595 0 : throw uno::RuntimeException();
2596 :
2597 2 : const SwSectionFormats& rFormats = GetDoc()->GetSections();
2598 3 : for( size_t n = 0; n < rFormats.size(); ++n )
2599 : {
2600 2 : SwSection const*const pSect = rFormats[ n ]->GetSection();
2601 4 : if( TOX_CONTENT_SECTION == pSect->GetType() &&
2602 2 : pSect->GetFormat()->GetSectionNode())
2603 : {
2604 6 : if (static_cast<SwTOXBaseSection const*>(pSect)->GetTOXName()
2605 4 : == rName)
2606 : {
2607 1 : return sal_True;
2608 : }
2609 : }
2610 : }
2611 1 : return sal_False;
2612 : }
2613 :
2614 : uno::Type SAL_CALL
2615 1 : SwXDocumentIndexes::getElementType() throw (uno::RuntimeException, std::exception)
2616 : {
2617 1 : return cppu::UnoType<text::XDocumentIndex>::get();
2618 : }
2619 :
2620 : sal_Bool SAL_CALL
2621 1 : SwXDocumentIndexes::hasElements() throw (uno::RuntimeException, std::exception)
2622 : {
2623 1 : return 0 != getCount();
2624 : }
2625 :
2626 12 : SwXDocumentIndex::StyleAccess_Impl::StyleAccess_Impl(
2627 : SwXDocumentIndex& rParentIdx)
2628 12 : : m_xParent(&rParentIdx)
2629 : {
2630 12 : }
2631 :
2632 24 : SwXDocumentIndex::StyleAccess_Impl::~StyleAccess_Impl()
2633 : {
2634 24 : }
2635 :
2636 : OUString SAL_CALL
2637 0 : SwXDocumentIndex::StyleAccess_Impl::getImplementationName()
2638 : throw (uno::RuntimeException, std::exception)
2639 : {
2640 0 : return OUString("SwXDocumentIndex::StyleAccess_Impl");
2641 : }
2642 :
2643 : static char const*const g_ServicesIndexStyleAccess[] =
2644 : {
2645 : "com.sun.star.text.DocumentIndexParagraphStyles",
2646 : };
2647 :
2648 : sal_Bool SAL_CALL
2649 0 : SwXDocumentIndex::StyleAccess_Impl::supportsService(const OUString& rServiceName)
2650 : throw (uno::RuntimeException, std::exception)
2651 : {
2652 0 : return cppu::supportsService(this, rServiceName);
2653 : }
2654 :
2655 : uno::Sequence< OUString > SAL_CALL
2656 0 : SwXDocumentIndex::StyleAccess_Impl::getSupportedServiceNames()
2657 : throw (uno::RuntimeException, std::exception)
2658 : {
2659 : return ::sw::GetSupportedServiceNamesImpl(
2660 : SAL_N_ELEMENTS(g_ServicesIndexStyleAccess),
2661 0 : g_ServicesIndexStyleAccess);
2662 : }
2663 :
2664 : void SAL_CALL
2665 6 : SwXDocumentIndex::StyleAccess_Impl::replaceByIndex(
2666 : sal_Int32 nIndex, const uno::Any& rElement)
2667 : throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException,
2668 : lang::WrappedTargetException, uno::RuntimeException, std::exception)
2669 : {
2670 6 : SolarMutexGuard aGuard;
2671 :
2672 6 : if(nIndex < 0 || nIndex >= MAXLEVEL)
2673 : {
2674 0 : throw lang::IndexOutOfBoundsException();
2675 : }
2676 :
2677 6 : SwTOXBase & rTOXBase( m_xParent->m_pImpl->GetTOXSectionOrThrow() );
2678 :
2679 12 : uno::Sequence<OUString> aSeq;
2680 6 : if(!(rElement >>= aSeq))
2681 : {
2682 0 : throw lang::IllegalArgumentException();
2683 : }
2684 :
2685 6 : const sal_Int32 nStyles = aSeq.getLength();
2686 6 : const OUString* pStyles = aSeq.getConstArray();
2687 12 : OUString sSetStyles;
2688 12 : OUString aString;
2689 35 : for(sal_Int32 i = 0; i < nStyles; i++)
2690 : {
2691 29 : if(i)
2692 : {
2693 23 : sSetStyles += OUString(TOX_STYLE_DELIMITER);
2694 : }
2695 29 : SwStyleNameMapper::FillUIName(pStyles[i], aString,
2696 58 : nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true);
2697 29 : sSetStyles += aString;
2698 : }
2699 12 : rTOXBase.SetStyleNames(sSetStyles, static_cast<sal_uInt16>(nIndex));
2700 6 : }
2701 :
2702 : sal_Int32 SAL_CALL
2703 4 : SwXDocumentIndex::StyleAccess_Impl::getCount() throw (uno::RuntimeException, std::exception)
2704 : {
2705 4 : return MAXLEVEL;
2706 : }
2707 :
2708 : uno::Any SAL_CALL
2709 44 : SwXDocumentIndex::StyleAccess_Impl::getByIndex(sal_Int32 nIndex)
2710 : throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException,
2711 : uno::RuntimeException, std::exception)
2712 : {
2713 44 : SolarMutexGuard aGuard;
2714 :
2715 44 : if(nIndex < 0 || nIndex >= MAXLEVEL)
2716 : {
2717 0 : throw lang::IndexOutOfBoundsException();
2718 : }
2719 :
2720 44 : SwTOXBase & rTOXBase( m_xParent->m_pImpl->GetTOXSectionOrThrow() );
2721 :
2722 : const OUString& rStyles =
2723 88 : rTOXBase.GetStyleNames(static_cast<sal_uInt16>(nIndex));
2724 44 : const sal_Int32 nStyles = comphelper::string::getTokenCount(rStyles, TOX_STYLE_DELIMITER);
2725 88 : uno::Sequence<OUString> aStyles(nStyles);
2726 44 : OUString* pStyles = aStyles.getArray();
2727 88 : OUString aString;
2728 44 : sal_Int32 nPos = 0;
2729 47 : for(sal_Int32 i = 0; i < nStyles; ++i)
2730 : {
2731 : SwStyleNameMapper::FillProgName(
2732 : rStyles.getToken(0, TOX_STYLE_DELIMITER, nPos),
2733 : aString,
2734 : nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL,
2735 3 : true);
2736 3 : pStyles[i] = aString;
2737 : }
2738 44 : uno::Any aRet(&aStyles, cppu::UnoType<uno::Sequence<OUString>>::get());
2739 88 : return aRet;
2740 : }
2741 :
2742 : uno::Type SAL_CALL
2743 0 : SwXDocumentIndex::StyleAccess_Impl::getElementType()
2744 : throw (uno::RuntimeException, std::exception)
2745 : {
2746 0 : return cppu::UnoType<uno::Sequence<OUString>>::get();
2747 : }
2748 :
2749 : sal_Bool SAL_CALL
2750 0 : SwXDocumentIndex::StyleAccess_Impl::hasElements() throw (uno::RuntimeException, std::exception)
2751 : {
2752 0 : return sal_True;
2753 : }
2754 :
2755 246 : SwXDocumentIndex::TokenAccess_Impl::TokenAccess_Impl(
2756 : SwXDocumentIndex& rParentIdx)
2757 246 : : m_xParent(&rParentIdx)
2758 : {
2759 246 : }
2760 :
2761 492 : SwXDocumentIndex::TokenAccess_Impl::~TokenAccess_Impl()
2762 : {
2763 492 : }
2764 :
2765 : OUString SAL_CALL
2766 0 : SwXDocumentIndex::TokenAccess_Impl::getImplementationName()
2767 : throw (uno::RuntimeException, std::exception)
2768 : {
2769 0 : return OUString("SwXDocumentIndex::TokenAccess_Impl");
2770 : }
2771 :
2772 : static char const*const g_ServicesIndexTokenAccess[] =
2773 : {
2774 : "com.sun.star.text.DocumentIndexLevelFormat",
2775 : };
2776 :
2777 0 : sal_Bool SAL_CALL SwXDocumentIndex::TokenAccess_Impl::supportsService(
2778 : const OUString& rServiceName)
2779 : throw (uno::RuntimeException, std::exception)
2780 : {
2781 0 : return cppu::supportsService(this, rServiceName);
2782 : }
2783 :
2784 : uno::Sequence< OUString > SAL_CALL
2785 0 : SwXDocumentIndex::TokenAccess_Impl::getSupportedServiceNames()
2786 : throw (uno::RuntimeException, std::exception)
2787 : {
2788 : return ::sw::GetSupportedServiceNamesImpl(
2789 : SAL_N_ELEMENTS(g_ServicesIndexTokenAccess),
2790 0 : g_ServicesIndexTokenAccess);
2791 : }
2792 :
2793 : struct TokenType_ {
2794 : const char *pName;
2795 : enum FormTokenType eTokenType;
2796 : };
2797 :
2798 : static const struct TokenType_ g_TokenTypes[] =
2799 : {
2800 : { "TokenEntryNumber", TOKEN_ENTRY_NO },
2801 : { "TokenEntryText", TOKEN_ENTRY_TEXT },
2802 : { "TokenTabStop", TOKEN_TAB_STOP },
2803 : { "TokenText", TOKEN_TEXT },
2804 : { "TokenPageNumber", TOKEN_PAGE_NUMS },
2805 : { "TokenChapterInfo", TOKEN_CHAPTER_INFO },
2806 : { "TokenHyperlinkStart", TOKEN_LINK_START },
2807 : { "TokenHyperlinkEnd", TOKEN_LINK_END },
2808 : { "TokenBibliographyDataField", TOKEN_AUTHORITY },
2809 : { 0, static_cast<enum FormTokenType>(0) }
2810 : };
2811 :
2812 : void SAL_CALL
2813 678 : SwXDocumentIndex::TokenAccess_Impl::replaceByIndex(
2814 : sal_Int32 nIndex, const uno::Any& rElement)
2815 : throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException,
2816 : lang::WrappedTargetException, uno::RuntimeException, std::exception)
2817 : {
2818 678 : SolarMutexGuard aGuard;
2819 :
2820 678 : SwTOXBase & rTOXBase( m_xParent->m_pImpl->GetTOXSectionOrThrow() );
2821 :
2822 678 : if ((nIndex < 0) || (nIndex > rTOXBase.GetTOXForm().GetFormMax()))
2823 : {
2824 0 : throw lang::IndexOutOfBoundsException();
2825 : }
2826 :
2827 1356 : uno::Sequence<beans::PropertyValues> aSeq;
2828 678 : if(!(rElement >>= aSeq))
2829 : {
2830 0 : throw lang::IllegalArgumentException();
2831 : }
2832 :
2833 1356 : OUString sPattern;
2834 678 : const sal_Int32 nTokens = aSeq.getLength();
2835 678 : const beans::PropertyValues* pTokens = aSeq.getConstArray();
2836 5594 : for(sal_Int32 i = 0; i < nTokens; i++)
2837 : {
2838 4916 : const beans::PropertyValue* pProperties = pTokens[i].getConstArray();
2839 4916 : const sal_Int32 nProperties = pTokens[i].getLength();
2840 : //create an invalid token
2841 4916 : SwFormToken aToken(TOKEN_END);
2842 14720 : for(sal_Int32 j = 0; j < nProperties; j++)
2843 : {
2844 9804 : if ( pProperties[j].Name == "TokenType" )
2845 : {
2846 : const OUString sTokenType =
2847 4916 : lcl_AnyToString(pProperties[j].Value);
2848 25239 : for (TokenType_ const* pTokenType = g_TokenTypes;
2849 : pTokenType->pName; ++pTokenType)
2850 : {
2851 25239 : if (sTokenType.equalsAscii(pTokenType->pName))
2852 : {
2853 4916 : aToken.eTokenType = pTokenType->eTokenType;
2854 4916 : break;
2855 : }
2856 4916 : }
2857 : }
2858 4888 : else if ( pProperties[j].Name == "CharacterStyleName" )
2859 : {
2860 2563 : OUString sCharStyleName;
2861 : SwStyleNameMapper::FillUIName(
2862 2563 : lcl_AnyToString(pProperties[j].Value),
2863 : sCharStyleName,
2864 : nsSwGetPoolIdFromName::GET_POOLID_CHRFMT,
2865 2563 : true);
2866 2563 : aToken.sCharStyleName = sCharStyleName;
2867 : aToken.nPoolId = SwStyleNameMapper::GetPoolIdFromUIName (
2868 2563 : sCharStyleName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
2869 : }
2870 2325 : else if ( pProperties[j].Name == "TabStopRightAligned" )
2871 : {
2872 613 : const bool bRight = lcl_AnyToBool(pProperties[j].Value);
2873 : aToken.eTabAlign = bRight ?
2874 613 : SVX_TAB_ADJUST_END : SVX_TAB_ADJUST_LEFT;
2875 : }
2876 1712 : else if ( pProperties[j].Name == "TabStopPosition" )
2877 : {
2878 9 : sal_Int32 nPosition = 0;
2879 9 : if (!(pProperties[j].Value >>= nPosition))
2880 : {
2881 0 : throw lang::IllegalArgumentException();
2882 : }
2883 9 : nPosition = convertMm100ToTwip(nPosition);
2884 9 : if(nPosition < 0)
2885 : {
2886 0 : throw lang::IllegalArgumentException();
2887 : }
2888 9 : aToken.nTabStopPosition = nPosition;
2889 : }
2890 1703 : else if ( pProperties[j].Name == "TabStopFillCharacter" )
2891 : {
2892 : const OUString sFillChar =
2893 613 : lcl_AnyToString(pProperties[j].Value);
2894 613 : if (sFillChar.getLength() > 1)
2895 : {
2896 0 : throw lang::IllegalArgumentException();
2897 : }
2898 : aToken.cTabFillChar =
2899 613 : sFillChar.isEmpty() ? ' ' : sFillChar[0];
2900 : }
2901 1090 : else if ( pProperties[j].Name == "Text" )
2902 : {
2903 206 : aToken.sText = lcl_AnyToString(pProperties[j].Value);
2904 : }
2905 884 : else if ( pProperties[j].Name == "ChapterFormat" )
2906 : {
2907 4 : sal_Int16 nFormat = lcl_AnyToInt16(pProperties[j].Value);
2908 4 : switch(nFormat)
2909 : {
2910 : case text::ChapterFormat::NUMBER:
2911 0 : nFormat = CF_NUMBER;
2912 0 : break;
2913 : case text::ChapterFormat::NAME:
2914 0 : nFormat = CF_TITLE;
2915 0 : break;
2916 : case text::ChapterFormat::NAME_NUMBER:
2917 0 : nFormat = CF_NUM_TITLE;
2918 0 : break;
2919 : case text::ChapterFormat::NO_PREFIX_SUFFIX:
2920 0 : nFormat = CF_NUMBER_NOPREPST;
2921 0 : break;
2922 : case text::ChapterFormat::DIGIT:
2923 4 : nFormat = CF_NUM_NOPREPST_TITLE;
2924 4 : break;
2925 : default:
2926 0 : throw lang::IllegalArgumentException();
2927 : }
2928 4 : aToken.nChapterFormat = nFormat;
2929 : }
2930 : // #i53420#
2931 880 : else if ( pProperties[j].Name == "ChapterLevel" )
2932 : {
2933 0 : const sal_Int16 nLevel = lcl_AnyToInt16(pProperties[j].Value);
2934 0 : if( nLevel < 1 || nLevel > MAXLEVEL )
2935 : {
2936 0 : throw lang::IllegalArgumentException();
2937 : }
2938 0 : aToken.nOutlineLevel = nLevel;
2939 : }
2940 880 : else if ( pProperties[j].Name == "BibliographyDataField" )
2941 : {
2942 267 : sal_Int16 nType = 0;
2943 267 : pProperties[j].Value >>= nType;
2944 267 : if(nType < 0 || nType > text::BibliographyDataField::ISBN)
2945 : {
2946 0 : lang::IllegalArgumentException aExcept;
2947 0 : aExcept.Message = "BibliographyDataField - wrong value";
2948 0 : aExcept.ArgumentPosition = static_cast< sal_Int16 >(j);
2949 0 : throw aExcept;
2950 : }
2951 267 : aToken.nAuthorityField = nType;
2952 : }
2953 : // #i21237#
2954 613 : else if ( pProperties[j].Name == "WithTab" )
2955 : {
2956 613 : aToken.bWithTab = lcl_AnyToBool(pProperties[j].Value);
2957 : }
2958 :
2959 : }
2960 : //exception if wrong TokenType
2961 4916 : if(TOKEN_END <= aToken.eTokenType )
2962 : {
2963 0 : throw lang::IllegalArgumentException();
2964 : }
2965 : // set TokenType from TOKEN_ENTRY_TEXT to TOKEN_ENTRY if it is
2966 : // not a content index
2967 5527 : if(TOKEN_ENTRY_TEXT == aToken.eTokenType &&
2968 611 : (TOX_CONTENT != rTOXBase.GetType()))
2969 : {
2970 42 : aToken.eTokenType = TOKEN_ENTRY;
2971 : }
2972 : // #i53420#
2973 : // check for chapter format allowed values if it was TOKEN_ENTRY_NO type
2974 : // only allowed value are CF_NUMBER and CF_NUM_NOPREPST_TITLE
2975 : // reading from file
2976 4916 : if( TOKEN_ENTRY_NO == aToken.eTokenType )
2977 : {
2978 566 : switch(aToken.nChapterFormat)
2979 : {
2980 : case CF_NUMBER:
2981 : case CF_NUM_NOPREPST_TITLE:
2982 566 : break;
2983 : default:
2984 0 : throw lang::IllegalArgumentException();
2985 : }
2986 : }
2987 4916 : sPattern += aToken.GetString();
2988 4916 : }
2989 678 : SwForm aForm(rTOXBase.GetTOXForm());
2990 678 : aForm.SetPattern(static_cast<sal_uInt16>(nIndex), sPattern);
2991 1356 : rTOXBase.SetTOXForm(aForm);
2992 678 : }
2993 :
2994 : sal_Int32 SAL_CALL
2995 72 : SwXDocumentIndex::TokenAccess_Impl::getCount() throw (uno::RuntimeException, std::exception)
2996 : {
2997 72 : SolarMutexGuard aGuard;
2998 :
2999 72 : const sal_Int32 nRet = m_xParent->m_pImpl->GetFormMax();
3000 72 : return nRet;
3001 : }
3002 :
3003 : uno::Any SAL_CALL
3004 573 : SwXDocumentIndex::TokenAccess_Impl::getByIndex(sal_Int32 nIndex)
3005 : throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException,
3006 : uno::RuntimeException, std::exception)
3007 : {
3008 573 : SolarMutexGuard aGuard;
3009 :
3010 573 : SwTOXBase & rTOXBase( m_xParent->m_pImpl->GetTOXSectionOrThrow() );
3011 :
3012 573 : if ((nIndex < 0) || (nIndex > rTOXBase.GetTOXForm().GetFormMax()))
3013 : {
3014 0 : throw lang::IndexOutOfBoundsException();
3015 : }
3016 :
3017 : // #i21237#
3018 573 : SwFormTokens aPattern = rTOXBase.GetTOXForm().
3019 1719 : GetPattern(static_cast<sal_uInt16>(nIndex));
3020 573 : SwFormTokens::iterator aIt = aPattern.begin();
3021 :
3022 573 : sal_Int32 nTokenCount = 0;
3023 1146 : uno::Sequence< beans::PropertyValues > aRetSeq;
3024 1146 : OUString aProgCharStyle;
3025 4503 : while(aIt != aPattern.end()) // #i21237#
3026 : {
3027 3357 : nTokenCount++;
3028 3357 : aRetSeq.realloc(nTokenCount);
3029 3357 : beans::PropertyValues* pTokenProps = aRetSeq.getArray();
3030 3357 : SwFormToken aToken = *aIt; // #i21237#
3031 :
3032 : uno::Sequence< beans::PropertyValue >& rCurTokenSeq =
3033 3357 : pTokenProps[nTokenCount-1];
3034 : SwStyleNameMapper::FillProgName(
3035 : aToken.sCharStyleName,
3036 : aProgCharStyle,
3037 : nsSwGetPoolIdFromName::GET_POOLID_CHRFMT,
3038 3357 : true );
3039 3357 : switch(aToken.eTokenType)
3040 : {
3041 : case TOKEN_ENTRY_NO:
3042 : {
3043 : // #i53420#
3044 : // writing to file (from doc to properties)
3045 520 : sal_Int32 nElements = 2;
3046 520 : sal_Int32 nCurrentElement = 0;
3047 :
3048 : // check for default value
3049 520 : if (aToken.nChapterFormat != CF_NUMBER)
3050 : {
3051 0 : nElements++;//we need the element
3052 : }
3053 520 : if( aToken.nOutlineLevel != MAXLEVEL )
3054 : {
3055 0 : nElements++;
3056 : }
3057 :
3058 520 : rCurTokenSeq.realloc( nElements );
3059 :
3060 520 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3061 :
3062 520 : pArr[nCurrentElement].Name = "TokenType";
3063 1040 : pArr[nCurrentElement++].Value <<=
3064 520 : OUString("TokenEntryNumber");
3065 :
3066 520 : pArr[nCurrentElement].Name = "CharacterStyleName";
3067 520 : pArr[nCurrentElement++].Value <<= aProgCharStyle;
3068 520 : if( aToken.nChapterFormat != CF_NUMBER )
3069 : {
3070 0 : pArr[nCurrentElement].Name = "ChapterFormat";
3071 : sal_Int16 nVal;
3072 : // the allowed values for chapter format, when used as entry number,
3073 : // are CF_NUMBER and CF_NUM_NOPREPST_TITLE only, all else forced to
3074 : //CF_NUMBER
3075 0 : switch(aToken.nChapterFormat)
3076 : {
3077 : default:
3078 : case CF_NUMBER:
3079 0 : nVal = text::ChapterFormat::NUMBER;
3080 0 : break;
3081 : case CF_NUM_NOPREPST_TITLE:
3082 0 : nVal = text::ChapterFormat::DIGIT;
3083 0 : break;
3084 : }
3085 0 : pArr[nCurrentElement++].Value <<= nVal;
3086 : }
3087 :
3088 : // only a ChapterLevel != MAXLEVEL is registered
3089 520 : if (aToken.nOutlineLevel != MAXLEVEL)
3090 : {
3091 0 : pArr[nCurrentElement].Name = "ChapterLevel";
3092 0 : pArr[nCurrentElement].Value <<= aToken.nOutlineLevel;
3093 : }
3094 : }
3095 520 : break;
3096 : case TOKEN_ENTRY: // no difference between Entry and Entry Text
3097 : case TOKEN_ENTRY_TEXT:
3098 : {
3099 549 : rCurTokenSeq.realloc( 2 );
3100 549 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3101 :
3102 549 : pArr[0].Name = "TokenType";
3103 549 : pArr[0].Value <<= OUString("TokenEntryText");
3104 :
3105 549 : pArr[1].Name = "CharacterStyleName";
3106 549 : pArr[1].Value <<= aProgCharStyle;
3107 : }
3108 549 : break;
3109 : case TOKEN_TAB_STOP:
3110 : {
3111 544 : rCurTokenSeq.realloc(5); // #i21237#
3112 544 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3113 :
3114 544 : pArr[0].Name = "TokenType";
3115 544 : pArr[0].Value <<= OUString("TokenTabStop");
3116 :
3117 544 : if(SVX_TAB_ADJUST_END == aToken.eTabAlign)
3118 : {
3119 544 : pArr[1].Name = "TabStopRightAligned";
3120 544 : pArr[1].Value <<= true;
3121 : }
3122 : else
3123 : {
3124 0 : pArr[1].Name = "TabStopPosition";
3125 0 : sal_Int32 nPos = (convertTwipToMm100(aToken.nTabStopPosition));
3126 0 : if(nPos < 0)
3127 0 : nPos = 0;
3128 0 : pArr[1].Value <<= (sal_Int32)nPos;
3129 : }
3130 544 : pArr[2].Name = "TabStopFillCharacter";
3131 544 : pArr[2].Value <<= OUString(aToken.cTabFillChar);
3132 544 : pArr[3].Name = "CharacterStyleName";
3133 544 : pArr[3].Value <<= aProgCharStyle;
3134 : // #i21237#
3135 544 : pArr[4].Name = "WithTab";
3136 544 : pArr[4].Value <<= aToken.bWithTab;
3137 : }
3138 544 : break;
3139 : case TOKEN_TEXT:
3140 : {
3141 67 : rCurTokenSeq.realloc( 3 );
3142 67 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3143 :
3144 67 : pArr[0].Name = "TokenType";
3145 67 : pArr[0].Value <<= OUString("TokenText");
3146 :
3147 67 : pArr[1].Name = "CharacterStyleName";
3148 67 : pArr[1].Value <<= aProgCharStyle;
3149 :
3150 67 : pArr[2].Name = "Text";
3151 67 : pArr[2].Value <<= aToken.sText;
3152 : }
3153 67 : break;
3154 : case TOKEN_PAGE_NUMS:
3155 : {
3156 544 : rCurTokenSeq.realloc( 2 );
3157 544 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3158 :
3159 544 : pArr[0].Name = "TokenType";
3160 544 : pArr[0].Value <<= OUString("TokenPageNumber");
3161 :
3162 544 : pArr[1].Name = "CharacterStyleName";
3163 544 : pArr[1].Value <<= aProgCharStyle;
3164 : }
3165 544 : break;
3166 : case TOKEN_CHAPTER_INFO:
3167 : {
3168 0 : rCurTokenSeq.realloc( 4 );
3169 0 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3170 :
3171 0 : pArr[0].Name = "TokenType";
3172 0 : pArr[0].Value <<= OUString("TokenChapterInfo");
3173 :
3174 0 : pArr[1].Name = "CharacterStyleName";
3175 0 : pArr[1].Value <<= aProgCharStyle;
3176 :
3177 0 : pArr[2].Name = "ChapterFormat";
3178 0 : sal_Int16 nVal = text::ChapterFormat::NUMBER;
3179 0 : switch(aToken.nChapterFormat)
3180 : {
3181 : case CF_NUMBER:
3182 0 : nVal = text::ChapterFormat::NUMBER;
3183 0 : break;
3184 : case CF_TITLE:
3185 0 : nVal = text::ChapterFormat::NAME;
3186 0 : break;
3187 : case CF_NUM_TITLE:
3188 0 : nVal = text::ChapterFormat::NAME_NUMBER;
3189 0 : break;
3190 : case CF_NUMBER_NOPREPST:
3191 0 : nVal = text::ChapterFormat::NO_PREFIX_SUFFIX;
3192 0 : break;
3193 : case CF_NUM_NOPREPST_TITLE:
3194 0 : nVal = text::ChapterFormat::DIGIT;
3195 0 : break;
3196 : }
3197 0 : pArr[2].Value <<= nVal;
3198 : // #i53420#
3199 0 : pArr[3].Name = "ChapterLevel";
3200 0 : pArr[3].Value <<= aToken.nOutlineLevel;
3201 : }
3202 0 : break;
3203 : case TOKEN_LINK_START:
3204 : {
3205 522 : rCurTokenSeq.realloc( 2 );
3206 522 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3207 :
3208 522 : pArr[0].Name = "TokenType";
3209 1044 : pArr[0].Value <<=
3210 522 : OUString("TokenHyperlinkStart");
3211 522 : pArr[1].Name = "CharacterStyleName";
3212 522 : pArr[1].Value <<= aProgCharStyle;
3213 : }
3214 522 : break;
3215 : case TOKEN_LINK_END:
3216 : {
3217 522 : rCurTokenSeq.realloc( 1 );
3218 522 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3219 :
3220 522 : pArr[0].Name = "TokenType";
3221 1044 : pArr[0].Value <<=
3222 522 : OUString("TokenHyperlinkEnd");
3223 : }
3224 522 : break;
3225 : case TOKEN_AUTHORITY:
3226 : {
3227 89 : rCurTokenSeq.realloc( 3 );
3228 89 : beans::PropertyValue* pArr = rCurTokenSeq.getArray();
3229 :
3230 89 : pArr[0].Name = "TokenType";
3231 178 : pArr[0].Value <<=
3232 89 : OUString("TokenBibliographyDataField");
3233 :
3234 89 : pArr[1].Name = "CharacterStyleName";
3235 89 : pArr[1].Value <<= aProgCharStyle;
3236 :
3237 89 : pArr[2].Name = "BibliographyDataField";
3238 89 : pArr[2].Value <<= sal_Int16(aToken.nAuthorityField);
3239 : }
3240 89 : break;
3241 :
3242 : default:
3243 : ;
3244 : }
3245 :
3246 3357 : ++aIt; // #i21237#
3247 3357 : }
3248 :
3249 573 : uno::Any aRet;
3250 573 : aRet <<= aRetSeq;
3251 1146 : return aRet;
3252 : }
3253 :
3254 : uno::Type SAL_CALL
3255 0 : SwXDocumentIndex::TokenAccess_Impl::getElementType()
3256 : throw (uno::RuntimeException, std::exception)
3257 : {
3258 0 : return cppu::UnoType<uno::Sequence< beans::PropertyValues >>::get();
3259 : }
3260 :
3261 : sal_Bool SAL_CALL
3262 0 : SwXDocumentIndex::TokenAccess_Impl::hasElements()
3263 : throw (uno::RuntimeException, std::exception)
3264 : {
3265 0 : return sal_True;
3266 177 : }
3267 :
3268 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|