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_toolkit.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <toolkit/helper/unopropertyarrayhelper.hxx>
28*b1cdbd2cSJim Jagielski #include <toolkit/helper/property.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski //	----------------------------------------------------
31*b1cdbd2cSJim Jagielski //	class UnoPropertyArrayHelper
32*b1cdbd2cSJim Jagielski //	----------------------------------------------------
33*b1cdbd2cSJim Jagielski 
UnoPropertyArrayHelper(const::com::sun::star::uno::Sequence<sal_Int32> & rIDs)34*b1cdbd2cSJim Jagielski UnoPropertyArrayHelper::UnoPropertyArrayHelper( const ::com::sun::star::uno::Sequence<sal_Int32>& rIDs )
35*b1cdbd2cSJim Jagielski {
36*b1cdbd2cSJim Jagielski 	sal_Int32 nIDs = rIDs.getLength();
37*b1cdbd2cSJim Jagielski 	const sal_Int32* pIDs = rIDs.getConstArray();
38*b1cdbd2cSJim Jagielski 	for ( sal_Int32 n = 0; n < nIDs; n++ )
39*b1cdbd2cSJim Jagielski 		maIDs.Insert( pIDs[n], (void*)1L );
40*b1cdbd2cSJim Jagielski }
41*b1cdbd2cSJim Jagielski 
UnoPropertyArrayHelper(const std::list<sal_uInt16> & rIDs)42*b1cdbd2cSJim Jagielski UnoPropertyArrayHelper::UnoPropertyArrayHelper( const std::list< sal_uInt16 > &rIDs )
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski     std::list< sal_uInt16 >::const_iterator iter;
45*b1cdbd2cSJim Jagielski     for( iter = rIDs.begin(); iter != rIDs.end(); iter++)
46*b1cdbd2cSJim Jagielski 	  maIDs.Insert( *iter, (void*)1L);
47*b1cdbd2cSJim Jagielski }
48*b1cdbd2cSJim Jagielski 
ImplHasProperty(sal_uInt16 nPropId) const49*b1cdbd2cSJim Jagielski sal_Bool UnoPropertyArrayHelper::ImplHasProperty( sal_uInt16 nPropId ) const
50*b1cdbd2cSJim Jagielski {
51*b1cdbd2cSJim Jagielski 	if ( ( nPropId >= BASEPROPERTY_FONTDESCRIPTORPART_START ) && ( nPropId <= BASEPROPERTY_FONTDESCRIPTORPART_END ) )
52*b1cdbd2cSJim Jagielski 		nPropId = BASEPROPERTY_FONTDESCRIPTOR;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski 	return maIDs.Get( nPropId ) ? sal_True : sal_False;
55*b1cdbd2cSJim Jagielski }
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski // ::cppu::IPropertyArrayHelper
fillPropertyMembersByHandle(::rtl::OUString * pPropName,sal_Int16 * pAttributes,sal_Int32 nPropId)58*b1cdbd2cSJim Jagielski sal_Bool UnoPropertyArrayHelper::fillPropertyMembersByHandle( ::rtl::OUString * pPropName, sal_Int16 * pAttributes, sal_Int32 nPropId )
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski     sal_uInt16 id = sal::static_int_cast< sal_uInt16 >(nPropId);
61*b1cdbd2cSJim Jagielski 	sal_Bool bValid = ImplHasProperty( id );
62*b1cdbd2cSJim Jagielski 	if ( bValid )
63*b1cdbd2cSJim Jagielski 	{
64*b1cdbd2cSJim Jagielski 		if ( pPropName )
65*b1cdbd2cSJim Jagielski 			*pPropName = GetPropertyName( id );
66*b1cdbd2cSJim Jagielski 		if ( pAttributes )
67*b1cdbd2cSJim Jagielski 			*pAttributes = GetPropertyAttribs( id );
68*b1cdbd2cSJim Jagielski 	}
69*b1cdbd2cSJim Jagielski 	return bValid;
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski 
getProperties()72*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > UnoPropertyArrayHelper::getProperties()
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 	// Sortiert nach Namen...
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 	Table aSortedPropsIds;
77*b1cdbd2cSJim Jagielski 	sal_uInt32 nProps = maIDs.Count();
78*b1cdbd2cSJim Jagielski 	for ( sal_uInt32 s = 0; s < nProps; s++ )
79*b1cdbd2cSJim Jagielski 	{
80*b1cdbd2cSJim Jagielski 		sal_uInt16 nId = sal::static_int_cast< sal_uInt16 >(
81*b1cdbd2cSJim Jagielski             maIDs.GetObjectKey( s ));
82*b1cdbd2cSJim Jagielski 		aSortedPropsIds.Insert( 1+GetPropertyOrderNr( nId ), (void*)(sal_uInt32)nId );
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 		if ( nId == BASEPROPERTY_FONTDESCRIPTOR )
85*b1cdbd2cSJim Jagielski 		{
86*b1cdbd2cSJim Jagielski 			// Einzelproperties...
87*b1cdbd2cSJim Jagielski 			for ( sal_uInt16 i = BASEPROPERTY_FONTDESCRIPTORPART_START; i <= BASEPROPERTY_FONTDESCRIPTORPART_END; i++ )
88*b1cdbd2cSJim Jagielski 				aSortedPropsIds.Insert( 1+GetPropertyOrderNr( i ), (void*)(sal_uInt32)i );
89*b1cdbd2cSJim Jagielski 		}
90*b1cdbd2cSJim Jagielski 	}
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	nProps = aSortedPropsIds.Count();	// koennen jetzt mehr sein
93*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property> aProps( nProps );
94*b1cdbd2cSJim Jagielski 	::com::sun::star::beans::Property* pProps = aProps.getArray();
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 	for ( sal_uInt32 n = 0; n < nProps; n++ )
97*b1cdbd2cSJim Jagielski 	{
98*b1cdbd2cSJim Jagielski 		sal_uInt16 nId = (sal_uInt16)(sal_uLong)aSortedPropsIds.GetObject( n );
99*b1cdbd2cSJim Jagielski 		pProps[n].Name = GetPropertyName( nId );
100*b1cdbd2cSJim Jagielski 		pProps[n].Handle = nId;
101*b1cdbd2cSJim Jagielski 		pProps[n].Type = *GetPropertyType( nId );
102*b1cdbd2cSJim Jagielski 		pProps[n].Attributes = GetPropertyAttribs( nId );
103*b1cdbd2cSJim Jagielski 	}
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski 	return aProps;
106*b1cdbd2cSJim Jagielski }
107*b1cdbd2cSJim Jagielski 
getPropertyByName(const::rtl::OUString & rPropertyName)108*b1cdbd2cSJim Jagielski ::com::sun::star::beans::Property UnoPropertyArrayHelper::getPropertyByName(const ::rtl::OUString& rPropertyName) throw (::com::sun::star::beans::UnknownPropertyException)
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski 	::com::sun::star::beans::Property aProp;
111*b1cdbd2cSJim Jagielski 	sal_uInt16 nId = GetPropertyId( rPropertyName );
112*b1cdbd2cSJim Jagielski 	if ( ImplHasProperty( nId ) )
113*b1cdbd2cSJim Jagielski 	{
114*b1cdbd2cSJim Jagielski 		aProp.Name = rPropertyName;
115*b1cdbd2cSJim Jagielski 		aProp.Handle = -1;
116*b1cdbd2cSJim Jagielski 		aProp.Type = *GetPropertyType( nId );
117*b1cdbd2cSJim Jagielski 		aProp.Attributes = GetPropertyAttribs( nId );
118*b1cdbd2cSJim Jagielski 	}
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 	return aProp;
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
hasPropertyByName(const::rtl::OUString & rPropertyName)123*b1cdbd2cSJim Jagielski sal_Bool UnoPropertyArrayHelper::hasPropertyByName(const ::rtl::OUString& rPropertyName)
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski 	return ImplHasProperty( GetPropertyId( rPropertyName ) );
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
getHandleByName(const::rtl::OUString & rPropertyName)128*b1cdbd2cSJim Jagielski sal_Int32 UnoPropertyArrayHelper::getHandleByName( const ::rtl::OUString & rPropertyName )
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski 	sal_Int32 nId = (sal_Int32 ) GetPropertyId( rPropertyName );
131*b1cdbd2cSJim Jagielski 	return nId ? nId : (-1);
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
fillHandles(sal_Int32 * pHandles,const::com::sun::star::uno::Sequence<::rtl::OUString> & rPropNames)134*b1cdbd2cSJim Jagielski sal_Int32 UnoPropertyArrayHelper::fillHandles( sal_Int32* pHandles, const ::com::sun::star::uno::Sequence< ::rtl::OUString > & rPropNames )
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	const ::rtl::OUString* pNames = rPropNames.getConstArray();
137*b1cdbd2cSJim Jagielski 	sal_Int32 nValues = rPropNames.getLength();
138*b1cdbd2cSJim Jagielski 	sal_Int32 nValidHandles = 0;
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 	for ( sal_Int32 n = 0; n < nValues; n++ )
141*b1cdbd2cSJim Jagielski 	{
142*b1cdbd2cSJim Jagielski 		sal_uInt16 nPropId = GetPropertyId( pNames[n] );
143*b1cdbd2cSJim Jagielski 		if ( nPropId && ImplHasProperty( nPropId ) )
144*b1cdbd2cSJim Jagielski 		{
145*b1cdbd2cSJim Jagielski 			pHandles[n] = nPropId;
146*b1cdbd2cSJim Jagielski 			nValidHandles++;
147*b1cdbd2cSJim Jagielski 		}
148*b1cdbd2cSJim Jagielski 		else
149*b1cdbd2cSJim Jagielski 		{
150*b1cdbd2cSJim Jagielski 			pHandles[n] = -1;
151*b1cdbd2cSJim Jagielski 		}
152*b1cdbd2cSJim Jagielski 	}
153*b1cdbd2cSJim Jagielski 	return nValidHandles;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 
157