xref: /AOO41X/main/sw/source/core/attr/format.cxx (revision 808c4840145b66ebc65ba9c0f5bc9b4b53af9eab)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <hintids.hxx>          // fuer RES_..
29cdf0e10cSrcweir #include <frame.hxx>            // fuer AttrCache
30cdf0e10cSrcweir #include <format.hxx>
31cdf0e10cSrcweir #include <hints.hxx>            // fuer SwFmtChg
32cdf0e10cSrcweir #include <doc.hxx>
33cdf0e10cSrcweir #include <paratr.hxx>           // fuer SwParaFmt - SwHyphenBug
34cdf0e10cSrcweir #include <swcache.hxx>
35cdf0e10cSrcweir #include <fmtcolfunc.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir TYPEINIT1( SwFmt, SwClient );   //rtti fuer SwFmt
38cdf0e10cSrcweir 
39cdf0e10cSrcweir /*************************************************************************
40cdf0e10cSrcweir |*    SwFmt::SwFmt
41cdf0e10cSrcweir *************************************************************************/
42cdf0e10cSrcweir 
43cdf0e10cSrcweir 
SwFmt(SwAttrPool & rPool,const sal_Char * pFmtNm,const sal_uInt16 * pWhichRanges,SwFmt * pDrvdFrm,sal_uInt16 nFmtWhich)44cdf0e10cSrcweir SwFmt::SwFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
45cdf0e10cSrcweir             const sal_uInt16* pWhichRanges, SwFmt *pDrvdFrm, sal_uInt16 nFmtWhich )
46cdf0e10cSrcweir     : SwModify( pDrvdFrm ),
47cdf0e10cSrcweir     aSet( rPool, pWhichRanges ),
48cdf0e10cSrcweir     nWhichId( nFmtWhich ),
49cdf0e10cSrcweir     nFmtId( 0 ),
50cdf0e10cSrcweir     nPoolFmtId( USHRT_MAX ),
51cdf0e10cSrcweir     nPoolHelpId( USHRT_MAX ),
52cdf0e10cSrcweir     nPoolHlpFileId( UCHAR_MAX )
53cdf0e10cSrcweir {
54cdf0e10cSrcweir     aFmtName.AssignAscii( pFmtNm );
55cdf0e10cSrcweir     bWritten = bFmtInDTOR = bAutoUpdateFmt = sal_False; // LAYER_IMPL
56cdf0e10cSrcweir     bAutoFmt = sal_True;
57cdf0e10cSrcweir 
58cdf0e10cSrcweir     if( pDrvdFrm )
59cdf0e10cSrcweir         aSet.SetParent( &pDrvdFrm->aSet );
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir 
SwFmt(SwAttrPool & rPool,const String & rFmtNm,const sal_uInt16 * pWhichRanges,SwFmt * pDrvdFrm,sal_uInt16 nFmtWhich)63cdf0e10cSrcweir SwFmt::SwFmt( SwAttrPool& rPool, const String &rFmtNm,
64cdf0e10cSrcweir             const sal_uInt16* pWhichRanges, SwFmt *pDrvdFrm, sal_uInt16 nFmtWhich )
65cdf0e10cSrcweir     : SwModify( pDrvdFrm ),
66cdf0e10cSrcweir     aFmtName( rFmtNm ),
67cdf0e10cSrcweir     aSet( rPool, pWhichRanges ),
68cdf0e10cSrcweir     nWhichId( nFmtWhich ),
69cdf0e10cSrcweir     nFmtId( 0 ),
70cdf0e10cSrcweir     nPoolFmtId( USHRT_MAX ),
71cdf0e10cSrcweir     nPoolHelpId( USHRT_MAX ),
72cdf0e10cSrcweir     nPoolHlpFileId( UCHAR_MAX )
73cdf0e10cSrcweir {
74cdf0e10cSrcweir     bWritten = bFmtInDTOR = bAutoUpdateFmt = sal_False; // LAYER_IMPL
75cdf0e10cSrcweir     bAutoFmt = sal_True;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir     if( pDrvdFrm )
78cdf0e10cSrcweir         aSet.SetParent( &pDrvdFrm->aSet );
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir 
SwFmt(const SwFmt & rFmt)82cdf0e10cSrcweir SwFmt::SwFmt( const SwFmt& rFmt )
83cdf0e10cSrcweir     : SwModify( rFmt.DerivedFrom() ),
84cdf0e10cSrcweir     aFmtName( rFmt.aFmtName ),
85cdf0e10cSrcweir     aSet( rFmt.aSet ),
86cdf0e10cSrcweir     nWhichId( rFmt.nWhichId ),
87cdf0e10cSrcweir     nFmtId( 0 ),
88cdf0e10cSrcweir     nPoolFmtId( rFmt.GetPoolFmtId() ),
89cdf0e10cSrcweir     nPoolHelpId( rFmt.GetPoolHelpId() ),
90cdf0e10cSrcweir     nPoolHlpFileId( rFmt.GetPoolHlpFileId() )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     bWritten = bFmtInDTOR = sal_False; // LAYER_IMPL
93cdf0e10cSrcweir     bAutoFmt = rFmt.bAutoFmt;
94cdf0e10cSrcweir     bAutoUpdateFmt = rFmt.bAutoUpdateFmt;
95cdf0e10cSrcweir 
96cdf0e10cSrcweir     if( rFmt.DerivedFrom() )
97cdf0e10cSrcweir         aSet.SetParent( &rFmt.DerivedFrom()->aSet );
98cdf0e10cSrcweir     // einige Sonderbehandlungen fuer Attribute
99cdf0e10cSrcweir     aSet.SetModifyAtAttr( this );
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
102cdf0e10cSrcweir /*************************************************************************
103cdf0e10cSrcweir |*    SwFmt &SwFmt::operator=(const SwFmt& aFmt)
104cdf0e10cSrcweir |*
105cdf0e10cSrcweir |*    Beschreibung      Dokument 1.14
106cdf0e10cSrcweir |*    Ersterstellung    JP 22.11.90
107cdf0e10cSrcweir |*    Letzte Aenderung  JP 05.08.94
108cdf0e10cSrcweir *************************************************************************/
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 
operator =(const SwFmt & rFmt)111cdf0e10cSrcweir SwFmt &SwFmt::operator=(const SwFmt& rFmt)
112cdf0e10cSrcweir {
113cdf0e10cSrcweir     nWhichId = rFmt.nWhichId;
114cdf0e10cSrcweir     nPoolFmtId = rFmt.GetPoolFmtId();
115cdf0e10cSrcweir     nPoolHelpId = rFmt.GetPoolHelpId();
116cdf0e10cSrcweir     nPoolHlpFileId = rFmt.GetPoolHlpFileId();
117cdf0e10cSrcweir 
118cdf0e10cSrcweir     if ( IsInCache() )
119cdf0e10cSrcweir     {
120cdf0e10cSrcweir         SwFrm::GetCache().Delete( this );
121cdf0e10cSrcweir         SetInCache( sal_False );
122cdf0e10cSrcweir     }
123cdf0e10cSrcweir     SetInSwFntCache( sal_False );
124cdf0e10cSrcweir 
125cdf0e10cSrcweir     // kopiere nur das Attribut-Delta Array
126cdf0e10cSrcweir     SwAttrSet aOld( *aSet.GetPool(), aSet.GetRanges() ),
127cdf0e10cSrcweir                 aNew( *aSet.GetPool(), aSet.GetRanges() );
128cdf0e10cSrcweir     aSet.Intersect_BC( rFmt.aSet, &aOld, &aNew );
129cdf0e10cSrcweir     aSet.Put_BC( rFmt.aSet, &aOld, &aNew );
130cdf0e10cSrcweir 
131cdf0e10cSrcweir     // einige Sonderbehandlungen fuer Attribute
132cdf0e10cSrcweir     aSet.SetModifyAtAttr( this );
133cdf0e10cSrcweir 
134cdf0e10cSrcweir     // PoolItem-Attr erzeugen fuers Modify !!!
135cdf0e10cSrcweir     if( aOld.Count() )
136cdf0e10cSrcweir     {
137cdf0e10cSrcweir         SwAttrSetChg aChgOld( aSet, aOld );
138cdf0e10cSrcweir         SwAttrSetChg aChgNew( aSet, aNew );
139cdf0e10cSrcweir         ModifyNotification( &aChgOld, &aChgNew );        // alle veraenderten werden verschickt
140cdf0e10cSrcweir     }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     if( GetRegisteredIn() != rFmt.GetRegisteredIn() )
143cdf0e10cSrcweir     {
144cdf0e10cSrcweir         if( GetRegisteredIn() )
145cdf0e10cSrcweir             GetRegisteredInNonConst()->Remove(this);
146cdf0e10cSrcweir         if(rFmt.GetRegisteredIn())
147cdf0e10cSrcweir         {
148cdf0e10cSrcweir             const_cast<SwFmt&>(rFmt).GetRegisteredInNonConst()->Add(this);
149cdf0e10cSrcweir             aSet.SetParent( &rFmt.aSet );
150cdf0e10cSrcweir         }
151cdf0e10cSrcweir         else
152cdf0e10cSrcweir             aSet.SetParent( 0 );
153cdf0e10cSrcweir     }
154cdf0e10cSrcweir     bAutoFmt = rFmt.bAutoFmt;
155cdf0e10cSrcweir     bAutoUpdateFmt = rFmt.bAutoUpdateFmt;
156cdf0e10cSrcweir     return *this;
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
SetName(const String & rNewName,sal_Bool bBroadcast)159cdf0e10cSrcweir void SwFmt::SetName( const String& rNewName, sal_Bool bBroadcast )
160cdf0e10cSrcweir {
161cdf0e10cSrcweir     ASSERT(!IsDefault(), "SetName: Defaultformat" );
162cdf0e10cSrcweir     if( bBroadcast )
163cdf0e10cSrcweir     {
164cdf0e10cSrcweir         SwStringMsgPoolItem aOld( RES_NAME_CHANGED, aFmtName );
165cdf0e10cSrcweir         SwStringMsgPoolItem aNew( RES_NAME_CHANGED, rNewName );
166cdf0e10cSrcweir         aFmtName = rNewName;
167cdf0e10cSrcweir         ModifyNotification( &aOld, &aNew );
168cdf0e10cSrcweir     }
169cdf0e10cSrcweir     else
170cdf0e10cSrcweir     {
171cdf0e10cSrcweir         aFmtName = rNewName;
172cdf0e10cSrcweir     }
173cdf0e10cSrcweir }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
176cdf0e10cSrcweir  * diese Funktion wird in jedem Copy-Ctor gerufen, damit die
177cdf0e10cSrcweir  * Attribute kopiert werden. Diese koennen erst kopiert werden,
178cdf0e10cSrcweir  * wenn die abgeleitet Klasse existiert, denn beim Setzen der
179cdf0e10cSrcweir  * Attribute wird die Which()-Methode gerufen, die hier in der
180cdf0e10cSrcweir  * Basis-Klasse auf 0 defaultet ist.
181cdf0e10cSrcweir  *
182cdf0e10cSrcweir  * Zusatz: JP 8.4.1994
183cdf0e10cSrcweir  *  Wird ueber Dokumentgrenzen kopiert, so muss das neue Dokument
184cdf0e10cSrcweir  *  mit angeben werden, in dem this steht. Z.Z. ist das fuers
185cdf0e10cSrcweir  *  DropCaps wichtig, dieses haelt Daten, die tief kopiert werden
186cdf0e10cSrcweir  *  muessen !!
187cdf0e10cSrcweir  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 
CopyAttrs(const SwFmt & rFmt,sal_Bool bReplace)190cdf0e10cSrcweir void SwFmt::CopyAttrs( const SwFmt& rFmt, sal_Bool bReplace )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir     // kopiere nur das Attribut-Delta Array
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     if ( IsInCache() )
195cdf0e10cSrcweir     {
196cdf0e10cSrcweir         SwFrm::GetCache().Delete( this );
197cdf0e10cSrcweir         SetInCache( sal_False );
198cdf0e10cSrcweir     }
199cdf0e10cSrcweir     SetInSwFntCache( sal_False );
200cdf0e10cSrcweir 
201cdf0e10cSrcweir     // Sonderbehandlung fuer einige Attribute
202cdf0e10cSrcweir     SwAttrSet* pChgSet = (SwAttrSet*)&rFmt.aSet;
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     if( !bReplace )     // nur die neu, die nicht gesetzt sind ??
205cdf0e10cSrcweir     {
206cdf0e10cSrcweir         if( pChgSet == (SwAttrSet*)&rFmt.aSet )     // Set hier kopieren
207cdf0e10cSrcweir             pChgSet = new SwAttrSet( rFmt.aSet );
208cdf0e10cSrcweir         pChgSet->Differentiate( aSet );
209cdf0e10cSrcweir     }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     // kopiere nur das Attribut-Delta Array
212cdf0e10cSrcweir     if( pChgSet->GetPool() != aSet.GetPool() )
213cdf0e10cSrcweir         pChgSet->CopyToModify( *this );
214cdf0e10cSrcweir     else
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         SwAttrSet aOld( *aSet.GetPool(), aSet.GetRanges() ),
217cdf0e10cSrcweir                   aNew( *aSet.GetPool(), aSet.GetRanges() );
218cdf0e10cSrcweir 
219cdf0e10cSrcweir         if ( 0 != aSet.Put_BC( *pChgSet, &aOld, &aNew ) )
220cdf0e10cSrcweir         {
221cdf0e10cSrcweir             // einige Sonderbehandlungen fuer Attribute
222cdf0e10cSrcweir             aSet.SetModifyAtAttr( this );
223cdf0e10cSrcweir 
224cdf0e10cSrcweir             SwAttrSetChg aChgOld( aSet, aOld );
225cdf0e10cSrcweir             SwAttrSetChg aChgNew( aSet, aNew );
226cdf0e10cSrcweir             ModifyNotification( &aChgOld, &aChgNew );       // alle veraenderten werden verschickt
227cdf0e10cSrcweir         }
228cdf0e10cSrcweir     }
229cdf0e10cSrcweir 
230cdf0e10cSrcweir     if( pChgSet != (SwAttrSet*)&rFmt.aSet )     // Set hier angelegt ?
231cdf0e10cSrcweir         delete pChgSet;
232cdf0e10cSrcweir }
233cdf0e10cSrcweir 
234cdf0e10cSrcweir /*************************************************************************
235cdf0e10cSrcweir |*    SwFmt::~SwFmt()
236cdf0e10cSrcweir |*
237cdf0e10cSrcweir |*    Beschreibung      Dokument 1.14
238cdf0e10cSrcweir |*    Ersterstellung    JP 22.11.90
239cdf0e10cSrcweir |*    Letzte Aenderung  JP 14.02.91
240cdf0e10cSrcweir *************************************************************************/
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 
~SwFmt()243cdf0e10cSrcweir SwFmt::~SwFmt()
244cdf0e10cSrcweir {
245cdf0e10cSrcweir     /* das passiert bei der ObjectDying Message */
246cdf0e10cSrcweir     /* alle Abhaengigen auf DerivedFrom umhaengen */
247cdf0e10cSrcweir     if( GetDepends() )
248cdf0e10cSrcweir     {
249cdf0e10cSrcweir         ASSERT(DerivedFrom(), "SwFmt::~SwFmt: Def Abhaengige!" );
250cdf0e10cSrcweir 
251cdf0e10cSrcweir         bFmtInDTOR = sal_True;
252cdf0e10cSrcweir 
253cdf0e10cSrcweir         SwFmt *pParentFmt = DerivedFrom();
254cdf0e10cSrcweir         if (!pParentFmt)        // see #112405#
255cdf0e10cSrcweir         {
256cdf0e10cSrcweir             DBG_ERROR( "~SwFmt: parent format missing" );
257cdf0e10cSrcweir         }
258cdf0e10cSrcweir         else
259cdf0e10cSrcweir         {
260*ca62e2c2SSteve Yin             while( GetDepends() && pParentFmt)
261cdf0e10cSrcweir             {
262cdf0e10cSrcweir                 SwFmtChg aOldFmt(this);
263cdf0e10cSrcweir                 SwFmtChg aNewFmt(pParentFmt);
264cdf0e10cSrcweir                 SwClient * pDepend = (SwClient*)GetDepends();
265cdf0e10cSrcweir                 pParentFmt->Add(pDepend);
266cdf0e10cSrcweir                 pDepend->ModifyNotification(&aOldFmt, &aNewFmt);
267cdf0e10cSrcweir             }
268cdf0e10cSrcweir         }
269cdf0e10cSrcweir     }
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 
273cdf0e10cSrcweir /*************************************************************************
274cdf0e10cSrcweir |*    void SwFmt::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue )
275cdf0e10cSrcweir |*
276cdf0e10cSrcweir |*    Beschreibung      Dokument 1.14
277cdf0e10cSrcweir |*    Ersterstellung    JP 22.11.90
278cdf0e10cSrcweir |*    Letzte Aenderung  JP 05.08.94
279cdf0e10cSrcweir *************************************************************************/
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 
Modify(const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue)282cdf0e10cSrcweir void SwFmt::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir     sal_Bool bWeiter = sal_True;    // sal_True = Propagierung an die Abhaengigen
285cdf0e10cSrcweir 
286cdf0e10cSrcweir     sal_uInt16 nWhich = pOldValue ? pOldValue->Which() :
287cdf0e10cSrcweir                     pNewValue ? pNewValue->Which() : 0 ;
288cdf0e10cSrcweir     switch( nWhich )
289cdf0e10cSrcweir     {
290cdf0e10cSrcweir     case 0:     break;          // Which-Id von 0 ???
291cdf0e10cSrcweir 
292cdf0e10cSrcweir     case RES_OBJECTDYING :
293cdf0e10cSrcweir         {
294cdf0e10cSrcweir             // ist das sterbende Object das "Parent"-Format von diesen Format,
295cdf0e10cSrcweir             // dann haengt sich dieses Format an den Parent vom Parent
296cdf0e10cSrcweir             SwFmt * pFmt = (SwFmt *) ((SwPtrMsgPoolItem *)pNewValue)->pObject;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir             // nicht umhaengen wenn dieses das oberste Format ist !!
299cdf0e10cSrcweir             if( GetRegisteredIn() && GetRegisteredIn() == pFmt )
300cdf0e10cSrcweir             {
301cdf0e10cSrcweir                 if( pFmt->GetRegisteredIn() )
302cdf0e10cSrcweir                 {
303cdf0e10cSrcweir                     // wenn Parent, dann im neuen Parent wieder anmelden
304cdf0e10cSrcweir                     pFmt->DerivedFrom()->Add( this );
305cdf0e10cSrcweir                     aSet.SetParent( &DerivedFrom()->aSet );
306cdf0e10cSrcweir                 }
307cdf0e10cSrcweir                 else
308cdf0e10cSrcweir                 {
309cdf0e10cSrcweir                     // sonst auf jeden Fall beim sterbenden abmelden
310cdf0e10cSrcweir                     DerivedFrom()->Remove( this );
311cdf0e10cSrcweir                     aSet.SetParent( 0 );
312cdf0e10cSrcweir                 }
313cdf0e10cSrcweir             }
314cdf0e10cSrcweir         } // OBJECTDYING
315cdf0e10cSrcweir         break;
316cdf0e10cSrcweir 
317cdf0e10cSrcweir     case RES_ATTRSET_CHG:
318cdf0e10cSrcweir         if( ((SwAttrSetChg*)pOldValue)->GetTheChgdSet() != &aSet )
319cdf0e10cSrcweir         {
320cdf0e10cSrcweir             //nur die weiter geben, die hier nicht gesetzt sind !!
321cdf0e10cSrcweir             SwAttrSetChg aOld( *(SwAttrSetChg*)pOldValue );
322cdf0e10cSrcweir             SwAttrSetChg aNew( *(SwAttrSetChg*)pNewValue );
323cdf0e10cSrcweir 
324cdf0e10cSrcweir             aOld.GetChgSet()->Differentiate( aSet );
325cdf0e10cSrcweir             aNew.GetChgSet()->Differentiate( aSet );
326cdf0e10cSrcweir 
327cdf0e10cSrcweir             if( aNew.Count() )
328cdf0e10cSrcweir                 // keine mehr gesetzt, dann Ende !!
329cdf0e10cSrcweir             NotifyClients( &aOld, &aNew );
330cdf0e10cSrcweir             bWeiter = sal_False;
331cdf0e10cSrcweir         }
332cdf0e10cSrcweir         break;
333cdf0e10cSrcweir     case RES_FMT_CHG:
334cdf0e10cSrcweir         // falls mein Format Parent umgesetzt wird, dann melde ich
335cdf0e10cSrcweir         // meinen Attrset beim Neuen an.
336cdf0e10cSrcweir 
337cdf0e10cSrcweir         // sein eigenes Modify ueberspringen !!
338cdf0e10cSrcweir         if( ((SwFmtChg*)pOldValue)->pChangedFmt != this &&
339cdf0e10cSrcweir             ((SwFmtChg*)pNewValue)->pChangedFmt == DerivedFrom() )
340cdf0e10cSrcweir         {
341cdf0e10cSrcweir             // den Set an den neuen Parent haengen
342cdf0e10cSrcweir             aSet.SetParent( DerivedFrom() ? &DerivedFrom()->aSet : 0 );
343cdf0e10cSrcweir         }
344cdf0e10cSrcweir         break;
345cdf0e10cSrcweir 
346cdf0e10cSrcweir     case RES_RESET_FMTWRITTEN:
347cdf0e10cSrcweir         {
348cdf0e10cSrcweir             // IsWritten-Flag zuruecksetzen. Hint nur an abhanegige
349cdf0e10cSrcweir             // Formate (und keine Frames) propagieren.
350cdf0e10cSrcweir             // mba: the code does the opposite from what is written in the comment!
351cdf0e10cSrcweir             ResetWritten();
352cdf0e10cSrcweir             // mba: here we don't use the additional stuff from NotifyClients().
353cdf0e10cSrcweir             // should we?!
354cdf0e10cSrcweir             // mba: move the code that ignores this event to the clients
355cdf0e10cSrcweir             ModifyBroadcast( pOldValue, pNewValue, TYPE(SwFmt) );
356cdf0e10cSrcweir             bWeiter = sal_False;
357cdf0e10cSrcweir         }
358cdf0e10cSrcweir         break;
359cdf0e10cSrcweir 
360cdf0e10cSrcweir     default:
361cdf0e10cSrcweir         {
362cdf0e10cSrcweir             // Ist das Attribut in diesem Format definiert, dann auf
363cdf0e10cSrcweir             // NICHT weiter propagieren !!
364cdf0e10cSrcweir             if( SFX_ITEM_SET == aSet.GetItemState( nWhich, sal_False ))
365cdf0e10cSrcweir             {
366cdf0e10cSrcweir // wie finde ich heraus, ob nicht ich die Message versende ??
367cdf0e10cSrcweir // aber wer ruft das hier ????
368cdf0e10cSrcweir //ASSERT( sal_False, "Modify ohne Absender verschickt" );
369cdf0e10cSrcweir //JP 11.06.96: DropCaps koennen hierher kommen
370cdf0e10cSrcweir ASSERT( RES_PARATR_DROP == nWhich, "Modify ohne Absender verschickt" );
371cdf0e10cSrcweir                 bWeiter = sal_False;
372cdf0e10cSrcweir             }
373cdf0e10cSrcweir 
374cdf0e10cSrcweir         } // default
375cdf0e10cSrcweir     } // switch
376cdf0e10cSrcweir 
377cdf0e10cSrcweir     if( bWeiter )
378cdf0e10cSrcweir     {
379cdf0e10cSrcweir         // laufe durch alle abhaengigen Formate
380cdf0e10cSrcweir         NotifyClients( pOldValue, pNewValue );
381cdf0e10cSrcweir     }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir }
384cdf0e10cSrcweir 
385cdf0e10cSrcweir 
SetDerivedFrom(SwFmt * pDerFrom)386cdf0e10cSrcweir sal_Bool SwFmt::SetDerivedFrom(SwFmt *pDerFrom)
387cdf0e10cSrcweir {
388cdf0e10cSrcweir     if ( pDerFrom )
389cdf0e10cSrcweir     {
390cdf0e10cSrcweir         // Zyklus?
391cdf0e10cSrcweir         const SwFmt* pFmt = pDerFrom;
392cdf0e10cSrcweir         while ( pFmt != 0 )
393cdf0e10cSrcweir         {
394cdf0e10cSrcweir             if ( pFmt == this )
395cdf0e10cSrcweir                 return sal_False;
396cdf0e10cSrcweir 
397cdf0e10cSrcweir             pFmt=pFmt->DerivedFrom();
398cdf0e10cSrcweir         }
399cdf0e10cSrcweir     }
400cdf0e10cSrcweir     else
401cdf0e10cSrcweir     {
402cdf0e10cSrcweir         // Nichts angegeben, Dflt-Format suchen
403cdf0e10cSrcweir         pDerFrom = this;
404cdf0e10cSrcweir         while ( pDerFrom->DerivedFrom() )
405cdf0e10cSrcweir             pDerFrom = pDerFrom->DerivedFrom();
406cdf0e10cSrcweir     }
407cdf0e10cSrcweir     if ( (pDerFrom == DerivedFrom()) || (pDerFrom == this) )
408cdf0e10cSrcweir         return sal_False;
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     ASSERT( Which()==pDerFrom->Which()
411cdf0e10cSrcweir             || ( Which()==RES_CONDTXTFMTCOLL && pDerFrom->Which()==RES_TXTFMTCOLL)
412cdf0e10cSrcweir             || ( Which()==RES_TXTFMTCOLL && pDerFrom->Which()==RES_CONDTXTFMTCOLL)
413cdf0e10cSrcweir             || ( Which()==RES_FLYFRMFMT && pDerFrom->Which()==RES_FRMFMT ),
414cdf0e10cSrcweir             "SetDerivedFrom: Aepfel von Birnen ableiten?");
415cdf0e10cSrcweir 
416cdf0e10cSrcweir     if ( IsInCache() )
417cdf0e10cSrcweir     {
418cdf0e10cSrcweir         SwFrm::GetCache().Delete( this );
419cdf0e10cSrcweir         SetInCache( sal_False );
420cdf0e10cSrcweir     }
421cdf0e10cSrcweir     SetInSwFntCache( sal_False );
422cdf0e10cSrcweir 
423cdf0e10cSrcweir     pDerFrom->Add(this);
424cdf0e10cSrcweir     aSet.SetParent( &pDerFrom->aSet );
425cdf0e10cSrcweir 
426cdf0e10cSrcweir     SwFmtChg aOldFmt(this);
427cdf0e10cSrcweir     SwFmtChg aNewFmt(this);
428cdf0e10cSrcweir     ModifyNotification( &aOldFmt, &aNewFmt );
429cdf0e10cSrcweir 
430cdf0e10cSrcweir     return sal_True;
431cdf0e10cSrcweir }
432cdf0e10cSrcweir 
433cdf0e10cSrcweir 
SetFmtAttr(const SfxPoolItem & rAttr)434cdf0e10cSrcweir sal_Bool SwFmt::SetFmtAttr(const SfxPoolItem& rAttr )
435cdf0e10cSrcweir {
436cdf0e10cSrcweir     if ( IsInCache() || IsInSwFntCache() )
437cdf0e10cSrcweir     {
438cdf0e10cSrcweir         const sal_uInt16 nWhich = rAttr.Which();
439cdf0e10cSrcweir         CheckCaching( nWhich );
440cdf0e10cSrcweir     }
441cdf0e10cSrcweir 
442cdf0e10cSrcweir     // wenn Modify gelockt ist, werden keine Modifies verschickt;
443cdf0e10cSrcweir     // fuer FrmFmt's immer das Modify verschicken!
444cdf0e10cSrcweir     sal_Bool bRet = sal_False;
445cdf0e10cSrcweir     const sal_uInt16 nFmtWhich = Which();
446cdf0e10cSrcweir     if( IsModifyLocked() || (!GetDepends() &&
447cdf0e10cSrcweir         (RES_GRFFMTCOLL == nFmtWhich  ||
448cdf0e10cSrcweir          RES_TXTFMTCOLL == nFmtWhich ) ) )
449cdf0e10cSrcweir     {
450cdf0e10cSrcweir         if( 0 != ( bRet = (0 != aSet.Put( rAttr ))) )
451cdf0e10cSrcweir             aSet.SetModifyAtAttr( this );
452cdf0e10cSrcweir         if ( nFmtWhich == RES_TXTFMTCOLL && rAttr.Which() == RES_PARATR_NUMRULE )
453cdf0e10cSrcweir         {
454cdf0e10cSrcweir             TxtFmtCollFunc::CheckTxtFmtCollForDeletionOfAssignmentToOutlineStyle( this );
455cdf0e10cSrcweir         }
456cdf0e10cSrcweir     }
457cdf0e10cSrcweir     else
458cdf0e10cSrcweir     {
459cdf0e10cSrcweir         // kopiere nur das Attribut-Delta Array
460cdf0e10cSrcweir         SwAttrSet aOld( *aSet.GetPool(), aSet.GetRanges() ),
461cdf0e10cSrcweir                     aNew( *aSet.GetPool(), aSet.GetRanges() );
462cdf0e10cSrcweir 
463cdf0e10cSrcweir         bRet = 0 != aSet.Put_BC( rAttr, &aOld, &aNew );
464cdf0e10cSrcweir         if( bRet )
465cdf0e10cSrcweir         {
466cdf0e10cSrcweir             // einige Sonderbehandlungen fuer Attribute
467cdf0e10cSrcweir             aSet.SetModifyAtAttr( this );
468cdf0e10cSrcweir 
469cdf0e10cSrcweir             SwAttrSetChg aChgOld( aSet, aOld );
470cdf0e10cSrcweir             SwAttrSetChg aChgNew( aSet, aNew );
471cdf0e10cSrcweir             ModifyNotification( &aChgOld, &aChgNew );       // alle veraenderten werden verschickt
472cdf0e10cSrcweir         }
473cdf0e10cSrcweir     }
474cdf0e10cSrcweir     return bRet;
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 
SetFmtAttr(const SfxItemSet & rSet)478cdf0e10cSrcweir sal_Bool SwFmt::SetFmtAttr( const SfxItemSet& rSet )
479cdf0e10cSrcweir {
480cdf0e10cSrcweir     if( !rSet.Count() )
481cdf0e10cSrcweir         return sal_False;
482cdf0e10cSrcweir 
483cdf0e10cSrcweir     if ( IsInCache() )
484cdf0e10cSrcweir     {
485cdf0e10cSrcweir         SwFrm::GetCache().Delete( this );
486cdf0e10cSrcweir         SetInCache( sal_False );
487cdf0e10cSrcweir     }
488cdf0e10cSrcweir     SetInSwFntCache( sal_False );
489cdf0e10cSrcweir 
490cdf0e10cSrcweir     // wenn Modify gelockt ist, werden keine Modifies verschickt;
491cdf0e10cSrcweir     // fuer FrmFmt's immer das Modify verschicken!
492cdf0e10cSrcweir     sal_Bool bRet = sal_False;
493cdf0e10cSrcweir     const sal_uInt16 nFmtWhich = Which();
494cdf0e10cSrcweir     if ( IsModifyLocked() ||
495cdf0e10cSrcweir          ( !GetDepends() &&
496cdf0e10cSrcweir            ( RES_GRFFMTCOLL == nFmtWhich ||
497cdf0e10cSrcweir              RES_TXTFMTCOLL == nFmtWhich ) ) )
498cdf0e10cSrcweir     {
499cdf0e10cSrcweir         if( 0 != ( bRet = (0 != aSet.Put( rSet ))) )
500cdf0e10cSrcweir             aSet.SetModifyAtAttr( this );
501cdf0e10cSrcweir         if ( nFmtWhich == RES_TXTFMTCOLL )
502cdf0e10cSrcweir         {
503cdf0e10cSrcweir             TxtFmtCollFunc::CheckTxtFmtCollForDeletionOfAssignmentToOutlineStyle( this );
504cdf0e10cSrcweir         }
505cdf0e10cSrcweir     }
506cdf0e10cSrcweir     else
507cdf0e10cSrcweir     {
508cdf0e10cSrcweir         SwAttrSet aOld( *aSet.GetPool(), aSet.GetRanges() ),
509cdf0e10cSrcweir                     aNew( *aSet.GetPool(), aSet.GetRanges() );
510cdf0e10cSrcweir         bRet = 0 != aSet.Put_BC( rSet, &aOld, &aNew );
511cdf0e10cSrcweir         if( bRet )
512cdf0e10cSrcweir         {
513cdf0e10cSrcweir             // einige Sonderbehandlungen fuer Attribute
514cdf0e10cSrcweir             aSet.SetModifyAtAttr( this );
515cdf0e10cSrcweir             SwAttrSetChg aChgOld( aSet, aOld );
516cdf0e10cSrcweir             SwAttrSetChg aChgNew( aSet, aNew );
517cdf0e10cSrcweir             ModifyNotification( &aChgOld, &aChgNew );       // alle veraenderten werden verschickt
518cdf0e10cSrcweir         }
519cdf0e10cSrcweir     }
520cdf0e10cSrcweir     return bRet;
521cdf0e10cSrcweir }
522cdf0e10cSrcweir 
523cdf0e10cSrcweir // Nimmt den Hint mit nWhich aus dem Delta-Array
524cdf0e10cSrcweir 
525cdf0e10cSrcweir 
ResetFmtAttr(sal_uInt16 nWhich1,sal_uInt16 nWhich2)526cdf0e10cSrcweir sal_Bool SwFmt::ResetFmtAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 )
527cdf0e10cSrcweir {
528cdf0e10cSrcweir     if( !aSet.Count() )
529cdf0e10cSrcweir         return sal_False;
530cdf0e10cSrcweir 
531cdf0e10cSrcweir     if( !nWhich2 || nWhich2 < nWhich1 )
532cdf0e10cSrcweir         nWhich2 = nWhich1;      // dann setze auf 1. Id, nur dieses Item
533cdf0e10cSrcweir 
534cdf0e10cSrcweir     if ( IsInCache() || IsInSwFntCache() )
535cdf0e10cSrcweir     {
536cdf0e10cSrcweir         for( sal_uInt16 n = nWhich1; n < nWhich2; ++n )
537cdf0e10cSrcweir             CheckCaching( n );
538cdf0e10cSrcweir     }
539cdf0e10cSrcweir 
540cdf0e10cSrcweir     // wenn Modify gelockt ist, werden keine Modifies verschickt
541cdf0e10cSrcweir     if( IsModifyLocked() )
542cdf0e10cSrcweir         return 0 != (( nWhich2 == nWhich1 )
543cdf0e10cSrcweir                 ? aSet.ClearItem( nWhich1 )
544cdf0e10cSrcweir                 : aSet.ClearItem_BC( nWhich1, nWhich2 ));
545cdf0e10cSrcweir 
546cdf0e10cSrcweir     SwAttrSet aOld( *aSet.GetPool(), aSet.GetRanges() ),
547cdf0e10cSrcweir                 aNew( *aSet.GetPool(), aSet.GetRanges() );
548cdf0e10cSrcweir     sal_Bool bRet = 0 != aSet.ClearItem_BC( nWhich1, nWhich2, &aOld, &aNew );
549cdf0e10cSrcweir 
550cdf0e10cSrcweir     if( bRet )
551cdf0e10cSrcweir     {
552cdf0e10cSrcweir         SwAttrSetChg aChgOld( aSet, aOld );
553cdf0e10cSrcweir         SwAttrSetChg aChgNew( aSet, aNew );
554cdf0e10cSrcweir         ModifyNotification( &aChgOld, &aChgNew );       // alle veraenderten werden verschickt
555cdf0e10cSrcweir     }
556cdf0e10cSrcweir     return bRet;
557cdf0e10cSrcweir }
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 
560cdf0e10cSrcweir 
561cdf0e10cSrcweir // --> OD 2007-01-24 #i73790#
562cdf0e10cSrcweir // method renamed
ResetAllFmtAttr()563cdf0e10cSrcweir sal_uInt16 SwFmt::ResetAllFmtAttr()
564cdf0e10cSrcweir // <--
565cdf0e10cSrcweir {
566cdf0e10cSrcweir     if( !aSet.Count() )
567cdf0e10cSrcweir         return 0;
568cdf0e10cSrcweir 
569cdf0e10cSrcweir     if ( IsInCache() )
570cdf0e10cSrcweir     {
571cdf0e10cSrcweir         SwFrm::GetCache().Delete( this );
572cdf0e10cSrcweir         SetInCache( sal_False );
573cdf0e10cSrcweir     }
574cdf0e10cSrcweir     SetInSwFntCache( sal_False );
575cdf0e10cSrcweir 
576cdf0e10cSrcweir     // wenn Modify gelockt ist, werden keine Modifies verschickt
577cdf0e10cSrcweir     if( IsModifyLocked() )
578cdf0e10cSrcweir         return aSet.ClearItem( 0 );
579cdf0e10cSrcweir 
580cdf0e10cSrcweir     SwAttrSet aOld( *aSet.GetPool(), aSet.GetRanges() ),
581cdf0e10cSrcweir                 aNew( *aSet.GetPool(), aSet.GetRanges() );
582cdf0e10cSrcweir     sal_Bool bRet = 0 != aSet.ClearItem_BC( 0, &aOld, &aNew );
583cdf0e10cSrcweir 
584cdf0e10cSrcweir     if( bRet )
585cdf0e10cSrcweir     {
586cdf0e10cSrcweir         SwAttrSetChg aChgOld( aSet, aOld );
587cdf0e10cSrcweir         SwAttrSetChg aChgNew( aSet, aNew );
588cdf0e10cSrcweir         ModifyNotification( &aChgOld, &aChgNew );       // alle veraenderten werden verschickt
589cdf0e10cSrcweir     }
590cdf0e10cSrcweir     return aNew.Count();
591cdf0e10cSrcweir }
592cdf0e10cSrcweir 
593cdf0e10cSrcweir 
594cdf0e10cSrcweir /*************************************************************************
595cdf0e10cSrcweir |*    void SwFmt::GetInfo( const SfxPoolItem& ) const
596cdf0e10cSrcweir |*
597cdf0e10cSrcweir |*    Beschreibung
598cdf0e10cSrcweir |*    Ersterstellung    JP 18.04.94
599cdf0e10cSrcweir |*    Letzte Aenderung  JP 05.08.94
600cdf0e10cSrcweir *************************************************************************/
601cdf0e10cSrcweir 
602cdf0e10cSrcweir 
GetInfo(SfxPoolItem & rInfo) const603cdf0e10cSrcweir sal_Bool SwFmt::GetInfo( SfxPoolItem& rInfo ) const
604cdf0e10cSrcweir {
605cdf0e10cSrcweir     sal_Bool bRet = SwModify::GetInfo( rInfo );
606cdf0e10cSrcweir     return bRet;
607cdf0e10cSrcweir }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir 
DelDiffs(const SfxItemSet & rSet)610cdf0e10cSrcweir void SwFmt::DelDiffs( const SfxItemSet& rSet )
611cdf0e10cSrcweir {
612cdf0e10cSrcweir     if( !aSet.Count() )
613cdf0e10cSrcweir         return;
614cdf0e10cSrcweir 
615cdf0e10cSrcweir     if ( IsInCache() )
616cdf0e10cSrcweir     {
617cdf0e10cSrcweir         SwFrm::GetCache().Delete( this );
618cdf0e10cSrcweir         SetInCache( sal_False );
619cdf0e10cSrcweir     }
620cdf0e10cSrcweir     SetInSwFntCache( sal_False );
621cdf0e10cSrcweir 
622cdf0e10cSrcweir     // wenn Modify gelockt ist, werden keine Modifies verschickt
623cdf0e10cSrcweir     if( IsModifyLocked() )
624cdf0e10cSrcweir     {
625cdf0e10cSrcweir         aSet.Intersect( rSet );
626cdf0e10cSrcweir         return;
627cdf0e10cSrcweir     }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir     SwAttrSet aOld( *aSet.GetPool(), aSet.GetRanges() ),
630cdf0e10cSrcweir                 aNew( *aSet.GetPool(), aSet.GetRanges() );
631cdf0e10cSrcweir     sal_Bool bRet = 0 != aSet.Intersect_BC( rSet, &aOld, &aNew );
632cdf0e10cSrcweir 
633cdf0e10cSrcweir     if( bRet )
634cdf0e10cSrcweir     {
635cdf0e10cSrcweir         SwAttrSetChg aChgOld( aSet, aOld );
636cdf0e10cSrcweir         SwAttrSetChg aChgNew( aSet, aNew );
637cdf0e10cSrcweir         ModifyNotification( &aChgOld, &aChgNew );       // alle veraenderten werden verschickt
638cdf0e10cSrcweir     }
639cdf0e10cSrcweir }
640cdf0e10cSrcweir 
641cdf0e10cSrcweir /** SwFmt::IsBackgroundTransparent - for feature #99657#
642cdf0e10cSrcweir 
643cdf0e10cSrcweir     OD 22.08.2002
644cdf0e10cSrcweir     Virtual method to determine, if background of format is transparent.
645cdf0e10cSrcweir     Default implementation returns false. Thus, subclasses have to overload
646cdf0e10cSrcweir     method, if the specific subclass can have a transparent background.
647cdf0e10cSrcweir 
648cdf0e10cSrcweir     @author OD
649cdf0e10cSrcweir 
650cdf0e10cSrcweir     @return false, default implementation
651cdf0e10cSrcweir */
IsBackgroundTransparent() const652cdf0e10cSrcweir sal_Bool SwFmt::IsBackgroundTransparent() const
653cdf0e10cSrcweir {
654cdf0e10cSrcweir     return sal_False;
655cdf0e10cSrcweir }
656cdf0e10cSrcweir 
657cdf0e10cSrcweir /** SwFmt::IsShadowTransparent - for feature #99657#
658cdf0e10cSrcweir 
659cdf0e10cSrcweir     OD 22.08.2002
660cdf0e10cSrcweir     Virtual method to determine, if shadow of format is transparent.
661cdf0e10cSrcweir     Default implementation returns false. Thus, subclasses have to overload
662cdf0e10cSrcweir     method, if the specific subclass can have a transparent shadow.
663cdf0e10cSrcweir 
664cdf0e10cSrcweir     @author OD
665cdf0e10cSrcweir 
666cdf0e10cSrcweir     @return false, default implementation
667cdf0e10cSrcweir */
IsShadowTransparent() const668cdf0e10cSrcweir sal_Bool SwFmt::IsShadowTransparent() const
669cdf0e10cSrcweir {
670cdf0e10cSrcweir     return sal_False;
671cdf0e10cSrcweir }
672cdf0e10cSrcweir 
673cdf0e10cSrcweir /*
674cdf0e10cSrcweir  * Document Interface Access
675cdf0e10cSrcweir  */
getIDocumentSettingAccess() const676cdf0e10cSrcweir const IDocumentSettingAccess* SwFmt::getIDocumentSettingAccess() const { return GetDoc(); }
getIDocumentDrawModelAccess() const677cdf0e10cSrcweir const IDocumentDrawModelAccess* SwFmt::getIDocumentDrawModelAccess() const { return GetDoc(); }
getIDocumentDrawModelAccess()678cdf0e10cSrcweir IDocumentDrawModelAccess* SwFmt::getIDocumentDrawModelAccess() { return GetDoc(); }
getIDocumentLayoutAccess() const679cdf0e10cSrcweir const IDocumentLayoutAccess* SwFmt::getIDocumentLayoutAccess() const { return GetDoc(); }
getIDocumentLayoutAccess()680cdf0e10cSrcweir IDocumentLayoutAccess* SwFmt::getIDocumentLayoutAccess() { return GetDoc(); }
getIDocumentTimerAccess()681cdf0e10cSrcweir IDocumentTimerAccess* SwFmt::getIDocumentTimerAccess() { return GetDoc(); }
getIDocumentFieldsAccess()682cdf0e10cSrcweir IDocumentFieldsAccess* SwFmt::getIDocumentFieldsAccess() { return GetDoc(); }
getIDocumentChartDataProviderAccess()683cdf0e10cSrcweir IDocumentChartDataProviderAccess* SwFmt::getIDocumentChartDataProviderAccess() { return GetDoc(); }
684cdf0e10cSrcweir 
685