xref: /trunk/main/sd/source/core/stlsheet.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 #include <com/sun/star/beans/PropertyAttribute.hpp>
32 #include <com/sun/star/lang/DisposedException.hpp>
33 #include <com/sun/star/style/XStyle.hpp>
34 
35 #include <osl/mutex.hxx>
36 #include <vos/mutex.hxx>
37 #include <vcl/svapp.hxx>
38 #include <comphelper/serviceinfohelper.hxx>
39 #include <boost/bind.hpp>
40 
41 #include "eetext.hxx"
42 #include <editeng/eeitem.hxx>
43 #include <editeng/fhgtitem.hxx>
44 #include <svx/svdoattr.hxx>
45 #include <editeng/ulspitem.hxx>
46 #include <svl/smplhint.hxx>
47 #include <svl/itemset.hxx>
48 
49 #include <svx/xflbmtit.hxx>
50 #include <svx/xflbstit.hxx>
51 #include <editeng/bulitem.hxx>
52 #include <editeng/lrspitem.hxx>
53 #include <svx/unoshprp.hxx>
54 #include <svx/unoshape.hxx>
55 #include <svx/svdpool.hxx>
56 #include "stlsheet.hxx"
57 #include "sdresid.hxx"
58 #include "sdpage.hxx"
59 #include "drawdoc.hxx"
60 #include "stlpool.hxx"
61 #include "glob.hrc"
62 #include "app.hrc"
63 #include "glob.hxx"
64 #include "helpids.h"
65 #include "../ui/inc/DrawViewShell.hxx"
66 #include "../ui/inc/ViewShellBase.hxx"
67 
68 using ::rtl::OUString;
69 using ::osl::MutexGuard;
70 using ::osl::ClearableMutexGuard;
71 using ::cppu::OInterfaceContainerHelper;
72 using namespace ::vos;
73 using namespace ::com::sun::star::uno;
74 using namespace ::com::sun::star::util;
75 using namespace ::com::sun::star::lang;
76 using namespace ::com::sun::star::style;
77 using namespace ::com::sun::star::beans;
78 using namespace ::com::sun::star::container;
79 using namespace ::com::sun::star::drawing;
80 
81 #define WID_STYLE_DISPNAME  7998
82 #define WID_STYLE_FAMILY    7999
83 
84 static SvxItemPropertySet& GetStylePropertySet()
85 {
86     static const SfxItemPropertyMapEntry aFullPropertyMap_Impl[] =
87     {
88         { RTL_CONSTASCII_STRINGPARAM("Family"),                 WID_STYLE_FAMILY,       &::getCppuType((const OUString*)0), PropertyAttribute::READONLY,    0},
89         { RTL_CONSTASCII_STRINGPARAM("UserDefinedAttributes"),  SDRATTR_XMLATTRIBUTES,  &XNameContainer::static_type(), 0,     0},
90         { RTL_CONSTASCII_STRINGPARAM("DisplayName"),            WID_STYLE_DISPNAME,     &::getCppuType((const OUString*)0), PropertyAttribute::READONLY,    0},
91 
92         SVX_UNOEDIT_NUMBERING_PROPERTIE,
93         SHADOW_PROPERTIES
94         LINE_PROPERTIES
95         LINE_PROPERTIES_START_END
96         FILL_PROPERTIES
97         EDGERADIUS_PROPERTIES
98         TEXT_PROPERTIES_DEFAULTS
99         CONNECTOR_PROPERTIES
100         SPECIAL_DIMENSIONING_PROPERTIES_DEFAULTS
101         {0,0,0,0,0,0}
102     };
103 
104     static SvxItemPropertySet aPropSet( aFullPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
105     return aPropSet;
106 }
107 
108 class ModifyListenerForewarder : public SfxListener
109 {
110 public:
111     ModifyListenerForewarder( SdStyleSheet* pStyleSheet );
112 
113     virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
114 
115 private:
116     SdStyleSheet* mpStyleSheet;
117 };
118 
119 ModifyListenerForewarder::ModifyListenerForewarder( SdStyleSheet* pStyleSheet )
120 : mpStyleSheet( pStyleSheet )
121 {
122     if( pStyleSheet )
123     {
124         SfxBroadcaster& rBC = static_cast< SfxBroadcaster& >( *pStyleSheet );
125         StartListening( rBC );
126     }
127 }
128 
129 void ModifyListenerForewarder::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& /*rHint*/)
130 {
131     if( mpStyleSheet )
132         mpStyleSheet->notifyModifyListener();
133 }
134 
135 SdStyleSheet::SdStyleSheet(const OUString& rDisplayName, SfxStyleSheetBasePool& _rPool, SfxStyleFamily eFamily, sal_uInt16 _nMask)
136 : SdStyleSheetBase( UniString( rDisplayName ), _rPool, eFamily, _nMask)
137 , ::cppu::BaseMutex()
138 , msApiName( rDisplayName )
139 , mxPool( const_cast< SfxStyleSheetBasePool* >(&_rPool) )
140 , mrBHelper( m_aMutex )
141 {
142 }
143 
144 SdStyleSheet::SdStyleSheet( const SdStyleSheet & r )
145 : SdStyleSheetBase( r )
146 , ::cppu::BaseMutex()
147 , msApiName( r.msApiName )
148 , mxPool( r.mxPool )
149 , mrBHelper( m_aMutex )
150 {
151 }
152 
153 SdStyleSheet::~SdStyleSheet()
154 {
155     delete pSet;
156     pSet = NULL;    // damit nachfolgende Destruktoren eine Chance haben
157 }
158 
159 void SdStyleSheet::SetApiName( const OUString& rApiName )
160 {
161     msApiName = rApiName;
162 }
163 
164 rtl::OUString SdStyleSheet::GetApiName() const
165 {
166     if( msApiName.getLength() )
167         return msApiName;
168     else
169         return GetName();
170 }
171 
172 
173 void SdStyleSheet::Load (SvStream& rIn, sal_uInt16 nVersion)
174 {
175     SfxStyleSheetBase::Load(rIn, nVersion);
176 
177     // Die Default-Maske war frueher 0xAFFE.
178     // Aus dieser Default-Maske wurden die benoetigten Flags ausmaskiert.
179     // Nun wurde das Flag SFXSTYLEBIT_READONLY eingefuehrt, was dazu
180     // das alle StyleSheets read-only waren.
181     // Da im Draw kein StyleSheet read-only sein soll, wird an dieser Stelle
182     // das Flag zurueckgesetzt.
183     nMask &= ~SFXSTYLEBIT_READONLY;
184 }
185 
186 /*************************************************************************
187 |*
188 |* Store
189 |*
190 \************************************************************************/
191 
192 void SdStyleSheet::Store(SvStream& rOut)
193 {
194     SfxStyleSheetBase::Store(rOut);
195 }
196 
197 /*************************************************************************
198 |*
199 |* Parent setzen
200 |*
201 \************************************************************************/
202 
203 sal_Bool SdStyleSheet::SetParent(const String& rParentName)
204 {
205     sal_Bool bResult = sal_False;
206 
207     if (SfxStyleSheet::SetParent(rParentName))
208     {
209         // PseudoStyleSheets haben keine eigenen ItemSets
210         if (nFamily != SD_STYLE_FAMILY_PSEUDO)
211         {
212             if( rParentName.Len() )
213             {
214                 SfxStyleSheetBase* pStyle = rPool.Find(rParentName, nFamily);
215                 if (pStyle)
216                 {
217                     bResult = sal_True;
218                     SfxItemSet& rParentSet = pStyle->GetItemSet();
219                     GetItemSet().SetParent(&rParentSet);
220                     Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
221                 }
222             }
223             else
224             {
225                 bResult = sal_True;
226                 GetItemSet().SetParent(NULL);
227                 Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
228             }
229         }
230         else
231         {
232             bResult = sal_True;
233         }
234     }
235     return bResult;
236 }
237 
238 /*************************************************************************
239 |*
240 |* ItemSet ggfs. erzeugen und herausreichen
241 |*
242 \************************************************************************/
243 
244 SfxItemSet& SdStyleSheet::GetItemSet()
245 {
246     if (nFamily == SD_STYLE_FAMILY_GRAPHICS || nFamily == SD_STYLE_FAMILY_MASTERPAGE)
247     {
248         // ggfs. das ItemSet 'on demand' anlegen
249         if (!pSet)
250         {
251             sal_uInt16 nWhichPairTable[] = { XATTR_LINE_FIRST,              XATTR_LINE_LAST,
252                                          XATTR_FILL_FIRST,              XATTR_FILL_LAST,
253 
254                                         SDRATTR_SHADOW_FIRST,           SDRATTR_SHADOW_LAST,
255                                         SDRATTR_TEXT_MINFRAMEHEIGHT,    SDRATTR_TEXT_CONTOURFRAME,
256 
257                                         SDRATTR_TEXT_WORDWRAP,          SDRATTR_TEXT_AUTOGROWSIZE,
258 
259                                         SDRATTR_EDGE_FIRST,             SDRATTR_EDGE_LAST,
260                                         SDRATTR_MEASURE_FIRST,          SDRATTR_MEASURE_LAST,
261 
262                                         EE_PARA_START,                  EE_CHAR_END,
263 
264                                         SDRATTR_XMLATTRIBUTES,          SDRATTR_TEXT_USEFIXEDCELLHEIGHT,
265 
266                                         SDRATTR_3D_FIRST, SDRATTR_3D_LAST,
267                                         0, 0 };
268 
269             pSet = new SfxItemSet(GetPool().GetPool(), nWhichPairTable);
270         }
271 
272         return *pSet;
273     }
274 
275     else if( nFamily == SD_STYLE_FAMILY_CELL )
276     {
277         if (!pSet)
278         {
279             sal_uInt16 nWhichPairTable[] = { XATTR_LINE_FIRST,              XATTR_LINE_LAST,
280                                          XATTR_FILL_FIRST,              XATTR_FILL_LAST,
281 
282                                         SDRATTR_SHADOW_FIRST,           SDRATTR_SHADOW_LAST,
283                                         SDRATTR_TEXT_MINFRAMEHEIGHT,    SDRATTR_TEXT_CONTOURFRAME,
284 
285                                         SDRATTR_TEXT_WORDWRAP,          SDRATTR_TEXT_AUTOGROWSIZE,
286 
287                                         EE_PARA_START,                  EE_CHAR_END,
288 
289                                         SDRATTR_TABLE_FIRST,            SDRATTR_TABLE_LAST,
290                                         SDRATTR_XMLATTRIBUTES,          SDRATTR_XMLATTRIBUTES,
291 
292                                         0, 0 };
293 
294             pSet = new SfxItemSet(GetPool().GetPool(), nWhichPairTable);
295         }
296 
297         return *pSet;
298     }
299 
300     // dies ist eine Stellvertretervorlage fuer die interne Vorlage des
301     // aktuellen Praesentationslayouts: dessen ItemSet returnieren
302     else
303     {
304 //        return (GetRealStyleSheet()->GetItemSet());
305 
306         SdStyleSheet* pSdSheet = GetRealStyleSheet();
307 
308         if (pSdSheet)
309         {
310             return(pSdSheet->GetItemSet());
311         }
312         else
313         {
314             if (!pSet)
315             {
316                 sal_uInt16 nWhichPairTable[] = { XATTR_LINE_FIRST,              XATTR_LINE_LAST,
317                                              XATTR_FILL_FIRST,              XATTR_FILL_LAST,
318 
319                                              SDRATTR_SHADOW_FIRST,          SDRATTR_SHADOW_LAST,
320                                              SDRATTR_TEXT_MINFRAMEHEIGHT,   SDRATTR_TEXT_CONTOURFRAME,
321 
322                                              SDRATTR_TEXT_WORDWRAP,         SDRATTR_TEXT_AUTOGROWSIZE,
323 
324                                              SDRATTR_EDGE_FIRST,            SDRATTR_EDGE_LAST,
325                                              SDRATTR_MEASURE_FIRST,         SDRATTR_MEASURE_LAST,
326 
327                                              EE_PARA_START,                 EE_CHAR_END,
328 
329                                             SDRATTR_XMLATTRIBUTES,          SDRATTR_TEXT_USEFIXEDCELLHEIGHT,
330 
331                                             SDRATTR_3D_FIRST, SDRATTR_3D_LAST,
332                                              0, 0 };
333 
334                 pSet = new SfxItemSet(GetPool().GetPool(), nWhichPairTable);
335             }
336 
337             return(*pSet);
338         }
339     }
340 }
341 
342 /*************************************************************************
343 |*
344 |* IsUsed(), eine Vorlage gilt als benutzt, wenn sie von eingefuegten Objekten
345 |*           oder von benutzten Vorlagen referenziert wird
346 |*
347 \************************************************************************/
348 
349 sal_Bool SdStyleSheet::IsUsed() const
350 {
351     sal_Bool bResult = sal_False;
352 
353     sal_uInt16 nListenerCount = GetListenerCount();
354     if (nListenerCount > 0)
355     {
356         for (sal_uInt16 n = 0; n < nListenerCount; n++)
357         {
358             SfxListener* pListener = GetListener(n);
359             if( pListener == this )
360                 continue;
361 
362             // NULL-Pointer ist im Listener-Array erlaubt
363             if (pListener && pListener->ISA(SdrAttrObj))
364             {
365                 bResult = ((SdrAttrObj*)pListener)->IsInserted();
366             }
367             else if (pListener && pListener->ISA(SfxStyleSheet))
368             {
369                 bResult = ((SfxStyleSheet*)pListener)->IsUsed();
370             }
371             if (bResult)
372                 break;
373         }
374     }
375 
376     if( !bResult )
377     {
378         MutexGuard aGuard( mrBHelper.rMutex );
379 
380         OInterfaceContainerHelper * pContainer = mrBHelper.getContainer( XModifyListener::static_type() );
381         if( pContainer )
382         {
383             Sequence< Reference< XInterface > > aModifyListeners( pContainer->getElements() );
384             Reference< XInterface > *p = aModifyListeners.getArray();
385             sal_Int32 nCount = aModifyListeners.getLength();
386             while( nCount-- && !bResult )
387             {
388                 Reference< XStyle > xStyle( *p++, UNO_QUERY );
389                 if( xStyle.is() )
390                     bResult = xStyle->isInUse();
391             }
392         }
393     }
394     return bResult;
395 }
396 
397 /*************************************************************************
398 |*
399 |* das StyleSheet ermitteln, fuer das dieses StyleSheet steht
400 |*
401 \************************************************************************/
402 
403 SdStyleSheet* SdStyleSheet::GetRealStyleSheet() const
404 {
405     String aRealStyle;
406     String aSep( RTL_CONSTASCII_USTRINGPARAM( SD_LT_SEPARATOR ));
407     SdStyleSheet* pRealStyle = NULL;
408     SdDrawDocument* pDoc = ((SdStyleSheetPool&) rPool).GetDoc();
409 
410     ::sd::DrawViewShell* pDrawViewShell = 0;
411 
412     ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase* >( SfxViewShell::Current() );
413     if( pBase )
414         pDrawViewShell = dynamic_cast< ::sd::DrawViewShell* >( pBase->GetMainViewShell().get() );
415 
416     if (pDrawViewShell && pDrawViewShell->GetDoc() == pDoc)
417     {
418         SdPage* pPage = pDrawViewShell->getCurrentPage();
419         if( pPage )
420         {
421             aRealStyle = pPage->GetLayoutName();
422             // cut after seperator string
423             aRealStyle.Erase(aRealStyle.Search(aSep) + aSep.Len());
424         }
425     }
426 
427     if (aRealStyle.Len() == 0)
428     {
429         SdPage* pPage = pDoc->GetSdPage(0, PK_STANDARD);
430 
431         if (pPage)
432         {
433             aRealStyle = pDoc->GetSdPage(0, PK_STANDARD)->GetLayoutName();
434         }
435         else
436         {
437             // Noch keine Seite vorhanden
438             // Dieses kann beim Aktualisieren vonDokumentvorlagen vorkommen
439             SfxStyleSheetIterator aIter(&rPool, SD_STYLE_FAMILY_MASTERPAGE);
440             SfxStyleSheetBase* pSheet = aIter.First();
441             if( pSheet )
442                 aRealStyle = pSheet->GetName();
443         }
444 
445         aRealStyle.Erase(aRealStyle.Search(aSep) + aSep.Len());
446     }
447 
448     // jetzt vom Namen (landessprachlich angepasst) auf den internen
449     // Namen (unabhaengig von der Landessprache) mappen
450     String aInternalName;
451 
452     if (aName == String(SdResId(STR_PSEUDOSHEET_TITLE)))
453     {
454         aInternalName = String(SdResId(STR_LAYOUT_TITLE));
455     }
456     else if (aName == String(SdResId(STR_PSEUDOSHEET_SUBTITLE)))
457     {
458         aInternalName = String(SdResId(STR_LAYOUT_SUBTITLE));
459     }
460     else if (aName == String(SdResId(STR_PSEUDOSHEET_BACKGROUND)))
461     {
462         aInternalName = String(SdResId(STR_LAYOUT_BACKGROUND));
463     }
464     else if (aName == String(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS)))
465     {
466         aInternalName = String(SdResId(STR_LAYOUT_BACKGROUNDOBJECTS));
467     }
468     else if (aName == String(SdResId(STR_PSEUDOSHEET_NOTES)))
469     {
470         aInternalName = String(SdResId(STR_LAYOUT_NOTES));
471     }
472     else
473     {
474         String aOutlineStr(SdResId(STR_PSEUDOSHEET_OUTLINE));
475         sal_uInt16 nPos = aName.Search(aOutlineStr);
476         if (nPos != STRING_NOTFOUND)
477         {
478             String aNumStr(aName.Copy(aOutlineStr.Len()));
479             aInternalName = String(SdResId(STR_LAYOUT_OUTLINE));
480             aInternalName += aNumStr;
481         }
482     }
483 
484     aRealStyle += aInternalName;
485     pRealStyle = static_cast< SdStyleSheet* >( rPool.Find(aRealStyle, SD_STYLE_FAMILY_MASTERPAGE) );
486 
487 #ifdef DBG_UTIL
488     if( !pRealStyle )
489     {
490         SfxStyleSheetIterator aIter(&rPool, SD_STYLE_FAMILY_MASTERPAGE);
491         if( aIter.Count() > 0 )
492             // StyleSheet not found, but pool already loaded
493             DBG_ASSERT(pRealStyle, "Internal StyleSheet not found");
494     }
495 #endif
496 
497     return pRealStyle;
498 }
499 
500 /*************************************************************************
501 |*
502 |* das PseudoStyleSheet ermitteln, durch das dieses StyleSheet vertreten wird
503 |*
504 \************************************************************************/
505 
506 SdStyleSheet* SdStyleSheet::GetPseudoStyleSheet() const
507 {
508     SdStyleSheet* pPseudoStyle = NULL;
509     String aSep( RTL_CONSTASCII_USTRINGPARAM( SD_LT_SEPARATOR ));
510     String aStyleName(aName);
511         // ohne Layoutnamen und Separator
512     aStyleName.Erase(0, aStyleName.Search(aSep) + aSep.Len());
513 
514     if (aStyleName == String(SdResId(STR_LAYOUT_TITLE)))
515     {
516         aStyleName = String(SdResId(STR_PSEUDOSHEET_TITLE));
517     }
518     else if (aStyleName == String(SdResId(STR_LAYOUT_SUBTITLE)))
519     {
520         aStyleName = String(SdResId(STR_PSEUDOSHEET_SUBTITLE));
521     }
522     else if (aStyleName == String(SdResId(STR_LAYOUT_BACKGROUND)))
523     {
524         aStyleName = String(SdResId(STR_PSEUDOSHEET_BACKGROUND));
525     }
526     else if (aStyleName == String(SdResId(STR_LAYOUT_BACKGROUNDOBJECTS)))
527     {
528         aStyleName = String(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS));
529     }
530     else if (aStyleName == String(SdResId(STR_LAYOUT_NOTES)))
531     {
532         aStyleName = String(SdResId(STR_PSEUDOSHEET_NOTES));
533     }
534     else
535     {
536         String aOutlineStr((SdResId(STR_LAYOUT_OUTLINE)));
537         sal_uInt16 nPos = aStyleName.Search(aOutlineStr);
538         if (nPos != STRING_NOTFOUND)
539         {
540             String aNumStr(aStyleName.Copy(aOutlineStr.Len()));
541             aStyleName = String(SdResId(STR_PSEUDOSHEET_OUTLINE));
542             aStyleName += aNumStr;
543         }
544     }
545 
546     pPseudoStyle = static_cast<SdStyleSheet*>(rPool.Find(aStyleName, SD_STYLE_FAMILY_PSEUDO));
547     DBG_ASSERT(pPseudoStyle, "PseudoStyleSheet nicht gefunden");
548 
549     return pPseudoStyle;
550 }
551 
552 
553 /*************************************************************************
554 |*
555 |* Notify
556 |*
557 \************************************************************************/
558 
559 void SdStyleSheet::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
560 {
561     // erstmal die Basisklassenfunktionalitaet
562     SfxStyleSheet::Notify(rBC, rHint);
563 
564     // wenn der Stellvertreter ein Notify bezueglich geaenderter Attribute
565     // bekommt, sorgt er dafuer, dass das eigentlich gemeinte StyleSheet
566     // broadcastet
567     SfxSimpleHint* pSimple = PTR_CAST(SfxSimpleHint, &rHint);
568     sal_uLong nId = pSimple == NULL ? 0 : pSimple->GetId();
569     if (nId == SFX_HINT_DATACHANGED && nFamily == SD_STYLE_FAMILY_PSEUDO)
570     {
571         SdStyleSheet* pRealStyle = GetRealStyleSheet();
572         if (pRealStyle)
573             pRealStyle->Broadcast(rHint);
574     }
575 }
576 
577 /*************************************************************************
578 |* AdjustToFontHeight passt die Bulletbreite und den linken Texteinzug
579 |* des uebergebenen ItemSets dessen Fonthoehe an. Die neuen Werte werden so
580 |* berechnet, dass das Verhaeltnis zur Fonthoehe so ist wie im StyleSheet.
581 |*
582 |* bOnlyMissingItems legt fest, ob lediglich nicht gesetzte Items ergaenzt
583 |* (sal_True) oder explizit gesetzte Items ueberschreiben werden sollen (sal_False)
584 |*
585 \************************************************************************/
586 
587 void SdStyleSheet::AdjustToFontHeight(SfxItemSet& rSet, sal_Bool bOnlyMissingItems)
588 {
589     // Bulletbreite und Texteinzug an neue Fonthoehe
590     // anpassen, wenn sie nicht explizit gesetzt wurden
591     SfxStyleFamily eFamily = nFamily;
592     String aStyleName(aName);
593     if (eFamily == SD_STYLE_FAMILY_PSEUDO)
594     {
595         SfxStyleSheet* pRealStyle = GetRealStyleSheet();
596         eFamily = pRealStyle->GetFamily();
597         aStyleName = pRealStyle->GetName();
598     }
599 
600     if (eFamily == SD_STYLE_FAMILY_MASTERPAGE &&
601         aStyleName.Search(String(SdResId(STR_LAYOUT_OUTLINE))) != STRING_NOTFOUND &&
602         rSet.GetItemState(EE_CHAR_FONTHEIGHT) == SFX_ITEM_SET)
603     {
604         const SfxItemSet* pCurSet = &GetItemSet();
605         sal_uInt32 nNewHeight = ((SvxFontHeightItem&)rSet.Get(EE_CHAR_FONTHEIGHT)).GetHeight();
606         sal_uInt32 nOldHeight = ((SvxFontHeightItem&)pCurSet->Get(EE_CHAR_FONTHEIGHT)).GetHeight();
607 
608         if (rSet.GetItemState(EE_PARA_BULLET) != SFX_ITEM_SET || !bOnlyMissingItems)
609         {
610             const SvxBulletItem& rBItem = (const SvxBulletItem&)pCurSet->Get(EE_PARA_BULLET);
611             double fBulletFraction = double(rBItem.GetWidth()) / nOldHeight;
612             SvxBulletItem aNewBItem(rBItem);
613             aNewBItem.SetWidth((sal_uInt32)(fBulletFraction * nNewHeight));
614             rSet.Put(aNewBItem);
615         }
616 
617         if (rSet.GetItemState(EE_PARA_LRSPACE) != SFX_ITEM_SET || !bOnlyMissingItems)
618         {
619             const SvxLRSpaceItem& rLRItem = (const SvxLRSpaceItem&)pCurSet->Get(EE_PARA_LRSPACE);
620             double fIndentFraction = double(rLRItem.GetTxtLeft()) / nOldHeight;
621             SvxLRSpaceItem aNewLRItem(rLRItem);
622             aNewLRItem.SetTxtLeft((sal_uInt16)(fIndentFraction * nNewHeight));
623             double fFirstIndentFraction = double(rLRItem.GetTxtFirstLineOfst()) / nOldHeight;
624             aNewLRItem.SetTxtFirstLineOfst((short)(fFirstIndentFraction * nNewHeight));
625             rSet.Put(aNewLRItem);
626         }
627 
628         if (rSet.GetItemState(EE_PARA_ULSPACE) != SFX_ITEM_SET || !bOnlyMissingItems)
629         {
630             const SvxULSpaceItem& rULItem = (const SvxULSpaceItem&)pCurSet->Get(EE_PARA_ULSPACE);
631             SvxULSpaceItem aNewULItem(rULItem);
632             double fLowerFraction = double(rULItem.GetLower()) / nOldHeight;
633             aNewULItem.SetLower((sal_uInt16)(fLowerFraction * nNewHeight));
634             double fUpperFraction = double(rULItem.GetUpper()) / nOldHeight;
635             aNewULItem.SetUpper((sal_uInt16)(fUpperFraction * nNewHeight));
636             rSet.Put(aNewULItem);
637         }
638     }
639 }
640 
641 // --------------------------------------------------------------------
642 
643 sal_Bool SdStyleSheet::HasFollowSupport() const
644 {
645     return sal_False;
646 }
647 
648 // --------------------------------------------------------------------
649 
650 sal_Bool SdStyleSheet::HasParentSupport() const
651 {
652     return sal_True;
653 }
654 
655 // --------------------------------------------------------------------
656 
657 sal_Bool SdStyleSheet::HasClearParentSupport() const
658 {
659     return sal_True;
660 }
661 
662 // --------------------------------------------------------------------
663 
664 sal_Bool SdStyleSheet::SetName( const UniString& rName )
665 {
666     return SfxStyleSheet::SetName( rName );
667 }
668 
669 // --------------------------------------------------------------------
670 
671 void SdStyleSheet::SetHelpId( const String& r, sal_uLong nId )
672 {
673     SfxStyleSheet::SetHelpId( r, nId );
674 
675     if( (nId >= HID_PSEUDOSHEET_OUTLINE1) && ( nId <= HID_PSEUDOSHEET_OUTLINE9 ) )
676     {
677         msApiName = OUString( RTL_CONSTASCII_USTRINGPARAM("outline") );
678         msApiName += OUString( (sal_Unicode)( '1' + (nId - HID_PSEUDOSHEET_OUTLINE1) ) );
679     }
680     else
681     {
682         static struct ApiNameMap
683         {
684             const sal_Char* mpApiName;
685             sal_uInt32      mnApiNameLength;
686             sal_uInt32      mnHelpId;
687         }
688         pApiNameMap[] =
689         {
690             { RTL_CONSTASCII_STRINGPARAM( "title" ),            HID_PSEUDOSHEET_TITLE },
691             { RTL_CONSTASCII_STRINGPARAM( "subtitle" ),         HID_PSEUDOSHEET_SUBTITLE },
692             { RTL_CONSTASCII_STRINGPARAM( "background" ),       HID_PSEUDOSHEET_BACKGROUND },
693             { RTL_CONSTASCII_STRINGPARAM( "backgroundobjects" ),HID_PSEUDOSHEET_BACKGROUNDOBJECTS },
694             { RTL_CONSTASCII_STRINGPARAM( "notes" ),            HID_PSEUDOSHEET_NOTES },
695             { RTL_CONSTASCII_STRINGPARAM( "standard" ),         HID_STANDARD_STYLESHEET_NAME },
696             { RTL_CONSTASCII_STRINGPARAM( "objectwitharrow" ),  HID_POOLSHEET_OBJWITHARROW },
697             { RTL_CONSTASCII_STRINGPARAM( "objectwithshadow" ), HID_POOLSHEET_OBJWITHSHADOW },
698             { RTL_CONSTASCII_STRINGPARAM( "objectwithoutfill" ),HID_POOLSHEET_OBJWITHOUTFILL },
699             { RTL_CONSTASCII_STRINGPARAM( "text" ),             HID_POOLSHEET_TEXT },
700             { RTL_CONSTASCII_STRINGPARAM( "textbody" ),         HID_POOLSHEET_TEXTBODY },
701             { RTL_CONSTASCII_STRINGPARAM( "textbodyjustfied" ), HID_POOLSHEET_TEXTBODY_JUSTIFY },
702             { RTL_CONSTASCII_STRINGPARAM( "textbodyindent" ),   HID_POOLSHEET_TEXTBODY_INDENT },
703             { RTL_CONSTASCII_STRINGPARAM( "title" ),            HID_POOLSHEET_TITLE },
704             { RTL_CONSTASCII_STRINGPARAM( "title1" ),           HID_POOLSHEET_TITLE1 },
705             { RTL_CONSTASCII_STRINGPARAM( "title2" ),           HID_POOLSHEET_TITLE2 },
706             { RTL_CONSTASCII_STRINGPARAM( "headline" ),         HID_POOLSHEET_HEADLINE },
707             { RTL_CONSTASCII_STRINGPARAM( "headline1" ),        HID_POOLSHEET_HEADLINE1 },
708             { RTL_CONSTASCII_STRINGPARAM( "headline2" ),        HID_POOLSHEET_HEADLINE2 },
709             { RTL_CONSTASCII_STRINGPARAM( "measure" ),          HID_POOLSHEET_MEASURE },
710             { 0, 0, 0 }
711         };
712 
713         ApiNameMap* p = pApiNameMap;
714         while( p->mpApiName )
715         {
716             if( nId == p->mnHelpId )
717             {
718                 msApiName = OUString( p->mpApiName, p->mnApiNameLength, RTL_TEXTENCODING_ASCII_US );
719                 break;
720             }
721             p++;
722         }
723     }
724 }
725 
726 // --------------------------------------------------------------------
727 
728 OUString SdStyleSheet::GetFamilyString( SfxStyleFamily eFamily )
729 {
730     switch( eFamily )
731     {
732     case SD_STYLE_FAMILY_CELL:
733         return OUString( RTL_CONSTASCII_USTRINGPARAM( "cell" ) );
734     default:
735         DBG_ERROR( "SdStyleSheet::GetFamilyString(), illegal family!" );
736     case SD_STYLE_FAMILY_GRAPHICS:
737         return OUString( RTL_CONSTASCII_USTRINGPARAM( "graphics" ) );
738     }
739 }
740 
741 // --------------------------------------------------------------------
742 
743 void SdStyleSheet::throwIfDisposed() throw (RuntimeException)
744 {
745     if( !mxPool.is() )
746         throw DisposedException();
747 }
748 
749 // --------------------------------------------------------------------
750 
751 SdStyleSheet* SdStyleSheet::CreateEmptyUserStyle( SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily )
752 {
753     OUString aPrefix( RTL_CONSTASCII_USTRINGPARAM("user") );
754     OUString aName;
755     sal_Int32 nIndex = 1;
756     do
757     {
758         aName = aPrefix + OUString::valueOf( nIndex++ );
759     }
760     while( rPool.Find( aName, eFamily ) != 0 );
761 
762     return new SdStyleSheet(aName, rPool, eFamily, SFXSTYLEBIT_USERDEF);
763 }
764 
765 // --------------------------------------------------------------------
766 // XInterface
767 // --------------------------------------------------------------------
768 
769 /*
770 Any SAL_CALL SdStyleSheet::queryInterface( const ::com::sun::star::uno::Type& aType ) throw (RuntimeException)
771 {
772     return SdStyleSheetBase::queryInterface( aType );
773 }
774 
775 // --------------------------------------------------------------------
776 
777 void SAL_CALL SdStyleSheet::acquire(  ) throw ()
778 {
779     SdStyleSheetBase::acquire();
780 }
781 
782 // --------------------------------------------------------------------
783 */
784 void SAL_CALL SdStyleSheet::release(  ) throw ()
785 {
786     if (osl_decrementInterlockedCount( &m_refCount ) == 0)
787     {
788         // restore reference count:
789         osl_incrementInterlockedCount( &m_refCount );
790         if (! mrBHelper.bDisposed) try
791         {
792             dispose();
793         }
794         catch (RuntimeException const& exc)
795         { // don't break throw ()
796             OSL_ENSURE(
797                 false, OUStringToOString(
798                     exc.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
799             static_cast<void>(exc);
800         }
801         OSL_ASSERT( mrBHelper.bDisposed );
802         SdStyleSheetBase::release();
803     }
804 }
805 
806 // --------------------------------------------------------------------
807 // XWeak
808 // --------------------------------------------------------------------
809 /*
810 Reference< XAdapter > SAL_CALL SdStyleSheet::queryAdapter(  ) throw (RuntimeException)
811 {
812     return SdStyleSheetBase::queryAdapter();
813 }
814 
815 // --------------------------------------------------------------------
816 // XTypeProvider
817 // --------------------------------------------------------------------
818 
819 Sequence< Type > SAL_CALL SdStyleSheet::getTypes(  ) throw (RuntimeException)
820 {
821     return SdStyleSheetBase::getTypes();
822 }
823 
824 // --------------------------------------------------------------------
825 
826 Sequence< ::sal_Int8 > SAL_CALL SdStyleSheet::getImplementationId(  ) throw (RuntimeException)
827 {
828     return SdStyleSheetBase::getImplementationId();
829 }
830 */
831 // --------------------------------------------------------------------
832 // XComponent
833 // --------------------------------------------------------------------
834 
835 void SAL_CALL SdStyleSheet::dispose(  ) throw (RuntimeException)
836 {
837     ClearableMutexGuard aGuard( mrBHelper.rMutex );
838     if (!mrBHelper.bDisposed && !mrBHelper.bInDispose)
839     {
840         mrBHelper.bInDispose = sal_True;
841         aGuard.clear();
842         try
843         {
844             // side effect: keeping a reference to this
845             EventObject aEvt( static_cast< OWeakObject * >( this ) );
846             try
847             {
848                 mrBHelper.aLC.disposeAndClear( aEvt );
849                 disposing();
850             }
851             catch (...)
852             {
853                 MutexGuard aGuard2( mrBHelper.rMutex );
854                 // bDisposed and bInDispose must be set in this order:
855                 mrBHelper.bDisposed = sal_True;
856                 mrBHelper.bInDispose = sal_False;
857                 throw;
858             }
859             MutexGuard aGuard2( mrBHelper.rMutex );
860             // bDisposed and bInDispose must be set in this order:
861             mrBHelper.bDisposed = sal_True;
862             mrBHelper.bInDispose = sal_False;
863         }
864         catch (RuntimeException &)
865         {
866             throw;
867         }
868         catch (Exception & exc)
869         {
870             throw RuntimeException(
871                 OUString( RTL_CONSTASCII_USTRINGPARAM(
872                               "unexpected UNO exception caught: ") ) +
873                 exc.Message, Reference< XInterface >() );
874         }
875     }
876 }
877 
878 // --------------------------------------------------------------------
879 
880 void SdStyleSheet::disposing()
881 {
882     mxPool.clear();
883 }
884 
885 // --------------------------------------------------------------------
886 
887 void SAL_CALL SdStyleSheet::addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException)
888 {
889     ClearableMutexGuard aGuard( mrBHelper.rMutex );
890     if (mrBHelper.bDisposed || mrBHelper.bInDispose)
891     {
892         aGuard.clear();
893         EventObject aEvt( static_cast< OWeakObject * >( this ) );
894         xListener->disposing( aEvt );
895     }
896     else
897     {
898         mrBHelper.addListener( ::getCppuType( &xListener ), xListener );
899     }
900 }
901 
902 // --------------------------------------------------------------------
903 
904 void SAL_CALL SdStyleSheet::removeEventListener( const Reference< XEventListener >& xListener  ) throw (RuntimeException)
905 {
906     mrBHelper.removeListener( ::getCppuType( &xListener ), xListener );
907 }
908 
909 //------------------------------------------------------------------------
910 // XModifyBroadcaster
911 //------------------------------------------------------------------------
912 
913 void SAL_CALL SdStyleSheet::addModifyListener( const Reference< XModifyListener >& xListener ) throw (RuntimeException)
914 {
915     ClearableMutexGuard aGuard( mrBHelper.rMutex );
916     if (mrBHelper.bDisposed || mrBHelper.bInDispose)
917     {
918         aGuard.clear();
919         EventObject aEvt( static_cast< OWeakObject * >( this ) );
920         xListener->disposing( aEvt );
921     }
922     else
923     {
924         if( !mpModifyListenerForewarder.get() )
925             mpModifyListenerForewarder.reset( new ModifyListenerForewarder( this ) );
926         mrBHelper.addListener( XModifyListener::static_type(), xListener );
927     }
928 }
929 
930 //------------------------------------------------------------------------
931 
932 void SAL_CALL SdStyleSheet::removeModifyListener( const Reference< XModifyListener >& xListener ) throw (RuntimeException)
933 {
934     mrBHelper.removeListener( XModifyListener::static_type(), xListener );
935 }
936 
937 //------------------------------------------------------------------------
938 
939 void SdStyleSheet::notifyModifyListener()
940 {
941     MutexGuard aGuard( mrBHelper.rMutex );
942 
943     OInterfaceContainerHelper * pContainer = mrBHelper.getContainer( XModifyListener::static_type() );
944     if( pContainer )
945     {
946         EventObject aEvt( static_cast< OWeakObject * >( this ) );
947         pContainer->forEach<XModifyListener>( boost::bind( &XModifyListener::modified, _1, boost::cref( aEvt ) ) );
948     }
949 }
950 
951 
952 // --------------------------------------------------------------------
953 // XServiceInfo
954 // --------------------------------------------------------------------
955 
956 OUString SAL_CALL SdStyleSheet::getImplementationName() throw(RuntimeException)
957 {
958     return OUString::createFromAscii( "SdStyleSheet" );
959 }
960 
961 // --------------------------------------------------------------------
962 
963 sal_Bool SAL_CALL SdStyleSheet::supportsService( const OUString& ServiceName ) throw(RuntimeException)
964 {
965     return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
966 }
967 
968 // --------------------------------------------------------------------
969 
970 Sequence< OUString > SAL_CALL SdStyleSheet::getSupportedServiceNames() throw(RuntimeException)
971 {
972     Sequence< OUString > aNameSequence( 10 );
973     OUString* pStrings = aNameSequence.getArray();
974 
975     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.Style" ) );
976     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.FillProperties" ) );
977     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.LineProperties" ) );
978     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.ShadowProperties" ) );
979     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.ConnectorProperties" ) );
980     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.MeasureProperties" ) );
981     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.ParagraphProperties" ) );
982     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.CharacterProperties" ) );
983     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.TextProperties" ) );
984     *pStrings++ = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.Text" ) );
985 
986     return aNameSequence;
987 }
988 
989 // --------------------------------------------------------------------
990 // XNamed
991 // --------------------------------------------------------------------
992 
993 OUString SAL_CALL SdStyleSheet::getName() throw(RuntimeException)
994 {
995     OGuard aGuard( Application::GetSolarMutex() );
996     throwIfDisposed();
997     return GetApiName();
998 }
999 
1000 // --------------------------------------------------------------------
1001 
1002 void SAL_CALL SdStyleSheet::setName( const OUString& rName  ) throw(RuntimeException)
1003 {
1004     OGuard aGuard( Application::GetSolarMutex() );
1005     throwIfDisposed();
1006 
1007     if( SetName( rName ) )
1008     {
1009         msApiName = rName;
1010         Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
1011     }
1012 }
1013 
1014 // --------------------------------------------------------------------
1015 // XStyle
1016 // --------------------------------------------------------------------
1017 
1018 sal_Bool SAL_CALL SdStyleSheet::isUserDefined() throw(RuntimeException)
1019 {
1020     OGuard aGuard( Application::GetSolarMutex() );
1021     throwIfDisposed();
1022     return IsUserDefined() ? sal_True : sal_False;
1023 }
1024 
1025 // --------------------------------------------------------------------
1026 
1027 sal_Bool SAL_CALL SdStyleSheet::isInUse() throw(RuntimeException)
1028 {
1029     OGuard aGuard( Application::GetSolarMutex() );
1030     throwIfDisposed();
1031     return IsUsed() ? sal_True : sal_False;
1032 }
1033 
1034 // --------------------------------------------------------------------
1035 
1036 OUString SAL_CALL SdStyleSheet::getParentStyle() throw(RuntimeException)
1037 {
1038     OGuard aGuard( Application::GetSolarMutex() );
1039     throwIfDisposed();
1040 
1041     if( GetParent().Len() )
1042     {
1043         SdStyleSheet* pParentStyle = static_cast< SdStyleSheet* >( mxPool->Find( GetParent(), nFamily ) );
1044         if( pParentStyle )
1045             return pParentStyle->msApiName;
1046     }
1047     return OUString();
1048 }
1049 
1050 // --------------------------------------------------------------------
1051 
1052 void SAL_CALL SdStyleSheet::setParentStyle( const OUString& rParentName  ) throw(NoSuchElementException, RuntimeException)
1053 {
1054     OGuard aGuard( Application::GetSolarMutex() );
1055     throwIfDisposed();
1056 
1057     if( rParentName.getLength() )
1058     {
1059         const SfxStyles& rStyles = mxPool->GetStyles();
1060 
1061         for( SfxStyles::const_iterator iter( rStyles.begin() ); iter != rStyles.end(); iter++ )
1062         {
1063             SdStyleSheet* pStyle = static_cast< SdStyleSheet* >( (*iter).get() );
1064             if( pStyle && (pStyle->nFamily == nFamily) && (pStyle->msApiName == rParentName) )
1065             {
1066                 if( pStyle != this )
1067                     SetParent( pStyle->GetName() );
1068                 return;
1069             }
1070         }
1071         throw NoSuchElementException();
1072     }
1073     else
1074     {
1075         SetParent( rParentName );
1076     }
1077 }
1078 
1079 // --------------------------------------------------------------------
1080 // XPropertySet
1081 // --------------------------------------------------------------------
1082 
1083 Reference< XPropertySetInfo > SdStyleSheet::getPropertySetInfo() throw(RuntimeException)
1084 {
1085     throwIfDisposed();
1086     static Reference< XPropertySetInfo > xInfo;
1087     if( !xInfo.is() )
1088         xInfo = GetStylePropertySet().getPropertySetInfo();
1089     return xInfo;
1090 }
1091 
1092 // --------------------------------------------------------------------
1093 
1094 void SAL_CALL SdStyleSheet::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
1095 {
1096     OGuard aGuard( Application::GetSolarMutex() );
1097     throwIfDisposed();
1098 
1099     const SfxItemPropertySimpleEntry* pEntry = getPropertyMapEntry( aPropertyName );
1100     if( pEntry == NULL )
1101     {
1102         throw UnknownPropertyException();
1103     }
1104     else
1105     {
1106         if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
1107             return; // not yet implemented for styles
1108 
1109         if( pEntry->nWID == WID_STYLE_FAMILY )
1110             throw PropertyVetoException();
1111 
1112         if( (pEntry->nWID == EE_PARA_NUMBULLET) && (GetFamily() == SD_STYLE_FAMILY_MASTERPAGE) )
1113         {
1114             String aStr;
1115             const sal_uInt32 nTempHelpId = GetHelpId( aStr );
1116 
1117             if( (nTempHelpId >= HID_PSEUDOSHEET_OUTLINE2) && (nTempHelpId <= HID_PSEUDOSHEET_OUTLINE9) )
1118                 return;
1119         }
1120 
1121         SfxItemSet &rStyleSet = GetItemSet();
1122 
1123         if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
1124         {
1125             BitmapMode eMode;
1126             if( aValue >>= eMode )
1127             {
1128                 rStyleSet.Put( XFillBmpStretchItem( eMode == BitmapMode_STRETCH ) );
1129                 rStyleSet.Put( XFillBmpTileItem( eMode == BitmapMode_REPEAT ) );
1130                 return;
1131             }
1132             throw IllegalArgumentException();
1133         }
1134 
1135         SfxItemSet aSet( GetPool().GetPool(),   pEntry->nWID, pEntry->nWID);
1136         aSet.Put( rStyleSet );
1137 
1138         if( !aSet.Count() )
1139         {
1140             if( EE_PARA_NUMBULLET == pEntry->nWID )
1141             {
1142                 Font aBulletFont;
1143                 SdStyleSheetPool::PutNumBulletItem( this, aBulletFont );
1144                 aSet.Put( rStyleSet );
1145             }
1146             else
1147             {
1148                 aSet.Put( GetPool().GetPool().GetDefaultItem( pEntry->nWID ) );
1149             }
1150         }
1151 
1152         if( pEntry->nMemberId == MID_NAME &&
1153             ( pEntry->nWID == XATTR_FILLBITMAP || pEntry->nWID == XATTR_FILLGRADIENT ||
1154               pEntry->nWID == XATTR_FILLHATCH || pEntry->nWID == XATTR_FILLFLOATTRANSPARENCE ||
1155               pEntry->nWID == XATTR_LINESTART || pEntry->nWID == XATTR_LINEEND || pEntry->nWID == XATTR_LINEDASH) )
1156         {
1157             OUString aTempName;
1158             if(!(aValue >>= aTempName ))
1159                 throw IllegalArgumentException();
1160 
1161             SvxShape::SetFillAttribute( pEntry->nWID, aTempName, aSet );
1162         }
1163         else if(!SvxUnoTextRangeBase::SetPropertyValueHelper( aSet, pEntry, aValue, aSet ))
1164         {
1165             SvxItemPropertySet_setPropertyValue( GetStylePropertySet(), pEntry, aValue, aSet );
1166         }
1167 
1168         rStyleSet.Put( aSet );
1169         Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
1170     }
1171 }
1172 
1173 // --------------------------------------------------------------------
1174 
1175 Any SAL_CALL SdStyleSheet::getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1176 {
1177     OGuard aGuard( Application::GetSolarMutex() );
1178 
1179     throwIfDisposed();
1180 
1181     const SfxItemPropertySimpleEntry* pEntry = getPropertyMapEntry( PropertyName );
1182     if( pEntry == NULL )
1183     {
1184         throw UnknownPropertyException();
1185     }
1186     else
1187     {
1188         Any aAny;
1189 
1190         if( pEntry->nWID == WID_STYLE_FAMILY )
1191         {
1192             if( nFamily == SD_STYLE_FAMILY_MASTERPAGE )
1193             {
1194                 const OUString aLayoutName( GetName() );
1195                 aAny <<= aLayoutName.copy( 0, aLayoutName.indexOf(OUString( RTL_CONSTASCII_USTRINGPARAM(SD_LT_SEPARATOR) ) ) );
1196             }
1197             else
1198             {
1199                 aAny <<= GetFamilyString(nFamily);
1200             }
1201         }
1202         else if( pEntry->nWID == WID_STYLE_DISPNAME )
1203         {
1204             aAny <<= maDisplayName;
1205         }
1206         else if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
1207         {
1208             aAny <<= sal_False;
1209         }
1210         else if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
1211         {
1212             SfxItemSet &rStyleSet = GetItemSet();
1213 
1214             XFillBmpStretchItem* pStretchItem = (XFillBmpStretchItem*)rStyleSet.GetItem(XATTR_FILLBMP_STRETCH);
1215             XFillBmpTileItem* pTileItem = (XFillBmpTileItem*)rStyleSet.GetItem(XATTR_FILLBMP_TILE);
1216 
1217             if( pStretchItem && pTileItem )
1218             {
1219                 if( pTileItem->GetValue() )
1220                     aAny <<= BitmapMode_REPEAT;
1221                 else if( pStretchItem->GetValue() )
1222                     aAny <<= BitmapMode_STRETCH;
1223                 else
1224                     aAny <<= BitmapMode_NO_REPEAT;
1225             }
1226         }
1227         else
1228         {
1229             SfxItemSet aSet( GetPool().GetPool(),   pEntry->nWID, pEntry->nWID);
1230 
1231             const SfxPoolItem* pItem;
1232             SfxItemSet& rStyleSet = GetItemSet();
1233 
1234             if( rStyleSet.GetItemState( pEntry->nWID, sal_True, &pItem ) == SFX_ITEM_SET )
1235                 aSet.Put(  *pItem );
1236 
1237             if( !aSet.Count() )
1238                 aSet.Put( GetPool().GetPool().GetDefaultItem( pEntry->nWID ) );
1239 
1240             if(SvxUnoTextRangeBase::GetPropertyValueHelper( aSet, pEntry, aAny ))
1241                 return aAny;
1242 
1243             // Hole Wert aus ItemSet
1244             aAny = SvxItemPropertySet_getPropertyValue( GetStylePropertySet(),pEntry, aSet );
1245         }
1246 
1247         if( *pEntry->pType != aAny.getValueType() )
1248         {
1249             // since the sfx uint16 item now exports a sal_Int32, we may have to fix this here
1250             if( ( *pEntry->pType == ::getCppuType((const sal_Int16*)0)) && aAny.getValueType() == ::getCppuType((const sal_Int32*)0) )
1251             {
1252                 sal_Int32 nValue = 0;
1253                 aAny >>= nValue;
1254                 aAny <<= (sal_Int16)nValue;
1255             }
1256             else
1257             {
1258                 DBG_ERROR("SvxShape::GetAnyForItem() Returnvalue has wrong Type!" );
1259             }
1260         }
1261 
1262         return aAny;
1263     }
1264 }
1265 
1266 // --------------------------------------------------------------------
1267 
1268 void SAL_CALL SdStyleSheet::addPropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >&  ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) {}
1269 void SAL_CALL SdStyleSheet::removePropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >&  ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) {}
1270 void SAL_CALL SdStyleSheet::addVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >&  ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) {}
1271 void SAL_CALL SdStyleSheet::removeVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >&  ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) {}
1272 
1273 // --------------------------------------------------------------------
1274 // XPropertyState
1275 // --------------------------------------------------------------------
1276 
1277 PropertyState SAL_CALL SdStyleSheet::getPropertyState( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException)
1278 {
1279     OGuard aGuard( Application::GetSolarMutex() );
1280 
1281     throwIfDisposed();
1282 
1283     const SfxItemPropertySimpleEntry* pEntry = getPropertyMapEntry( PropertyName );
1284 
1285     if( pEntry == NULL )
1286         throw UnknownPropertyException();
1287 
1288     if( pEntry->nWID == WID_STYLE_FAMILY )
1289     {
1290         return PropertyState_DIRECT_VALUE;
1291     }
1292     else if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
1293     {
1294         return PropertyState_DEFAULT_VALUE;
1295     }
1296     else if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
1297     {
1298         const SfxItemSet& rSet = GetItemSet();
1299 
1300         if( rSet.GetItemState( XATTR_FILLBMP_STRETCH, false ) == SFX_ITEM_SET ||
1301             rSet.GetItemState( XATTR_FILLBMP_TILE, false ) == SFX_ITEM_SET )
1302         {
1303             return PropertyState_DIRECT_VALUE;
1304         }
1305         else
1306         {
1307             return PropertyState_AMBIGUOUS_VALUE;
1308         }
1309     }
1310     else
1311     {
1312         SfxItemSet &rStyleSet = GetItemSet();
1313 
1314         PropertyState eState;
1315 
1316         switch( rStyleSet.GetItemState( pEntry->nWID, sal_False ) )
1317         {
1318         case SFX_ITEM_READONLY:
1319         case SFX_ITEM_SET:
1320             eState = PropertyState_DIRECT_VALUE;
1321             break;
1322         case SFX_ITEM_DEFAULT:
1323             eState = PropertyState_DEFAULT_VALUE;
1324             break;
1325 //      case SFX_ITEM_DONTCARE:
1326 //      case SFX_ITEM_DISABLED:
1327         default:
1328             eState = PropertyState_AMBIGUOUS_VALUE;
1329             break;
1330         }
1331 
1332         // if a item is set, this doesn't mean we want it :)
1333         if( ( PropertyState_DIRECT_VALUE == eState ) )
1334         {
1335             switch( pEntry->nWID )
1336             {
1337             case XATTR_FILLBITMAP:
1338             case XATTR_FILLGRADIENT:
1339             case XATTR_FILLHATCH:
1340             case XATTR_FILLFLOATTRANSPARENCE:
1341             case XATTR_LINEEND:
1342             case XATTR_LINESTART:
1343             case XATTR_LINEDASH:
1344                 {
1345                     NameOrIndex* pItem = (NameOrIndex*)rStyleSet.GetItem((sal_uInt16)pEntry->nWID);
1346                     if( ( pItem == NULL ) || ( pItem->GetName().Len() == 0) )
1347                         eState = PropertyState_DEFAULT_VALUE;
1348                 }
1349             }
1350         }
1351 
1352         return eState;
1353     }
1354 }
1355 
1356 // --------------------------------------------------------------------
1357 
1358 Sequence< PropertyState > SAL_CALL SdStyleSheet::getPropertyStates( const Sequence< OUString >& aPropertyName ) throw(UnknownPropertyException, RuntimeException)
1359 {
1360     OGuard aGuard( Application::GetSolarMutex() );
1361 
1362     throwIfDisposed();
1363 
1364     sal_Int32 nCount = aPropertyName.getLength();
1365     const OUString* pNames = aPropertyName.getConstArray();
1366 
1367     Sequence< PropertyState > aPropertyStateSequence( nCount );
1368     PropertyState* pState = aPropertyStateSequence.getArray();
1369 
1370     while( nCount-- )
1371         *pState++ = getPropertyState( *pNames++ );
1372 
1373     return aPropertyStateSequence;
1374 }
1375 
1376 // --------------------------------------------------------------------
1377 
1378 void SAL_CALL SdStyleSheet::setPropertyToDefault( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException)
1379 {
1380     OGuard aGuard( Application::GetSolarMutex() );
1381 
1382     throwIfDisposed();
1383 
1384     const SfxItemPropertySimpleEntry* pEntry = getPropertyMapEntry( PropertyName );
1385     if( pEntry == NULL )
1386         throw UnknownPropertyException();
1387 
1388     SfxItemSet &rStyleSet = GetItemSet();
1389 
1390     if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
1391     {
1392         rStyleSet.ClearItem( XATTR_FILLBMP_STRETCH );
1393         rStyleSet.ClearItem( XATTR_FILLBMP_TILE );
1394     }
1395     else
1396     {
1397         rStyleSet.ClearItem( pEntry->nWID );
1398     }
1399     Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
1400 }
1401 
1402 // --------------------------------------------------------------------
1403 
1404 Any SAL_CALL SdStyleSheet::getPropertyDefault( const OUString& aPropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1405 {
1406     OGuard aGuard( Application::GetSolarMutex() );
1407 
1408     throwIfDisposed();
1409 
1410     const SfxItemPropertySimpleEntry* pEntry = getPropertyMapEntry( aPropertyName );
1411     if( pEntry == NULL )
1412         throw UnknownPropertyException();
1413     Any aRet;
1414     if( pEntry->nWID == WID_STYLE_FAMILY )
1415     {
1416         aRet <<= GetFamilyString(nFamily);
1417     }
1418     else if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
1419     {
1420         aRet <<= sal_False;
1421     }
1422     else if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
1423     {
1424         aRet <<= BitmapMode_REPEAT;
1425     }
1426     else
1427     {
1428         SfxItemPool& rMyPool = GetPool().GetPool();
1429         SfxItemSet aSet( rMyPool,   pEntry->nWID, pEntry->nWID);
1430         aSet.Put( rMyPool.GetDefaultItem( pEntry->nWID ) );
1431         aRet = SvxItemPropertySet_getPropertyValue( GetStylePropertySet(), pEntry, aSet );
1432     }
1433     return aRet;
1434 }
1435 
1436 // --------------------------------------------------------------------
1437 
1438 /** this is used because our property map is not sorted yet */
1439 const SfxItemPropertySimpleEntry* SdStyleSheet::getPropertyMapEntry( const OUString& rPropertyName ) const throw()
1440 {
1441     return GetStylePropertySet().getPropertyMapEntry(rPropertyName);
1442 }
1443 
1444