Files
libreoffice/sw/source/core/attr/swatrset.cxx
Jens-Heiner Rechtien 6b3f69d26e INTEGRATION: CWS swwarnings (1.10.130); FILE MERGED
2007/05/29 11:09:51 os 1.10.130.3: RESYNC: (1.10-1.11); FILE MERGED
2007/04/03 12:59:21 tl 1.10.130.2: #i69287# warning-free code
2007/03/07 16:20:59 ama 1.10.130.1: #i69287#: Warning free
2007-09-27 07:25:59 +00:00

359 lines
11 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: swatrset.cxx,v $
*
* $Revision: 1.12 $
*
* last change: $Author: hr $ $Date: 2007-09-27 08:25:59 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <hintids.hxx>
#include <svtools/whiter.hxx>
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BOLNITEM_HXX //autogen
#include <svx/bolnitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _XTABLE_HXX //autogen
#include <svx/xtable.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _PAGEDESC_HXX //autogen
#include <pagedesc.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NODE_HXX //autogen
#include <node.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx> // fuer SetModifyAtAttr
#endif
#ifndef _CELLATR_HXX
#include <cellatr.hxx> // fuer SetModifyAtAttr
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#include <istyleaccess.hxx>
SwAttrPool::SwAttrPool( SwDoc* pD )
: SfxItemPool( String::CreateFromAscii(
RTL_CONSTASCII_STRINGPARAM( "SWG" )),
POOLATTR_BEGIN, POOLATTR_END-1,
aSlotTab, aAttrTab ),
pDoc( pD )
{
SetVersionMap( 1, 1, 60, pVersionMap1 );
SetVersionMap( 2, 1, 75, pVersionMap2 );
SetVersionMap( 3, 1, 86, pVersionMap3 );
SetVersionMap( 4, 1,121, pVersionMap4 );
// OD 2004-01-21 #i18732# - apply new version map
SetVersionMap( 5, 1,130, pVersionMap5 );
}
SwAttrSet::SwAttrSet( SwAttrPool& rPool, USHORT nWh1, USHORT nWh2 )
: SfxItemSet( rPool, nWh1, nWh2 ), pOldSet( 0 ), pNewSet( 0 )
{
}
SwAttrSet::SwAttrSet( SwAttrPool& rPool, const USHORT* nWhichPairTable )
: SfxItemSet( rPool, nWhichPairTable ), pOldSet( 0 ), pNewSet( 0 )
{
}
SwAttrSet::SwAttrSet( const SwAttrSet& rSet )
: SfxItemSet( rSet ), pOldSet( 0 ), pNewSet( 0 )
{
}
SfxItemSet* SwAttrSet::Clone( BOOL bItems, SfxItemPool *pToPool ) const
{
if ( pToPool && pToPool != GetPool() )
{
SwAttrPool* pAttrPool = dynamic_cast< SwAttrPool* >(pToPool);
SfxItemSet* pTmpSet = 0;
if ( !pAttrPool )
pTmpSet = SfxItemSet::Clone( bItems, pToPool );
else
{
pTmpSet = new SwAttrSet( *pAttrPool, GetRanges() );
if ( bItems )
{
SfxWhichIter aIter(*pTmpSet);
USHORT nWhich = aIter.FirstWhich();
while ( nWhich )
{
const SfxPoolItem* pItem;
if ( SFX_ITEM_SET == GetItemState( nWhich, FALSE, &pItem ) )
pTmpSet->Put( *pItem, pItem->Which() );
nWhich = aIter.NextWhich();
}
}
}
return pTmpSet;
}
else
return bItems
? new SwAttrSet( *this )
: new SwAttrSet( *GetPool(), GetRanges() );
}
int SwAttrSet::Put_BC( const SfxPoolItem& rAttr,
SwAttrSet* pOld, SwAttrSet* pNew )
{
pNewSet = pNew;
pOldSet = pOld;
int nRet = 0 != SfxItemSet::Put( rAttr );
pOldSet = pNewSet = 0;
return nRet;
}
int SwAttrSet::Put_BC( const SfxItemSet& rSet,
SwAttrSet* pOld, SwAttrSet* pNew )
{
pNewSet = pNew;
pOldSet = pOld;
int nRet = 0 != SfxItemSet::Put( rSet );
pOldSet = pNewSet = 0;
return nRet;
}
USHORT SwAttrSet::ClearItem_BC( USHORT nWhich,
SwAttrSet* pOld, SwAttrSet* pNew )
{
pNewSet = pNew;
pOldSet = pOld;
USHORT nRet = SfxItemSet::ClearItem( nWhich );
pOldSet = pNewSet = 0;
return nRet;
}
USHORT SwAttrSet::ClearItem_BC( USHORT nWhich1, USHORT nWhich2,
SwAttrSet* pOld, SwAttrSet* pNew )
{
ASSERT( nWhich1 <= nWhich2, "kein gueltiger Bereich" );
pNewSet = pNew;
pOldSet = pOld;
USHORT nRet = 0;
for( ; nWhich1 <= nWhich2; ++nWhich1 )
nRet = nRet + SfxItemSet::ClearItem( nWhich1 );
pOldSet = pNewSet = 0;
return nRet;
}
int SwAttrSet::Intersect_BC( const SfxItemSet& rSet,
SwAttrSet* pOld, SwAttrSet* pNew )
{
pNewSet = pNew;
pOldSet = pOld;
SfxItemSet::Intersect( rSet );
pOldSet = pNewSet = 0;
return pNew ? pNew->Count() : ( pOld ? pOld->Count() : 0 );
}
// Notification-Callback
void SwAttrSet::Changed( const SfxPoolItem& rOld,
const SfxPoolItem& rNew )
{
if( pOldSet )
pOldSet->PutChgd( rOld );
if( pNewSet )
pNewSet->PutChgd( rNew );
}
// ----------------------------------------------------------------
// Sonderbehandlung fuer einige Attribute
// Setze den Modify-Pointer (alten pDefinedIn) bei folgenden Attributen:
// - SwFmtDropCaps
// - SwFmtPageDesc
// (Wird beim Einfuegen in Formate/Nodes gerufen)
// ----------------------------------------------------------------
bool SwAttrSet::SetModifyAtAttr( const SwModify* pModify )
{
bool bSet = false;
const SfxPoolItem* pItem;
if( SFX_ITEM_SET == GetItemState( RES_PAGEDESC, FALSE, &pItem ) &&
((SwFmtPageDesc*)pItem)->GetDefinedIn() != pModify )
{
((SwFmtPageDesc*)pItem)->ChgDefinedIn( pModify );
bSet = true;
}
if( SFX_ITEM_SET == GetItemState( RES_PARATR_NUMRULE, FALSE, &pItem ) &&
((SwNumRuleItem*)pItem)->GetDefinedIn() != pModify )
{
((SwNumRuleItem*)pItem)->ChgDefinedIn( pModify );
bSet = true;
}
if( SFX_ITEM_SET == GetItemState( RES_PARATR_DROP, FALSE, &pItem ) &&
((SwFmtDrop*)pItem)->GetDefinedIn() != pModify )
{
// CharFormat gesetzt und dann noch in unterschiedlichen
// Attribut Pools, dann muss das CharFormat kopiert werden!
SwCharFmt* pCharFmt;
if( 0 != ( pCharFmt = ((SwFmtDrop*)pItem)->GetCharFmt() )
&& GetPool() != pCharFmt->GetAttrSet().GetPool() )
{
pCharFmt = GetDoc()->CopyCharFmt( *pCharFmt );
((SwFmtDrop*)pItem)->SetCharFmt( pCharFmt );
}
((SwFmtDrop*)pItem)->ChgDefinedIn( pModify );
bSet = true;
}
if( SFX_ITEM_SET == GetItemState( RES_BOXATR_FORMULA, FALSE, &pItem ) &&
((SwTblBoxFormula*)pItem)->GetDefinedIn() != pModify )
{
((SwTblBoxFormula*)pItem)->ChgDefinedIn( pModify );
bSet = true;
}
return bSet;
}
void SwAttrSet::CopyToModify( SwModify& rMod ) const
{
// kopiere die Attribute ggfs. ueber Dokumentgrenzen
SwCntntNode* pCNd = PTR_CAST( SwCntntNode, &rMod );
SwFmt* pFmt = PTR_CAST( SwFmt, &rMod );
if( pCNd || pFmt )
{
if( Count() )
{
const SfxPoolItem* pItem;
const SwDoc *pSrcDoc = GetDoc();
SwDoc *pDstDoc = pCNd ? pCNd->GetDoc() : pFmt->GetDoc();
// muss die NumRule kopiert werden?
if( pSrcDoc != pDstDoc && SFX_ITEM_SET == GetItemState(
RES_PARATR_NUMRULE, FALSE, &pItem ) )
{
const String& rNm = ((SwNumRuleItem*)pItem)->GetValue();
if( rNm.Len() )
{
SwNumRule* pDestRule = pDstDoc->FindNumRulePtr( rNm );
if( pDestRule )
pDestRule->SetInvalidRule( TRUE );
else
pDstDoc->MakeNumRule( rNm,
pSrcDoc->FindNumRulePtr( rNm ) );
}
}
// JP 04.02.99: Task #61467# Seitenvorlagenwechsel mit kopieren
// Gegenueber dem alten Verhalten, sie zu entfernen
const SwPageDesc* pPgDesc;
if( pSrcDoc != pDstDoc && SFX_ITEM_SET == GetItemState(
RES_PAGEDESC, FALSE, &pItem ) &&
0 != ( pPgDesc = ((SwFmtPageDesc*)pItem)->GetPageDesc()) )
{
SfxItemSet aTmpSet( *this );
// JP 09.02.99: und jetzt doch wieder nur entfernen
aTmpSet.ClearItem( RES_PAGEDESC );
/*************************************************************************
SwPageDesc* pDstPgDesc = pDstDoc->FindPageDescByName(
pPgDesc->GetName() );
if( !pDstPgDesc )
{
// dann kopieren, ansonsten den benutzen
pDstPgDesc = &pDstDoc->_GetPageDesc( pDstDoc->MakePageDesc(
pPgDesc->GetName() ));
pDstDoc->CopyPageDesc( *pPgDesc, *pDstPgDesc );
}
SwFmtPageDesc aDesc( pDstPgDesc );
aDesc.SetNumOffset( ((SwFmtPageDesc*)pItem)->GetNumOffset() );
aTmpSet.Put( aDesc );
************************************************************************/
if( pCNd )
pCNd->SetAttr( aTmpSet );
else
pFmt->SetAttr( aTmpSet );
}
else if( pCNd )
pCNd->SetAttr( *this );
else
pFmt->SetAttr( *this );
}
}
#ifndef PRODUCT
else
ASSERT( !this, "weder Format noch ContentNode - keine Attribute kopiert");
#endif
}
// check if ID is InRange of AttrSet-Ids
BOOL IsInRange( const USHORT* pRange, const USHORT nId )
{
while( *pRange )
{
if( *pRange <= nId && nId <= *(pRange+1) )
return TRUE;
pRange += 2;
}
return FALSE;
}