1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski #include <svx/sdr/properties/defaultproperties.hxx>
27*b1cdbd2cSJim Jagielski #include <svx/sdr/properties/itemsettools.hxx>
28*b1cdbd2cSJim Jagielski #include <svl/itemset.hxx>
29*b1cdbd2cSJim Jagielski #include <svl/whiter.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <vector>
32*b1cdbd2cSJim Jagielski #include <svx/svdobj.hxx>
33*b1cdbd2cSJim Jagielski #include <svx/svddef.hxx>
34*b1cdbd2cSJim Jagielski #include <svx/svdpool.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski namespace sdr
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski 	namespace properties
42*b1cdbd2cSJim Jagielski 	{
CreateObjectSpecificItemSet(SfxItemPool & rPool)43*b1cdbd2cSJim Jagielski 		SfxItemSet& DefaultProperties::CreateObjectSpecificItemSet(SfxItemPool& rPool)
44*b1cdbd2cSJim Jagielski 		{
45*b1cdbd2cSJim Jagielski 			// Basic implementation; Basic object has NO attributes
46*b1cdbd2cSJim Jagielski 			return *(new SfxItemSet(rPool));
47*b1cdbd2cSJim Jagielski 		}
48*b1cdbd2cSJim Jagielski 
DefaultProperties(SdrObject & rObj)49*b1cdbd2cSJim Jagielski 		DefaultProperties::DefaultProperties(SdrObject& rObj)
50*b1cdbd2cSJim Jagielski 		:	BaseProperties(rObj),
51*b1cdbd2cSJim Jagielski 			mpItemSet(0L)
52*b1cdbd2cSJim Jagielski 		{
53*b1cdbd2cSJim Jagielski 		}
54*b1cdbd2cSJim Jagielski 
DefaultProperties(const DefaultProperties & rProps,SdrObject & rObj)55*b1cdbd2cSJim Jagielski 		DefaultProperties::DefaultProperties(const DefaultProperties& rProps, SdrObject& rObj)
56*b1cdbd2cSJim Jagielski 		:	BaseProperties(rObj),
57*b1cdbd2cSJim Jagielski 			mpItemSet(0L)
58*b1cdbd2cSJim Jagielski 		{
59*b1cdbd2cSJim Jagielski 			if(rProps.mpItemSet)
60*b1cdbd2cSJim Jagielski 			{
61*b1cdbd2cSJim Jagielski 				mpItemSet = rProps.mpItemSet->Clone(sal_True);
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 				// do not keep parent info, this may be changed by later construrtors.
64*b1cdbd2cSJim Jagielski 				// This class just copies the ItemSet, ignore parent.
65*b1cdbd2cSJim Jagielski 				if(mpItemSet && mpItemSet->GetParent())
66*b1cdbd2cSJim Jagielski 				{
67*b1cdbd2cSJim Jagielski 					mpItemSet->SetParent(0L);
68*b1cdbd2cSJim Jagielski 				}
69*b1cdbd2cSJim Jagielski 			}
70*b1cdbd2cSJim Jagielski 		}
71*b1cdbd2cSJim Jagielski 
Clone(SdrObject & rObj) const72*b1cdbd2cSJim Jagielski 		BaseProperties& DefaultProperties::Clone(SdrObject& rObj) const
73*b1cdbd2cSJim Jagielski 		{
74*b1cdbd2cSJim Jagielski 			return *(new DefaultProperties(*this, rObj));
75*b1cdbd2cSJim Jagielski 		}
76*b1cdbd2cSJim Jagielski 
~DefaultProperties()77*b1cdbd2cSJim Jagielski 		DefaultProperties::~DefaultProperties()
78*b1cdbd2cSJim Jagielski 		{
79*b1cdbd2cSJim Jagielski 			if(mpItemSet)
80*b1cdbd2cSJim Jagielski 			{
81*b1cdbd2cSJim Jagielski 				delete mpItemSet;
82*b1cdbd2cSJim Jagielski 				mpItemSet = 0L;
83*b1cdbd2cSJim Jagielski 			}
84*b1cdbd2cSJim Jagielski 		}
85*b1cdbd2cSJim Jagielski 
GetObjectItemSet() const86*b1cdbd2cSJim Jagielski 		const SfxItemSet& DefaultProperties::GetObjectItemSet() const
87*b1cdbd2cSJim Jagielski 		{
88*b1cdbd2cSJim Jagielski 			if(!mpItemSet)
89*b1cdbd2cSJim Jagielski 			{
90*b1cdbd2cSJim Jagielski 				((DefaultProperties*)this)->mpItemSet = &(((DefaultProperties*)this)->CreateObjectSpecificItemSet(*GetSdrObject().GetObjectItemPool()));
91*b1cdbd2cSJim Jagielski 				((DefaultProperties*)this)->ForceDefaultAttributes();
92*b1cdbd2cSJim Jagielski 			}
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 			DBG_ASSERT(mpItemSet, "Could not create an SfxItemSet(!)");
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 			return *mpItemSet;
97*b1cdbd2cSJim Jagielski 		}
98*b1cdbd2cSJim Jagielski 
SetObjectItem(const SfxPoolItem & rItem)99*b1cdbd2cSJim Jagielski 		void DefaultProperties::SetObjectItem(const SfxPoolItem& rItem)
100*b1cdbd2cSJim Jagielski 		{
101*b1cdbd2cSJim Jagielski 			const sal_uInt16 nWhichID(rItem.Which());
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 			if(AllowItemChange(nWhichID, &rItem))
104*b1cdbd2cSJim Jagielski 			{
105*b1cdbd2cSJim Jagielski 				ItemChange(nWhichID, &rItem);
106*b1cdbd2cSJim Jagielski 				PostItemChange(nWhichID);
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 				SfxItemSet aSet(*GetSdrObject().GetObjectItemPool(), nWhichID, nWhichID);
109*b1cdbd2cSJim Jagielski 				aSet.Put(rItem);
110*b1cdbd2cSJim Jagielski 				ItemSetChanged(aSet);
111*b1cdbd2cSJim Jagielski 			}
112*b1cdbd2cSJim Jagielski 		}
113*b1cdbd2cSJim Jagielski 
SetObjectItemDirect(const SfxPoolItem & rItem)114*b1cdbd2cSJim Jagielski 		void DefaultProperties::SetObjectItemDirect(const SfxPoolItem& rItem)
115*b1cdbd2cSJim Jagielski 		{
116*b1cdbd2cSJim Jagielski 			const sal_uInt16 nWhichID(rItem.Which());
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 			if(AllowItemChange(nWhichID, &rItem))
119*b1cdbd2cSJim Jagielski 			{
120*b1cdbd2cSJim Jagielski 				ItemChange(nWhichID, &rItem);
121*b1cdbd2cSJim Jagielski 			}
122*b1cdbd2cSJim Jagielski 		}
123*b1cdbd2cSJim Jagielski 
ClearObjectItem(const sal_uInt16 nWhich)124*b1cdbd2cSJim Jagielski 		void DefaultProperties::ClearObjectItem(const sal_uInt16 nWhich)
125*b1cdbd2cSJim Jagielski 		{
126*b1cdbd2cSJim Jagielski 			if(AllowItemChange(nWhich))
127*b1cdbd2cSJim Jagielski 			{
128*b1cdbd2cSJim Jagielski 				ItemChange(nWhich);
129*b1cdbd2cSJim Jagielski 				PostItemChange(nWhich);
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 				if(nWhich)
132*b1cdbd2cSJim Jagielski 				{
133*b1cdbd2cSJim Jagielski 					SfxItemSet aSet(*GetSdrObject().GetObjectItemPool(), nWhich, nWhich, 0, 0);
134*b1cdbd2cSJim Jagielski 					ItemSetChanged(aSet);
135*b1cdbd2cSJim Jagielski 				}
136*b1cdbd2cSJim Jagielski 			}
137*b1cdbd2cSJim Jagielski 		}
138*b1cdbd2cSJim Jagielski 
ClearObjectItemDirect(const sal_uInt16 nWhich)139*b1cdbd2cSJim Jagielski 		void DefaultProperties::ClearObjectItemDirect(const sal_uInt16 nWhich)
140*b1cdbd2cSJim Jagielski 		{
141*b1cdbd2cSJim Jagielski 			if(AllowItemChange(nWhich))
142*b1cdbd2cSJim Jagielski 			{
143*b1cdbd2cSJim Jagielski 				ItemChange(nWhich);
144*b1cdbd2cSJim Jagielski 			}
145*b1cdbd2cSJim Jagielski 		}
146*b1cdbd2cSJim Jagielski 
SetObjectItemSet(const SfxItemSet & rSet)147*b1cdbd2cSJim Jagielski 		void DefaultProperties::SetObjectItemSet(const SfxItemSet& rSet)
148*b1cdbd2cSJim Jagielski 		{
149*b1cdbd2cSJim Jagielski 			SfxWhichIter aWhichIter(rSet);
150*b1cdbd2cSJim Jagielski 			sal_uInt16 nWhich(aWhichIter.FirstWhich());
151*b1cdbd2cSJim Jagielski 			const SfxPoolItem *pPoolItem;
152*b1cdbd2cSJim Jagielski 			std::vector< sal_uInt16 > aPostItemChangeList;
153*b1cdbd2cSJim Jagielski 			sal_Bool bDidChange(sal_False);
154*b1cdbd2cSJim Jagielski 			SfxItemSet aSet(*GetSdrObject().GetObjectItemPool(), SDRATTR_START, EE_ITEMS_END, 0, 0);
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 			// give a hint to STL_Vector
157*b1cdbd2cSJim Jagielski 			aPostItemChangeList.reserve(rSet.Count());
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 			while(nWhich)
160*b1cdbd2cSJim Jagielski 			{
161*b1cdbd2cSJim Jagielski 				if(SFX_ITEM_SET == rSet.GetItemState(nWhich, sal_False, &pPoolItem))
162*b1cdbd2cSJim Jagielski 				{
163*b1cdbd2cSJim Jagielski 					if(AllowItemChange(nWhich, pPoolItem))
164*b1cdbd2cSJim Jagielski 					{
165*b1cdbd2cSJim Jagielski 						bDidChange = sal_True;
166*b1cdbd2cSJim Jagielski 						ItemChange(nWhich, pPoolItem);
167*b1cdbd2cSJim Jagielski 						aPostItemChangeList.push_back( nWhich );
168*b1cdbd2cSJim Jagielski 						aSet.Put(*pPoolItem);
169*b1cdbd2cSJim Jagielski 					}
170*b1cdbd2cSJim Jagielski 				}
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 				nWhich = aWhichIter.NextWhich();
173*b1cdbd2cSJim Jagielski 			}
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 			if(bDidChange)
176*b1cdbd2cSJim Jagielski 			{
177*b1cdbd2cSJim Jagielski 				std::vector< sal_uInt16 >::iterator aIter = aPostItemChangeList.begin();
178*b1cdbd2cSJim Jagielski 				const std::vector< sal_uInt16 >::iterator aEnd = aPostItemChangeList.end();
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 				while(aIter != aEnd)
181*b1cdbd2cSJim Jagielski 				{
182*b1cdbd2cSJim Jagielski 					PostItemChange(*aIter);
183*b1cdbd2cSJim Jagielski 					aIter++;
184*b1cdbd2cSJim Jagielski 				}
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 				ItemSetChanged(aSet);
187*b1cdbd2cSJim Jagielski 			}
188*b1cdbd2cSJim Jagielski 		}
189*b1cdbd2cSJim Jagielski 
ItemSetChanged(const SfxItemSet &)190*b1cdbd2cSJim Jagielski 		void DefaultProperties::ItemSetChanged(const SfxItemSet& /*rSet*/)
191*b1cdbd2cSJim Jagielski 		{
192*b1cdbd2cSJim Jagielski 		}
193*b1cdbd2cSJim Jagielski 
AllowItemChange(const sal_uInt16,const SfxPoolItem *) const194*b1cdbd2cSJim Jagielski 		sal_Bool DefaultProperties::AllowItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/) const
195*b1cdbd2cSJim Jagielski 		{
196*b1cdbd2cSJim Jagielski 			return sal_True;
197*b1cdbd2cSJim Jagielski 		}
198*b1cdbd2cSJim Jagielski 
ItemChange(const sal_uInt16,const SfxPoolItem *)199*b1cdbd2cSJim Jagielski 		void DefaultProperties::ItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/)
200*b1cdbd2cSJim Jagielski 		{
201*b1cdbd2cSJim Jagielski 		}
202*b1cdbd2cSJim Jagielski 
PostItemChange(const sal_uInt16 nWhich)203*b1cdbd2cSJim Jagielski 		void DefaultProperties::PostItemChange(const sal_uInt16 nWhich )
204*b1cdbd2cSJim Jagielski 		{
205*b1cdbd2cSJim Jagielski 			if( (nWhich == XATTR_FILLSTYLE) && (mpItemSet != NULL) )
206*b1cdbd2cSJim Jagielski 				CleanupFillProperties(*mpItemSet);
207*b1cdbd2cSJim Jagielski 		}
208*b1cdbd2cSJim Jagielski 
SetStyleSheet(SfxStyleSheet *,sal_Bool)209*b1cdbd2cSJim Jagielski 		void DefaultProperties::SetStyleSheet(SfxStyleSheet* /*pNewStyleSheet*/, sal_Bool /*bDontRemoveHardAttr*/)
210*b1cdbd2cSJim Jagielski 		{
211*b1cdbd2cSJim Jagielski 			// no StyleSheet in DefaultProperties
212*b1cdbd2cSJim Jagielski 		}
213*b1cdbd2cSJim Jagielski 
GetStyleSheet() const214*b1cdbd2cSJim Jagielski 		SfxStyleSheet* DefaultProperties::GetStyleSheet() const
215*b1cdbd2cSJim Jagielski 		{
216*b1cdbd2cSJim Jagielski 			// no StyleSheet in DefaultProperties
217*b1cdbd2cSJim Jagielski 			return 0L;
218*b1cdbd2cSJim Jagielski 		}
219*b1cdbd2cSJim Jagielski 
ForceDefaultAttributes()220*b1cdbd2cSJim Jagielski 		void DefaultProperties::ForceDefaultAttributes()
221*b1cdbd2cSJim Jagielski 		{
222*b1cdbd2cSJim Jagielski 		}
223*b1cdbd2cSJim Jagielski 
Scale(const Fraction & rScale)224*b1cdbd2cSJim Jagielski 		void DefaultProperties::Scale(const Fraction& rScale)
225*b1cdbd2cSJim Jagielski 		{
226*b1cdbd2cSJim Jagielski 			if(mpItemSet)
227*b1cdbd2cSJim Jagielski 			{
228*b1cdbd2cSJim Jagielski 				ScaleItemSet(*mpItemSet, rScale);
229*b1cdbd2cSJim Jagielski 			}
230*b1cdbd2cSJim Jagielski 		}
231*b1cdbd2cSJim Jagielski 	} // end of namespace properties
232*b1cdbd2cSJim Jagielski } // end of namespace sdr
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
235*b1cdbd2cSJim Jagielski // eof
236