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