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