diff options
author | Christian Lippka <cl@openoffice.org> | 2002-04-08 09:36:57 +0000 |
---|---|---|
committer | Christian Lippka <cl@openoffice.org> | 2002-04-08 09:36:57 +0000 |
commit | 3a2518831b233fbdb9549bdaa1bdf75147f8898f (patch) | |
tree | d4ff180ed365686df0e4b35751a4f2ec639a2d6b /svx/source/svdraw/svdoattr.cxx | |
parent | 990d8f4dbd2fb4b914ffcc13638a40462646dd9d (diff) |
#98532# check for unique item names onSdrObject::MigrateItemPool
Diffstat (limited to 'svx/source/svdraw/svdoattr.cxx')
-rw-r--r-- | svx/source/svdraw/svdoattr.cxx | 135 |
1 files changed, 63 insertions, 72 deletions
diff --git a/svx/source/svdraw/svdoattr.cxx b/svx/source/svdraw/svdoattr.cxx index 1f64f962f423..2f7035d4f897 100644 --- a/svx/source/svdraw/svdoattr.cxx +++ b/svx/source/svdraw/svdoattr.cxx @@ -2,9 +2,9 @@ * * $RCSfile: svdoattr.cxx,v $ * - * $Revision: 1.34 $ + * $Revision: 1.35 $ * - * last change: $Author: cl $ $Date: 2002-04-05 12:43:42 $ + * last change: $Author: cl $ $Date: 2002-04-08 10:36:57 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -568,75 +568,13 @@ static void ImpScaleItemSet(SfxItemSet& rSet, const Fraction& rScale) } } -void SdrAttrObj::ImplMigrateUniqueItems(SdrModel* pNewModel) -{ - if( mpObjectItemSet ) - { - static sal_uInt16 ImplUniqueItemsWhichId[] = - { - XATTR_FILLBITMAP, XATTR_LINEDASH, XATTR_LINESTART, - XATTR_LINEEND, XATTR_FILLGRADIENT, XATTR_FILLFLOATTRANSPARENCE, - XATTR_FILLHATCH, 0 - }; - - sal_uInt16* pWhich = ImplUniqueItemsWhichId; - - const SfxPoolItem *pPoolItem; - - while(*pWhich) - { - if(SFX_ITEM_SET == mpObjectItemSet->GetItemState(*pWhich, FALSE, &pPoolItem)) - { - const SfxPoolItem* pItem = pPoolItem; - - switch( *pWhich ) - { - case XATTR_FILLBITMAP: - pItem = ((XFillBitmapItem*)pItem)->checkForUniqueItem( pNewModel ); - break; - case XATTR_LINEDASH: - pItem = ((XLineDashItem*)pItem)->checkForUniqueItem( pNewModel ); - break; - case XATTR_LINESTART: - pItem = ((XLineStartItem*)pItem)->checkForUniqueItem( pNewModel ); - break; - case XATTR_LINEEND: - pItem = ((XLineEndItem*)pItem)->checkForUniqueItem( pNewModel ); - break; - case XATTR_FILLGRADIENT: - pItem = ((XFillGradientItem*)pItem)->checkForUniqueItem( pNewModel ); - break; - case XATTR_FILLFLOATTRANSPARENCE: - // #85953# allow all kinds of XFillFloatTransparenceItem to be set - pItem = ((XFillFloatTransparenceItem*)pItem)->checkForUniqueItem( pNewModel ); - break; - case XATTR_FILLHATCH: - pItem = ((XFillHatchItem*)pItem)->checkForUniqueItem( pNewModel ); - break; - } - - // set item - if( (NULL != pItem) && (pItem != pPoolItem) ) - { - mpObjectItemSet->Put(*pItem); - delete (SfxPoolItem*)pItem; - } - } - pWhich++; - } - } -} - void SdrAttrObj::SetModel(SdrModel* pNewModel) { SdrModel* pOldModel = pModel; // test for correct pool in ItemSet; move to new pool if necessary if(pNewModel && mpObjectItemSet && mpObjectItemSet->GetPool() != &pNewModel->GetItemPool()) - { - ImplMigrateUniqueItems( pNewModel ); - MigrateItemPool(mpObjectItemSet->GetPool(), &pNewModel->GetItemPool()); - } + MigrateItemPool(mpObjectItemSet->GetPool(), &pNewModel->GetItemPool(), pNewModel); // call parent SdrObject::SetModel(pNewModel); @@ -1342,35 +1280,88 @@ FASTBOOL SdrAttrObj::ImpSetShadowAttributes(ExtOutputDevice& rXOut, FASTBOOL bNo } // ItemPool fuer dieses Objekt wechseln -void SdrAttrObj::MigrateItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool) +void SdrAttrObj::MigrateItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel) { if(pSrcPool && pDestPool && (pSrcPool != pDestPool)) { // call parent - SdrObject::MigrateItemPool(pSrcPool, pDestPool); + SdrObject::MigrateItemPool(pSrcPool, pDestPool, pNewModel); // eigene Reaktion if(pDestPool && pSrcPool && (pDestPool != pSrcPool)) { if(mpObjectItemSet) { + if( pNewModel == NULL ) + pNewModel = GetModel(); + // migrate ItemSet to new pool. Scaling is NOT necessary // because this functionality is used by UNDO only. Thus // objects and ItemSets would be moved back to their original // pool before usage. - SfxItemSet* pNewSet = mpObjectItemSet->Clone(TRUE, pDestPool); + + SfxItemSet* pOldSet = mpObjectItemSet; SfxStyleSheet* pStySheet = GetStyleSheet(); if(GetStyleSheet()) - pNewSet->SetParent(&GetStyleSheet()->GetItemSet()); + RemoveStyleSheet(); + + mpObjectItemSet = CreateNewItemSet(*pDestPool); + + SfxWhichIter aWhichIter(*pOldSet); + sal_uInt16 nWhich(aWhichIter.FirstWhich()); + const SfxPoolItem *pPoolItem; + + while(nWhich) + { + if(SFX_ITEM_SET == pOldSet->GetItemState(nWhich, FALSE, &pPoolItem)) + { + const SfxPoolItem* pItem = pPoolItem; - // set new itemset - ImpDeleteItemSet(); - mpObjectItemSet = pNewSet; + switch( nWhich ) + { + case XATTR_FILLBITMAP: + pItem = ((XFillBitmapItem*)pItem)->checkForUniqueItem( pNewModel ); + break; + case XATTR_LINEDASH: + pItem = ((XLineDashItem*)pItem)->checkForUniqueItem( pNewModel ); + break; + case XATTR_LINESTART: + pItem = ((XLineStartItem*)pItem)->checkForUniqueItem( pNewModel ); + break; + case XATTR_LINEEND: + pItem = ((XLineEndItem*)pItem)->checkForUniqueItem( pNewModel ); + break; + case XATTR_FILLGRADIENT: + pItem = ((XFillGradientItem*)pItem)->checkForUniqueItem( pNewModel ); + break; + case XATTR_FILLFLOATTRANSPARENCE: + // #85953# allow all kinds of XFillFloatTransparenceItem to be set + pItem = ((XFillFloatTransparenceItem*)pItem)->checkForUniqueItem( pNewModel ); + break; + case XATTR_FILLHATCH: + pItem = ((XFillHatchItem*)pItem)->checkForUniqueItem( pNewModel ); + break; + } + + // set item + if( pItem ) + { + mpObjectItemSet->Put(*pItem); + + // delete item if it was a generated one + if( pItem != pPoolItem) + delete (SfxPoolItem*)pItem; + } + } + nWhich = aWhichIter.NextWhich(); + } // set stylesheet (if used) if(pStySheet) AddStyleSheet(pStySheet, TRUE); + + delete pOldSet; } } } |