xref: /trunk/main/svx/source/sdr/properties/defaultproperties.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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/defaultproperties.hxx>
31 #include <svx/sdr/properties/itemsettools.hxx>
32 #include <svl/itemset.hxx>
33 #include <svl/whiter.hxx>
34 
35 #include <vector>
36 #include <svx/svdobj.hxx>
37 #include <svx/svddef.hxx>
38 #include <svx/svdpool.hxx>
39 #include <editeng/eeitem.hxx>
40 
41 //////////////////////////////////////////////////////////////////////////////
42 
43 namespace sdr
44 {
45     namespace properties
46     {
47         SfxItemSet& DefaultProperties::CreateObjectSpecificItemSet(SfxItemPool& rPool)
48         {
49             // Basic implementation; Basic object has NO attributes
50             return *(new SfxItemSet(rPool));
51         }
52 
53         DefaultProperties::DefaultProperties(SdrObject& rObj)
54         :   BaseProperties(rObj),
55             mpItemSet(0L)
56         {
57         }
58 
59         DefaultProperties::DefaultProperties(const DefaultProperties& rProps, SdrObject& rObj)
60         :   BaseProperties(rObj),
61             mpItemSet(0L)
62         {
63             if(rProps.mpItemSet)
64             {
65                 mpItemSet = rProps.mpItemSet->Clone(sal_True);
66 
67                 // do not keep parent info, this may be changed by later construrtors.
68                 // This class just copies the ItemSet, ignore parent.
69                 if(mpItemSet && mpItemSet->GetParent())
70                 {
71                     mpItemSet->SetParent(0L);
72                 }
73             }
74         }
75 
76         BaseProperties& DefaultProperties::Clone(SdrObject& rObj) const
77         {
78             return *(new DefaultProperties(*this, rObj));
79         }
80 
81         DefaultProperties::~DefaultProperties()
82         {
83             if(mpItemSet)
84             {
85                 delete mpItemSet;
86                 mpItemSet = 0L;
87             }
88         }
89 
90         const SfxItemSet& DefaultProperties::GetObjectItemSet() const
91         {
92             if(!mpItemSet)
93             {
94                 ((DefaultProperties*)this)->mpItemSet = &(((DefaultProperties*)this)->CreateObjectSpecificItemSet(*GetSdrObject().GetObjectItemPool()));
95                 ((DefaultProperties*)this)->ForceDefaultAttributes();
96             }
97 
98             DBG_ASSERT(mpItemSet, "Could not create an SfxItemSet(!)");
99 
100             return *mpItemSet;
101         }
102 
103         void DefaultProperties::SetObjectItem(const SfxPoolItem& rItem)
104         {
105             const sal_uInt16 nWhichID(rItem.Which());
106 
107             if(AllowItemChange(nWhichID, &rItem))
108             {
109                 ItemChange(nWhichID, &rItem);
110                 PostItemChange(nWhichID);
111 
112                 SfxItemSet aSet(*GetSdrObject().GetObjectItemPool(), nWhichID, nWhichID);
113                 aSet.Put(rItem);
114                 ItemSetChanged(aSet);
115             }
116         }
117 
118         void DefaultProperties::SetObjectItemDirect(const SfxPoolItem& rItem)
119         {
120             const sal_uInt16 nWhichID(rItem.Which());
121 
122             if(AllowItemChange(nWhichID, &rItem))
123             {
124                 ItemChange(nWhichID, &rItem);
125             }
126         }
127 
128         void DefaultProperties::ClearObjectItem(const sal_uInt16 nWhich)
129         {
130             if(AllowItemChange(nWhich))
131             {
132                 ItemChange(nWhich);
133                 PostItemChange(nWhich);
134 
135                 if(nWhich)
136                 {
137                     SfxItemSet aSet(*GetSdrObject().GetObjectItemPool(), nWhich, nWhich, 0, 0);
138                     ItemSetChanged(aSet);
139                 }
140             }
141         }
142 
143         void DefaultProperties::ClearObjectItemDirect(const sal_uInt16 nWhich)
144         {
145             if(AllowItemChange(nWhich))
146             {
147                 ItemChange(nWhich);
148             }
149         }
150 
151         void DefaultProperties::SetObjectItemSet(const SfxItemSet& rSet)
152         {
153             SfxWhichIter aWhichIter(rSet);
154             sal_uInt16 nWhich(aWhichIter.FirstWhich());
155             const SfxPoolItem *pPoolItem;
156             std::vector< sal_uInt16 > aPostItemChangeList;
157             sal_Bool bDidChange(sal_False);
158             SfxItemSet aSet(*GetSdrObject().GetObjectItemPool(), SDRATTR_START, EE_ITEMS_END, 0, 0);
159 
160             // give a hint to STL_Vector
161             aPostItemChangeList.reserve(rSet.Count());
162 
163             while(nWhich)
164             {
165                 if(SFX_ITEM_SET == rSet.GetItemState(nWhich, sal_False, &pPoolItem))
166                 {
167                     if(AllowItemChange(nWhich, pPoolItem))
168                     {
169                         bDidChange = sal_True;
170                         ItemChange(nWhich, pPoolItem);
171                         aPostItemChangeList.push_back( nWhich );
172                         aSet.Put(*pPoolItem);
173                     }
174                 }
175 
176                 nWhich = aWhichIter.NextWhich();
177             }
178 
179             if(bDidChange)
180             {
181                 std::vector< sal_uInt16 >::iterator aIter = aPostItemChangeList.begin();
182                 const std::vector< sal_uInt16 >::iterator aEnd = aPostItemChangeList.end();
183 
184                 while(aIter != aEnd)
185                 {
186                     PostItemChange(*aIter);
187                     aIter++;
188                 }
189 
190                 ItemSetChanged(aSet);
191             }
192         }
193 
194         void DefaultProperties::ItemSetChanged(const SfxItemSet& /*rSet*/)
195         {
196         }
197 
198         sal_Bool DefaultProperties::AllowItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/) const
199         {
200             return sal_True;
201         }
202 
203         void DefaultProperties::ItemChange(const sal_uInt16 /*nWhich*/, const SfxPoolItem* /*pNewItem*/)
204         {
205         }
206 
207         void DefaultProperties::PostItemChange(const sal_uInt16 nWhich )
208         {
209             if( (nWhich == XATTR_FILLSTYLE) && (mpItemSet != NULL) )
210                 CleanupFillProperties(*mpItemSet);
211         }
212 
213         void DefaultProperties::SetStyleSheet(SfxStyleSheet* /*pNewStyleSheet*/, sal_Bool /*bDontRemoveHardAttr*/)
214         {
215             // no StyleSheet in DefaultProperties
216         }
217 
218         SfxStyleSheet* DefaultProperties::GetStyleSheet() const
219         {
220             // no StyleSheet in DefaultProperties
221             return 0L;
222         }
223 
224         void DefaultProperties::ForceDefaultAttributes()
225         {
226         }
227 
228         void DefaultProperties::Scale(const Fraction& rScale)
229         {
230             if(mpItemSet)
231             {
232                 ScaleItemSet(*mpItemSet, rScale);
233             }
234         }
235     } // end of namespace properties
236 } // end of namespace sdr
237 
238 //////////////////////////////////////////////////////////////////////////////
239 // eof
240