1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: format.cxx,v $
10 * $Revision: 1.17.146.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sw.hxx"
35 #include <hintids.hxx> // fuer RES_..
36 #include <frame.hxx> // fuer AttrCache
38 #include <hints.hxx> // fuer SwFmtChg
40 #include <paratr.hxx> // fuer SwParaFmt - SwHyphenBug
41 #include <swcache.hxx>
42 // --> OD 2006-11-22 #i71574#
43 #include <fmtcolfunc.hxx>
46 TYPEINIT1( SwFmt
, SwClient
); //rtti fuer SwFmt
48 /*************************************************************************
50 *************************************************************************/
53 SwFmt::SwFmt( SwAttrPool
& rPool
, const sal_Char
* pFmtNm
,
54 const USHORT
* pWhichRanges
, SwFmt
*pDrvdFrm
, USHORT nFmtWhich
)
55 : SwModify( pDrvdFrm
),
56 aSet( rPool
, pWhichRanges
),
57 nWhichId( nFmtWhich
),
59 nPoolFmtId( USHRT_MAX
),
60 nPoolHelpId( USHRT_MAX
),
61 nPoolHlpFileId( UCHAR_MAX
)
63 aFmtName
.AssignAscii( pFmtNm
);
64 bWritten
= bFmtInDTOR
= bAutoUpdateFmt
= FALSE
; // LAYER_IMPL
68 aSet
.SetParent( &pDrvdFrm
->aSet
);
72 SwFmt::SwFmt( SwAttrPool
& rPool
, const String
&rFmtNm
,
73 const USHORT
* pWhichRanges
, SwFmt
*pDrvdFrm
, USHORT nFmtWhich
)
74 : SwModify( pDrvdFrm
),
76 aSet( rPool
, pWhichRanges
),
77 nWhichId( nFmtWhich
),
79 nPoolFmtId( USHRT_MAX
),
80 nPoolHelpId( USHRT_MAX
),
81 nPoolHlpFileId( UCHAR_MAX
)
83 bWritten
= bFmtInDTOR
= bAutoUpdateFmt
= FALSE
; // LAYER_IMPL
87 aSet
.SetParent( &pDrvdFrm
->aSet
);
91 SwFmt::SwFmt( const SwFmt
& rFmt
)
92 : SwModify( rFmt
.DerivedFrom() ),
93 aFmtName( rFmt
.aFmtName
),
95 nWhichId( rFmt
.nWhichId
),
97 nPoolFmtId( rFmt
.GetPoolFmtId() ),
98 nPoolHelpId( rFmt
.GetPoolHelpId() ),
99 nPoolHlpFileId( rFmt
.GetPoolHlpFileId() )
101 bWritten
= bFmtInDTOR
= FALSE
; // LAYER_IMPL
102 bAutoFmt
= rFmt
.bAutoFmt
;
103 bAutoUpdateFmt
= rFmt
.bAutoUpdateFmt
;
105 if( rFmt
.DerivedFrom() )
106 aSet
.SetParent( &rFmt
.DerivedFrom()->aSet
);
107 // einige Sonderbehandlungen fuer Attribute
108 aSet
.SetModifyAtAttr( this );
111 /*************************************************************************
112 |* SwFmt &SwFmt::operator=(const SwFmt& aFmt)
114 |* Beschreibung Dokument 1.14
115 |* Ersterstellung JP 22.11.90
116 |* Letzte Aenderung JP 05.08.94
117 *************************************************************************/
120 SwFmt
&SwFmt::operator=(const SwFmt
& rFmt
)
122 nWhichId
= rFmt
.nWhichId
;
123 nPoolFmtId
= rFmt
.GetPoolFmtId();
124 nPoolHelpId
= rFmt
.GetPoolHelpId();
125 nPoolHlpFileId
= rFmt
.GetPoolHlpFileId();
129 SwFrm::GetCache().Delete( this );
132 SetInSwFntCache( FALSE
);
134 // kopiere nur das Attribut-Delta Array
135 SwAttrSet
aOld( *aSet
.GetPool(), aSet
.GetRanges() ),
136 aNew( *aSet
.GetPool(), aSet
.GetRanges() );
137 aSet
.Intersect_BC( rFmt
.aSet
, &aOld
, &aNew
);
138 aSet
.Put_BC( rFmt
.aSet
, &aOld
, &aNew
);
140 // einige Sonderbehandlungen fuer Attribute
141 aSet
.SetModifyAtAttr( this );
143 // PoolItem-Attr erzeugen fuers Modify !!!
146 SwAttrSetChg
aChgOld( aSet
, aOld
);
147 SwAttrSetChg
aChgNew( aSet
, aNew
);
148 Modify( &aChgOld
, &aChgNew
); // alle veraenderten werden verschickt
151 if( pRegisteredIn
!= rFmt
.pRegisteredIn
)
154 pRegisteredIn
->Remove(this);
155 if(rFmt
.pRegisteredIn
)
157 rFmt
.pRegisteredIn
->Add(this);
158 aSet
.SetParent( &rFmt
.aSet
);
163 bAutoFmt
= rFmt
.bAutoFmt
;
164 bAutoUpdateFmt
= rFmt
.bAutoUpdateFmt
;
168 void SwFmt::SetName( const String
& rNewName
, sal_Bool bBroadcast
)
170 ASSERT(!IsDefault(), "SetName: Defaultformat" );
173 SwStringMsgPoolItem
aOld( RES_NAME_CHANGED
, aFmtName
);
174 SwStringMsgPoolItem
aNew( RES_NAME_CHANGED
, rNewName
);
176 Modify( &aOld
, &aNew
);
184 /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
185 * diese Funktion wird in jedem Copy-Ctor gerufen, damit die
186 * Attribute kopiert werden. Diese koennen erst kopiert werden,
187 * wenn die abgeleitet Klasse existiert, denn beim Setzen der
188 * Attribute wird die Which()-Methode gerufen, die hier in der
189 * Basis-Klasse auf 0 defaultet ist.
191 * Zusatz: JP 8.4.1994
192 * Wird ueber Dokumentgrenzen kopiert, so muss das neue Dokument
193 * mit angeben werden, in dem this steht. Z.Z. ist das fuers
194 * DropCaps wichtig, dieses haelt Daten, die tief kopiert werden
196 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
199 void SwFmt::CopyAttrs( const SwFmt
& rFmt
, BOOL bReplace
)
201 // kopiere nur das Attribut-Delta Array
205 SwFrm::GetCache().Delete( this );
208 SetInSwFntCache( FALSE
);
210 // Sonderbehandlung fuer einige Attribute
211 SwAttrSet
* pChgSet
= (SwAttrSet
*)&rFmt
.aSet
;
213 if( !bReplace
) // nur die neu, die nicht gesetzt sind ??
215 if( pChgSet
== (SwAttrSet
*)&rFmt
.aSet
) // Set hier kopieren
216 pChgSet
= new SwAttrSet( rFmt
.aSet
);
217 pChgSet
->Differentiate( aSet
);
220 // kopiere nur das Attribut-Delta Array
221 if( pChgSet
->GetPool() != aSet
.GetPool() )
222 pChgSet
->CopyToModify( *this );
225 SwAttrSet
aOld( *aSet
.GetPool(), aSet
.GetRanges() ),
226 aNew( *aSet
.GetPool(), aSet
.GetRanges() );
228 if ( 0 != aSet
.Put_BC( *pChgSet
, &aOld
, &aNew
) )
230 // einige Sonderbehandlungen fuer Attribute
231 aSet
.SetModifyAtAttr( this );
233 SwAttrSetChg
aChgOld( aSet
, aOld
);
234 SwAttrSetChg
aChgNew( aSet
, aNew
);
235 Modify( &aChgOld
, &aChgNew
); // alle veraenderten werden verschickt
239 if( pChgSet
!= (SwAttrSet
*)&rFmt
.aSet
) // Set hier angelegt ?
243 /*************************************************************************
246 |* Beschreibung Dokument 1.14
247 |* Ersterstellung JP 22.11.90
248 |* Letzte Aenderung JP 14.02.91
249 *************************************************************************/
254 /* das passiert bei der ObjectDying Message */
255 /* alle Abhaengigen auf DerivedFrom umhaengen */
258 ASSERT(DerivedFrom(), "SwFmt::~SwFmt: Def Abhaengige!" );
262 SwFmt
*pParentFmt
= DerivedFrom();
263 if (!pParentFmt
) // see #112405#
265 DBG_ERROR( "~SwFmt: parent format missing" );
269 while( GetDepends() )
271 SwFmtChg
aOldFmt(this);
272 SwFmtChg
aNewFmt(pParentFmt
);
273 SwClient
* pDepend
= (SwClient
*)GetDepends();
274 pParentFmt
->Add(pDepend
);
275 pDepend
->Modify(&aOldFmt
, &aNewFmt
);
282 /*************************************************************************
283 |* void SwFmt::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue )
285 |* Beschreibung Dokument 1.14
286 |* Ersterstellung JP 22.11.90
287 |* Letzte Aenderung JP 05.08.94
288 *************************************************************************/
291 void SwFmt::Modify( SfxPoolItem
* pOldValue
, SfxPoolItem
* pNewValue
)
293 BOOL bWeiter
= TRUE
; // TRUE = Propagierung an die Abhaengigen
295 USHORT nWhich
= pOldValue
? pOldValue
->Which() :
296 pNewValue
? pNewValue
->Which() : 0 ;
299 case 0: break; // Which-Id von 0 ???
301 case RES_OBJECTDYING
:
303 // ist das sterbende Object das "Parent"-Format von diesen Format,
304 // dann haengt sich dieses Format an den Parent vom Parent
305 SwFmt
* pFmt
= (SwFmt
*) ((SwPtrMsgPoolItem
*)pNewValue
)->pObject
;
307 // nicht umhaengen wenn dieses das oberste Format ist !!
308 if( pRegisteredIn
&& pRegisteredIn
== pFmt
)
310 if( pFmt
->pRegisteredIn
)
312 // wenn Parent, dann im neuen Parent wieder anmelden
313 pFmt
->DerivedFrom()->Add( this );
314 aSet
.SetParent( &DerivedFrom()->aSet
);
318 // sonst auf jeden Fall beim sterbenden abmelden
319 DerivedFrom()->Remove( this );
326 case RES_ATTRSET_CHG
:
327 if( ((SwAttrSetChg
*)pOldValue
)->GetTheChgdSet() != &aSet
)
329 //nur die weiter geben, die hier nicht gesetzt sind !!
330 SwAttrSetChg
aOld( *(SwAttrSetChg
*)pOldValue
);
331 SwAttrSetChg
aNew( *(SwAttrSetChg
*)pNewValue
);
333 aOld
.GetChgSet()->Differentiate( aSet
);
334 aNew
.GetChgSet()->Differentiate( aSet
);
337 // keine mehr gesetzt, dann Ende !!
338 SwModify::Modify( &aOld
, &aNew
);
343 // falls mein Format Parent umgesetzt wird, dann melde ich
344 // meinen Attrset beim Neuen an.
346 // sein eigenes Modify ueberspringen !!
347 if( ((SwFmtChg
*)pOldValue
)->pChangedFmt
!= this &&
348 ((SwFmtChg
*)pNewValue
)->pChangedFmt
== DerivedFrom() )
350 // den Set an den neuen Parent haengen
351 aSet
.SetParent( DerivedFrom() ? &DerivedFrom()->aSet
: 0 );
355 case RES_RESET_FMTWRITTEN
:
357 // IsWritten-Flag zuruecksetzen. Hint nur an abhanegige
358 // Formate (und keine Frames) propagieren.
360 SwClientIter
aIter( *this );
361 for( SwClient
*pClient
= aIter
.First( TYPE(SwFmt
) ); pClient
;
362 pClient
= aIter
.Next() )
363 pClient
->Modify( pOldValue
, pNewValue
);
371 // Ist das Attribut in diesem Format definiert, dann auf
372 // NICHT weiter propagieren !!
373 if( SFX_ITEM_SET
== aSet
.GetItemState( nWhich
, FALSE
))
375 // wie finde ich heraus, ob nicht ich die Message versende ??
376 // aber wer ruft das hier ????
377 //ASSERT( FALSE, "Modify ohne Absender verschickt" );
378 //JP 11.06.96: DropCaps koennen hierher kommen
379 ASSERT( RES_PARATR_DROP
== nWhich
, "Modify ohne Absender verschickt" );
388 // laufe durch alle abhaengigen Formate
389 SwModify::Modify( pOldValue
, pNewValue
);
395 BOOL
SwFmt::SetDerivedFrom(SwFmt
*pDerFrom
)
400 const SwFmt
* pFmt
= pDerFrom
;
406 pFmt
=pFmt
->DerivedFrom();
411 // Nichts angegeben, Dflt-Format suchen
413 while ( pDerFrom
->DerivedFrom() )
414 pDerFrom
= pDerFrom
->DerivedFrom();
416 if ( (pDerFrom
== DerivedFrom()) || (pDerFrom
== this) )
419 ASSERT( Which()==pDerFrom
->Which()
420 || ( Which()==RES_CONDTXTFMTCOLL
&& pDerFrom
->Which()==RES_TXTFMTCOLL
)
421 || ( Which()==RES_TXTFMTCOLL
&& pDerFrom
->Which()==RES_CONDTXTFMTCOLL
)
422 || ( Which()==RES_FLYFRMFMT
&& pDerFrom
->Which()==RES_FRMFMT
),
423 "SetDerivedFrom: Aepfel von Birnen ableiten?");
427 SwFrm::GetCache().Delete( this );
430 SetInSwFntCache( FALSE
);
433 aSet
.SetParent( &pDerFrom
->aSet
);
435 SwFmtChg
aOldFmt(this);
436 SwFmtChg
aNewFmt(this);
437 Modify( &aOldFmt
, &aNewFmt
);
443 BOOL
SwFmt::SetFmtAttr(const SfxPoolItem
& rAttr
)
445 if ( IsInCache() || IsInSwFntCache() )
447 const USHORT nWhich
= rAttr
.Which();
448 CheckCaching( nWhich
);
451 // wenn Modify gelockt ist, werden keine Modifies verschickt;
452 // fuer FrmFmt's immer das Modify verschicken!
454 const USHORT nFmtWhich
= Which();
455 if( IsModifyLocked() || (!GetDepends() &&
456 (RES_GRFFMTCOLL
== nFmtWhich
||
457 RES_TXTFMTCOLL
== nFmtWhich
) ) )
459 if( 0 != ( bRet
= (0 != aSet
.Put( rAttr
))) )
460 aSet
.SetModifyAtAttr( this );
461 // --> OD 2006-11-22 #i71574#
462 if ( nFmtWhich
== RES_TXTFMTCOLL
&& rAttr
.Which() == RES_PARATR_NUMRULE
)
464 TxtFmtCollFunc::CheckTxtFmtCollForDeletionOfAssignmentToOutlineStyle( this );
470 // kopiere nur das Attribut-Delta Array
471 SwAttrSet
aOld( *aSet
.GetPool(), aSet
.GetRanges() ),
472 aNew( *aSet
.GetPool(), aSet
.GetRanges() );
474 bRet
= 0 != aSet
.Put_BC( rAttr
, &aOld
, &aNew
);
477 // einige Sonderbehandlungen fuer Attribute
478 aSet
.SetModifyAtAttr( this );
480 SwAttrSetChg
aChgOld( aSet
, aOld
);
481 SwAttrSetChg
aChgNew( aSet
, aNew
);
482 Modify( &aChgOld
, &aChgNew
); // alle veraenderten werden verschickt
489 BOOL
SwFmt::SetFmtAttr( const SfxItemSet
& rSet
)
496 SwFrm::GetCache().Delete( this );
499 SetInSwFntCache( FALSE
);
501 // wenn Modify gelockt ist, werden keine Modifies verschickt;
502 // fuer FrmFmt's immer das Modify verschicken!
504 const USHORT nFmtWhich
= Which();
505 if ( IsModifyLocked() ||
507 ( RES_GRFFMTCOLL
== nFmtWhich
||
508 RES_TXTFMTCOLL
== nFmtWhich
) ) )
510 if( 0 != ( bRet
= (0 != aSet
.Put( rSet
))) )
511 aSet
.SetModifyAtAttr( this );
512 // --> OD 2006-11-22 #i71574#
513 if ( nFmtWhich
== RES_TXTFMTCOLL
)
515 TxtFmtCollFunc::CheckTxtFmtCollForDeletionOfAssignmentToOutlineStyle( this );
521 SwAttrSet
aOld( *aSet
.GetPool(), aSet
.GetRanges() ),
522 aNew( *aSet
.GetPool(), aSet
.GetRanges() );
523 bRet
= 0 != aSet
.Put_BC( rSet
, &aOld
, &aNew
);
526 // einige Sonderbehandlungen fuer Attribute
527 aSet
.SetModifyAtAttr( this );
528 SwAttrSetChg
aChgOld( aSet
, aOld
);
529 SwAttrSetChg
aChgNew( aSet
, aNew
);
530 Modify( &aChgOld
, &aChgNew
); // alle veraenderten werden verschickt
536 // Nimmt den Hint mit nWhich aus dem Delta-Array
539 BOOL
SwFmt::ResetFmtAttr( USHORT nWhich1
, USHORT nWhich2
)
544 if( !nWhich2
|| nWhich2
< nWhich1
)
545 nWhich2
= nWhich1
; // dann setze auf 1. Id, nur dieses Item
547 if ( IsInCache() || IsInSwFntCache() )
549 for( USHORT n
= nWhich1
; n
< nWhich2
; ++n
)
553 // wenn Modify gelockt ist, werden keine Modifies verschickt
554 if( IsModifyLocked() )
555 return 0 != (( nWhich2
== nWhich1
)
556 ? aSet
.ClearItem( nWhich1
)
557 : aSet
.ClearItem_BC( nWhich1
, nWhich2
));
559 SwAttrSet
aOld( *aSet
.GetPool(), aSet
.GetRanges() ),
560 aNew( *aSet
.GetPool(), aSet
.GetRanges() );
561 BOOL bRet
= 0 != aSet
.ClearItem_BC( nWhich1
, nWhich2
, &aOld
, &aNew
);
565 SwAttrSetChg
aChgOld( aSet
, aOld
);
566 SwAttrSetChg
aChgNew( aSet
, aNew
);
567 Modify( &aChgOld
, &aChgNew
); // alle veraenderten werden verschickt
574 // --> OD 2007-01-24 #i73790#
576 USHORT
SwFmt::ResetAllFmtAttr()
584 SwFrm::GetCache().Delete( this );
587 SetInSwFntCache( FALSE
);
589 // wenn Modify gelockt ist, werden keine Modifies verschickt
590 if( IsModifyLocked() )
591 return aSet
.ClearItem( 0 );
593 SwAttrSet
aOld( *aSet
.GetPool(), aSet
.GetRanges() ),
594 aNew( *aSet
.GetPool(), aSet
.GetRanges() );
595 BOOL bRet
= 0 != aSet
.ClearItem_BC( 0, &aOld
, &aNew
);
599 SwAttrSetChg
aChgOld( aSet
, aOld
);
600 SwAttrSetChg
aChgNew( aSet
, aNew
);
601 Modify( &aChgOld
, &aChgNew
); // alle veraenderten werden verschickt
607 /*************************************************************************
608 |* void SwFmt::GetInfo( const SfxPoolItem& ) const
611 |* Ersterstellung JP 18.04.94
612 |* Letzte Aenderung JP 05.08.94
613 *************************************************************************/
616 BOOL
SwFmt::GetInfo( SfxPoolItem
& rInfo
) const
618 BOOL bRet
= SwModify::GetInfo( rInfo
);
623 void SwFmt::DelDiffs( const SfxItemSet
& rSet
)
630 SwFrm::GetCache().Delete( this );
633 SetInSwFntCache( FALSE
);
635 // wenn Modify gelockt ist, werden keine Modifies verschickt
636 if( IsModifyLocked() )
638 aSet
.Intersect( rSet
);
642 SwAttrSet
aOld( *aSet
.GetPool(), aSet
.GetRanges() ),
643 aNew( *aSet
.GetPool(), aSet
.GetRanges() );
644 BOOL bRet
= 0 != aSet
.Intersect_BC( rSet
, &aOld
, &aNew
);
648 SwAttrSetChg
aChgOld( aSet
, aOld
);
649 SwAttrSetChg
aChgNew( aSet
, aNew
);
650 Modify( &aChgOld
, &aChgNew
); // alle veraenderten werden verschickt
654 /** SwFmt::IsBackgroundTransparent - for feature #99657#
657 Virtual method to determine, if background of format is transparent.
658 Default implementation returns false. Thus, subclasses have to overload
659 method, if the specific subclass can have a transparent background.
663 @return false, default implementation
665 sal_Bool
SwFmt::IsBackgroundTransparent() const
670 /** SwFmt::IsShadowTransparent - for feature #99657#
673 Virtual method to determine, if shadow of format is transparent.
674 Default implementation returns false. Thus, subclasses have to overload
675 method, if the specific subclass can have a transparent shadow.
679 @return false, default implementation
681 sal_Bool
SwFmt::IsShadowTransparent() const
687 * Document Interface Access
689 const IDocumentSettingAccess
* SwFmt::getIDocumentSettingAccess() const { return GetDoc(); }
690 const IDocumentDrawModelAccess
* SwFmt::getIDocumentDrawModelAccess() const { return GetDoc(); }
691 IDocumentDrawModelAccess
* SwFmt::getIDocumentDrawModelAccess() { return GetDoc(); }
692 const IDocumentLayoutAccess
* SwFmt::getIDocumentLayoutAccess() const { return GetDoc(); }
693 IDocumentLayoutAccess
* SwFmt::getIDocumentLayoutAccess() { return GetDoc(); }
694 IDocumentTimerAccess
* SwFmt::getIDocumentTimerAccess() { return GetDoc(); }
695 IDocumentFieldsAccess
* SwFmt::getIDocumentFieldsAccess() { return GetDoc(); }
696 IDocumentChartDataProviderAccess
* SwFmt::getIDocumentChartDataProviderAccess() { return GetDoc(); }