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 <tools/resid.hxx>
21 : #include <unotools/charclass.hxx>
22 : #include <com/sun/star/i18n/CollatorOptions.hpp>
23 : #include <editeng/unolingu.hxx>
24 : #include <txtfld.hxx>
25 : #include <doc.hxx>
26 : #include <IDocumentLayoutAccess.hxx>
27 : #include <docary.hxx>
28 : #include <cntfrm.hxx>
29 : #include <node.hxx>
30 : #include <frmatr.hxx>
31 : #include <pam.hxx>
32 : #include <txttxmrk.hxx>
33 : #include <frmfmt.hxx>
34 : #include <fmtfld.hxx>
35 : #include <txmsrt.hxx>
36 : #include <ndtxt.hxx>
37 : #include <txtatr.hxx>
38 : #include <swtable.hxx>
39 : #include <expfld.hxx>
40 : #include <authfld.hxx>
41 : #include <toxwrap.hxx>
42 :
43 : #include <comcore.hrc>
44 : #include <numrule.hxx>
45 : #include <reffld.hxx>
46 :
47 : using namespace ::com::sun::star;
48 : using namespace ::com::sun::star::uno;
49 :
50 : // Initialize strings
51 : sal_uInt16 SwTOXSortTabBase::nOpt = 0;
52 :
53 7 : SwTOXInternational::SwTOXInternational( LanguageType nLang, sal_uInt16 nOpt,
54 : const OUString& rSortAlgorithm ) :
55 : eLang( nLang ),
56 : sSortAlgorithm(rSortAlgorithm),
57 7 : nOptions( nOpt )
58 : {
59 7 : Init();
60 7 : }
61 :
62 0 : SwTOXInternational::SwTOXInternational( const SwTOXInternational& rIntl ) :
63 : eLang( rIntl.eLang ),
64 : sSortAlgorithm(rIntl.sSortAlgorithm),
65 0 : nOptions( rIntl.nOptions )
66 : {
67 0 : Init();
68 0 : }
69 :
70 7 : void SwTOXInternational::Init()
71 : {
72 7 : pIndexWrapper = new IndexEntrySupplierWrapper();
73 :
74 7 : const lang::Locale aLcl( LanguageTag::convertToLocale( eLang ) );
75 7 : pIndexWrapper->SetLocale( aLcl );
76 :
77 7 : if(sSortAlgorithm.isEmpty())
78 : {
79 5 : Sequence < OUString > aSeq( pIndexWrapper->GetAlgorithmList( aLcl ));
80 5 : if(aSeq.getLength())
81 5 : sSortAlgorithm = aSeq.getConstArray()[0];
82 : }
83 :
84 7 : if ( nOptions & nsSwTOIOptions::TOI_CASE_SENSITIVE )
85 2 : pIndexWrapper->LoadAlgorithm( aLcl, sSortAlgorithm, 0 );
86 : else
87 5 : pIndexWrapper->LoadAlgorithm( aLcl, sSortAlgorithm, SW_COLLATOR_IGNORES );
88 :
89 7 : pCharClass = new CharClass( LanguageTag( aLcl ));
90 :
91 7 : }
92 :
93 14 : SwTOXInternational::~SwTOXInternational()
94 : {
95 7 : delete pCharClass;
96 7 : delete pIndexWrapper;
97 7 : }
98 :
99 1 : OUString SwTOXInternational::ToUpper( const OUString& rStr, sal_Int32 nPos ) const
100 : {
101 1 : return pCharClass->uppercase( rStr, nPos, 1 );
102 : }
103 :
104 0 : inline bool SwTOXInternational::IsNumeric( const OUString& rStr ) const
105 : {
106 0 : return pCharClass->isNumeric( rStr );
107 : }
108 :
109 0 : sal_Int32 SwTOXInternational::Compare( const TextAndReading& rTaR1,
110 : const lang::Locale& rLocale1,
111 : const TextAndReading& rTaR2,
112 : const lang::Locale& rLocale2 ) const
113 : {
114 : return pIndexWrapper->CompareIndexEntry( rTaR1.sText, rTaR1.sReading, rLocale1,
115 0 : rTaR2.sText, rTaR2.sReading, rLocale2 );
116 : }
117 :
118 1 : OUString SwTOXInternational::GetIndexKey( const TextAndReading& rTaR,
119 : const lang::Locale& rLocale ) const
120 : {
121 1 : return pIndexWrapper->GetIndexKey( rTaR.sText, rTaR.sReading, rLocale );
122 : }
123 :
124 0 : OUString SwTOXInternational::GetFollowingText( bool bMorePages ) const
125 : {
126 0 : return pIndexWrapper->GetFollowingText( bMorePages );
127 : }
128 :
129 : // SortElement for TOX entries
130 6 : SwTOXSortTabBase::SwTOXSortTabBase( TOXSortType nTyp, const SwContentNode* pNd,
131 : const SwTextTOXMark* pMark,
132 : const SwTOXInternational* pInter,
133 : const lang::Locale* pLocale )
134 : : pTOXNd( 0 ), pTextMark( pMark ), pTOXIntl( pInter ),
135 6 : nPos( 0 ), nCntPos( 0 ), nType( static_cast<sal_uInt16>(nTyp) ), bValidText( false )
136 : {
137 6 : if ( pLocale )
138 1 : aLocale = *pLocale;
139 :
140 6 : if( pNd )
141 : {
142 4 : sal_Int32 n = 0;
143 4 : if( pTextMark )
144 1 : n = pTextMark->GetStart();
145 4 : SwTOXSource aTmp( pNd, n, pTextMark && pTextMark->GetTOXMark().IsMainEntry() );
146 4 : aTOXSources.push_back(aTmp);
147 :
148 4 : nPos = pNd->GetIndex();
149 :
150 4 : switch( nTyp )
151 : {
152 : case TOX_SORT_CONTENT:
153 : case TOX_SORT_PARA:
154 : case TOX_SORT_TABLE:
155 : // If they are in a special areas, we should get the position at the
156 : // body
157 3 : if( nPos < pNd->GetNodes().GetEndOfExtras().GetIndex() )
158 : {
159 : // Then get the 'anchor' (body) position
160 0 : Point aPt;
161 0 : const SwContentFrm* pFrm = pNd->getLayoutFrm( pNd->GetDoc()->getIDocumentLayoutAccess().GetCurrentLayout(), &aPt, 0, false );
162 0 : if( pFrm )
163 : {
164 0 : SwPosition aPos( *pNd );
165 0 : const SwDoc& rDoc = *pNd->GetDoc();
166 0 : bool const bResult = GetBodyTextNode( rDoc, aPos, *pFrm );
167 : OSL_ENSURE(bResult, "where is the text node");
168 : (void) bResult; // unused in non-debug
169 0 : nPos = aPos.nNode.GetIndex();
170 0 : nCntPos = aPos.nContent.GetIndex();
171 : }
172 : }
173 : else
174 3 : nCntPos = n;
175 3 : break;
176 1 : default: break;
177 : }
178 : }
179 6 : }
180 :
181 0 : OUString SwTOXSortTabBase::GetURL() const
182 : {
183 0 : return OUString();
184 : }
185 :
186 0 : void SwTOXSortTabBase::FillText( SwTextNode& rNd, const SwIndex& rInsPos,
187 : sal_uInt16 ) const
188 : {
189 0 : rNd.InsertText( GetText().sText, rInsPos );
190 0 : }
191 :
192 1 : bool SwTOXSortTabBase::operator==( const SwTOXSortTabBase& rCmp )
193 : {
194 1 : bool bRet = nPos == rCmp.nPos && nCntPos == rCmp.nCntPos &&
195 0 : (!aTOXSources[0].pNd || !rCmp.aTOXSources[0].pNd ||
196 1 : aTOXSources[0].pNd == rCmp.aTOXSources[0].pNd );
197 :
198 1 : if( TOX_SORT_CONTENT == nType )
199 : {
200 0 : bRet = bRet && pTextMark && rCmp.pTextMark &&
201 0 : pTextMark->GetStart() == rCmp.pTextMark->GetStart();
202 :
203 0 : if( bRet )
204 : {
205 : // Both pointers exist -> compare text
206 : // else -> compare AlternativeText
207 0 : const sal_Int32 *pEnd = pTextMark->End();
208 0 : const sal_Int32 *pEndCmp = rCmp.pTextMark->End();
209 :
210 0 : bRet = ( ( pEnd && pEndCmp ) || ( !pEnd && !pEndCmp ) ) &&
211 0 : pTOXIntl->IsEqual( GetText(), GetLocale(),
212 0 : rCmp.GetText(), rCmp.GetLocale() );
213 : }
214 : }
215 1 : return bRet;
216 : }
217 :
218 1 : bool SwTOXSortTabBase::operator<( const SwTOXSortTabBase& rCmp )
219 : {
220 1 : if( nPos < rCmp.nPos )
221 0 : return true;
222 :
223 1 : if( nPos == rCmp.nPos )
224 : {
225 0 : if( nCntPos < rCmp.nCntPos )
226 0 : return true;
227 :
228 0 : if( nCntPos == rCmp.nCntPos )
229 : {
230 0 : const SwNode* pFirst = aTOXSources[0].pNd;
231 0 : const SwNode* pNext = rCmp.aTOXSources[0].pNd;
232 :
233 0 : if( pFirst && pFirst == pNext )
234 : {
235 0 : if( TOX_SORT_CONTENT == nType && pTextMark && rCmp.pTextMark )
236 : {
237 0 : if( pTextMark->GetStart() < rCmp.pTextMark->GetStart() )
238 0 : return true;
239 :
240 0 : if( pTextMark->GetStart() == rCmp.pTextMark->GetStart() )
241 : {
242 0 : const sal_Int32 *pEnd = pTextMark->End();
243 0 : const sal_Int32 *pEndCmp = rCmp.pTextMark->End();
244 :
245 : // Both pointers exist -> compare text
246 : // else -> compare AlternativeText
247 0 : if( ( pEnd && pEndCmp ) || ( !pEnd && !pEndCmp ) )
248 : {
249 0 : return pTOXIntl->IsLess( GetText(), GetLocale(),
250 0 : rCmp.GetText(), rCmp.GetLocale() );
251 : }
252 0 : if( pEnd && !pEndCmp )
253 0 : return true;
254 : }
255 0 : }
256 : }
257 0 : else if( pFirst && pFirst->IsTextNode() &&
258 0 : pNext && pNext->IsTextNode() )
259 0 : return ::IsFrameBehind( *static_cast<const SwTextNode*>(pNext), nCntPos,
260 0 : *static_cast<const SwTextNode*>(pFirst), nCntPos );
261 : }
262 : }
263 1 : return false;
264 : }
265 :
266 : // Sorted keyword entry
267 1 : SwTOXIndex::SwTOXIndex( const SwTextNode& rNd,
268 : const SwTextTOXMark* pMark, sal_uInt16 nOptions,
269 : sal_uInt8 nKyLevel,
270 : const SwTOXInternational& rIntl,
271 : const lang::Locale& rLocale )
272 : : SwTOXSortTabBase( TOX_SORT_INDEX, &rNd, pMark, &rIntl, &rLocale ),
273 1 : nKeyLevel(nKyLevel)
274 : {
275 1 : nPos = rNd.GetIndex();
276 1 : nOpt = nOptions;
277 1 : }
278 :
279 : // Compare keywords. Only relates to the text.
280 :
281 0 : bool SwTOXIndex::operator==( const SwTOXSortTabBase& rCmpBase )
282 : {
283 0 : const SwTOXIndex& rCmp = static_cast<const SwTOXIndex&>(rCmpBase);
284 :
285 : // Respect case taking dependencies into account
286 0 : if(GetLevel() != rCmp.GetLevel() || nKeyLevel != rCmp.nKeyLevel)
287 0 : return false;
288 :
289 : OSL_ENSURE(pTextMark, "pTextMark == 0, No keyword");
290 :
291 0 : bool bRet = pTOXIntl->IsEqual( GetText(), GetLocale(),
292 0 : rCmp.GetText(), rCmp.GetLocale() );
293 :
294 : // If we don't summarize we need to evaluate the Pos
295 0 : if(bRet && !(GetOptions() & nsSwTOIOptions::TOI_SAME_ENTRY))
296 0 : bRet = nPos == rCmp.nPos;
297 :
298 0 : return bRet;
299 : }
300 :
301 : // operator, only depends on the text
302 :
303 0 : bool SwTOXIndex::operator<( const SwTOXSortTabBase& rCmpBase )
304 : {
305 0 : const SwTOXIndex& rCmp = static_cast<const SwTOXIndex&>(rCmpBase);
306 :
307 : OSL_ENSURE(pTextMark, "pTextMark == 0, No keyword");
308 :
309 0 : const TextAndReading aMyTaR(GetText());
310 0 : const TextAndReading aOtherTaR(rCmp.GetText());
311 :
312 0 : bool bRet = GetLevel() == rCmp.GetLevel() &&
313 0 : pTOXIntl->IsLess( aMyTaR, GetLocale(),
314 0 : aOtherTaR, rCmp.GetLocale() );
315 :
316 : // If we don't summarize we need to evaluate the Pos
317 0 : if( !bRet && !(GetOptions() & nsSwTOIOptions::TOI_SAME_ENTRY) )
318 : {
319 0 : bRet = pTOXIntl->IsEqual( aMyTaR, GetLocale(),
320 0 : aOtherTaR, rCmp.GetLocale() ) &&
321 0 : nPos < rCmp.nPos;
322 : }
323 :
324 0 : return bRet;
325 : }
326 :
327 : // The keyword itself
328 :
329 1 : TextAndReading SwTOXIndex::GetText_Impl() const
330 : {
331 : OSL_ENSURE(pTextMark, "pTextMark == 0, No keyword");
332 1 : const SwTOXMark& rTOXMark = pTextMark->GetTOXMark();
333 :
334 1 : TextAndReading aRet;
335 1 : switch(nKeyLevel)
336 : {
337 : case FORM_PRIMARY_KEY :
338 : {
339 0 : aRet.sText = rTOXMark.GetPrimaryKey();
340 0 : aRet.sReading = rTOXMark.GetPrimaryKeyReading();
341 : }
342 0 : break;
343 : case FORM_SECONDARY_KEY :
344 : {
345 0 : aRet.sText = rTOXMark.GetSecondaryKey();
346 0 : aRet.sReading = rTOXMark.GetSecondaryKeyReading();
347 : }
348 0 : break;
349 : case FORM_ENTRY :
350 : {
351 1 : aRet.sText = rTOXMark.GetText();
352 1 : aRet.sReading = rTOXMark.GetTextReading();
353 : }
354 1 : break;
355 : }
356 : // if TOI_INITIAL_CAPS is set, first character is to be capitalized
357 1 : if( nsSwTOIOptions::TOI_INITIAL_CAPS & nOpt && pTOXIntl && !aRet.sText.isEmpty())
358 : {
359 1 : aRet.sText = pTOXIntl->ToUpper( aRet.sText, 0 ) + aRet.sText.copy(1);
360 : }
361 :
362 1 : return aRet;
363 : }
364 :
365 0 : void SwTOXIndex::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 ) const
366 : {
367 0 : const sal_Int32* pEnd = pTextMark->End();
368 :
369 0 : TextAndReading aRet;
370 0 : if( pEnd && !pTextMark->GetTOXMark().IsAlternativeText() &&
371 0 : 0 == (GetOptions() & nsSwTOIOptions::TOI_KEY_AS_ENTRY))
372 : {
373 0 : aRet.sText = static_cast<const SwTextNode*>(aTOXSources[0].pNd)->GetExpandText(
374 0 : pTextMark->GetStart(),
375 0 : *pEnd - pTextMark->GetStart());
376 0 : if(nsSwTOIOptions::TOI_INITIAL_CAPS & nOpt && pTOXIntl && !aRet.sText.isEmpty())
377 : {
378 0 : aRet.sText = pTOXIntl->ToUpper( aRet.sText, 0 ) + aRet.sText.copy(1);
379 : }
380 : }
381 : else
382 0 : aRet = GetText();
383 :
384 0 : rNd.InsertText( aRet.sText, rInsPos );
385 0 : }
386 :
387 3 : sal_uInt16 SwTOXIndex::GetLevel() const
388 : {
389 : OSL_ENSURE(pTextMark, "pTextMark == 0, No keyword");
390 :
391 3 : sal_uInt16 nForm = FORM_PRIMARY_KEY;
392 :
393 9 : if( 0 == (GetOptions() & nsSwTOIOptions::TOI_KEY_AS_ENTRY)&&
394 3 : !pTextMark->GetTOXMark().GetPrimaryKey().isEmpty() )
395 : {
396 0 : nForm = FORM_SECONDARY_KEY;
397 0 : if( !pTextMark->GetTOXMark().GetSecondaryKey().isEmpty() )
398 0 : nForm = FORM_ENTRY;
399 : }
400 3 : return nForm;
401 : }
402 :
403 : // Key and separator
404 0 : SwTOXCustom::SwTOXCustom(const TextAndReading& rKey,
405 : sal_uInt16 nLevel,
406 : const SwTOXInternational& rIntl,
407 : const lang::Locale& rLocale )
408 : : SwTOXSortTabBase( TOX_SORT_CUSTOM, 0, 0, &rIntl, &rLocale ),
409 0 : m_aKey(rKey), nLev(nLevel)
410 : {
411 0 : }
412 :
413 0 : bool SwTOXCustom::operator==(const SwTOXSortTabBase& rCmpBase)
414 : {
415 0 : return GetLevel() == rCmpBase.GetLevel() &&
416 0 : pTOXIntl->IsEqual( GetText(), GetLocale(),
417 0 : rCmpBase.GetText(), rCmpBase.GetLocale() );
418 : }
419 :
420 0 : bool SwTOXCustom::operator < (const SwTOXSortTabBase& rCmpBase)
421 : {
422 0 : return GetLevel() <= rCmpBase.GetLevel() &&
423 0 : pTOXIntl->IsLess( GetText(), GetLocale(),
424 0 : rCmpBase.GetText(), rCmpBase.GetLocale() );
425 : }
426 :
427 0 : sal_uInt16 SwTOXCustom::GetLevel() const
428 : {
429 0 : return nLev;
430 : }
431 :
432 0 : TextAndReading SwTOXCustom::GetText_Impl() const
433 : {
434 0 : return m_aKey;
435 : }
436 :
437 : // Sorts the TOX entries
438 0 : SwTOXContent::SwTOXContent( const SwTextNode& rNd, const SwTextTOXMark* pMark,
439 : const SwTOXInternational& rIntl)
440 0 : : SwTOXSortTabBase( TOX_SORT_CONTENT, &rNd, pMark, &rIntl )
441 : {
442 0 : }
443 :
444 : // The content's text
445 :
446 0 : TextAndReading SwTOXContent::GetText_Impl() const
447 : {
448 0 : const sal_Int32* pEnd = pTextMark->End();
449 0 : if( pEnd && !pTextMark->GetTOXMark().IsAlternativeText() )
450 : {
451 : return TextAndReading(
452 0 : static_cast<const SwTextNode*>(aTOXSources[0].pNd)->GetExpandText(
453 0 : pTextMark->GetStart(),
454 0 : *pEnd - pTextMark->GetStart() ),
455 0 : pTextMark->GetTOXMark().GetTextReading());
456 : }
457 :
458 0 : return TextAndReading(pTextMark->GetTOXMark().GetAlternativeText(), OUString());
459 : }
460 :
461 0 : void SwTOXContent::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 ) const
462 : {
463 0 : const sal_Int32* pEnd = pTextMark->End();
464 0 : if( pEnd && !pTextMark->GetTOXMark().IsAlternativeText() )
465 0 : static_cast<const SwTextNode*>(aTOXSources[0].pNd)->GetExpandText( rNd, &rInsPos,
466 0 : pTextMark->GetStart(),
467 0 : *pEnd - pTextMark->GetStart() );
468 : else
469 : {
470 0 : rNd.InsertText( GetText().sText, rInsPos );
471 : }
472 0 : }
473 :
474 : // The level for displaying it
475 :
476 0 : sal_uInt16 SwTOXContent::GetLevel() const
477 : {
478 0 : return pTextMark->GetTOXMark().GetLevel();
479 : }
480 :
481 : // TOX assembled from paragraphs
482 : // Watch out for OLE/graphics when sorting!
483 : // The position must not come from the document, but from the "anchor"!
484 3 : SwTOXPara::SwTOXPara( const SwContentNode& rNd, SwTOXElement eT, sal_uInt16 nLevel, const OUString& sSeqName )
485 : : SwTOXSortTabBase( TOX_SORT_PARA, &rNd, 0, 0 ),
486 : eType( eT ),
487 : m_nLevel(nLevel),
488 : nStartIndex(0),
489 : nEndIndex(-1),
490 3 : m_sSequenceName( sSeqName )
491 : {
492 3 : }
493 :
494 3 : TextAndReading SwTOXPara::GetText_Impl() const
495 : {
496 3 : const SwContentNode* pNd = aTOXSources[0].pNd;
497 3 : switch( eType )
498 : {
499 : case nsSwTOXElement::TOX_SEQUENCE:
500 : case nsSwTOXElement::TOX_TEMPLATE:
501 : case nsSwTOXElement::TOX_OUTLINELEVEL:
502 : {
503 : return TextAndReading(static_cast<const SwTextNode*>(pNd)->GetExpandText(
504 : nStartIndex,
505 3 : nEndIndex == -1 ? -1 : nEndIndex - nStartIndex),
506 6 : OUString());
507 : }
508 : break;
509 :
510 : case nsSwTOXElement::TOX_OLE:
511 : case nsSwTOXElement::TOX_GRAPHIC:
512 : case nsSwTOXElement::TOX_FRAME:
513 : {
514 : // Find the FlyFormat; the object/graphic name is there
515 0 : SwFrameFormat* pFly = pNd->GetFlyFormat();
516 0 : if( pFly )
517 0 : return TextAndReading(pFly->GetName(), OUString());
518 :
519 : OSL_ENSURE( false, "Graphic/object without name" );
520 0 : sal_uInt16 nId = nsSwTOXElement::TOX_OLE == eType
521 : ? STR_OBJECT_DEFNAME
522 0 : : nsSwTOXElement::TOX_GRAPHIC == eType
523 : ? STR_GRAPHIC_DEFNAME
524 0 : : STR_FRAME_DEFNAME;
525 0 : return TextAndReading(SW_RESSTR( nId ), OUString());
526 : }
527 : break;
528 0 : default: break;
529 : }
530 0 : return TextAndReading();
531 : }
532 :
533 0 : void SwTOXPara::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 ) const
534 : {
535 0 : if( nsSwTOXElement::TOX_TEMPLATE == eType || nsSwTOXElement::TOX_SEQUENCE == eType || nsSwTOXElement::TOX_OUTLINELEVEL == eType)
536 : {
537 0 : const SwTextNode* pSrc = static_cast<const SwTextNode*>(aTOXSources[0].pNd);
538 : pSrc->GetExpandText( rNd, &rInsPos, nStartIndex,
539 0 : nEndIndex == -1 ? -1 : nEndIndex - nStartIndex,
540 0 : false, false, true );
541 : }
542 : else
543 : {
544 0 : rNd.InsertText( GetText().sText.replace('\t', ' '), rInsPos );
545 : }
546 0 : }
547 :
548 6 : sal_uInt16 SwTOXPara::GetLevel() const
549 : {
550 6 : sal_uInt16 nRet = m_nLevel;
551 6 : const SwContentNode* pNd = aTOXSources[0].pNd;
552 :
553 6 : if( nsSwTOXElement::TOX_OUTLINELEVEL == eType && pNd->GetTextNode() )
554 : {
555 6 : const int nTmp = static_cast<const SwTextNode*>(pNd)->GetAttrOutlineLevel();
556 6 : if(nTmp != 0 )
557 6 : nRet = static_cast<sal_uInt16>(nTmp);
558 : }
559 6 : return nRet;
560 : }
561 :
562 3 : OUString SwTOXPara::GetURL() const
563 : {
564 3 : OUString aText;
565 3 : const SwContentNode* pNd = aTOXSources[0].pNd;
566 3 : switch( eType )
567 : {
568 : case nsSwTOXElement::TOX_TEMPLATE:
569 : case nsSwTOXElement::TOX_OUTLINELEVEL:
570 : {
571 3 : const SwTextNode * pTextNd = pNd->GetTextNode();
572 :
573 3 : SwDoc* pDoc = const_cast<SwDoc*>( pTextNd->GetDoc() );
574 3 : ::sw::mark::IMark const * const pMark = pDoc->getIDocumentMarkAccess()->getMarkForTextNode(
575 : *(pTextNd),
576 3 : IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK);
577 3 : aText = "#" + pMark->GetName();
578 : }
579 3 : break;
580 :
581 : case nsSwTOXElement::TOX_OLE:
582 : case nsSwTOXElement::TOX_GRAPHIC:
583 : case nsSwTOXElement::TOX_FRAME:
584 : {
585 : // Find the FlyFormat; the object/graphic name is there
586 0 : SwFrameFormat* pFly = pNd->GetFlyFormat();
587 0 : if( pFly )
588 : {
589 0 : aText = "#" + pFly->GetName() + OUStringLiteral1<cMarkSeparator>();
590 : const sal_Char* pStr;
591 0 : switch( eType )
592 : {
593 0 : case nsSwTOXElement::TOX_OLE: pStr = "ole"; break;
594 0 : case nsSwTOXElement::TOX_GRAPHIC: pStr = "graphic"; break;
595 0 : case nsSwTOXElement::TOX_FRAME: pStr = "frame"; break;
596 0 : default: pStr = 0;
597 : }
598 0 : if( pStr )
599 0 : aText += OUString::createFromAscii( pStr );
600 : }
601 : }
602 0 : break;
603 : case nsSwTOXElement::TOX_SEQUENCE:
604 : {
605 0 : aText = "#" + m_sSequenceName + OUStringLiteral1<cMarkSeparator>()
606 0 : + "sequence";
607 : }
608 0 : break;
609 0 : default: break;
610 : }
611 3 : return aText;
612 : }
613 :
614 : // Table
615 0 : SwTOXTable::SwTOXTable( const SwContentNode& rNd )
616 : : SwTOXSortTabBase( TOX_SORT_TABLE, &rNd, 0, 0 ),
617 0 : nLevel(FORM_ALPHA_DELIMITTER)
618 : {
619 0 : }
620 :
621 0 : TextAndReading SwTOXTable::GetText_Impl() const
622 : {
623 0 : const SwNode* pNd = aTOXSources[0].pNd;
624 0 : if( pNd )
625 : {
626 : const SwTableNode* pTableNd =
627 0 : reinterpret_cast<const SwTableNode*>(pNd->FindTableNode());
628 0 : if (pTableNd)
629 : {
630 0 : return TextAndReading(pTableNd->GetTable().GetFrameFormat()->GetName(), OUString());
631 : }
632 : }
633 :
634 : OSL_ENSURE( false, "Where's my table?" );
635 0 : return TextAndReading(SW_RESSTR( STR_TABLE_DEFNAME ), OUString());
636 : }
637 :
638 0 : sal_uInt16 SwTOXTable::GetLevel() const
639 : {
640 0 : return nLevel;
641 : }
642 :
643 0 : OUString SwTOXTable::GetURL() const
644 : {
645 0 : const SwNode* pNd = aTOXSources[0].pNd;
646 0 : if (!pNd)
647 0 : return OUString();
648 :
649 0 : pNd = pNd->FindTableNode();
650 0 : if (!pNd)
651 0 : return OUString();
652 :
653 0 : const OUString sName = static_cast<const SwTableNode*>(pNd)->GetTable().GetFrameFormat()->GetName();
654 0 : if ( sName.isEmpty() )
655 0 : return OUString();
656 :
657 0 : return "#" + sName + OUStringLiteral1<cMarkSeparator>() + "table";
658 : }
659 :
660 0 : SwTOXAuthority::SwTOXAuthority( const SwContentNode& rNd,
661 : SwFormatField& rField, const SwTOXInternational& rIntl ) :
662 : SwTOXSortTabBase( TOX_SORT_AUTHORITY, &rNd, 0, &rIntl ),
663 0 : m_rField(rField)
664 : {
665 0 : if(rField.GetTextField())
666 0 : nCntPos = rField.GetTextField()->GetStart();
667 0 : }
668 :
669 0 : sal_uInt16 SwTOXAuthority::GetLevel() const
670 : {
671 0 : OUString sText(static_cast<SwAuthorityField*>(m_rField.GetField())->GetFieldText(AUTH_FIELD_AUTHORITY_TYPE));
672 : //#i18655# the level '0' is the heading level therefore the values are incremented here
673 0 : sal_uInt16 nRet = 1;
674 0 : if( pTOXIntl->IsNumeric( sText ) )
675 : {
676 0 : nRet = (sal_uInt16)sText.toInt32();
677 0 : nRet++;
678 : }
679 : //illegal values are also set to 'ARTICLE' as non-numeric values are
680 0 : if(nRet > AUTH_TYPE_END)
681 0 : nRet = 1;
682 0 : return nRet;
683 : }
684 :
685 0 : static OUString lcl_GetText(SwFormatField const& rField)
686 : {
687 0 : return rField.GetField()->ExpandField(true);
688 : }
689 :
690 0 : TextAndReading SwTOXAuthority::GetText_Impl() const
691 : {
692 0 : return TextAndReading(lcl_GetText(m_rField), OUString());
693 : }
694 :
695 0 : void SwTOXAuthority::FillText( SwTextNode& rNd,
696 : const SwIndex& rInsPos, sal_uInt16 nAuthField ) const
697 : {
698 0 : SwAuthorityField* pField = static_cast<SwAuthorityField*>(m_rField.GetField());
699 0 : OUString sText;
700 0 : if(AUTH_FIELD_IDENTIFIER == nAuthField)
701 : {
702 0 : sText = lcl_GetText(m_rField);
703 0 : const SwAuthorityFieldType* pType = static_cast<const SwAuthorityFieldType*>(pField->GetTyp());
704 0 : sal_Unicode cChar = pType->GetPrefix();
705 0 : if(cChar && cChar != ' ')
706 0 : sText = sText.copy(1);
707 0 : cChar = pType->GetSuffix();
708 0 : if(cChar && cChar != ' ')
709 0 : sText = sText.copy(0, sText.getLength() - 1);
710 : }
711 0 : else if(AUTH_FIELD_AUTHORITY_TYPE == nAuthField)
712 : {
713 0 : sal_uInt16 nLevel = GetLevel();
714 0 : if(nLevel)
715 0 : sText = SwAuthorityFieldType::GetAuthTypeName((ToxAuthorityType) --nLevel);
716 : }
717 : else
718 0 : sText = (pField->GetFieldText((ToxAuthorityField) nAuthField));
719 0 : rNd.InsertText( sText, rInsPos );
720 0 : }
721 :
722 0 : bool SwTOXAuthority::operator==( const SwTOXSortTabBase& rCmp)
723 : {
724 0 : return nType == rCmp.nType &&
725 0 : static_cast<SwAuthorityField*>(m_rField.GetField())->GetHandle() ==
726 0 : static_cast<SwAuthorityField*>(static_cast<const SwTOXAuthority&>(rCmp).m_rField.GetField())->GetHandle();
727 : }
728 :
729 0 : bool SwTOXAuthority::operator<( const SwTOXSortTabBase& rBase)
730 : {
731 0 : bool bRet = false;
732 0 : SwAuthorityField* pField = static_cast<SwAuthorityField*>(m_rField.GetField());
733 : SwAuthorityFieldType* pType = static_cast<SwAuthorityFieldType*>(
734 0 : pField->GetTyp());
735 0 : if(pType->IsSortByDocument())
736 0 : bRet = SwTOXSortTabBase::operator<(rBase);
737 : else
738 : {
739 : SwAuthorityField* pCmpField =
740 0 : static_cast<SwAuthorityField*>(static_cast<const SwTOXAuthority&>(rBase).m_rField.GetField());
741 :
742 0 : for(sal_uInt16 i = 0; i < pType->GetSortKeyCount(); i++)
743 : {
744 0 : const SwTOXSortKey* pKey = pType->GetSortKey(i);
745 0 : const TextAndReading aMy(pField->GetFieldText(pKey->eField), OUString());
746 0 : const TextAndReading aOther(pCmpField->GetFieldText(pKey->eField), OUString());
747 :
748 0 : sal_Int32 nComp = pTOXIntl->Compare( aMy, GetLocale(),
749 0 : aOther, rBase.GetLocale() );
750 :
751 0 : if( nComp )
752 : {
753 0 : bRet = (-1 == nComp) == pKey->bSortAscending;
754 0 : break;
755 : }
756 0 : }
757 : }
758 0 : return bRet;
759 177 : }
760 :
761 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|