summaryrefslogtreecommitdiff
path: root/svx/source/sdr/properties/groupproperties.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/sdr/properties/groupproperties.cxx')
-rw-r--r--svx/source/sdr/properties/groupproperties.cxx301
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