1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: itemprop.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svtools.hxx"
34 #include <svtools/itemprop.hxx>
35 #include <svtools/itempool.hxx>
36 #include <svtools/itemset.hxx>
37 #include <com/sun/star/beans/PropertyAttribute.hpp>
39 /*************************************************************************
40 UNO III Implementation
41 *************************************************************************/
42 using namespace com::sun::star
;
43 using namespace com::sun::star::beans
;
44 using namespace com::sun::star::lang
;
45 using namespace com::sun::star::uno
;
46 using namespace ::rtl
;
47 /*-- 16.02.2009 10:03:55---------------------------------------------------
49 -----------------------------------------------------------------------*/
53 bool operator()(const ::rtl::OUString
& r1
, const ::rtl::OUString
& r2
) const
55 return r1
.equals( r2
);
59 typedef ::std::hash_map
< ::rtl::OUString
,
60 SfxItemPropertySimpleEntry
,
62 equalOUString
> SfxItemPropertyHashMap_t
;
64 class SfxItemPropertyMap_Impl
: public SfxItemPropertyHashMap_t
67 mutable uno::Sequence
< beans::Property
> m_aPropSeq
;
69 SfxItemPropertyMap_Impl(){}
70 SfxItemPropertyMap_Impl( const SfxItemPropertyMap_Impl
* pSource
);
72 SfxItemPropertyMap_Impl::SfxItemPropertyMap_Impl( const SfxItemPropertyMap_Impl
* pSource
)
74 this->SfxItemPropertyHashMap_t::operator=( *pSource
);
75 m_aPropSeq
= pSource
->m_aPropSeq
;
78 /*-- 16.02.2009 10:03:51---------------------------------------------------
80 -----------------------------------------------------------------------*/
81 SfxItemPropertyMap::SfxItemPropertyMap( const SfxItemPropertyMapEntry
* pEntries
) :
82 m_pImpl( new SfxItemPropertyMap_Impl
)
84 while( pEntries
->pName
)
86 ::rtl::OUString
sEntry(pEntries
->pName
, pEntries
->nNameLen
, RTL_TEXTENCODING_ASCII_US
);
87 (*m_pImpl
) [ sEntry
] = pEntries
;
91 /*-- 16.02.2009 12:46:41---------------------------------------------------
93 -----------------------------------------------------------------------*/
94 SfxItemPropertyMap::SfxItemPropertyMap( const SfxItemPropertyMap
* pSource
) :
95 m_pImpl( new SfxItemPropertyMap_Impl( pSource
->m_pImpl
) )
98 /*-- 16.02.2009 10:03:51---------------------------------------------------
100 -----------------------------------------------------------------------*/
101 SfxItemPropertyMap::~SfxItemPropertyMap()
105 /*-- 16.02.2009 10:03:51---------------------------------------------------
107 -----------------------------------------------------------------------*/
108 const SfxItemPropertySimpleEntry
* SfxItemPropertyMap::getByName( const ::rtl::OUString
&rName
) const
110 SfxItemPropertyHashMap_t::const_iterator aIter
= m_pImpl
->find(rName
);
111 if( aIter
== m_pImpl
->end() )
113 return &aIter
->second
;
116 /*-- 16.02.2009 10:44:24---------------------------------------------------
118 -----------------------------------------------------------------------*/
119 uno::Sequence
<beans::Property
> SfxItemPropertyMap::getProperties() const
121 if( !m_pImpl
->m_aPropSeq
.getLength() )
123 m_pImpl
->m_aPropSeq
.realloc( m_pImpl
->size() );
124 beans::Property
* pPropArray
= m_pImpl
->m_aPropSeq
.getArray();
126 SfxItemPropertyHashMap_t::const_iterator aIt
= m_pImpl
->begin();
127 while( aIt
!= m_pImpl
->end() )
128 //for ( const SfxItemPropertyMap *pMap = _pMap; pMap->pName; ++pMap )
130 const SfxItemPropertySimpleEntry
* pEntry
= &(*aIt
).second
;
131 pPropArray
[n
].Name
= (*aIt
).first
;
132 pPropArray
[n
].Handle
= pEntry
->nWID
;
134 pPropArray
[n
].Type
= *pEntry
->pType
;
135 pPropArray
[n
].Attributes
=
136 sal::static_int_cast
< sal_Int16
>(pEntry
->nFlags
);
142 return m_pImpl
->m_aPropSeq
;
144 /*-- 16.02.2009 11:04:31---------------------------------------------------
146 -----------------------------------------------------------------------*/
147 beans::Property
SfxItemPropertyMap::getPropertyByName( const ::rtl::OUString rName
) const
148 throw( beans::UnknownPropertyException
)
150 SfxItemPropertyHashMap_t::const_iterator aIter
= m_pImpl
->find(rName
);
151 if( aIter
== m_pImpl
->end() )
152 throw UnknownPropertyException();
153 const SfxItemPropertySimpleEntry
* pEntry
= &aIter
->second
;
154 beans::Property aProp
;
156 aProp
.Handle
= pEntry
->nWID
;
158 aProp
.Type
= *pEntry
->pType
;
159 aProp
.Attributes
= sal::static_int_cast
< sal_Int16
>(pEntry
->nFlags
);
162 /*-- 16.02.2009 11:09:16---------------------------------------------------
164 -----------------------------------------------------------------------*/
165 sal_Bool
SfxItemPropertyMap::hasPropertyByName( const ::rtl::OUString
& rName
) const
167 SfxItemPropertyHashMap_t::const_iterator aIter
= m_pImpl
->find(rName
);
168 return aIter
!= m_pImpl
->end();
170 /*-- 16.02.2009 11:25:14---------------------------------------------------
172 -----------------------------------------------------------------------*/
173 void SfxItemPropertyMap::mergeProperties( const uno::Sequence
< beans::Property
>& rPropSeq
)
175 const beans::Property
* pPropArray
= rPropSeq
.getConstArray();
176 sal_uInt32 nElements
= rPropSeq
.getLength();
177 for( sal_uInt32 nElement
= 0; nElement
< nElements
; ++nElement
)
179 SfxItemPropertySimpleEntry
aTemp(
180 sal::static_int_cast
< sal_Int16
>( pPropArray
[nElement
].Handle
), //nWID
181 &pPropArray
[nElement
].Type
, //pType
182 pPropArray
[nElement
].Attributes
, //nFlags
184 (*m_pImpl
)[pPropArray
[nElement
].Name
] = aTemp
;
187 /*-- 18.02.2009 12:04:42---------------------------------------------------
189 -----------------------------------------------------------------------*/
190 PropertyEntryVector_t
SfxItemPropertyMap::getPropertyEntries() const
192 PropertyEntryVector_t aRet
;
193 aRet
.reserve(m_pImpl
->size());
195 SfxItemPropertyHashMap_t::const_iterator aIt
= m_pImpl
->begin();
196 while( aIt
!= m_pImpl
->end() )
198 const SfxItemPropertySimpleEntry
* pEntry
= &(*aIt
).second
;
199 aRet
.push_back( SfxItemPropertyNamedEntry( (*aIt
).first
, * pEntry
) );
204 /*-- 18.02.2009 15:11:06---------------------------------------------------
206 -----------------------------------------------------------------------*/
207 sal_uInt32
SfxItemPropertyMap::getSize() const
209 return m_pImpl
->size();
211 /*-- 16.02.2009 13:44:54---------------------------------------------------
213 -----------------------------------------------------------------------*/
214 SfxItemPropertySet::~SfxItemPropertySet()
217 /* -----------------------------21.02.00 11:26--------------------------------
219 ---------------------------------------------------------------------------*/
220 BOOL
SfxItemPropertySet::FillItem(SfxItemSet
&, USHORT
, BOOL
) const
224 /* -----------------------------06.06.01 12:32--------------------------------
226 ---------------------------------------------------------------------------*/
227 void SfxItemPropertySet::getPropertyValue( const SfxItemPropertySimpleEntry
& rEntry
,
228 const SfxItemSet
& rSet
, Any
& rAny
) const
229 throw(RuntimeException
)
231 // get the SfxPoolItem
232 const SfxPoolItem
* pItem
= 0;
233 SfxItemState eState
= rSet
.GetItemState( rEntry
.nWID
, TRUE
, &pItem
);
234 if(SFX_ITEM_SET
!= eState
&& SFX_WHICH_MAX
> rEntry
.nWID
)
235 pItem
= &rSet
.GetPool()->GetDefaultItem(rEntry
.nWID
);
236 // return item values as uno::Any
237 if(eState
>= SFX_ITEM_DEFAULT
&& pItem
)
239 pItem
->QueryValue( rAny
, rEntry
.nMemberId
);
243 SfxItemSet
aSet(*rSet
.GetPool(), rEntry
.nWID
, rEntry
.nWID
);
244 if(FillItem(aSet
, rEntry
.nWID
, TRUE
))
246 const SfxPoolItem
& rItem
= aSet
.Get(rEntry
.nWID
);
247 rItem
.QueryValue( rAny
, rEntry
.nMemberId
);
249 else if(0 == (rEntry
.nFlags
& PropertyAttribute::MAYBEVOID
))
250 throw RuntimeException();
254 // convert general SfxEnumItem values to specific values
255 if( rEntry
.pType
&& TypeClass_ENUM
== rEntry
.pType
->getTypeClass() &&
256 rAny
.getValueTypeClass() == TypeClass_LONG
)
258 INT32 nTmp
= *(INT32
*)rAny
.getValue();
259 rAny
.setValue( &nTmp
, *rEntry
.pType
);
262 /* -----------------------------06.06.01 12:32--------------------------------
264 ---------------------------------------------------------------------------*/
265 void SfxItemPropertySet::getPropertyValue( const OUString
&rName
,
266 const SfxItemSet
& rSet
, Any
& rAny
) const
267 throw(RuntimeException
, UnknownPropertyException
)
270 const SfxItemPropertySimpleEntry
* pEntry
= m_aMap
.getByName( rName
);
272 throw UnknownPropertyException();
273 getPropertyValue( *pEntry
,rSet
, rAny
);
275 /* -----------------------------21.02.00 11:26--------------------------------
277 ---------------------------------------------------------------------------*/
278 Any
SfxItemPropertySet::getPropertyValue( const OUString
&rName
,
279 const SfxItemSet
& rSet
) const
280 throw(RuntimeException
, UnknownPropertyException
)
283 getPropertyValue( rName
,rSet
, aVal
);
286 /* -----------------------------15.11.00 14:46--------------------------------
288 ---------------------------------------------------------------------------*/
289 void SfxItemPropertySet::setPropertyValue( const SfxItemPropertySimpleEntry
& rEntry
,
291 SfxItemSet
& rSet
) const
292 throw(RuntimeException
,
293 IllegalArgumentException
)
295 // get the SfxPoolItem
296 const SfxPoolItem
* pItem
= 0;
297 SfxPoolItem
*pNewItem
= 0;
298 SfxItemState eState
= rSet
.GetItemState( rEntry
.nWID
, TRUE
, &pItem
);
299 if(SFX_ITEM_SET
!= eState
&& SFX_WHICH_MAX
> rEntry
.nWID
)
300 pItem
= &rSet
.GetPool()->GetDefaultItem(rEntry
.nWID
);
301 //maybe there's another way to find an Item
302 if(eState
< SFX_ITEM_DEFAULT
)
304 SfxItemSet
aSet(*rSet
.GetPool(), rEntry
.nWID
, rEntry
.nWID
);
305 if(FillItem(aSet
, rEntry
.nWID
, FALSE
))
307 const SfxPoolItem
&rItem
= aSet
.Get(rEntry
.nWID
);
308 pNewItem
= rItem
.Clone();
311 if(!pNewItem
&& pItem
)
313 pNewItem
= pItem
->Clone();
317 if( !pNewItem
->PutValue( aVal
, rEntry
.nMemberId
) )
320 throw IllegalArgumentException();
323 rSet
.Put( *pNewItem
, rEntry
.nWID
);
327 /* -----------------------------21.02.00 11:26--------------------------------
329 ---------------------------------------------------------------------------*/
330 void SfxItemPropertySet::setPropertyValue( const OUString
&rName
,
332 SfxItemSet
& rSet
) const
333 throw(RuntimeException
,
334 IllegalArgumentException
,
335 UnknownPropertyException
)
337 const SfxItemPropertySimpleEntry
* pEntry
= m_aMap
.getByName( rName
);
340 throw UnknownPropertyException();
342 setPropertyValue(*pEntry
, aVal
, rSet
);
344 /* -----------------------------21.02.00 11:26--------------------------------
346 ---------------------------------------------------------------------------*/
347 PropertyState
SfxItemPropertySet::getPropertyState(const SfxItemPropertySimpleEntry
& rEntry
, const SfxItemSet
& rSet
) const
350 PropertyState eRet
= PropertyState_DIRECT_VALUE
;
351 USHORT nWhich
= rEntry
.nWID
;
354 SfxItemState eState
= rSet
.GetItemState( nWhich
, FALSE
);
355 // item-Wert als UnoAny zurueckgeben
356 if(eState
== SFX_ITEM_DEFAULT
)
357 eRet
= PropertyState_DEFAULT_VALUE
;
358 else if(eState
< SFX_ITEM_DEFAULT
)
359 eRet
= PropertyState_AMBIGUOUS_VALUE
;
362 PropertyState
SfxItemPropertySet::getPropertyState(
363 const OUString
& rName
, const SfxItemSet
& rSet
) const
364 throw(UnknownPropertyException
)
366 PropertyState eRet
= PropertyState_DIRECT_VALUE
;
368 // which-id ermitteln
369 const SfxItemPropertySimpleEntry
* pEntry
= m_aMap
.getByName( rName
);
370 if( !pEntry
|| !pEntry
->nWID
)
372 throw UnknownPropertyException();
374 USHORT nWhich
= pEntry
->nWID
;
377 const SfxPoolItem
* pItem
= 0;
378 SfxItemState eState
= rSet
.GetItemState( nWhich
, FALSE
, &pItem
);
379 if(!pItem
&& nWhich
!= rSet
.GetPool()->GetSlotId(nWhich
))
380 pItem
= &rSet
.GetPool()->GetDefaultItem(nWhich
);
381 // item-Wert als UnoAny zurueckgeben
382 if(eState
== SFX_ITEM_DEFAULT
)
383 eRet
= PropertyState_DEFAULT_VALUE
;
384 else if(eState
< SFX_ITEM_DEFAULT
)
385 eRet
= PropertyState_AMBIGUOUS_VALUE
;
388 /* -----------------------------21.02.00 11:26--------------------------------
390 ---------------------------------------------------------------------------*/
391 Reference
<XPropertySetInfo
>
392 SfxItemPropertySet::getPropertySetInfo() const
395 m_xInfo
= new SfxItemPropertySetInfo( &m_aMap
);
398 /*-- 16.02.2009 13:49:25---------------------------------------------------
400 -----------------------------------------------------------------------*/
401 struct SfxItemPropertySetInfo_Impl
403 SfxItemPropertyMap
* m_pOwnMap
;
405 /*-- 16.02.2009 13:49:24---------------------------------------------------
407 -----------------------------------------------------------------------*/
408 SfxItemPropertySetInfo::SfxItemPropertySetInfo(const SfxItemPropertyMap
*pMap
) :
409 m_pImpl( new SfxItemPropertySetInfo_Impl
)
411 m_pImpl
->m_pOwnMap
= new SfxItemPropertyMap( pMap
);
413 /*-- 16.02.2009 13:49:25---------------------------------------------------
415 -----------------------------------------------------------------------*/
416 SfxItemPropertySetInfo::SfxItemPropertySetInfo(const SfxItemPropertyMapEntry
*pEntries
) :
417 m_pImpl( new SfxItemPropertySetInfo_Impl
)
419 m_pImpl
->m_pOwnMap
= new SfxItemPropertyMap( pEntries
);
421 /* -----------------------------21.02.00 11:09--------------------------------
423 ---------------------------------------------------------------------------*/
424 Sequence
< Property
> SAL_CALL
425 SfxItemPropertySetInfo::getProperties( )
426 throw(RuntimeException
)
428 return m_pImpl
->m_pOwnMap
->getProperties();
430 /*-- 16.02.2009 13:49:27---------------------------------------------------
432 -----------------------------------------------------------------------*/
433 const SfxItemPropertyMap
* SfxItemPropertySetInfo::getMap() const
435 return m_pImpl
->m_pOwnMap
;
438 /*-- 16.02.2009 12:43:36---------------------------------------------------
440 -----------------------------------------------------------------------*/
441 SfxItemPropertySetInfo::~SfxItemPropertySetInfo()
443 delete m_pImpl
->m_pOwnMap
;
446 /* -----------------------------21.02.00 11:27--------------------------------
448 ---------------------------------------------------------------------------*/
450 SfxItemPropertySetInfo::getPropertyByName( const ::rtl::OUString
& rName
)
451 throw(UnknownPropertyException
, RuntimeException
)
453 return m_pImpl
->m_pOwnMap
->getPropertyByName( rName
);
455 /* -----------------------------21.02.00 11:28--------------------------------
457 ---------------------------------------------------------------------------*/
459 SfxItemPropertySetInfo::hasPropertyByName( const ::rtl::OUString
& rName
)
460 throw(RuntimeException
)
462 return m_pImpl
->m_pOwnMap
->hasPropertyByName( rName
);
464 /* -----------------------------21.02.00 12:03--------------------------------
466 ---------------------------------------------------------------------------*/
467 SfxExtItemPropertySetInfo::SfxExtItemPropertySetInfo(
468 const SfxItemPropertyMapEntry
*pMap
,
469 const Sequence
<Property
>& rPropSeq
) :
472 aExtMap
.mergeProperties( rPropSeq
);
474 /*-- 16.02.2009 12:06:49---------------------------------------------------
476 -----------------------------------------------------------------------*/
477 SfxExtItemPropertySetInfo::~SfxExtItemPropertySetInfo()
480 /* -----------------------------21.02.00 12:03--------------------------------
482 ---------------------------------------------------------------------------*/
483 Sequence
< Property
> SAL_CALL
484 SfxExtItemPropertySetInfo::getProperties( ) throw(RuntimeException
)
486 return aExtMap
.getProperties();
488 /* -----------------------------21.02.00 12:03--------------------------------
490 ---------------------------------------------------------------------------*/
492 SfxExtItemPropertySetInfo::getPropertyByName( const OUString
& rPropertyName
)
493 throw(UnknownPropertyException
, RuntimeException
)
495 return aExtMap
.getPropertyByName( rPropertyName
);
497 /* -----------------------------21.02.00 12:03--------------------------------
499 ---------------------------------------------------------------------------*/
501 SfxExtItemPropertySetInfo::hasPropertyByName( const OUString
& rPropertyName
)
502 throw(RuntimeException
)
504 return aExtMap
.hasPropertyByName( rPropertyName
);