xref: /AOO41X/main/svx/source/sdr/properties/properties.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir #include <svx/sdr/properties/properties.hxx>
31*cdf0e10cSrcweir #include <svx/sdr/properties/itemsettools.hxx>
32*cdf0e10cSrcweir #include <svl/itemset.hxx>
33*cdf0e10cSrcweir #include <svx/svdogrp.hxx>
34*cdf0e10cSrcweir #include <svx/svditer.hxx>
35*cdf0e10cSrcweir #include <svx/xfillit0.hxx>
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir namespace sdr
40*cdf0e10cSrcweir {
41*cdf0e10cSrcweir 	namespace properties
42*cdf0e10cSrcweir 	{
43*cdf0e10cSrcweir 		BaseProperties::BaseProperties(SdrObject& rObj)
44*cdf0e10cSrcweir 		:	mrObject(rObj)
45*cdf0e10cSrcweir 		{
46*cdf0e10cSrcweir 		}
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir 		BaseProperties::BaseProperties(const BaseProperties& /*rProps*/, SdrObject& rObj)
49*cdf0e10cSrcweir 		:	mrObject(rObj)
50*cdf0e10cSrcweir 		{
51*cdf0e10cSrcweir 		}
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir 		BaseProperties::~BaseProperties()
54*cdf0e10cSrcweir 		{
55*cdf0e10cSrcweir 		}
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir 		const SfxItemSet& BaseProperties::GetMergedItemSet() const
58*cdf0e10cSrcweir 		{
59*cdf0e10cSrcweir 			// default implementation falls back to GetObjectItemSet()
60*cdf0e10cSrcweir 			return GetObjectItemSet();
61*cdf0e10cSrcweir 		}
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 		void BaseProperties::SetMergedItemSet(const SfxItemSet& rSet, sal_Bool bClearAllItems)
64*cdf0e10cSrcweir 		{
65*cdf0e10cSrcweir 			// clear items if requested
66*cdf0e10cSrcweir 			if(bClearAllItems)
67*cdf0e10cSrcweir 			{
68*cdf0e10cSrcweir 				ClearObjectItem();
69*cdf0e10cSrcweir 			}
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir 			// default implementation falls back to SetObjectItemSet()
72*cdf0e10cSrcweir 			SetObjectItemSet(rSet);
73*cdf0e10cSrcweir 		}
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir 		void BaseProperties::SetMergedItem(const SfxPoolItem& rItem)
76*cdf0e10cSrcweir 		{
77*cdf0e10cSrcweir 			// default implementation falls back to SetObjectItem()
78*cdf0e10cSrcweir 			SetObjectItem(rItem);
79*cdf0e10cSrcweir 		}
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir 		void BaseProperties::ClearMergedItem(const sal_uInt16 nWhich)
82*cdf0e10cSrcweir 		{
83*cdf0e10cSrcweir 			// default implementation falls back to ClearObjectItem()
84*cdf0e10cSrcweir 			ClearObjectItem(nWhich);
85*cdf0e10cSrcweir 		}
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir 		void BaseProperties::Scale(const Fraction& /*rScale*/)
88*cdf0e10cSrcweir 		{
89*cdf0e10cSrcweir 			// default implementation does nothing; overload where
90*cdf0e10cSrcweir 			// an ItemSet is implemented.
91*cdf0e10cSrcweir 		}
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir 		void BaseProperties::MoveToItemPool(SfxItemPool* /*pSrcPool*/, SfxItemPool* /*pDestPool*/, SdrModel* /*pNewModel*/)
94*cdf0e10cSrcweir 		{
95*cdf0e10cSrcweir 			// Move properties to a new ItemPool. Default implementation does nothing.
96*cdf0e10cSrcweir 			// Overload where an ItemSet is implemented.
97*cdf0e10cSrcweir 		}
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 		void BaseProperties::SetModel(SdrModel* /*pOldModel*/, SdrModel* /*pNewModel*/)
100*cdf0e10cSrcweir 		{
101*cdf0e10cSrcweir 			// Set new model. Default implementation does nothing.
102*cdf0e10cSrcweir 			// Overload where an ItemSet is implemented.
103*cdf0e10cSrcweir 		}
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir 		void BaseProperties::ForceStyleToHardAttributes()
106*cdf0e10cSrcweir 		{
107*cdf0e10cSrcweir 			// force all attributes which come from styles to hard attributes
108*cdf0e10cSrcweir 			// to be able to live without the style. Default implementation does nothing.
109*cdf0e10cSrcweir 			// Overload where an ItemSet is implemented.
110*cdf0e10cSrcweir 		}
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir 		//void BaseProperties::SetItemAndBroadcast(const SfxPoolItem& rItem)
113*cdf0e10cSrcweir 		//{
114*cdf0e10cSrcweir 		//	ItemChangeBroadcaster aC(GetSdrObject());
115*cdf0e10cSrcweir 		//	SetObjectItem(rItem);
116*cdf0e10cSrcweir 		//	BroadcastItemChange(aC);
117*cdf0e10cSrcweir 		//}
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir 		//void BaseProperties::ClearItemAndBroadcast(const sal_uInt16 nWhich)
120*cdf0e10cSrcweir 		//{
121*cdf0e10cSrcweir 		//	ItemChangeBroadcaster aC(GetSdrObject());
122*cdf0e10cSrcweir 		//	ClearObjectItem(nWhich);
123*cdf0e10cSrcweir 		//	BroadcastItemChange(aC);
124*cdf0e10cSrcweir 		//}
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir 		void BaseProperties::SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, sal_Bool bClearAllItems)
127*cdf0e10cSrcweir 		{
128*cdf0e10cSrcweir 			ItemChangeBroadcaster aC(GetSdrObject());
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir 			if(bClearAllItems)
131*cdf0e10cSrcweir 			{
132*cdf0e10cSrcweir 				ClearObjectItem();
133*cdf0e10cSrcweir 			}
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir 			SetMergedItemSet(rSet);
136*cdf0e10cSrcweir 			BroadcastItemChange(aC);
137*cdf0e10cSrcweir 		}
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir 		const SfxPoolItem& BaseProperties::GetItem(const sal_uInt16 nWhich) const
140*cdf0e10cSrcweir 		{
141*cdf0e10cSrcweir 			return GetObjectItemSet().Get(nWhich);
142*cdf0e10cSrcweir 		}
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir 		void BaseProperties::BroadcastItemChange(const ItemChangeBroadcaster& rChange)
145*cdf0e10cSrcweir 		{
146*cdf0e10cSrcweir 			const sal_uInt32 nCount(rChange.GetRectangleCount());
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir 			// #110094#-14 Reduce to do only second change
149*cdf0e10cSrcweir 			//// invalidate all remembered rectangles
150*cdf0e10cSrcweir 			//for(sal_uInt32 a(0); a < nCount; a++)
151*cdf0e10cSrcweir 			//{
152*cdf0e10cSrcweir 			//	GetSdrObject().BroadcastObjectChange(rChange.GetRectangle(a));
153*cdf0e10cSrcweir 			//}
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir 			// invalidate all new rectangles
156*cdf0e10cSrcweir 			if(GetSdrObject().ISA(SdrObjGroup))
157*cdf0e10cSrcweir 			{
158*cdf0e10cSrcweir 				SdrObjListIter aIter((SdrObjGroup&)GetSdrObject(), IM_DEEPNOGROUPS);
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir 				while(aIter.IsMore())
161*cdf0e10cSrcweir 				{
162*cdf0e10cSrcweir 					SdrObject* pObj = aIter.Next();
163*cdf0e10cSrcweir 					// This is done with ItemSetChanged
164*cdf0e10cSrcweir 					// pObj->SetChanged();
165*cdf0e10cSrcweir 					pObj->BroadcastObjectChange();
166*cdf0e10cSrcweir 				}
167*cdf0e10cSrcweir 			}
168*cdf0e10cSrcweir 			else
169*cdf0e10cSrcweir 			{
170*cdf0e10cSrcweir 				// This is done with ItemSetChanged
171*cdf0e10cSrcweir 				// GetSdrObject().SetChanged();
172*cdf0e10cSrcweir 				GetSdrObject().BroadcastObjectChange();
173*cdf0e10cSrcweir 			}
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir 			// also send the user calls
176*cdf0e10cSrcweir 			for(sal_uInt32 a(0L); a < nCount; a++)
177*cdf0e10cSrcweir 			{
178*cdf0e10cSrcweir 				GetSdrObject().SendUserCall(SDRUSERCALL_CHGATTR, rChange.GetRectangle(a));
179*cdf0e10cSrcweir 			}
180*cdf0e10cSrcweir 		}
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir         sal_uInt32 BaseProperties::getVersion() const
183*cdf0e10cSrcweir         {
184*cdf0e10cSrcweir             return 0;
185*cdf0e10cSrcweir         }
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir 		void CleanupFillProperties( SfxItemSet& rItemSet )
188*cdf0e10cSrcweir 		{
189*cdf0e10cSrcweir 			const bool bFillBitmap = rItemSet.GetItemState(XATTR_FILLBITMAP, sal_False) == SFX_ITEM_SET;
190*cdf0e10cSrcweir 			const bool bFillGradient = rItemSet.GetItemState(XATTR_FILLGRADIENT, sal_False) == SFX_ITEM_SET;
191*cdf0e10cSrcweir 			const bool bFillHatch = rItemSet.GetItemState(XATTR_FILLHATCH, sal_False) == SFX_ITEM_SET;
192*cdf0e10cSrcweir 			if( bFillBitmap || bFillGradient || bFillHatch )
193*cdf0e10cSrcweir 			{
194*cdf0e10cSrcweir 				const XFillStyleItem* pFillStyleItem = dynamic_cast< const XFillStyleItem* >( rItemSet.GetItem(XATTR_FILLSTYLE) );
195*cdf0e10cSrcweir 				if( pFillStyleItem )
196*cdf0e10cSrcweir 				{
197*cdf0e10cSrcweir 					if( bFillBitmap && (pFillStyleItem->GetValue() != XFILL_BITMAP) )
198*cdf0e10cSrcweir 					{
199*cdf0e10cSrcweir 						rItemSet.ClearItem( XATTR_FILLBITMAP );
200*cdf0e10cSrcweir 					}
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir 					if( bFillGradient && (pFillStyleItem->GetValue() != XFILL_GRADIENT) )
203*cdf0e10cSrcweir 					{
204*cdf0e10cSrcweir 						rItemSet.ClearItem( XATTR_FILLGRADIENT );
205*cdf0e10cSrcweir 					}
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir 					if( bFillHatch && (pFillStyleItem->GetValue() != XFILL_HATCH) )
208*cdf0e10cSrcweir 					{
209*cdf0e10cSrcweir 						rItemSet.ClearItem( XATTR_FILLHATCH );
210*cdf0e10cSrcweir 					}
211*cdf0e10cSrcweir 				}
212*cdf0e10cSrcweir 			}
213*cdf0e10cSrcweir 		}
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir 	} // end of namespace properties
216*cdf0e10cSrcweir } // end of namespace sdr
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
219*cdf0e10cSrcweir // eof
220