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 <com/sun/star/lang/XComponent.hpp>
21 :
22 : #include <tools/tenccvt.hxx>
23 : #include <comphelper/processfactory.hxx>
24 : #include <unotools/intlwrapper.hxx>
25 : #include <svl/smplhint.hxx>
26 : #include <svl/poolitem.hxx>
27 : #include <svl/itemset.hxx>
28 : #include <svl/itempool.hxx>
29 : #include <svl/IndexedStyleSheets.hxx>
30 : #include <svl/itemiter.hxx>
31 : #include <svl/style.hxx>
32 : #include <unotools/syslocale.hxx>
33 : #include <algorithm>
34 : #include <comphelper/servicehelper.hxx>
35 :
36 : #include <boost/numeric/conversion/cast.hpp>
37 :
38 : #include <string.h>
39 :
40 : #ifdef DBG_UTIL
41 : class DbgStyleSheetReferences
42 : {
43 : public:
44 : DbgStyleSheetReferences() : mnStyles(0), mnPools(0) {}
45 : ~DbgStyleSheetReferences()
46 : {
47 : OSL_TRACE("DbgStyleSheetReferences\nSfxStyleSheetBase left %ld\nSfxStyleSheetBasePool left %ld", mnStyles, mnPools );
48 : }
49 :
50 : sal_uInt32 mnStyles;
51 : sal_uInt32 mnPools;
52 : }
53 : aDbgStyleSheetReferences;
54 :
55 : #endif
56 :
57 0 : TYPEINIT0(SfxStyleSheetBase)
58 :
59 462246 : TYPEINIT3(SfxStyleSheet, SfxStyleSheetBase, SfxListener, SfxBroadcaster)
60 :
61 1674 : SfxStyleSheetHintExtended::SfxStyleSheetHintExtended
62 : (
63 : sal_uInt16 nAction, // SFX_STYLESHEET_... (see above)
64 : const OUString& rOldName,
65 : SfxStyleSheetBase& rStyleSheet // Remains with the caller
66 : )
67 : : SfxStyleSheetHint( nAction, rStyleSheet ),
68 1674 : aName( rOldName )
69 1674 : {}
70 :
71 :
72 278158 : SfxStyleSheetHint::SfxStyleSheetHint
73 : (
74 : sal_uInt16 nAction, // SFX_STYLESHEET_... (see above)
75 : SfxStyleSheetBase& rStyleSheet // Remains with the caller
76 : )
77 : : pStyleSh( &rStyleSheet ),
78 278158 : nHint( nAction )
79 278158 : {}
80 :
81 :
82 15435 : class SfxStyleSheetBasePool_Impl
83 : {
84 : public:
85 : SfxStyleSheetIteratorPtr pIter;
86 : };
87 :
88 :
89 98682 : SfxStyleSheetBase::SfxStyleSheetBase( const OUString& rName, SfxStyleSheetBasePool* p, SfxStyleFamily eFam, sal_uInt16 mask )
90 : : pPool( p )
91 : , nFamily( eFam )
92 : , aName( rName )
93 : , aParent()
94 : , aFollow( rName )
95 : , pSet( NULL )
96 : , nMask(mask)
97 : , nHelpId( 0 )
98 : , bMySet( false )
99 98682 : , bHidden( false )
100 : {
101 : #ifdef DBG_UTIL
102 : aDbgStyleSheetReferences.mnStyles++;
103 : #endif
104 98682 : }
105 :
106 860776 : SfxStyleSheetBase::SfxStyleSheetBase( const SfxStyleSheetBase& r )
107 : : comphelper::OWeakTypeObject()
108 : , pPool( r.pPool )
109 : , nFamily( r.nFamily )
110 : , aName( r.aName )
111 : , aParent( r.aParent )
112 : , aFollow( r.aFollow )
113 : , aHelpFile( r.aHelpFile )
114 : , nMask( r.nMask )
115 : , nHelpId( r.nHelpId )
116 : , bMySet( r.bMySet )
117 860776 : , bHidden( r.bHidden )
118 : {
119 : #ifdef DBG_UTIL
120 : aDbgStyleSheetReferences.mnStyles++;
121 : #endif
122 860776 : if( r.pSet )
123 0 : pSet = bMySet ? new SfxItemSet( *r.pSet ) : r.pSet;
124 : else
125 860776 : pSet = NULL;
126 860776 : }
127 :
128 1918874 : SfxStyleSheetBase::~SfxStyleSheetBase()
129 : {
130 : #ifdef DBG_UTIL
131 : --aDbgStyleSheetReferences.mnStyles;
132 : #endif
133 :
134 959437 : if( bMySet )
135 : {
136 9040 : delete pSet;
137 9040 : pSet = 0;
138 : }
139 959437 : }
140 :
141 0 : sal_uInt16 SfxStyleSheetBase::GetVersion() const
142 : {
143 0 : return 0x0000;
144 : }
145 :
146 : // Change name
147 :
148 2457761 : const OUString& SfxStyleSheetBase::GetName() const
149 : {
150 2457761 : return aName;
151 : }
152 :
153 1674 : bool SfxStyleSheetBase::SetName(const OUString& rName, bool bReIndexNow)
154 : {
155 1674 : if(rName.isEmpty())
156 0 : return false;
157 :
158 1674 : if( aName != rName )
159 : {
160 1674 : OUString aOldName = aName;
161 1674 : SfxStyleSheetBase *pOther = pPool->Find( rName, nFamily ) ;
162 1674 : if ( pOther && pOther != this )
163 0 : return false;
164 :
165 1674 : SfxStyleFamily eTmpFam = pPool->GetSearchFamily();
166 1674 : sal_uInt16 nTmpMask = pPool->GetSearchMask();
167 :
168 1674 : pPool->SetSearchMask(nFamily);
169 :
170 1674 : if ( !aName.isEmpty() )
171 1674 : pPool->ChangeParent( aName, rName, false );
172 :
173 1674 : if ( aFollow == aName )
174 1658 : aFollow = rName;
175 1674 : aName = rName;
176 1674 : if (bReIndexNow)
177 1674 : pPool->Reindex();
178 1674 : pPool->SetSearchMask(eTmpFam, nTmpMask);
179 : pPool->Broadcast( SfxStyleSheetHintExtended(
180 1674 : SFX_STYLESHEET_MODIFIED, aOldName, *this ) );
181 : }
182 1674 : return true;
183 : }
184 :
185 5964 : OUString SfxStyleSheetBase::GetDisplayName() const
186 : {
187 5964 : if( maDisplayName.isEmpty() )
188 : {
189 5964 : return aName;
190 : }
191 : else
192 : {
193 0 : return maDisplayName;
194 : }
195 : }
196 :
197 0 : void SfxStyleSheetBase::SetDisplayName( const OUString& rDisplayName )
198 : {
199 0 : maDisplayName = rDisplayName;
200 0 : }
201 :
202 : // Change Parent
203 :
204 82792 : const OUString& SfxStyleSheetBase::GetParent() const
205 : {
206 82792 : return aParent;
207 : }
208 :
209 31760 : bool SfxStyleSheetBase::SetParent( const OUString& rName )
210 : {
211 31760 : if ( rName == aName )
212 0 : return false;
213 :
214 31760 : if( aParent != rName )
215 : {
216 31760 : SfxStyleSheetBase* pIter = pPool->Find(rName, nFamily);
217 31760 : if( !rName.isEmpty() && !pIter )
218 : {
219 : OSL_FAIL( "StyleSheet-Parent not found" );
220 0 : return false;
221 : }
222 : // prevent recursive linkages
223 31760 : if( !aName.isEmpty() )
224 : {
225 118828 : while(pIter)
226 : {
227 55308 : if(pIter->GetName() == aName)
228 0 : return false;
229 55308 : pIter = pPool->Find(pIter->GetParent(), nFamily);
230 : }
231 : }
232 31760 : aParent = rName;
233 : }
234 31760 : pPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
235 31760 : return true;
236 : }
237 :
238 2240 : void SfxStyleSheetBase::SetHidden( bool hidden )
239 : {
240 2240 : bHidden = hidden;
241 2240 : pPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
242 2240 : }
243 :
244 : /**
245 : * Change follow
246 : */
247 5788 : const OUString& SfxStyleSheetBase::GetFollow() const
248 : {
249 5788 : return aFollow;
250 : }
251 :
252 10248 : bool SfxStyleSheetBase::SetFollow( const OUString& rName )
253 : {
254 10248 : if( aFollow != rName )
255 : {
256 10232 : if( !pPool->Find( rName, nFamily ) )
257 : {
258 : SAL_WARN( "svl", "StyleSheet-Follow not found" );
259 2192 : return false;
260 : }
261 8040 : aFollow = rName;
262 : }
263 8056 : pPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
264 8056 : return true;
265 : }
266 :
267 : /**
268 : * Set Itemset
269 : * The default implementation creates a new set
270 : */
271 0 : SfxItemSet& SfxStyleSheetBase::GetItemSet()
272 : {
273 0 : if( !pSet )
274 : {
275 0 : pSet = new SfxItemSet( pPool->GetPool() );
276 0 : bMySet = true;
277 : }
278 0 : return *pSet;
279 : }
280 :
281 : /**
282 : * Set help file and ID and return it
283 : */
284 1810 : sal_uLong SfxStyleSheetBase::GetHelpId( OUString& rFile )
285 : {
286 1810 : rFile = aHelpFile;
287 1810 : return nHelpId;
288 : }
289 :
290 23464 : void SfxStyleSheetBase::SetHelpId( const OUString& rFile, sal_uLong nId )
291 : {
292 23464 : aHelpFile = rFile;
293 23464 : nHelpId = nId;
294 23464 : }
295 :
296 : /**
297 : * Next style possible?
298 : * Default: Yes
299 : */
300 0 : bool SfxStyleSheetBase::HasFollowSupport() const
301 : {
302 0 : return true;
303 : }
304 :
305 : /**
306 : * Base template possible?
307 : * Default: Yes
308 : */
309 0 : bool SfxStyleSheetBase::HasParentSupport() const
310 : {
311 0 : return true;
312 : }
313 :
314 : /**
315 : * Setting base template to NULL possible?
316 : * Default: No
317 : */
318 0 : bool SfxStyleSheetBase::HasClearParentSupport() const
319 : {
320 0 : return false;
321 : }
322 :
323 : /**
324 : * By default all stylesheets are set to used
325 : */
326 0 : bool SfxStyleSheetBase::IsUsed() const
327 : {
328 0 : return true;
329 : }
330 :
331 : /**
332 : * Return set attributes
333 : */
334 0 : OUString SfxStyleSheetBase::GetDescription()
335 : {
336 0 : return GetDescription( SFX_MAPUNIT_CM );
337 : }
338 :
339 : /**
340 : * Return set attributes
341 : */
342 0 : OUString SfxStyleSheetBase::GetDescription( SfxMapUnit eMetric )
343 : {
344 0 : SfxItemIter aIter( GetItemSet() );
345 0 : OUString aDesc;
346 0 : const SfxPoolItem* pItem = aIter.FirstItem();
347 :
348 0 : IntlWrapper aIntlWrapper( SvtSysLocale().GetLanguageTag() );
349 0 : while ( pItem )
350 : {
351 0 : OUString aItemPresentation;
352 :
353 0 : if ( !IsInvalidItem( pItem ) &&
354 0 : pPool->GetPool().GetPresentation(
355 0 : *pItem, eMetric, aItemPresentation, &aIntlWrapper ) )
356 : {
357 0 : if ( !aDesc.isEmpty() && !aItemPresentation.isEmpty() )
358 0 : aDesc += " + ";
359 0 : if ( !aItemPresentation.isEmpty() )
360 0 : aDesc += aItemPresentation;
361 : }
362 0 : pItem = aIter.NextItem();
363 0 : }
364 0 : return aDesc;
365 : }
366 :
367 1032877 : SfxStyleFamily SfxStyleSheetIterator::GetSearchFamily() const
368 : {
369 1032877 : return nSearchFamily;
370 : }
371 :
372 90032 : inline bool SfxStyleSheetIterator::IsTrivialSearch()
373 : {
374 180064 : return (( nMask & SFXSTYLEBIT_ALL_VISIBLE ) == SFXSTYLEBIT_ALL_VISIBLE) &&
375 180064 : (GetSearchFamily() == SFX_STYLE_FAMILY_ALL);
376 : }
377 :
378 : namespace {
379 :
380 458534 : struct DoesStyleMatchStyleSheetPredicate SAL_FINAL : public svl::StyleSheetPredicate
381 : {
382 458534 : DoesStyleMatchStyleSheetPredicate(SfxStyleSheetIterator *it)
383 458534 : : mIterator(it) {;}
384 :
385 : bool
386 401990 : Check(const SfxStyleSheetBase& styleSheet) SAL_OVERRIDE
387 : {
388 803980 : bool bMatchFamily = ((mIterator->GetSearchFamily() == SFX_STYLE_FAMILY_ALL) ||
389 803980 : ( styleSheet.GetFamily() == mIterator->GetSearchFamily() ));
390 :
391 401990 : bool bUsed = mIterator->SearchUsed() && styleSheet.IsUsed( );
392 :
393 401990 : bool bSearchHidden = ( mIterator->GetSearchMask() & SFXSTYLEBIT_HIDDEN );
394 401990 : bool bMatchVisibility = !( !bSearchHidden && styleSheet.IsHidden() && !bUsed );
395 401990 : bool bOnlyHidden = mIterator->GetSearchMask( ) == SFXSTYLEBIT_HIDDEN && styleSheet.IsHidden( );
396 :
397 348880 : bool bMatches = bMatchFamily && bMatchVisibility
398 1094966 : && (( styleSheet.GetMask() & ( mIterator->GetSearchMask() & ~SFXSTYLEBIT_USED )) ||
399 206012 : bUsed || bOnlyHidden ||
400 504996 : ( mIterator->GetSearchMask() & SFXSTYLEBIT_ALL_VISIBLE ) == SFXSTYLEBIT_ALL_VISIBLE );
401 401990 : return bMatches;
402 : }
403 :
404 : SfxStyleSheetIterator *mIterator;
405 : };
406 :
407 : }
408 :
409 498267 : SfxStyleSheetIterator::SfxStyleSheetIterator(SfxStyleSheetBasePool *pBase,
410 : SfxStyleFamily eFam, sal_uInt16 n)
411 : : pAktStyle(NULL)
412 498267 : , nAktPosition(0)
413 : {
414 498267 : pBasePool=pBase;
415 498267 : nSearchFamily=eFam;
416 498267 : bSearchUsed=false;
417 498267 : if( (( n & SFXSTYLEBIT_ALL_VISIBLE ) != SFXSTYLEBIT_ALL_VISIBLE )
418 40389 : && ((n & SFXSTYLEBIT_USED) == SFXSTYLEBIT_USED))
419 : {
420 13135 : bSearchUsed = true;
421 13135 : n &= ~SFXSTYLEBIT_USED;
422 : }
423 498267 : nMask=n;
424 498267 : }
425 :
426 500391 : SfxStyleSheetIterator::~SfxStyleSheetIterator()
427 : {
428 500391 : }
429 :
430 13548 : sal_uInt16 SfxStyleSheetIterator::Count()
431 : {
432 13548 : sal_uInt16 n = 0;
433 13548 : if( IsTrivialSearch())
434 : {
435 28 : n = (sal_uInt16) pBasePool->mIndexedStyleSheets->GetNumberOfStyleSheets();
436 : }
437 13520 : else if(nMask == SFXSTYLEBIT_ALL)
438 : {
439 13520 : n = static_cast<sal_uInt16>(pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily).size());
440 : }
441 : else
442 : {
443 0 : DoesStyleMatchStyleSheetPredicate predicate(this);
444 0 : n = pBasePool->mIndexedStyleSheets->GetNumberOfStyleSheetsWithPredicate(predicate);
445 : }
446 13548 : return n;
447 : }
448 :
449 13170 : SfxStyleSheetBase* SfxStyleSheetIterator::operator[](sal_uInt16 nIdx)
450 : {
451 13170 : SfxStyleSheetBase* retval = NULL;
452 13170 : if( IsTrivialSearch())
453 : {
454 24 : retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(nIdx).get();
455 24 : nAktPosition = nIdx;
456 : }
457 13146 : else if(nMask == SFXSTYLEBIT_ALL)
458 : {
459 : rtl::Reference< SfxStyleSheetBase > ref =
460 : pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(
461 13146 : pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily).at(nIdx))
462 : ;
463 13146 : retval = ref.get();
464 13146 : nAktPosition = nIdx;
465 : }
466 : else
467 : {
468 0 : DoesStyleMatchStyleSheetPredicate predicate(this);
469 : rtl::Reference< SfxStyleSheetBase > ref =
470 0 : pBasePool->mIndexedStyleSheets->GetNthStyleSheetThatMatchesPredicate(nIdx, predicate);
471 0 : if (ref.get() != NULL)
472 : {
473 0 : nAktPosition = pBasePool->mIndexedStyleSheets->FindStyleSheetPosition(*ref);
474 0 : retval = ref.get();
475 0 : }
476 : }
477 :
478 : if (retval == NULL)
479 : {
480 : OSL_FAIL("Incorrect index");
481 : }
482 :
483 13170 : return retval;
484 : }
485 :
486 12284 : SfxStyleSheetBase* SfxStyleSheetIterator::First()
487 : {
488 12284 : if (Count() != 0) {
489 12250 : return operator[](0);
490 : }
491 : else {
492 34 : return NULL;
493 : }
494 : }
495 :
496 :
497 63314 : SfxStyleSheetBase* SfxStyleSheetIterator::Next()
498 : {
499 63314 : SfxStyleSheetBase* retval = NULL;
500 :
501 63314 : if ( IsTrivialSearch() )
502 : {
503 1592 : unsigned nStyleSheets = pBasePool->mIndexedStyleSheets->GetNumberOfStyleSheets();
504 1592 : unsigned newPosition = nAktPosition +1;
505 1592 : if (nStyleSheets > newPosition)
506 : {
507 1568 : nAktPosition = newPosition;
508 1568 : retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(nAktPosition).get();
509 : }
510 : }
511 61722 : else if(nMask == SFXSTYLEBIT_ALL)
512 : {
513 61722 : unsigned newPosition = nAktPosition +1;
514 61722 : const std::vector<unsigned>& familyVector = pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily);
515 61722 : if (familyVector.size() > newPosition)
516 : {
517 59272 : nAktPosition = newPosition;
518 59272 : unsigned stylePosition = familyVector.at(newPosition);
519 59272 : retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(stylePosition).get();
520 : }
521 : }
522 : else
523 : {
524 0 : DoesStyleMatchStyleSheetPredicate predicate(this);
525 : rtl::Reference< SfxStyleSheetBase > ref =
526 : pBasePool->mIndexedStyleSheets->GetNthStyleSheetThatMatchesPredicate(
527 0 : 0, predicate, nAktPosition+1);
528 0 : retval = ref.get();
529 0 : if (retval != NULL) {
530 0 : nAktPosition = pBasePool->mIndexedStyleSheets->FindStyleSheetPosition(*ref);
531 0 : }
532 : }
533 63314 : pAktStyle = retval;
534 63314 : return retval;
535 : }
536 :
537 458534 : SfxStyleSheetBase* SfxStyleSheetIterator::Find(const OUString& rStr)
538 : {
539 458534 : DoesStyleMatchStyleSheetPredicate predicate(this);
540 :
541 : std::vector<unsigned> positions =
542 : pBasePool->mIndexedStyleSheets->FindPositionsByNameAndPredicate(rStr, predicate,
543 917068 : svl::IndexedStyleSheets::RETURN_FIRST);
544 458534 : if (positions.empty()) {
545 114438 : return NULL;
546 : }
547 :
548 344096 : unsigned pos = positions.front();
549 344096 : SfxStyleSheetBase* pStyle = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(pos).get();
550 344096 : nAktPosition = pos;
551 344096 : pAktStyle = pStyle;
552 802630 : return pAktStyle;
553 : }
554 :
555 1397445 : sal_uInt16 SfxStyleSheetIterator::GetSearchMask() const
556 : {
557 1397445 : sal_uInt16 mask = nMask;
558 :
559 1397445 : if ( bSearchUsed )
560 49087 : mask |= SFXSTYLEBIT_USED;
561 1397445 : return mask;
562 : }
563 :
564 :
565 0 : void SfxStyleSheetBasePool::Replace( SfxStyleSheetBase& rSource, SfxStyleSheetBase& rTarget )
566 : {
567 0 : rTarget.SetFollow( rSource.GetFollow() );
568 0 : rTarget.SetParent( rSource.GetParent() );
569 0 : SfxItemSet& rSourceSet = rSource.GetItemSet();
570 0 : SfxItemSet& rTargetSet = rTarget.GetItemSet();
571 0 : rTargetSet.Intersect( rSourceSet );
572 0 : rTargetSet.Put( rSourceSet );
573 0 : }
574 :
575 145517 : SfxStyleSheetIterator& SfxStyleSheetBasePool::GetIterator_Impl()
576 : {
577 145517 : if( !pImp->pIter || (pImp->pIter->GetSearchMask() != nMask) || (pImp->pIter->GetSearchFamily() != nSearchFamily) )
578 : {
579 25925 : pImp->pIter = CreateIterator( nSearchFamily, nMask );
580 : }
581 :
582 145517 : return *pImp->pIter;
583 : }
584 :
585 7744 : SfxStyleSheetBasePool::SfxStyleSheetBasePool( SfxItemPool& r )
586 7744 : : aAppName(r.GetName())
587 : , rPool(r)
588 : , nSearchFamily(SFX_STYLE_FAMILY_PARA)
589 : , nMask(SFXSTYLEBIT_ALL)
590 15488 : , mIndexedStyleSheets(new svl::IndexedStyleSheets)
591 : {
592 : #ifdef DBG_UTIL
593 : aDbgStyleSheetReferences.mnPools++;
594 : #endif
595 :
596 7744 : pImp = new SfxStyleSheetBasePool_Impl;
597 7744 : }
598 :
599 0 : SfxStyleSheetBasePool::SfxStyleSheetBasePool( const SfxStyleSheetBasePool& r )
600 : : SfxBroadcaster( r )
601 : , comphelper::OWeakTypeObject()
602 : , aAppName(r.aAppName)
603 : , rPool(r.rPool)
604 : , nSearchFamily(r.nSearchFamily)
605 : , nMask( r.nMask )
606 0 : , mIndexedStyleSheets(new svl::IndexedStyleSheets)
607 : {
608 : #ifdef DBG_UTIL
609 : aDbgStyleSheetReferences.mnPools++;
610 : #endif
611 :
612 0 : pImp = new SfxStyleSheetBasePool_Impl;
613 0 : *this += r;
614 0 : }
615 :
616 15382 : SfxStyleSheetBasePool::~SfxStyleSheetBasePool()
617 : {
618 : #ifdef DBG_UTIL
619 : aDbgStyleSheetReferences.mnPools--;
620 : #endif
621 :
622 7691 : Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
623 7691 : Clear();
624 7691 : delete pImp;
625 7691 : }
626 :
627 0 : bool SfxStyleSheetBasePool::SetParent(SfxStyleFamily eFam, const OUString& rStyle, const OUString& rParent)
628 : {
629 0 : SfxStyleSheetIterator aIter(this,eFam,SFXSTYLEBIT_ALL);
630 0 : SfxStyleSheetBase *pStyle = aIter.Find(rStyle);
631 : OSL_ENSURE(pStyle, "Template not found. Writer with solar <2541?");
632 0 : if(pStyle)
633 0 : return pStyle->SetParent(rParent);
634 : else
635 0 : return false;
636 : }
637 :
638 :
639 2010930 : void SfxStyleSheetBasePool::SetSearchMask(SfxStyleFamily eFam, sal_uInt16 n)
640 : {
641 2010930 : nSearchFamily = eFam; nMask = n;
642 2010930 : }
643 :
644 :
645 2126 : SfxStyleSheetIteratorPtr SfxStyleSheetBasePool::CreateIterator
646 : (
647 : SfxStyleFamily eFam,
648 : sal_uInt16 mask
649 : )
650 : {
651 2126 : return SfxStyleSheetIteratorPtr(new SfxStyleSheetIterator(this,eFam,mask));
652 : }
653 :
654 0 : SfxStyleSheetBase* SfxStyleSheetBasePool::Create
655 : (
656 : const OUString& rName,
657 : SfxStyleFamily eFam,
658 : sal_uInt16 mask
659 : )
660 : {
661 0 : return new SfxStyleSheetBase( rName, this, eFam, mask );
662 : }
663 :
664 0 : SfxStyleSheetBase* SfxStyleSheetBasePool::Create( const SfxStyleSheetBase& r )
665 : {
666 0 : return new SfxStyleSheetBase( r );
667 : }
668 :
669 37810 : SfxStyleSheetBase& SfxStyleSheetBasePool::Make( const OUString& rName, SfxStyleFamily eFam, sal_uInt16 mask)
670 : {
671 : OSL_ENSURE( eFam != SFX_STYLE_FAMILY_ALL, "svl::SfxStyleSheetBasePool::Make(), FamilyAll is not a allowed Familie" );
672 :
673 37810 : SfxStyleSheetIterator aIter(this, eFam, mask);
674 75620 : rtl::Reference< SfxStyleSheetBase > xStyle( aIter.Find( rName ) );
675 : OSL_ENSURE( !xStyle.is(), "svl::SfxStyleSheetBasePool::Make(), StyleSheet already exists" );
676 :
677 37810 : if( !xStyle.is() )
678 : {
679 37810 : xStyle = Create( rName, eFam, mask );
680 37810 : StoreStyleSheet(xStyle);
681 37810 : Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xStyle.get() ) );
682 : }
683 75620 : return *xStyle.get();
684 : }
685 :
686 : /**
687 : * Helper function: If a template with this name exists it is created
688 : * anew. All templates that have this template as a parent are reconnected.
689 : */
690 0 : SfxStyleSheetBase& SfxStyleSheetBasePool::Add( const SfxStyleSheetBase& rSheet )
691 : {
692 0 : SfxStyleSheetIterator aIter(this, rSheet.GetFamily(), nMask);
693 0 : SfxStyleSheetBase* pOld = aIter.Find( rSheet.GetName() );
694 0 : if (pOld) {
695 0 : Remove( pOld );
696 : }
697 0 : rtl::Reference< SfxStyleSheetBase > xNew( Create( rSheet ) );
698 0 : mIndexedStyleSheets->AddStyleSheet(xNew);
699 0 : Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CHANGED, *xNew.get() ) );
700 0 : return *xNew.get();
701 : }
702 :
703 0 : SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator=( const SfxStyleSheetBasePool& r )
704 : {
705 0 : if( &r != this )
706 : {
707 0 : Clear();
708 0 : *this += r;
709 : }
710 0 : return *this;
711 : }
712 :
713 : namespace {
714 0 : struct AddStyleSheetCallback : svl::StyleSheetCallback
715 : {
716 0 : AddStyleSheetCallback(SfxStyleSheetBasePool *pool)
717 0 : : mPool(pool) {;}
718 :
719 0 : void DoIt(const SfxStyleSheetBase& ssheet) SAL_OVERRIDE
720 : {
721 0 : mPool->Add(ssheet);
722 0 : }
723 :
724 : SfxStyleSheetBasePool *mPool;
725 : };
726 : }
727 :
728 0 : SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator+=( const SfxStyleSheetBasePool& r )
729 : {
730 0 : if( &r != this )
731 : {
732 0 : AddStyleSheetCallback callback(this);
733 0 : mIndexedStyleSheets->ApplyToAllStyleSheets(callback);
734 : }
735 0 : return *this;
736 : }
737 :
738 8926 : sal_uInt16 SfxStyleSheetBasePool::Count()
739 : {
740 8926 : return GetIterator_Impl().Count();
741 : }
742 :
743 0 : SfxStyleSheetBase *SfxStyleSheetBasePool::operator[](sal_uInt16 nIdx)
744 : {
745 0 : return GetIterator_Impl()[nIdx];
746 : }
747 :
748 420724 : SfxStyleSheetBase* SfxStyleSheetBasePool::Find(const OUString& rName,
749 : SfxStyleFamily eFam,
750 : sal_uInt16 mask)
751 : {
752 420724 : SfxStyleSheetIterator aIter(this,eFam,mask);
753 420724 : return aIter.Find(rName);
754 : }
755 :
756 20396 : SfxStyleSheetBase* SfxStyleSheetBasePool::First()
757 : {
758 20396 : return GetIterator_Impl().First();
759 : }
760 :
761 34983 : SfxStyleSheetBase* SfxStyleSheetBasePool::Next()
762 : {
763 34983 : return GetIterator_Impl().Next();
764 : }
765 :
766 2 : void SfxStyleSheetBasePool::Remove( SfxStyleSheetBase* p )
767 : {
768 2 : if( p )
769 : {
770 : // Reference to keep p alive until after Broadcast call!
771 2 : rtl::Reference<SfxStyleSheetBase> xP(p);
772 2 : bool bWasRemoved = mIndexedStyleSheets->RemoveStyleSheet(xP);
773 2 : if( bWasRemoved )
774 : {
775 : // Adapt all styles which have this style as parant
776 2 : ChangeParent( p->GetName(), p->GetParent() );
777 :
778 : // #120015# Do not dispose, the removed StyleSheet may still be used in
779 : // existing SdrUndoAttrObj incarnations. Rely on refcounting for disposal,
780 : // this works well under normal conditions (checked breaking and counting
781 : // on SfxStyleSheetBase constructors and destructors)
782 :
783 : // com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY );
784 : // if( xComp.is() ) try
785 : // {
786 : // xComp->dispose();
787 : // }
788 : // catch( com::sun::star::uno::Exception& )
789 : // {
790 : // }
791 2 : Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *p ) );
792 2 : }
793 : }
794 2 : }
795 :
796 6 : void SfxStyleSheetBasePool::Insert( SfxStyleSheetBase* p )
797 : {
798 : #if OSL_DEBUG_LEVEL > 0
799 : OSL_ENSURE( p, "svl::SfxStyleSheetBasePool::Insert(), no stylesheet?" );
800 :
801 : SfxStyleSheetIterator aIter(this, p->GetFamily(), p->GetMask());
802 : SfxStyleSheetBase* pOld = aIter.Find( p->GetName() );
803 : OSL_ENSURE( !pOld, "svl::SfxStyleSheetBasePool::Insert(), StyleSheet already inserted" );
804 : if( !p->GetParent().isEmpty() )
805 : {
806 : pOld = aIter.Find( p->GetParent() );
807 : OSL_ENSURE( pOld, "svl::SfxStyleSheetBasePool::Insert(), Parent not found!" );
808 : }
809 : #endif
810 6 : StoreStyleSheet(rtl::Reference< SfxStyleSheetBase >( p ) );
811 6 : Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *p ) );
812 6 : }
813 :
814 : namespace
815 : {
816 :
817 8133 : struct StyleSheetDisposerFunctor SAL_FINAL : public svl::StyleSheetDisposer
818 : {
819 8133 : StyleSheetDisposerFunctor(SfxStyleSheetBasePool* pool)
820 8133 : : mPool(pool) {;}
821 :
822 : void
823 37800 : Dispose(rtl::Reference<SfxStyleSheetBase> styleSheet) SAL_OVERRIDE
824 : {
825 37800 : cppu::OWeakObject* weakObject = static_cast< ::cppu::OWeakObject* >(styleSheet.get());
826 : com::sun::star::uno::Reference< com::sun::star::lang::XComponent >
827 37800 : xComp( weakObject, com::sun::star::uno::UNO_QUERY );
828 37800 : if( xComp.is() ) try
829 : {
830 28762 : xComp->dispose();
831 : }
832 0 : catch( com::sun::star::uno::Exception& )
833 : {
834 : }
835 37800 : mPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *styleSheet.get() ) );
836 37800 : }
837 :
838 : SfxStyleSheetBasePool* mPool;
839 : };
840 :
841 : }
842 :
843 8133 : void SfxStyleSheetBasePool::Clear()
844 : {
845 8133 : StyleSheetDisposerFunctor cleanup(this);
846 8133 : mIndexedStyleSheets->Clear(cleanup);
847 8133 : }
848 :
849 1676 : void SfxStyleSheetBasePool::ChangeParent(const OUString& rOld,
850 : const OUString& rNew,
851 : bool bVirtual)
852 : {
853 1676 : const sal_uInt16 nTmpMask = GetSearchMask();
854 1676 : SetSearchMask(GetSearchFamily(), SFXSTYLEBIT_ALL);
855 27622 : for( SfxStyleSheetBase* p = First(); p; p = Next() )
856 : {
857 25946 : if( p->GetParent() == rOld )
858 : {
859 944 : if(bVirtual)
860 0 : p->SetParent( rNew );
861 : else
862 944 : p->aParent = rNew;
863 : }
864 : }
865 1676 : SetSearchMask(GetSearchFamily(), nTmpMask);
866 1676 : }
867 :
868 0 : void SfxStyleSheetBase::Load( SvStream&, sal_uInt16 )
869 : {
870 0 : }
871 :
872 0 : void SfxStyleSheetBase::Store( SvStream& )
873 : {
874 0 : }
875 :
876 :
877 :
878 :
879 37816 : SfxStyleSheet::SfxStyleSheet(const OUString &rName,
880 : const SfxStyleSheetBasePool& r_Pool,
881 : SfxStyleFamily eFam,
882 : sal_uInt16 mask )
883 37816 : : SfxStyleSheetBase(rName, const_cast< SfxStyleSheetBasePool* >( &r_Pool ), eFam, mask)
884 : {
885 37816 : }
886 :
887 0 : SfxStyleSheet::SfxStyleSheet(const SfxStyleSheet& rStyle)
888 : : SfxStyleSheetBase(rStyle)
889 : , SfxListener( rStyle )
890 : , SfxBroadcaster( rStyle )
891 0 : , svl::StyleSheetUser()
892 : {
893 0 : }
894 :
895 75604 : SfxStyleSheet::~SfxStyleSheet()
896 : {
897 37802 : Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_INDESTRUCTION, *this ) );
898 37802 : }
899 :
900 :
901 42922 : bool SfxStyleSheet::SetParent( const OUString& rName )
902 : {
903 42922 : if(aParent == rName)
904 11162 : return true;
905 31760 : const OUString aOldParent(aParent);
906 31760 : if(SfxStyleSheetBase::SetParent(rName))
907 : {
908 : // Remove from notification chain of the old parent if applicable
909 31760 : if(!aOldParent.isEmpty())
910 : {
911 2968 : SfxStyleSheet *pParent = static_cast<SfxStyleSheet *>(pPool->Find(aOldParent, nFamily, SFXSTYLEBIT_ALL));
912 2968 : if(pParent)
913 2968 : EndListening(*pParent);
914 : }
915 : // Add to the notification chain of the new parent
916 31760 : if(!aParent.isEmpty())
917 : {
918 31760 : SfxStyleSheet *pParent = static_cast<SfxStyleSheet *>(pPool->Find(aParent, nFamily, SFXSTYLEBIT_ALL));
919 31760 : if(pParent)
920 31760 : StartListening(*pParent);
921 : }
922 31760 : return true;
923 : }
924 0 : return false;
925 : }
926 :
927 : /**
928 : * Notify all listeners
929 : */
930 2126878 : void SfxStyleSheet::Notify(SfxBroadcaster& rBC, const SfxHint& rHint )
931 : {
932 2126878 : Forward(rBC, rHint);
933 2126878 : }
934 :
935 9726 : bool SfxStyleSheet::isUsedByModel() const
936 : {
937 9726 : return IsUsed();
938 : }
939 :
940 :
941 2700 : SfxStyleSheetPool::SfxStyleSheetPool( SfxItemPool const& rSet)
942 2700 : : SfxStyleSheetBasePool( const_cast< SfxItemPool& >( rSet ) )
943 : {
944 2700 : }
945 :
946 0 : SfxStyleSheetBase* SfxStyleSheetPool::Create( const OUString& rName,
947 : SfxStyleFamily eFam, sal_uInt16 mask )
948 : {
949 0 : return new SfxStyleSheet( rName, *this, eFam, mask );
950 : }
951 :
952 0 : SfxStyleSheetBase* SfxStyleSheetPool::Create( const SfxStyleSheet& r )
953 : {
954 0 : return new SfxStyleSheet( r );
955 : }
956 :
957 28762 : SfxUnoStyleSheet::SfxUnoStyleSheet( const OUString& _rName, const SfxStyleSheetBasePool& _rPool, SfxStyleFamily _eFamily, sal_uInt16 _nMaske )
958 28762 : : ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel >( _rName, _rPool, _eFamily, _nMaske )
959 : {
960 28762 : }
961 :
962 2934 : SfxUnoStyleSheet* SfxUnoStyleSheet::getUnoStyleSheet( const ::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle >& xStyle )
963 : {
964 2934 : SfxUnoStyleSheet* pRet = dynamic_cast< SfxUnoStyleSheet* >( xStyle.get() );
965 2934 : if( !pRet )
966 : {
967 0 : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( xStyle, ::com::sun::star::uno::UNO_QUERY );
968 0 : if( xUT.is() )
969 0 : pRet = reinterpret_cast<SfxUnoStyleSheet*>(sal::static_int_cast<sal_uIntPtr>(xUT->getSomething( SfxUnoStyleSheet::getIdentifier())));
970 : }
971 2934 : return pRet;
972 : }
973 :
974 : /**
975 : * XUnoTunnel
976 : */
977 0 : ::sal_Int64 SAL_CALL SfxUnoStyleSheet::getSomething( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& rId ) throw (::com::sun::star::uno::RuntimeException, std::exception)
978 : {
979 0 : if( rId.getLength() == 16 && 0 == memcmp( getIdentifier().getConstArray(), rId.getConstArray(), 16 ) )
980 : {
981 0 : return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
982 : }
983 : else
984 : {
985 0 : return 0;
986 : }
987 : }
988 :
989 : void
990 37816 : SfxStyleSheetBasePool::StoreStyleSheet(rtl::Reference< SfxStyleSheetBase > xStyle)
991 : {
992 37816 : mIndexedStyleSheets->AddStyleSheet(xStyle);
993 37816 : }
994 :
995 : namespace
996 : {
997 : class theSfxUnoStyleSheetIdentifier : public rtl::Static< UnoTunnelIdInit, theSfxUnoStyleSheetIdentifier > {};
998 : }
999 :
1000 0 : const ::com::sun::star::uno::Sequence< ::sal_Int8 >& SfxUnoStyleSheet::getIdentifier()
1001 : {
1002 0 : return theSfxUnoStyleSheetIdentifier::get().getSeq();
1003 : }
1004 :
1005 : void
1006 1674 : SfxStyleSheetBasePool::Reindex()
1007 : {
1008 1674 : mIndexedStyleSheets->Reindex();
1009 1674 : }
1010 :
1011 : const svl::IndexedStyleSheets&
1012 0 : SfxStyleSheetBasePool::GetIndexedStyleSheets() const
1013 : {
1014 0 : return *mIndexedStyleSheets;
1015 : }
1016 :
1017 : rtl::Reference<SfxStyleSheetBase>
1018 0 : SfxStyleSheetBasePool::GetStyleSheetByPositionInIndex(unsigned pos)
1019 : {
1020 0 : return mIndexedStyleSheets->GetStyleSheetByPosition(pos);
1021 : }
1022 :
1023 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|