xref: /trunk/main/toolkit/source/controls/geometrycontrolmodel.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*b0724fc6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b0724fc6SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b0724fc6SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b0724fc6SAndrew Rist  * distributed with this work for additional information
6*b0724fc6SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b0724fc6SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b0724fc6SAndrew Rist  * "License"); you may not use this file except in compliance
9*b0724fc6SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*b0724fc6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*b0724fc6SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b0724fc6SAndrew Rist  * software distributed under the License is distributed on an
15*b0724fc6SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b0724fc6SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b0724fc6SAndrew Rist  * specific language governing permissions and limitations
18*b0724fc6SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*b0724fc6SAndrew Rist  *************************************************************/
21*b0724fc6SAndrew Rist 
22*b0724fc6SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_toolkit.hxx"
26cdf0e10cSrcweir #include "toolkit/controls/geometrycontrolmodel.hxx"
27cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
29cdf0e10cSrcweir #include <osl/diagnose.h>
30cdf0e10cSrcweir #include <rtl/instance.hxx>
31cdf0e10cSrcweir #include <comphelper/property.hxx>
32cdf0e10cSrcweir #include <comphelper/sequence.hxx>
33cdf0e10cSrcweir #ifndef _COM_SUN_STAR_XNAMECONTAINER_HPP_
34cdf0e10cSrcweir #include <toolkit/controls/eventcontainer.hxx>
35cdf0e10cSrcweir #endif
36cdf0e10cSrcweir #include <toolkit/helper/property.hxx>
37cdf0e10cSrcweir #include <tools/debug.hxx>
38cdf0e10cSrcweir #include <algorithm>
39cdf0e10cSrcweir #include <functional>
40cdf0e10cSrcweir #include <comphelper/sequence.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #define GCM_PROPERTY_ID_POS_X               1
44cdf0e10cSrcweir #define GCM_PROPERTY_ID_POS_Y               2
45cdf0e10cSrcweir #define GCM_PROPERTY_ID_WIDTH               3
46cdf0e10cSrcweir #define GCM_PROPERTY_ID_HEIGHT              4
47cdf0e10cSrcweir #define GCM_PROPERTY_ID_NAME                5
48cdf0e10cSrcweir #define GCM_PROPERTY_ID_TABINDEX            6
49cdf0e10cSrcweir #define GCM_PROPERTY_ID_STEP                7
50cdf0e10cSrcweir #define GCM_PROPERTY_ID_TAG                 8
51cdf0e10cSrcweir #define GCM_PROPERTY_ID_RESOURCERESOLVER    9
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #define GCM_PROPERTY_POS_X              ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PositionX"))
54cdf0e10cSrcweir #define GCM_PROPERTY_POS_Y              ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PositionY"))
55cdf0e10cSrcweir #define GCM_PROPERTY_WIDTH              ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Width"))
56cdf0e10cSrcweir #define GCM_PROPERTY_HEIGHT             ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Height"))
57cdf0e10cSrcweir #define GCM_PROPERTY_NAME               ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name"))
58cdf0e10cSrcweir #define GCM_PROPERTY_TABINDEX           ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TabIndex"))
59cdf0e10cSrcweir #define GCM_PROPERTY_STEP               ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Step"))
60cdf0e10cSrcweir #define GCM_PROPERTY_TAG                ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Tag"))
61cdf0e10cSrcweir #define GCM_PROPERTY_RESOURCERESOLVER   ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ResourceResolver"))
62cdf0e10cSrcweir 
63cdf0e10cSrcweir #define DEFAULT_ATTRIBS()       PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT
64cdf0e10cSrcweir 
65cdf0e10cSrcweir //........................................................................
66cdf0e10cSrcweir // namespace toolkit
67cdf0e10cSrcweir // {
68cdf0e10cSrcweir //........................................................................
69cdf0e10cSrcweir 
70cdf0e10cSrcweir     using namespace ::com::sun::star;
71cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
72cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
73cdf0e10cSrcweir     using namespace ::com::sun::star::beans;
74cdf0e10cSrcweir     using namespace ::com::sun::star::util;
75cdf0e10cSrcweir     using namespace ::com::sun::star::container;
76cdf0e10cSrcweir     using namespace ::comphelper;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     //====================================================================
79cdf0e10cSrcweir     //= OGeometryControlModel_Base
80cdf0e10cSrcweir     //====================================================================
81cdf0e10cSrcweir     //--------------------------------------------------------------------
OGeometryControlModel_Base(::com::sun::star::uno::XAggregation * _pAggregateInstance)82cdf0e10cSrcweir     OGeometryControlModel_Base::OGeometryControlModel_Base(::com::sun::star::uno::XAggregation* _pAggregateInstance)
83cdf0e10cSrcweir         :OPropertySetAggregationHelper( m_aBHelper )
84cdf0e10cSrcweir         ,OPropertyContainer( m_aBHelper )
85cdf0e10cSrcweir         ,OGCM_Base( m_aMutex )
86cdf0e10cSrcweir         ,m_nPosX(0)
87cdf0e10cSrcweir         ,m_nPosY(0)
88cdf0e10cSrcweir         ,m_nWidth(0)
89cdf0e10cSrcweir         ,m_nHeight(0)
90cdf0e10cSrcweir         ,m_nTabIndex(-1)
91cdf0e10cSrcweir         ,m_nStep(0)
92cdf0e10cSrcweir         ,m_bCloneable(sal_False)
93cdf0e10cSrcweir     {
94cdf0e10cSrcweir         OSL_ENSURE(NULL != _pAggregateInstance, "OGeometryControlModel_Base::OGeometryControlModel_Base: invalid aggregate!");
95cdf0e10cSrcweir 
96cdf0e10cSrcweir         increment(m_refCount);
97cdf0e10cSrcweir         {
98cdf0e10cSrcweir             m_xAggregate = _pAggregateInstance;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir             {   // check if the aggregat is cloneable
101cdf0e10cSrcweir                 Reference< XCloneable > xCloneAccess(m_xAggregate, UNO_QUERY);
102cdf0e10cSrcweir                 m_bCloneable = xCloneAccess.is();
103cdf0e10cSrcweir             }
104cdf0e10cSrcweir 
105cdf0e10cSrcweir             setAggregation(m_xAggregate);
106cdf0e10cSrcweir             m_xAggregate->setDelegator(static_cast< XWeak* >(this));
107cdf0e10cSrcweir         }
108cdf0e10cSrcweir         decrement(m_refCount);
109cdf0e10cSrcweir 
110cdf0e10cSrcweir         registerProperties();
111cdf0e10cSrcweir     }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     //--------------------------------------------------------------------
OGeometryControlModel_Base(Reference<XCloneable> & _rxAggregateInstance)114cdf0e10cSrcweir     OGeometryControlModel_Base::OGeometryControlModel_Base(Reference< XCloneable >& _rxAggregateInstance)
115cdf0e10cSrcweir         :OPropertySetAggregationHelper( m_aBHelper )
116cdf0e10cSrcweir         ,OPropertyContainer( m_aBHelper )
117cdf0e10cSrcweir         ,OGCM_Base( m_aMutex )
118cdf0e10cSrcweir         ,m_nPosX(0)
119cdf0e10cSrcweir         ,m_nPosY(0)
120cdf0e10cSrcweir         ,m_nWidth(0)
121cdf0e10cSrcweir         ,m_nHeight(0)
122cdf0e10cSrcweir         ,m_nTabIndex(-1)
123cdf0e10cSrcweir         ,m_nStep(0)
124cdf0e10cSrcweir         ,m_bCloneable(_rxAggregateInstance.is())
125cdf0e10cSrcweir     {
126cdf0e10cSrcweir         increment(m_refCount);
127cdf0e10cSrcweir         {
128cdf0e10cSrcweir             {
129cdf0e10cSrcweir                 // ensure that the temporary gets destructed NOW
130cdf0e10cSrcweir                 m_xAggregate = Reference< XAggregation >(_rxAggregateInstance, UNO_QUERY);
131cdf0e10cSrcweir             }
132cdf0e10cSrcweir             OSL_ENSURE(m_xAggregate.is(), "OGeometryControlModel_Base::OGeometryControlModel_Base: invalid object given!");
133cdf0e10cSrcweir 
134cdf0e10cSrcweir             // now the aggregate has a ref count of 2, but before setting the delegator it must be 1
135cdf0e10cSrcweir             _rxAggregateInstance.clear();
136cdf0e10cSrcweir             // now it should be the 1 we need here ...
137cdf0e10cSrcweir 
138cdf0e10cSrcweir             setAggregation(m_xAggregate);
139cdf0e10cSrcweir             m_xAggregate->setDelegator(static_cast< XWeak* >(this));
140cdf0e10cSrcweir         }
141cdf0e10cSrcweir         decrement(m_refCount);
142cdf0e10cSrcweir 
143cdf0e10cSrcweir         registerProperties();
144cdf0e10cSrcweir     }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     //--------------------------------------------------------------------
getTypes()147cdf0e10cSrcweir     Sequence< Type > SAL_CALL OGeometryControlModel_Base::getTypes(  ) throw (RuntimeException)
148cdf0e10cSrcweir     {
149cdf0e10cSrcweir         // our own types
150cdf0e10cSrcweir         Sequence< Type > aTypes = ::comphelper::concatSequences(
151cdf0e10cSrcweir             OPropertySetAggregationHelper::getTypes(),
152cdf0e10cSrcweir             OPropertyContainer::getTypes(),
153cdf0e10cSrcweir             OGCM_Base::getTypes()
154cdf0e10cSrcweir         );
155cdf0e10cSrcweir 
156cdf0e10cSrcweir         if ( m_xAggregate.is() )
157cdf0e10cSrcweir         {
158cdf0e10cSrcweir             // retrieve the types of the aggregate
159cdf0e10cSrcweir             Reference< XTypeProvider > xAggregateTypeProv;
160cdf0e10cSrcweir             m_xAggregate->queryAggregation( ::getCppuType( &xAggregateTypeProv ) ) >>= xAggregateTypeProv;
161cdf0e10cSrcweir             OSL_ENSURE( xAggregateTypeProv.is(), "OGeometryControlModel_Base::getTypes: aggregate should be a type provider!" );
162cdf0e10cSrcweir             Sequence< Type > aAggTypes;
163cdf0e10cSrcweir             if ( xAggregateTypeProv.is() )
164cdf0e10cSrcweir                 aAggTypes = xAggregateTypeProv->getTypes();
165cdf0e10cSrcweir 
166cdf0e10cSrcweir             // concat the sequences
167cdf0e10cSrcweir             sal_Int32 nOldSize = aTypes.getLength();
168cdf0e10cSrcweir             aTypes.realloc( nOldSize + aAggTypes.getLength() );
169cdf0e10cSrcweir             ::std::copy(
170cdf0e10cSrcweir                 aAggTypes.getConstArray(),
171cdf0e10cSrcweir                 aAggTypes.getConstArray() + aAggTypes.getLength(),
172cdf0e10cSrcweir                 aTypes.getArray() + nOldSize
173cdf0e10cSrcweir             );
174cdf0e10cSrcweir         }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir         return aTypes;
177cdf0e10cSrcweir     }
178cdf0e10cSrcweir 
179cdf0e10cSrcweir     //--------------------------------------------------------------------
registerProperties()180cdf0e10cSrcweir     void OGeometryControlModel_Base::registerProperties()
181cdf0e10cSrcweir     {
182cdf0e10cSrcweir         // register our members for the property handling of the OPropertyContainer
183cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_POS_X,    GCM_PROPERTY_ID_POS_X,      DEFAULT_ATTRIBS(), &m_nPosX, ::getCppuType(&m_nPosX));
184cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_POS_Y,    GCM_PROPERTY_ID_POS_Y,      DEFAULT_ATTRIBS(), &m_nPosY, ::getCppuType(&m_nPosY));
185cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_WIDTH,    GCM_PROPERTY_ID_WIDTH,      DEFAULT_ATTRIBS(), &m_nWidth, ::getCppuType(&m_nWidth));
186cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_HEIGHT,   GCM_PROPERTY_ID_HEIGHT,     DEFAULT_ATTRIBS(), &m_nHeight, ::getCppuType(&m_nHeight));
187cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_NAME,     GCM_PROPERTY_ID_NAME,       DEFAULT_ATTRIBS(), &m_aName, ::getCppuType(&m_aName));
188cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_TABINDEX, GCM_PROPERTY_ID_TABINDEX,   DEFAULT_ATTRIBS(), &m_nTabIndex, ::getCppuType(&m_nTabIndex));
189cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_STEP,     GCM_PROPERTY_ID_STEP,       DEFAULT_ATTRIBS(), &m_nStep, ::getCppuType(&m_nStep));
190cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_TAG,      GCM_PROPERTY_ID_TAG,        DEFAULT_ATTRIBS(), &m_aTag, ::getCppuType(&m_aTag));
191cdf0e10cSrcweir         registerProperty(GCM_PROPERTY_RESOURCERESOLVER, GCM_PROPERTY_ID_RESOURCERESOLVER, DEFAULT_ATTRIBS(), &m_xStrResolver, ::getCppuType(&m_xStrResolver));
192cdf0e10cSrcweir     }
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     //--------------------------------------------------------------------
ImplGetDefaultValueByHandle(sal_Int32 nHandle) const195cdf0e10cSrcweir     ::com::sun::star::uno::Any OGeometryControlModel_Base::ImplGetDefaultValueByHandle(sal_Int32 nHandle) const
196cdf0e10cSrcweir     {
197cdf0e10cSrcweir         ::com::sun::star::uno::Any aDefault;
198cdf0e10cSrcweir 
199cdf0e10cSrcweir         switch ( nHandle )
200cdf0e10cSrcweir         {
201cdf0e10cSrcweir             case GCM_PROPERTY_ID_POS_X:             aDefault <<= (sal_Int32) 0; break;
202cdf0e10cSrcweir             case GCM_PROPERTY_ID_POS_Y:             aDefault <<= (sal_Int32) 0; break;
203cdf0e10cSrcweir             case GCM_PROPERTY_ID_WIDTH:             aDefault <<= (sal_Int32) 0; break;
204cdf0e10cSrcweir             case GCM_PROPERTY_ID_HEIGHT:            aDefault <<= (sal_Int32) 0; break;
205cdf0e10cSrcweir             case GCM_PROPERTY_ID_NAME:              aDefault <<= ::rtl::OUString(); break;
206cdf0e10cSrcweir             case GCM_PROPERTY_ID_TABINDEX:          aDefault <<= (sal_Int16) -1; break;
207cdf0e10cSrcweir             case GCM_PROPERTY_ID_STEP:              aDefault <<= (sal_Int32) 0; break;
208cdf0e10cSrcweir             case GCM_PROPERTY_ID_TAG:               aDefault <<= ::rtl::OUString(); break;
209cdf0e10cSrcweir             case GCM_PROPERTY_ID_RESOURCERESOLVER:  aDefault <<= Reference< resource::XStringResourceResolver >(); break;
210cdf0e10cSrcweir             default:                            DBG_ERROR( "ImplGetDefaultValueByHandle - unknown Property" );
211cdf0e10cSrcweir         }
212cdf0e10cSrcweir 
213cdf0e10cSrcweir         return aDefault;
214cdf0e10cSrcweir     }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir     //--------------------------------------------------------------------
ImplGetPropertyValueByHandle(sal_Int32 nHandle) const217cdf0e10cSrcweir     ::com::sun::star::uno::Any OGeometryControlModel_Base::ImplGetPropertyValueByHandle(sal_Int32 nHandle) const
218cdf0e10cSrcweir     {
219cdf0e10cSrcweir         ::com::sun::star::uno::Any aValue;
220cdf0e10cSrcweir 
221cdf0e10cSrcweir         switch ( nHandle )
222cdf0e10cSrcweir         {
223cdf0e10cSrcweir             case GCM_PROPERTY_ID_POS_X:         aValue <<= m_nPosX; break;
224cdf0e10cSrcweir             case GCM_PROPERTY_ID_POS_Y:         aValue <<= m_nPosY; break;
225cdf0e10cSrcweir             case GCM_PROPERTY_ID_WIDTH:         aValue <<= m_nWidth; break;
226cdf0e10cSrcweir             case GCM_PROPERTY_ID_HEIGHT:        aValue <<= m_nHeight; break;
227cdf0e10cSrcweir             case GCM_PROPERTY_ID_NAME:          aValue <<= m_aName; break;
228cdf0e10cSrcweir             case GCM_PROPERTY_ID_TABINDEX:      aValue <<= m_nTabIndex; break;
229cdf0e10cSrcweir             case GCM_PROPERTY_ID_STEP:          aValue <<= m_nStep; break;
230cdf0e10cSrcweir             case GCM_PROPERTY_ID_TAG:           aValue <<= m_aTag; break;
231cdf0e10cSrcweir             case GCM_PROPERTY_ID_RESOURCERESOLVER: aValue <<= m_xStrResolver; break;
232cdf0e10cSrcweir             default:                            DBG_ERROR( "ImplGetPropertyValueByHandle - unknown Property" );
233cdf0e10cSrcweir         }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir         return aValue;
236cdf0e10cSrcweir     }
237cdf0e10cSrcweir 
238cdf0e10cSrcweir     //--------------------------------------------------------------------
ImplSetPropertyValueByHandle(sal_Int32 nHandle,const::com::sun::star::uno::Any & aValue)239cdf0e10cSrcweir     void OGeometryControlModel_Base::ImplSetPropertyValueByHandle(sal_Int32 nHandle, const :: com::sun::star::uno::Any& aValue)
240cdf0e10cSrcweir     {
241cdf0e10cSrcweir         switch ( nHandle )
242cdf0e10cSrcweir         {
243cdf0e10cSrcweir             case GCM_PROPERTY_ID_POS_X:         aValue >>= m_nPosX; break;
244cdf0e10cSrcweir             case GCM_PROPERTY_ID_POS_Y:         aValue >>= m_nPosY; break;
245cdf0e10cSrcweir             case GCM_PROPERTY_ID_WIDTH:         aValue >>= m_nWidth; break;
246cdf0e10cSrcweir             case GCM_PROPERTY_ID_HEIGHT:        aValue >>= m_nHeight; break;
247cdf0e10cSrcweir             case GCM_PROPERTY_ID_NAME:          aValue >>= m_aName; break;
248cdf0e10cSrcweir             case GCM_PROPERTY_ID_TABINDEX:      aValue >>= m_nTabIndex; break;
249cdf0e10cSrcweir             case GCM_PROPERTY_ID_STEP:          aValue >>= m_nStep; break;
250cdf0e10cSrcweir             case GCM_PROPERTY_ID_TAG:           aValue >>= m_aTag; break;
251cdf0e10cSrcweir             case GCM_PROPERTY_ID_RESOURCERESOLVER: aValue >>= m_xStrResolver; break;
252cdf0e10cSrcweir             default:                            DBG_ERROR( "ImplSetPropertyValueByHandle - unknown Property" );
253cdf0e10cSrcweir         }
254cdf0e10cSrcweir     }
255cdf0e10cSrcweir 
256cdf0e10cSrcweir     //--------------------------------------------------------------------
queryAggregation(const Type & _rType)257cdf0e10cSrcweir     Any SAL_CALL OGeometryControlModel_Base::queryAggregation( const Type& _rType ) throw(RuntimeException)
258cdf0e10cSrcweir     {
259cdf0e10cSrcweir         Any aReturn;
260cdf0e10cSrcweir         if (_rType.equals(::getCppuType(static_cast< Reference< XCloneable>* >(NULL))) && !m_bCloneable)
261cdf0e10cSrcweir             // somebody is asking for the XCloneable interface, but our aggregate does not support it
262cdf0e10cSrcweir             // -> outta here
263cdf0e10cSrcweir             // (need this extra check, cause OGCM_Base::queryAggregation would return this interface
264cdf0e10cSrcweir             // in every case)
265cdf0e10cSrcweir             return aReturn;
266cdf0e10cSrcweir 
267cdf0e10cSrcweir         aReturn = OGCM_Base::queryAggregation(_rType);
268cdf0e10cSrcweir             // the basic interfaces (XInterface, XAggregation etc)
269cdf0e10cSrcweir 
270cdf0e10cSrcweir         if (!aReturn.hasValue())
271cdf0e10cSrcweir             aReturn = OPropertySetAggregationHelper::queryInterface(_rType);
272cdf0e10cSrcweir             // the property set related interfaces
273cdf0e10cSrcweir 
274cdf0e10cSrcweir         if (!aReturn.hasValue() && m_xAggregate.is())
275cdf0e10cSrcweir             aReturn = m_xAggregate->queryAggregation(_rType);
276cdf0e10cSrcweir             // the interfaces our aggregate can provide
277cdf0e10cSrcweir 
278cdf0e10cSrcweir         return aReturn;
279cdf0e10cSrcweir     }
280cdf0e10cSrcweir 
281cdf0e10cSrcweir     //--------------------------------------------------------------------
queryInterface(const Type & _rType)282cdf0e10cSrcweir     Any SAL_CALL OGeometryControlModel_Base::queryInterface( const Type& _rType ) throw(RuntimeException)
283cdf0e10cSrcweir     {
284cdf0e10cSrcweir         return OGCM_Base::queryInterface(_rType);
285cdf0e10cSrcweir     }
286cdf0e10cSrcweir 
287cdf0e10cSrcweir     //--------------------------------------------------------------------
acquire()288cdf0e10cSrcweir     void SAL_CALL OGeometryControlModel_Base::acquire(  ) throw()
289cdf0e10cSrcweir     {
290cdf0e10cSrcweir         OGCM_Base::acquire();
291cdf0e10cSrcweir     }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     //--------------------------------------------------------------------
release()294cdf0e10cSrcweir     void SAL_CALL OGeometryControlModel_Base::release(  ) throw()
295cdf0e10cSrcweir     {
296cdf0e10cSrcweir         OGCM_Base::release();
297cdf0e10cSrcweir     }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir     //--------------------------------------------------------------------
releaseAggregation()300cdf0e10cSrcweir     void OGeometryControlModel_Base::releaseAggregation()
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         // release the aggregate (_before_ clearing m_xAggregate)
303cdf0e10cSrcweir         if (m_xAggregate.is())
304cdf0e10cSrcweir             m_xAggregate->setDelegator(NULL);
305cdf0e10cSrcweir         setAggregation(NULL);
306cdf0e10cSrcweir     }
307cdf0e10cSrcweir 
308cdf0e10cSrcweir     //--------------------------------------------------------------------
~OGeometryControlModel_Base()309cdf0e10cSrcweir     OGeometryControlModel_Base::~OGeometryControlModel_Base()
310cdf0e10cSrcweir     {
311cdf0e10cSrcweir         releaseAggregation();
312cdf0e10cSrcweir     }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir     //--------------------------------------------------------------------
convertFastPropertyValue(Any & _rConvertedValue,Any & _rOldValue,sal_Int32 _nHandle,const Any & _rValue)315cdf0e10cSrcweir     sal_Bool SAL_CALL OGeometryControlModel_Base::convertFastPropertyValue(Any& _rConvertedValue, Any& _rOldValue,
316cdf0e10cSrcweir             sal_Int32 _nHandle, const Any& _rValue) throw (IllegalArgumentException)
317cdf0e10cSrcweir     {
318cdf0e10cSrcweir         return OPropertyContainer::convertFastPropertyValue(_rConvertedValue, _rOldValue, _nHandle, _rValue);
319cdf0e10cSrcweir     }
320cdf0e10cSrcweir 
321cdf0e10cSrcweir     //--------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle,const Any & _rValue)322cdf0e10cSrcweir     void SAL_CALL OGeometryControlModel_Base::setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const Any& _rValue) throw (Exception)
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         OPropertyContainer::setFastPropertyValue_NoBroadcast(_nHandle, _rValue);
325cdf0e10cSrcweir     }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir     //--------------------------------------------------------------------
getFastPropertyValue(Any & _rValue,sal_Int32 _nHandle) const328cdf0e10cSrcweir     void SAL_CALL OGeometryControlModel_Base::getFastPropertyValue(Any& _rValue, sal_Int32 _nHandle) const
329cdf0e10cSrcweir     {
330cdf0e10cSrcweir         OPropertyArrayAggregationHelper& rPH = static_cast<OPropertyArrayAggregationHelper&>(const_cast<OGeometryControlModel_Base*>(this)->getInfoHelper());
331cdf0e10cSrcweir         ::rtl::OUString sPropName;
332cdf0e10cSrcweir         sal_Int32   nOriginalHandle = -1;
333cdf0e10cSrcweir 
334cdf0e10cSrcweir         if (rPH.fillAggregatePropertyInfoByHandle(&sPropName, &nOriginalHandle, _nHandle))
335cdf0e10cSrcweir             OPropertySetAggregationHelper::getFastPropertyValue(_rValue, _nHandle);
336cdf0e10cSrcweir         else
337cdf0e10cSrcweir             OPropertyContainer::getFastPropertyValue(_rValue, _nHandle);
338cdf0e10cSrcweir     }
339cdf0e10cSrcweir 
340cdf0e10cSrcweir     //--------------------------------------------------------------------
getPropertyStateByHandle(sal_Int32 nHandle)341cdf0e10cSrcweir     ::com::sun::star::beans::PropertyState OGeometryControlModel_Base::getPropertyStateByHandle(sal_Int32 nHandle)
342cdf0e10cSrcweir     {
343cdf0e10cSrcweir         ::com::sun::star::uno::Any aValue = ImplGetPropertyValueByHandle( nHandle );
344cdf0e10cSrcweir         ::com::sun::star::uno::Any aDefault = ImplGetDefaultValueByHandle( nHandle );
345cdf0e10cSrcweir 
346cdf0e10cSrcweir         return CompareProperties( aValue, aDefault ) ? ::com::sun::star::beans::PropertyState_DEFAULT_VALUE : ::com::sun::star::beans::PropertyState_DIRECT_VALUE;
347cdf0e10cSrcweir     }
348cdf0e10cSrcweir 
349cdf0e10cSrcweir     //--------------------------------------------------------------------
setPropertyToDefaultByHandle(sal_Int32 nHandle)350cdf0e10cSrcweir     void OGeometryControlModel_Base::setPropertyToDefaultByHandle(sal_Int32 nHandle)
351cdf0e10cSrcweir     {
352cdf0e10cSrcweir         ImplSetPropertyValueByHandle( nHandle , ImplGetDefaultValueByHandle( nHandle ) );
353cdf0e10cSrcweir     }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir     //--------------------------------------------------------------------
getPropertyDefaultByHandle(sal_Int32 nHandle) const356cdf0e10cSrcweir     ::com::sun::star::uno::Any OGeometryControlModel_Base::getPropertyDefaultByHandle( sal_Int32 nHandle ) const
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         return ImplGetDefaultValueByHandle( nHandle );
359cdf0e10cSrcweir     }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir     //--------------------------------------------------------------------
getPropertySetInfo()362cdf0e10cSrcweir     Reference< XPropertySetInfo> SAL_CALL OGeometryControlModel_Base::getPropertySetInfo() throw(RuntimeException)
363cdf0e10cSrcweir     {
364cdf0e10cSrcweir         return OPropertySetAggregationHelper::createPropertySetInfo(getInfoHelper());
365cdf0e10cSrcweir     }
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     //--------------------------------------------------------------------
createClone()368cdf0e10cSrcweir     Reference< XCloneable > SAL_CALL OGeometryControlModel_Base::createClone(  ) throw(RuntimeException)
369cdf0e10cSrcweir     {
370cdf0e10cSrcweir         OSL_ENSURE(m_bCloneable, "OGeometryControlModel_Base::createClone: invalid call!");
371cdf0e10cSrcweir         if (!m_bCloneable)
372cdf0e10cSrcweir             return Reference< XCloneable >();
373cdf0e10cSrcweir 
374cdf0e10cSrcweir         // let the aggregate create it's own clone
375cdf0e10cSrcweir         // the interface
376cdf0e10cSrcweir         Reference< XCloneable > xCloneAccess;
377cdf0e10cSrcweir         m_xAggregate->queryAggregation(::getCppuType(&xCloneAccess)) >>= xCloneAccess;
378cdf0e10cSrcweir         OSL_ENSURE(xCloneAccess.is(), "OGeometryControlModel_Base::createClone: suspicious aggregate!");
379cdf0e10cSrcweir         if (!xCloneAccess.is())
380cdf0e10cSrcweir             return Reference< XCloneable >();
381cdf0e10cSrcweir         // the aggregate's clone
382cdf0e10cSrcweir         Reference< XCloneable > xAggregateClone = xCloneAccess->createClone();
383cdf0e10cSrcweir         OSL_ENSURE(xAggregateClone.is(), "OGeometryControlModel_Base::createClone: suspicious return of the aggregate!");
384cdf0e10cSrcweir 
385cdf0e10cSrcweir         // create a new wrapper aggregating this return value
386cdf0e10cSrcweir         OGeometryControlModel_Base* pOwnClone = createClone_Impl(xAggregateClone);
387cdf0e10cSrcweir         OSL_ENSURE(pOwnClone, "OGeometryControlModel_Base::createClone: invalid derivee behaviour!");
388cdf0e10cSrcweir         OSL_ENSURE(!xAggregateClone.is(), "OGeometryControlModel_Base::createClone: invalid ctor behaviour!");
389cdf0e10cSrcweir             // should have been reset
390cdf0e10cSrcweir 
391cdf0e10cSrcweir         // set properties
392cdf0e10cSrcweir         pOwnClone->m_nPosX      = m_nPosX;
393cdf0e10cSrcweir         pOwnClone->m_nPosY      = m_nPosY;
394cdf0e10cSrcweir         pOwnClone->m_nWidth     = m_nWidth;
395cdf0e10cSrcweir         pOwnClone->m_nHeight    = m_nHeight;
396cdf0e10cSrcweir         pOwnClone->m_aName      = m_aName;
397cdf0e10cSrcweir         pOwnClone->m_nTabIndex  = m_nTabIndex;
398cdf0e10cSrcweir         pOwnClone->m_nStep      = m_nStep;
399cdf0e10cSrcweir         pOwnClone->m_aTag       = m_aTag;
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 
402cdf0e10cSrcweir         // Clone event container
403cdf0e10cSrcweir         Reference< ::com::sun::star::script::XScriptEventsSupplier > xEventsSupplier =
404cdf0e10cSrcweir             static_cast< ::com::sun::star::script::XScriptEventsSupplier* >( this );
405cdf0e10cSrcweir         Reference< ::com::sun::star::script::XScriptEventsSupplier > xCloneEventsSupplier =
406cdf0e10cSrcweir             static_cast< ::com::sun::star::script::XScriptEventsSupplier* >( pOwnClone );
407cdf0e10cSrcweir 
408cdf0e10cSrcweir         if( xEventsSupplier.is() && xCloneEventsSupplier.is() )
409cdf0e10cSrcweir         {
410cdf0e10cSrcweir             Reference< XNameContainer > xEventCont = xEventsSupplier->getEvents();
411cdf0e10cSrcweir             Reference< XNameContainer > xCloneEventCont = xCloneEventsSupplier->getEvents();
412cdf0e10cSrcweir 
413cdf0e10cSrcweir             ::com::sun::star::uno::Sequence< ::rtl::OUString > aNames =
414cdf0e10cSrcweir                 xEventCont->getElementNames();
415cdf0e10cSrcweir             const ::rtl::OUString* pNames = aNames.getConstArray();
416cdf0e10cSrcweir             sal_Int32 i, nNameCount = aNames.getLength();
417cdf0e10cSrcweir 
418cdf0e10cSrcweir             for( i = 0 ; i < nNameCount ; i++ )
419cdf0e10cSrcweir             {
420cdf0e10cSrcweir                 ::rtl::OUString aName = pNames[ i ];
421cdf0e10cSrcweir                 ::com::sun::star::uno::Any aElement = xEventCont->getByName( aName );
422cdf0e10cSrcweir                 xCloneEventCont->insertByName( aName, aElement );
423cdf0e10cSrcweir             }
424cdf0e10cSrcweir         }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir         return pOwnClone;
427cdf0e10cSrcweir     }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir     //--------------------------------------------------------------------
getEvents()430cdf0e10cSrcweir     Reference< XNameContainer > SAL_CALL OGeometryControlModel_Base::getEvents() throw(RuntimeException)
431cdf0e10cSrcweir     {
432cdf0e10cSrcweir         if( !mxEventContainer.is() )
433cdf0e10cSrcweir             mxEventContainer = (XNameContainer*)new toolkit::ScriptEventContainer();
434cdf0e10cSrcweir         return mxEventContainer;
435cdf0e10cSrcweir     }
436cdf0e10cSrcweir 
437cdf0e10cSrcweir     //--------------------------------------------------------------------
disposing()438cdf0e10cSrcweir     void SAL_CALL OGeometryControlModel_Base::disposing()
439cdf0e10cSrcweir     {
440cdf0e10cSrcweir         OGCM_Base::disposing();
441cdf0e10cSrcweir         OPropertySetAggregationHelper::disposing();
442cdf0e10cSrcweir 
443cdf0e10cSrcweir         Reference<XComponent>  xComp;
444cdf0e10cSrcweir         if ( query_aggregation( m_xAggregate, xComp ) )
445cdf0e10cSrcweir             xComp->dispose();
446cdf0e10cSrcweir     }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir     //====================================================================
449cdf0e10cSrcweir     //= OCommonGeometryControlModel
450cdf0e10cSrcweir     //====================================================================
451cdf0e10cSrcweir     //--------------------------------------------------------------------
452cdf0e10cSrcweir 
453cdf0e10cSrcweir     typedef ::std::hash_map< ::rtl::OUString, sal_Int32, ::comphelper::UStringHash > HashMapString2Int;
454cdf0e10cSrcweir     typedef ::std::vector< ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > >   PropSeqArray;
455cdf0e10cSrcweir     typedef ::std::vector< ::std::vector< sal_Int32 > > IntArrayArray;
456cdf0e10cSrcweir 
457cdf0e10cSrcweir     // for creating class-unique PropertySetInfo's, we need some info:
458cdf0e10cSrcweir     namespace { struct ServiceSpecifierMap : public rtl::Static< HashMapString2Int, ServiceSpecifierMap > {}; }
459cdf0e10cSrcweir     // this one maps from a String, which is the service specifier for our
460cdf0e10cSrcweir     // aggregate, to a unique id
461cdf0e10cSrcweir 
462cdf0e10cSrcweir     namespace { struct AggregateProperties : public rtl::Static< PropSeqArray, AggregateProperties > {}; }
463cdf0e10cSrcweir     // this one contains the properties which belong to all the unique ids
464cdf0e10cSrcweir     // in ServiceSpecifierMap
465cdf0e10cSrcweir 
466cdf0e10cSrcweir     namespace { struct AmbiguousPropertyIds : public rtl::Static< IntArrayArray, AmbiguousPropertyIds > {}; }
467cdf0e10cSrcweir     // the ids of the properties which we as well as our aggregate supply
468cdf0e10cSrcweir     // For such props, we let our base class handle them, and whenever such
469cdf0e10cSrcweir     // a prop is set, we forward this to our aggregate.
470cdf0e10cSrcweir 
471cdf0e10cSrcweir     // With this, we can ensure that two instances of this class share the
472cdf0e10cSrcweir     // same PropertySetInfo if and only if both aggregates have the same
473cdf0e10cSrcweir     // service specifier.
474cdf0e10cSrcweir 
475cdf0e10cSrcweir 
476cdf0e10cSrcweir     //--------------------------------------------------------------------
OCommonGeometryControlModel(Reference<XCloneable> & _rxAgg,const::rtl::OUString & _rServiceSpecifier)477cdf0e10cSrcweir     OCommonGeometryControlModel::OCommonGeometryControlModel( Reference< XCloneable >& _rxAgg, const ::rtl::OUString& _rServiceSpecifier )
478cdf0e10cSrcweir         :OGeometryControlModel_Base( _rxAgg )
479cdf0e10cSrcweir         ,m_sServiceSpecifier( _rServiceSpecifier )
480cdf0e10cSrcweir         ,m_nPropertyMapId( 0 )
481cdf0e10cSrcweir     {
482cdf0e10cSrcweir         Reference< XPropertySetInfo > xPI;
483cdf0e10cSrcweir         if ( m_xAggregateSet.is() )
484cdf0e10cSrcweir             xPI = m_xAggregateSet->getPropertySetInfo();
485cdf0e10cSrcweir         if ( !xPI.is() )
486cdf0e10cSrcweir         {
487cdf0e10cSrcweir             releaseAggregation();
488cdf0e10cSrcweir             throw IllegalArgumentException();
489cdf0e10cSrcweir         }
490cdf0e10cSrcweir 
491cdf0e10cSrcweir             HashMapString2Int &rMap = ServiceSpecifierMap::get();
492cdf0e10cSrcweir         HashMapString2Int::iterator aPropMapIdPos = rMap.find( m_sServiceSpecifier );
493cdf0e10cSrcweir         if ( rMap.end() == aPropMapIdPos )
494cdf0e10cSrcweir         {
495cdf0e10cSrcweir             PropSeqArray &rAggProperties = AggregateProperties::get();
496cdf0e10cSrcweir             m_nPropertyMapId = rAggProperties.size();
497cdf0e10cSrcweir             rAggProperties.push_back( xPI->getProperties() );
498cdf0e10cSrcweir             AmbiguousPropertyIds::get().push_back( IntArrayArray::value_type() );
499cdf0e10cSrcweir 
500cdf0e10cSrcweir             rMap[ m_sServiceSpecifier ] = m_nPropertyMapId;
501cdf0e10cSrcweir         }
502cdf0e10cSrcweir         else
503cdf0e10cSrcweir             m_nPropertyMapId = aPropMapIdPos->second;
504cdf0e10cSrcweir     }
505cdf0e10cSrcweir 
506cdf0e10cSrcweir     //--------------------------------------------------------------------
507cdf0e10cSrcweir     struct PropertyNameLess : public ::std::binary_function< Property, Property, bool >
508cdf0e10cSrcweir     {
operator ()PropertyNameLess509cdf0e10cSrcweir         bool operator()( const Property& _rLHS, const Property& _rRHS )
510cdf0e10cSrcweir         {
511cdf0e10cSrcweir             return _rLHS.Name < _rRHS.Name ? true : false;
512cdf0e10cSrcweir         }
513cdf0e10cSrcweir     };
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     //--------------------------------------------------------------------
516cdf0e10cSrcweir     struct PropertyNameEqual : public ::std::unary_function< Property, bool >
517cdf0e10cSrcweir     {
518cdf0e10cSrcweir         const ::rtl::OUString&  m_rCompare;
PropertyNameEqualPropertyNameEqual519cdf0e10cSrcweir         PropertyNameEqual( const ::rtl::OUString& _rCompare ) : m_rCompare( _rCompare ) { }
520cdf0e10cSrcweir 
operator ()PropertyNameEqual521cdf0e10cSrcweir         bool operator()( const Property& _rLHS )
522cdf0e10cSrcweir         {
523cdf0e10cSrcweir             return _rLHS.Name == m_rCompare ? true : false;
524cdf0e10cSrcweir         }
525cdf0e10cSrcweir     };
526cdf0e10cSrcweir 
527cdf0e10cSrcweir     //--------------------------------------------------------------------
createArrayHelper(sal_Int32 _nId) const528cdf0e10cSrcweir     ::cppu::IPropertyArrayHelper* OCommonGeometryControlModel::createArrayHelper( sal_Int32 _nId ) const
529cdf0e10cSrcweir     {
530cdf0e10cSrcweir         OSL_ENSURE( _nId == m_nPropertyMapId, "OCommonGeometryControlModel::createArrayHelper: invalid argument!" );
531cdf0e10cSrcweir         OSL_ENSURE( _nId < (sal_Int32)AggregateProperties::get().size(), "OCommonGeometryControlModel::createArrayHelper: invalid status info (1)!" );
532cdf0e10cSrcweir         OSL_ENSURE( _nId < (sal_Int32)AmbiguousPropertyIds::get().size(), "OCommonGeometryControlModel::createArrayHelper: invalid status info (2)!" );
533cdf0e10cSrcweir 
534cdf0e10cSrcweir         // our own properties
535cdf0e10cSrcweir         Sequence< Property > aProps;
536cdf0e10cSrcweir         OPropertyContainer::describeProperties( aProps );
537cdf0e10cSrcweir 
538cdf0e10cSrcweir         // the aggregate properties
539cdf0e10cSrcweir         Sequence< Property > aAggregateProps;
540cdf0e10cSrcweir         aAggregateProps = AggregateProperties::get()[ _nId ];
541cdf0e10cSrcweir 
542cdf0e10cSrcweir         // look for duplicates, and remember them
543cdf0e10cSrcweir         IntArrayArray::value_type& rDuplicateIds = AmbiguousPropertyIds::get()[ _nId ];
544cdf0e10cSrcweir         // for this, sort the aggregate properties
545cdf0e10cSrcweir         ::std::sort(
546cdf0e10cSrcweir             aAggregateProps.getArray(),
547cdf0e10cSrcweir             aAggregateProps.getArray() + aAggregateProps.getLength(),
548cdf0e10cSrcweir             PropertyNameLess()
549cdf0e10cSrcweir         );
550cdf0e10cSrcweir         const Property* pAggProps = aAggregateProps.getConstArray();
551cdf0e10cSrcweir         const Property* pAggPropsEnd = aAggregateProps.getConstArray() + aAggregateProps.getLength();
552cdf0e10cSrcweir 
553cdf0e10cSrcweir         // now loop through our own props
554cdf0e10cSrcweir         const Property* pProp = aProps.getConstArray();
555cdf0e10cSrcweir         const Property* pPropEnd = aProps.getConstArray() + aProps.getLength();
556cdf0e10cSrcweir         while ( pProp < pPropEnd )
557cdf0e10cSrcweir         {
558cdf0e10cSrcweir             // look for the current property in the properties of our aggregate
559cdf0e10cSrcweir             const Property* pAggPropPos = ::std::find_if( pAggProps, pAggPropsEnd, PropertyNameEqual( pProp->Name ) );
560cdf0e10cSrcweir             if ( pAggPropPos != pAggPropsEnd )
561cdf0e10cSrcweir             {   // found a duplicate
562cdf0e10cSrcweir                 // -> remove from the aggregate property sequence
563cdf0e10cSrcweir                 ::comphelper::removeElementAt( aAggregateProps, pAggPropPos - pAggProps );
564cdf0e10cSrcweir                 // which means we have to adjust the pointers
565cdf0e10cSrcweir                 pAggProps = aAggregateProps.getConstArray(),
566cdf0e10cSrcweir                 pAggPropsEnd = aAggregateProps.getConstArray() + aAggregateProps.getLength(),
567cdf0e10cSrcweir 
568cdf0e10cSrcweir                 // and additionally, remember the id of this property
569cdf0e10cSrcweir                 rDuplicateIds.push_back( pProp->Handle );
570cdf0e10cSrcweir             }
571cdf0e10cSrcweir 
572cdf0e10cSrcweir             ++pProp;
573cdf0e10cSrcweir         }
574cdf0e10cSrcweir 
575cdf0e10cSrcweir         // now, finally, sort the duplicates
576cdf0e10cSrcweir         ::std::sort( rDuplicateIds.begin(), rDuplicateIds.end(), ::std::less< sal_Int32 >() );
577cdf0e10cSrcweir 
578cdf0e10cSrcweir         return new OPropertyArrayAggregationHelper(aProps, aAggregateProps);
579cdf0e10cSrcweir     }
580cdf0e10cSrcweir 
581cdf0e10cSrcweir     //--------------------------------------------------------------------
getInfoHelper()582cdf0e10cSrcweir     ::cppu::IPropertyArrayHelper& SAL_CALL OCommonGeometryControlModel::getInfoHelper()
583cdf0e10cSrcweir     {
584cdf0e10cSrcweir         return *getArrayHelper( m_nPropertyMapId );
585cdf0e10cSrcweir     }
586cdf0e10cSrcweir 
587cdf0e10cSrcweir     //--------------------------------------------------------------------
createClone_Impl(Reference<XCloneable> & _rxAggregateInstance)588cdf0e10cSrcweir     OGeometryControlModel_Base* OCommonGeometryControlModel::createClone_Impl( Reference< XCloneable >& _rxAggregateInstance )
589cdf0e10cSrcweir     {
590cdf0e10cSrcweir         return new OCommonGeometryControlModel( _rxAggregateInstance, m_sServiceSpecifier );
591cdf0e10cSrcweir     }
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     //--------------------------------------------------------------------
getImplementationId()594cdf0e10cSrcweir     Sequence< sal_Int8 > SAL_CALL OCommonGeometryControlModel::getImplementationId(  ) throw (RuntimeException)
595cdf0e10cSrcweir     {
596cdf0e10cSrcweir         static ::cppu::OImplementationId * pId = NULL;
597cdf0e10cSrcweir         if ( !pId )
598cdf0e10cSrcweir         {
599cdf0e10cSrcweir             ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
600cdf0e10cSrcweir             if ( !pId )
601cdf0e10cSrcweir             {
602cdf0e10cSrcweir                 static ::cppu::OImplementationId s_aId;
603cdf0e10cSrcweir                 pId = &s_aId;
604cdf0e10cSrcweir             }
605cdf0e10cSrcweir         }
606cdf0e10cSrcweir         return pId->getImplementationId();
607cdf0e10cSrcweir     }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir     //--------------------------------------------------------------------
610cdf0e10cSrcweir     struct Int32Equal : public ::std::unary_function< sal_Int32, bool >
611cdf0e10cSrcweir     {
612cdf0e10cSrcweir         sal_Int32   m_nCompare;
Int32EqualInt32Equal613cdf0e10cSrcweir         Int32Equal( sal_Int32 _nCompare ) : m_nCompare( _nCompare ) { }
614cdf0e10cSrcweir 
operator ()Int32Equal615cdf0e10cSrcweir         bool operator()( sal_Int32 _nLHS )
616cdf0e10cSrcweir         {
617cdf0e10cSrcweir             return _nLHS == m_nCompare ? true  : false;
618cdf0e10cSrcweir         }
619cdf0e10cSrcweir     };
620cdf0e10cSrcweir 
621cdf0e10cSrcweir     //--------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle,const Any & _rValue)622cdf0e10cSrcweir     void SAL_CALL OCommonGeometryControlModel::setFastPropertyValue_NoBroadcast( sal_Int32 _nHandle, const Any& _rValue ) throw ( Exception )
623cdf0e10cSrcweir     {
624cdf0e10cSrcweir         OGeometryControlModel_Base::setFastPropertyValue_NoBroadcast( _nHandle, _rValue );
625cdf0e10cSrcweir 
626cdf0e10cSrcweir         // look if this id is one we recognized as duplicate
627cdf0e10cSrcweir         IntArrayArray::value_type& rDuplicateIds = AmbiguousPropertyIds::get()[ m_nPropertyMapId ];
628cdf0e10cSrcweir 
629cdf0e10cSrcweir         IntArrayArray::value_type::const_iterator aPos = ::std::find_if(
630cdf0e10cSrcweir             rDuplicateIds.begin(),
631cdf0e10cSrcweir             rDuplicateIds.end(),
632cdf0e10cSrcweir             Int32Equal( _nHandle )
633cdf0e10cSrcweir         );
634cdf0e10cSrcweir 
635cdf0e10cSrcweir         if ( rDuplicateIds.end() != aPos )
636cdf0e10cSrcweir         {
637cdf0e10cSrcweir             // yes, it is such a property
638cdf0e10cSrcweir             ::rtl::OUString sPropName;
639cdf0e10cSrcweir             sal_Int16 nAttributes(0);
640cdf0e10cSrcweir             static_cast< OPropertyArrayAggregationHelper* >( getArrayHelper( m_nPropertyMapId ) )->fillPropertyMembersByHandle( &sPropName, &nAttributes, _nHandle );
641cdf0e10cSrcweir 
642cdf0e10cSrcweir             if ( m_xAggregateSet.is() && sPropName.getLength() )
643cdf0e10cSrcweir                 m_xAggregateSet->setPropertyValue( sPropName, _rValue );
644cdf0e10cSrcweir         }
645cdf0e10cSrcweir     }
646cdf0e10cSrcweir 
647cdf0e10cSrcweir //........................................................................
648cdf0e10cSrcweir // }    // namespace toolkit
649cdf0e10cSrcweir //........................................................................
650