1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 #include <svx/sdr/properties/groupproperties.hxx>
31 #include <svl/itemset.hxx>
32 #include <svl/whiter.hxx>
33 #include <svx/svddef.hxx>
34 #include <editeng/eeitem.hxx>
35 #include <svx/svdogrp.hxx>
36 #include <svx/svdpool.hxx>
37 #include <svx/svdpage.hxx>
38 
39 //////////////////////////////////////////////////////////////////////////////
40 
41 namespace sdr
42 {
43 	namespace properties
44 	{
45 		// create a new itemset
46 		SfxItemSet& GroupProperties::CreateObjectSpecificItemSet(SfxItemPool& rPool)
47 		{
48 			// Groups have in principle no ItemSet. To support methods like
49 			// GetMergedItemSet() the local one is used. Thus, all items in the pool
50 			// may be used and a pool itemset is created.
51 			return *(new SfxItemSet(rPool));
52 		}
53 
54 		GroupProperties::GroupProperties(SdrObject& rObj)
55 		:	DefaultProperties(rObj)
56 		{
57 		}
58 
59 		GroupProperties::GroupProperties(const GroupProperties& rProps, SdrObject& rObj)
60 		:	DefaultProperties(rProps, rObj)
61 		{
62 		}
63 
64 		GroupProperties::~GroupProperties()
65 		{
66 		}
67 
68 		BaseProperties& GroupProperties::Clone(SdrObject& rObj) const
69 		{
70 			return *(new GroupProperties(*this, rObj));
71 		}
72 
73 		const SfxItemSet& GroupProperties::GetObjectItemSet() const
74 		{
75 			DBG_ASSERT(sal_False, "GroupProperties::GetObjectItemSet() should never be called (!)");
76 			return DefaultProperties::GetObjectItemSet();
77 		}
78 
79 		const SfxItemSet& GroupProperties::GetMergedItemSet() const
80 		{
81 			// prepare ItemSet
82 			if(mpItemSet)
83 			{
84 				// clear local itemset for merge
85 				mpItemSet->ClearItem();
86 			}
87 			else
88 			{
89 				// force local itemset
90 				DefaultProperties::GetObjectItemSet();
91 			}
92 
93 			// collect all ItemSets in mpItemSet
94 			const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
95 			const sal_uInt32 nCount(pSub->GetObjCount());
96 
97 			for(sal_uInt32 a(0L); a < nCount; a++)
98 			{
99 				const SfxItemSet& rSet = pSub->GetObj(a)->GetMergedItemSet();
100 				SfxWhichIter aIter(rSet);
101 				sal_uInt16 nWhich(aIter.FirstWhich());
102 
103 				while(nWhich)
104 				{
105 					if(SFX_ITEM_DONTCARE == rSet.GetItemState(nWhich, sal_False))
106 					{
107 						mpItemSet->InvalidateItem(nWhich);
108 					}
109 					else
110 					{
111 						mpItemSet->MergeValue(rSet.Get(nWhich), sal_True);
112 					}
113 
114 					nWhich = aIter.NextWhich();
115 				}
116 			}
117 
118 			// For group proerties, do not call parent since groups do
119 			// not have local ItemSets.
120 			return *mpItemSet;
121 		}
122 
123 		void GroupProperties::SetMergedItemSet(const SfxItemSet& rSet, sal_Bool bClearAllItems)
124 		{
125 			// iterate over contained SdrObjects
126 			const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
127 			const sal_uInt32 nCount(pSub->GetObjCount());
128 
129 			for(sal_uInt32 a(0L); a < nCount; a++)
130 			{
131 				SdrObject* pObj = pSub->GetObj(a);
132 
133 				if(pObj)
134 				{
135 					// Set merged ItemSet at contained object
136 					pObj->SetMergedItemSet(rSet, bClearAllItems);
137 				}
138 			}
139 
140 			// Do not call parent here. Group objects do not have local ItemSets
141 			// where items need to be set.
142 			// DefaultProperties::SetMergedItemSet(rSet, bClearAllItems);
143 		}
144 
145 		void GroupProperties::SetObjectItem(const SfxPoolItem& /*rItem*/)
146 		{
147 			DBG_ASSERT(sal_False, "GroupProperties::SetObjectItem() should never be called (!)");
148 		}
149 
150 		void GroupProperties::SetObjectItemDirect(const SfxPoolItem& /*rItem*/)
151 		{
152 			DBG_ASSERT(sal_False, "GroupProperties::SetObjectItemDirect() should never be called (!)");
153 		}
154 
155 		void GroupProperties::ClearObjectItem(const sal_uInt16 /*nWhich*/)
156 		{
157 			DBG_ASSERT(sal_False, "GroupProperties::ClearObjectItem() should never be called (!)");
158 		}
159 
160 		void GroupProperties::ClearObjectItemDirect(const sal_uInt16 /*nWhich*/)
161 		{
162 			DBG_ASSERT(sal_False, "GroupProperties::ClearObjectItemDirect() should never be called (!)");
163 		}
164 
165 		void GroupProperties::SetMergedItem(const SfxPoolItem& rItem)
166 		{
167 			const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
168 			const sal_uInt32 nCount(pSub->GetObjCount());
169 
170 			for(sal_uInt32 a(0L); a < nCount; a++)
171 			{
172 				pSub->GetObj(a)->GetProperties().SetMergedItem(rItem);
173 			}
174 		}
175 
176 		void GroupProperties::ClearMergedItem(const sal_uInt16 nWhich)
177 		{
178 			const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
179 			const sal_uInt32 nCount(pSub->GetObjCount());
180 
181 			for(sal_uInt32 a(0L); a < nCount; a++)
182 			{
183 				pSub->GetObj(a)->GetProperties().ClearMergedItem(nWhich);
184 			}
185 		}
186 
187 		void GroupProperties::SetObjectItemSet(const SfxItemSet& /*rSet*/)
188 		{
189 			DBG_ASSERT(sal_False, "GroupProperties::SetObjectItemSet() should never be called (!)");
190 		}
191 
192 		void GroupProperties::ItemSetChanged(const SfxItemSet& /*rSet*/)
193 		{
194 			DBG_ASSERT(sal_False, "GroupProperties::ItemSetChanged() should never be called (!)");
195 		}
196 
197 		sal_Bool GroupProperties::AllowItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/) const
198 		{
199 			DBG_ASSERT(sal_False, "GroupProperties::AllowItemChange() should never be called (!)");
200 			return sal_False;
201 		}
202 
203 		void GroupProperties::ItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/)
204 		{
205 			DBG_ASSERT(sal_False, "GroupProperties::ItemChange() should never be called (!)");
206 		}
207 
208 		void GroupProperties::PostItemChange(const sal_uInt16 /*nWhich*/)
209 		{
210 			DBG_ASSERT(sal_False, "GroupProperties::PostItemChange() should never be called (!)");
211 		}
212 
213 		SfxStyleSheet* GroupProperties::GetStyleSheet() const
214 		{
215 			SfxStyleSheet* pRetval = 0L;
216 
217 			const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
218 			const sal_uInt32 nCount(pSub->GetObjCount());
219 
220 			for(sal_uInt32 a(0L); a < nCount; a++)
221 			{
222 				SfxStyleSheet* pCandidate = pSub->GetObj(a)->GetStyleSheet();
223 
224 				if(pRetval)
225 				{
226 					if(pCandidate != pRetval)
227 					{
228 						// different StyleSheelts, return none
229 						return 0L;
230 					}
231 				}
232 				else
233 				{
234 					pRetval = pCandidate;
235 				}
236 			}
237 
238 			return pRetval;
239 		}
240 
241 		void GroupProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr)
242 		{
243 			const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
244 			const sal_uInt32 nCount(pSub->GetObjCount());
245 
246 			for(sal_uInt32 a(0L); a < nCount; a++)
247 			{
248 				pSub->GetObj(a)->SetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr);
249 			}
250 		}
251 
252 		void GroupProperties::ForceDefaultAttributes()
253 		{
254 			// nothing to do here, groups have no items and thus no default items, too.
255 		}
256 
257 		void GroupProperties::MoveToItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel)
258 		{
259 			if(pSrcPool && pDestPool && (pSrcPool != pDestPool))
260 			{
261 				const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
262 				const sal_uInt32 nCount(pSub->GetObjCount());
263 
264 				for(sal_uInt32 a(0L); a < nCount; a++)
265 				{
266 					pSub->GetObj(a)->GetProperties().MoveToItemPool(pSrcPool, pDestPool, pNewModel);
267 				}
268 
269 				// also clear local ItemSet, it's only temporary for group objects anyways.
270 				if(mpItemSet)
271 				{
272 					// #121905#
273 					// copy/paste is still using clone operators and MoveToItemPool functionality.
274 					// Since SfxItemSet contains a pool pointer, ClearItem is not enough here.
275 					// The ItemSet for merge is constructed on demand, so it's enough here to
276 					// just delete it and set to 0L.
277 					// mpItemSet->ClearItem();
278 					delete mpItemSet;
279 					mpItemSet = 0L;
280 				}
281 			}
282 		}
283 
284 		void GroupProperties::ForceStyleToHardAttributes()
285 		{
286 			const SdrObjList* pSub = ((const SdrObjGroup&)GetSdrObject()).GetSubList();
287 			const sal_uInt32 nCount(pSub->GetObjCount());
288 
289 			for(sal_uInt32 a(0L); a < nCount; a++)
290 			{
291 				pSub->GetObj(a)->GetProperties().ForceStyleToHardAttributes();
292 			}
293 		}
294 	} // end of namespace properties
295 } // end of namespace sdr
296 
297 //////////////////////////////////////////////////////////////////////////////
298 // eof
299