1*6d739b60SAndrew Rist /**************************************************************
2*6d739b60SAndrew Rist  *
3*6d739b60SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*6d739b60SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*6d739b60SAndrew Rist  * distributed with this work for additional information
6*6d739b60SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*6d739b60SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*6d739b60SAndrew Rist  * "License"); you may not use this file except in compliance
9*6d739b60SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*6d739b60SAndrew Rist  *
11*6d739b60SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*6d739b60SAndrew Rist  *
13*6d739b60SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*6d739b60SAndrew Rist  * software distributed under the License is distributed on an
15*6d739b60SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*6d739b60SAndrew Rist  * KIND, either express or implied.  See the License for the
17*6d739b60SAndrew Rist  * specific language governing permissions and limitations
18*6d739b60SAndrew Rist  * under the License.
19*6d739b60SAndrew Rist  *
20*6d739b60SAndrew Rist  *************************************************************/
21*6d739b60SAndrew Rist 
22*6d739b60SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //_________________________________________________________________________________________________________________
28cdf0e10cSrcweir //	my own includes
29cdf0e10cSrcweir //_________________________________________________________________________________________________________________
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include "services.h"
32cdf0e10cSrcweir #include "services/modelwinservice.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir //_________________________________________________________________________________________________________________
35cdf0e10cSrcweir //	interface includes
36cdf0e10cSrcweir //_________________________________________________________________________________________________________________
37cdf0e10cSrcweir 
38cdf0e10cSrcweir #include <com/sun/star/awt/XControlModel.hpp>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir using namespace ::com::sun::star;
41cdf0e10cSrcweir 
42cdf0e10cSrcweir //_________________________________________________________________________________________________________________
43cdf0e10cSrcweir //	namespace
44cdf0e10cSrcweir //_________________________________________________________________________________________________________________
45cdf0e10cSrcweir 
46cdf0e10cSrcweir namespace framework{
47cdf0e10cSrcweir 
48cdf0e10cSrcweir //_________________________________________________________________________________________________________________
49cdf0e10cSrcweir //	non exported definitions
50cdf0e10cSrcweir //_________________________________________________________________________________________________________________
51cdf0e10cSrcweir 
52cdf0e10cSrcweir //_________________________________________________________________________________________________________________
53cdf0e10cSrcweir //	declarations
54cdf0e10cSrcweir //_________________________________________________________________________________________________________________
55cdf0e10cSrcweir 
56cdf0e10cSrcweir class Impl_ModelWinService
57cdf0e10cSrcweir {
58cdf0e10cSrcweir     public:
59cdf0e10cSrcweir         ~Impl_ModelWinService();
60cdf0e10cSrcweir 
61cdf0e10cSrcweir         static Impl_ModelWinService* getSingleInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager );
62cdf0e10cSrcweir 
63cdf0e10cSrcweir         uno::Any getByName( const ::rtl::OUString& sName )
64cdf0e10cSrcweir             throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException );
65cdf0e10cSrcweir 
66cdf0e10cSrcweir         uno::Sequence< ::rtl::OUString > getElementNames()
67cdf0e10cSrcweir             throw( uno::RuntimeException );
68cdf0e10cSrcweir 
69cdf0e10cSrcweir         sal_Bool hasByName( const ::rtl::OUString& sName )
70cdf0e10cSrcweir             throw( uno::RuntimeException );
71cdf0e10cSrcweir 
72cdf0e10cSrcweir         uno::Type getElementType()
73cdf0e10cSrcweir             throw( css::uno::RuntimeException );
74cdf0e10cSrcweir 
75cdf0e10cSrcweir         sal_Bool hasElements()
76cdf0e10cSrcweir             throw( css::uno::RuntimeException );
77cdf0e10cSrcweir 
78cdf0e10cSrcweir         void registerModelForXWindow( const uno::Reference< awt::XWindow >& rWindow, const uno::Reference< awt::XControlModel >& rModel );
79cdf0e10cSrcweir 
80cdf0e10cSrcweir         void deregisterModelForXWindow( const uno::Reference< awt::XWindow >& rWindow );
81cdf0e10cSrcweir 
82cdf0e10cSrcweir     private:
83cdf0e10cSrcweir         typedef BaseHash< uno::WeakReference< awt::XControlModel > > ModelWinMap;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir         Impl_ModelWinService();
86cdf0e10cSrcweir         Impl_ModelWinService( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager );
87cdf0e10cSrcweir 
88cdf0e10cSrcweir         static Impl_ModelWinService* m_pModelWinService;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir         ::com::sun::star::uno::WeakReference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceManager;
91cdf0e10cSrcweir         ModelWinMap m_aModelMap;
92cdf0e10cSrcweir };
93cdf0e10cSrcweir 
94cdf0e10cSrcweir Impl_ModelWinService* Impl_ModelWinService::m_pModelWinService = 0;
95cdf0e10cSrcweir 
getSingleInstance(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rServiceManager)96cdf0e10cSrcweir Impl_ModelWinService* Impl_ModelWinService::getSingleInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir     osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
99cdf0e10cSrcweir     if ( !m_pModelWinService )
100cdf0e10cSrcweir         m_pModelWinService = new Impl_ModelWinService( rServiceManager );
101cdf0e10cSrcweir     return m_pModelWinService;
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
Impl_ModelWinService(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rServiceManager)104cdf0e10cSrcweir Impl_ModelWinService::Impl_ModelWinService( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager ) :
105cdf0e10cSrcweir     m_xServiceManager( rServiceManager )
106cdf0e10cSrcweir {
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
Impl_ModelWinService()109cdf0e10cSrcweir Impl_ModelWinService::Impl_ModelWinService()
110cdf0e10cSrcweir {
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
~Impl_ModelWinService()113cdf0e10cSrcweir Impl_ModelWinService::~Impl_ModelWinService()
114cdf0e10cSrcweir {
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
registerModelForXWindow(const uno::Reference<awt::XWindow> & rWindow,const uno::Reference<awt::XControlModel> & rModel)117cdf0e10cSrcweir void Impl_ModelWinService::registerModelForXWindow( const uno::Reference< awt::XWindow >& rWindow, const uno::Reference< awt::XControlModel >& rModel )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir     osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     ::rtl::OUString sName = rtl::OUString::valueOf( reinterpret_cast< sal_Int64 >((void*)rWindow.get()));
122cdf0e10cSrcweir     ModelWinMap::iterator pIter = m_aModelMap.find( sName );
123cdf0e10cSrcweir     if ( pIter != m_aModelMap.end() )
124cdf0e10cSrcweir         pIter->second = rModel;
125cdf0e10cSrcweir     else
126cdf0e10cSrcweir         m_aModelMap[sName] = rModel;
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
deregisterModelForXWindow(const uno::Reference<awt::XWindow> &)129cdf0e10cSrcweir void Impl_ModelWinService::deregisterModelForXWindow( const uno::Reference< awt::XWindow >& /*rWindow*/ )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
getByName(const::rtl::OUString & sName)133cdf0e10cSrcweir uno::Any Impl_ModelWinService::getByName( const ::rtl::OUString& sName )
134cdf0e10cSrcweir throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
135cdf0e10cSrcweir {
136cdf0e10cSrcweir     uno::Any aAny;
137cdf0e10cSrcweir 
138cdf0e10cSrcweir     osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
139cdf0e10cSrcweir     ModelWinMap::iterator pIter = m_aModelMap.find( sName );
140cdf0e10cSrcweir     if ( pIter != m_aModelMap.end())
141cdf0e10cSrcweir     {
142cdf0e10cSrcweir         uno::Reference< awt::XControlModel > xModel( pIter->second );
143cdf0e10cSrcweir         aAny = uno::makeAny(xModel);
144cdf0e10cSrcweir     }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     return aAny;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
getElementNames()149cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > Impl_ModelWinService::getElementNames()
150cdf0e10cSrcweir throw( uno::RuntimeException )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
153cdf0e10cSrcweir     uno::Sequence< ::rtl::OUString > aResult( m_aModelMap.size() );
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     sal_Int32 i = 0;
156cdf0e10cSrcweir     ModelWinMap::const_iterator pIter = m_aModelMap.begin();
157cdf0e10cSrcweir     while ( pIter != m_aModelMap.end())
158cdf0e10cSrcweir         aResult[i++] = pIter->first;
159cdf0e10cSrcweir 
160cdf0e10cSrcweir     return aResult;
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
hasByName(const::rtl::OUString & sName)163cdf0e10cSrcweir sal_Bool Impl_ModelWinService::hasByName( const ::rtl::OUString& sName )
164cdf0e10cSrcweir throw( uno::RuntimeException )
165cdf0e10cSrcweir {
166cdf0e10cSrcweir     osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
167cdf0e10cSrcweir     ModelWinMap::iterator pIter = m_aModelMap.find( sName );
168cdf0e10cSrcweir     if ( pIter != m_aModelMap.end())
169cdf0e10cSrcweir         return true;
170cdf0e10cSrcweir     else
171cdf0e10cSrcweir         return false;
172cdf0e10cSrcweir }
173cdf0e10cSrcweir 
getElementType()174cdf0e10cSrcweir uno::Type Impl_ModelWinService::getElementType()
175cdf0e10cSrcweir throw( css::uno::RuntimeException )
176cdf0e10cSrcweir {
177cdf0e10cSrcweir     return ::getCppuType(( const uno::Reference< awt::XControlModel >*)NULL );
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
hasElements()180cdf0e10cSrcweir sal_Bool Impl_ModelWinService::hasElements()
181cdf0e10cSrcweir throw( css::uno::RuntimeException )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir     osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
184cdf0e10cSrcweir     return (m_aModelMap.size() > 0);
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir //*****************************************************************************************************************
188cdf0e10cSrcweir //	css::uno::XInterface, XTypeProvider, XServiceInfo
189cdf0e10cSrcweir //*****************************************************************************************************************
190cdf0e10cSrcweir 
DEFINE_XINTERFACE_4(ModelWinService,OWeakObject,DIRECT_INTERFACE (css::lang::XTypeProvider),DIRECT_INTERFACE (css::lang::XServiceInfo),DIRECT_INTERFACE (css::container::XNameAccess),DIRECT_INTERFACE (css::container::XElementAccess))191cdf0e10cSrcweir DEFINE_XINTERFACE_4                 (   ModelWinService                                 ,
192cdf0e10cSrcweir                                         OWeakObject                                     ,
193cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::lang::XTypeProvider       ),
194cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::lang::XServiceInfo        ),
195cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::container::XNameAccess    ),
196cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::container::XElementAccess )
197cdf0e10cSrcweir 									)
198cdf0e10cSrcweir 
199cdf0e10cSrcweir DEFINE_XTYPEPROVIDER_4              (   ModelWinService                ,
200cdf0e10cSrcweir                                         css::lang::XTypeProvider       ,
201cdf0e10cSrcweir                                         css::lang::XServiceInfo        ,
202cdf0e10cSrcweir                                         css::container::XNameAccess    ,
203cdf0e10cSrcweir                                         css::container::XElementAccess
204cdf0e10cSrcweir 									)
205cdf0e10cSrcweir 
206cdf0e10cSrcweir DEFINE_XSERVICEINFO_MULTISERVICE    (   ModelWinService                    ,
207cdf0e10cSrcweir                                         OWeakObject                        ,
208cdf0e10cSrcweir                                         SERVICENAME_MODELWINSERVICE        ,
209cdf0e10cSrcweir                                         IMPLEMENTATIONNAME_MODELWINSERVICE
210cdf0e10cSrcweir 									)
211cdf0e10cSrcweir 
212cdf0e10cSrcweir DEFINE_INIT_SERVICE                 (   ModelWinService,
213cdf0e10cSrcweir                                         {
214cdf0e10cSrcweir                                         }
215cdf0e10cSrcweir                                     )
216cdf0e10cSrcweir 
217cdf0e10cSrcweir //*****************************************************************************************************************
218cdf0e10cSrcweir //	constructor
219cdf0e10cSrcweir //*****************************************************************************************************************
220cdf0e10cSrcweir ModelWinService::ModelWinService(const uno::Reference< lang::XMultiServiceFactory >& rServiceManager ) :
221cdf0e10cSrcweir     m_xServiceManager( rServiceManager )
222cdf0e10cSrcweir {
223cdf0e10cSrcweir }
224cdf0e10cSrcweir 
~ModelWinService()225cdf0e10cSrcweir ModelWinService::~ModelWinService()
226cdf0e10cSrcweir {
227cdf0e10cSrcweir }
228cdf0e10cSrcweir 
registerModelForXWindow(const uno::Reference<awt::XWindow> & rWindow,const uno::Reference<awt::XControlModel> & rModel)229cdf0e10cSrcweir void ModelWinService::registerModelForXWindow( const uno::Reference< awt::XWindow >& rWindow, const uno::Reference< awt::XControlModel >& rModel )
230cdf0e10cSrcweir {
231cdf0e10cSrcweir     Impl_ModelWinService::getSingleInstance(m_xServiceManager)->registerModelForXWindow( rWindow, rModel );
232cdf0e10cSrcweir }
233cdf0e10cSrcweir 
deregisterModelForXWindow(const uno::Reference<awt::XWindow> & rWindow)234cdf0e10cSrcweir void ModelWinService::deregisterModelForXWindow( const uno::Reference< awt::XWindow >& rWindow )
235cdf0e10cSrcweir {
236cdf0e10cSrcweir     Impl_ModelWinService::getSingleInstance(m_xServiceManager)->deregisterModelForXWindow( rWindow );
237cdf0e10cSrcweir }
238cdf0e10cSrcweir 
getByName(const::rtl::OUString & sName)239cdf0e10cSrcweir uno::Any SAL_CALL ModelWinService::getByName( const ::rtl::OUString& sName )
240cdf0e10cSrcweir throw(	container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
241cdf0e10cSrcweir {
242cdf0e10cSrcweir     return Impl_ModelWinService::getSingleInstance(m_xServiceManager)->getByName( sName );
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
getElementNames()245cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > SAL_CALL ModelWinService::getElementNames()
246cdf0e10cSrcweir throw( uno::RuntimeException )
247cdf0e10cSrcweir {
248cdf0e10cSrcweir     return Impl_ModelWinService::getSingleInstance(m_xServiceManager)->getElementNames( );
249cdf0e10cSrcweir }
250cdf0e10cSrcweir 
hasByName(const::rtl::OUString & sName)251cdf0e10cSrcweir sal_Bool SAL_CALL ModelWinService::hasByName( const ::rtl::OUString& sName )
252cdf0e10cSrcweir throw( uno::RuntimeException )
253cdf0e10cSrcweir {
254cdf0e10cSrcweir     return Impl_ModelWinService::getSingleInstance(m_xServiceManager)->hasByName( sName );
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir //---------------------------------------------------------------------------------------------------------
258cdf0e10cSrcweir //	XElementAccess
259cdf0e10cSrcweir //---------------------------------------------------------------------------------------------------------
getElementType()260cdf0e10cSrcweir uno::Type SAL_CALL ModelWinService::getElementType()
261cdf0e10cSrcweir throw( uno::RuntimeException )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir     return ::getCppuType( (const uno::Reference< awt::XControlModel > *)NULL );
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
hasElements()266cdf0e10cSrcweir sal_Bool SAL_CALL ModelWinService::hasElements()
267cdf0e10cSrcweir throw( uno::RuntimeException )
268cdf0e10cSrcweir {
269cdf0e10cSrcweir     return Impl_ModelWinService::getSingleInstance(m_xServiceManager)->hasElements();
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir }
273