diff options
Diffstat (limited to 'svx/source/sdr/properties/groupproperties.cxx')
-rw-r--r-- | svx/source/sdr/properties/groupproperties.cxx | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/svx/source/sdr/properties/groupproperties.cxx b/svx/source/sdr/properties/groupproperties.cxx new file mode 100644 index 000000000000..6370978c4527 --- /dev/null +++ b/svx/source/sdr/properties/groupproperties.cxx @@ -0,0 +1,301 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: groupproperties.cxx,v $ + * $Revision: 1.12 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" +#include <svx/sdr/properties/groupproperties.hxx> +#include <svl/itemset.hxx> +#include <svl/whiter.hxx> +#include <svx/svddef.hxx> +#include <svx/eeitem.hxx> +#include <svx/svdogrp.hxx> +#include <svx/svdpool.hxx> +#include <svx/svdpage.hxx> + +////////////////////////////////////////////////////////////////////////////// + +namespace sdr +{ + namespace properties + { + // create a new itemset + SfxItemSet& GroupProperties::CreateObjectSpecificItemSet(SfxItemPool& rPool) + { + // Groups have in principle no ItemSet. To support methods like + // GetMergedItemSet() the local one is used. Thus, all items in the pool + // may be used and a pool itemset is created. + return *(new SfxItemSet(rPool)); + } + + GroupProperties::GroupProperties(SdrObject& rObj) + : DefaultProperties(rObj) + { + } + + GroupProperties::GroupProperties(const GroupProperties& rProps, SdrObject& rObj) + : DefaultProperties(rProps, rObj) + { + } + + GroupProperties::~GroupProperties() + { + } + + BaseProperties& GroupProperties::Clone(SdrObject& rObj) const + { + return *(new GroupProperties(*this, rObj)); + } + + const SfxItemSet& GroupProperties::GetObjectItemSet() const + { + DBG_ASSERT(sal_False, "GroupProperties::GetObjectItemSet() should never be called (!)"); + return DefaultProperties::GetObjectItemSet(); + } + + const SfxItemSet& GroupProperties::GetMergedItemSet() const + { + // prepare ItemSet + if(mpItemSet) + { + // clear local itemset for merge + mpItemSet->ClearItem(); + } + else + { + // force local itemset + DefaultProperties::GetObjectItemSet(); + } + + // collect all ItemSets in mpItemSet + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + const SfxItemSet& rSet = pSub->GetObj(a)->GetMergedItemSet(); + SfxWhichIter aIter(rSet); + sal_uInt16 nWhich(aIter.FirstWhich()); + + while(nWhich) + { + if(SFX_ITEM_DONTCARE == rSet.GetItemState(nWhich, FALSE)) + { + mpItemSet->InvalidateItem(nWhich); + } + else + { + mpItemSet->MergeValue(rSet.Get(nWhich), TRUE); + } + + nWhich = aIter.NextWhich(); + } + } + + // For group proerties, do not call parent since groups do + // not have local ItemSets. + return *mpItemSet; + } + + void GroupProperties::SetMergedItemSet(const SfxItemSet& rSet, sal_Bool bClearAllItems) + { + // iterate over contained SdrObjects + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + SdrObject* pObj = pSub->GetObj(a); + + if(pObj) + { + // Set merged ItemSet at contained object + pObj->SetMergedItemSet(rSet, bClearAllItems); + } + } + + // Do not call parent here. Group objects do not have local ItemSets + // where items need to be set. + // DefaultProperties::SetMergedItemSet(rSet, bClearAllItems); + } + + void GroupProperties::SetObjectItem(const SfxPoolItem& /*rItem*/) + { + DBG_ASSERT(sal_False, "GroupProperties::SetObjectItem() should never be called (!)"); + } + + void GroupProperties::SetObjectItemDirect(const SfxPoolItem& /*rItem*/) + { + DBG_ASSERT(sal_False, "GroupProperties::SetObjectItemDirect() should never be called (!)"); + } + + void GroupProperties::ClearObjectItem(const sal_uInt16 /*nWhich*/) + { + DBG_ASSERT(sal_False, "GroupProperties::ClearObjectItem() should never be called (!)"); + } + + void GroupProperties::ClearObjectItemDirect(const sal_uInt16 /*nWhich*/) + { + DBG_ASSERT(sal_False, "GroupProperties::ClearObjectItemDirect() should never be called (!)"); + } + + void GroupProperties::SetMergedItem(const SfxPoolItem& rItem) + { + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + pSub->GetObj(a)->GetProperties().SetMergedItem(rItem); + } + } + + void GroupProperties::ClearMergedItem(const sal_uInt16 nWhich) + { + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + pSub->GetObj(a)->GetProperties().ClearMergedItem(nWhich); + } + } + + void GroupProperties::SetObjectItemSet(const SfxItemSet& /*rSet*/) + { + DBG_ASSERT(sal_False, "GroupProperties::SetObjectItemSet() should never be called (!)"); + } + + void GroupProperties::ItemSetChanged(const SfxItemSet& /*rSet*/) + { + DBG_ASSERT(sal_False, "GroupProperties::ItemSetChanged() should never be called (!)"); + } + + sal_Bool GroupProperties::AllowItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/) const + { + DBG_ASSERT(sal_False, "GroupProperties::AllowItemChange() should never be called (!)"); + return sal_False; + } + + void GroupProperties::ItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/) + { + DBG_ASSERT(sal_False, "GroupProperties::ItemChange() should never be called (!)"); + } + + void GroupProperties::PostItemChange(const sal_uInt16 /*nWhich*/) + { + DBG_ASSERT(sal_False, "GroupProperties::PostItemChange() should never be called (!)"); + } + + SfxStyleSheet* GroupProperties::GetStyleSheet() const + { + SfxStyleSheet* pRetval = 0L; + + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + SfxStyleSheet* pCandidate = pSub->GetObj(a)->GetStyleSheet(); + + if(pRetval) + { + if(pCandidate != pRetval) + { + // different StyleSheelts, return none + return 0L; + } + } + else + { + pRetval = pCandidate; + } + } + + return pRetval; + } + + void GroupProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr) + { + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + pSub->GetObj(a)->SetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr); + } + } + + void GroupProperties::ForceDefaultAttributes() + { + // nothing to do here, groups have no items and thus no default items, too. + } + + void GroupProperties::MoveToItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel) + { + if(pSrcPool && pDestPool && (pSrcPool != pDestPool)) + { + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + pSub->GetObj(a)->GetProperties().MoveToItemPool(pSrcPool, pDestPool, pNewModel); + } + + // also clear local ItemSet, it's only temporary for group objects anyways. + if(mpItemSet) + { + // #121905# + // copy/paste is still using clone operators and MoveToItemPool functionality. + // Since SfxItemSet contains a pool pointer, ClearItem is not enough here. + // The ItemSet for merge is constructed on demand, so it's enough here to + // just delete it and set to 0L. + // mpItemSet->ClearItem(); + delete mpItemSet; + mpItemSet = 0L; + } + } + } + + void GroupProperties::ForceStyleToHardAttributes() + { + const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList(); + const sal_uInt32 nCount(pSub->GetObjCount()); + + for(sal_uInt32 a(0L); a < nCount; a++) + { + pSub->GetObj(a)->GetProperties().ForceStyleToHardAttributes(); + } + } + } // end of namespace properties +} // end of namespace sdr + +////////////////////////////////////////////////////////////////////////////// +// eof |