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_vcl.hxx" 26 27 #include <tools/tempfile.hxx> 28 29 #include <osl/file.hxx> 30 31 #include <cppuhelper/servicefactory.hxx> 32 33 #include <vcl/svapp.hxx> 34 #include <vcl/unohelp.hxx> 35 36 #include <svdata.hxx> 37 38 #include <com/sun/star/lang/XSingleServiceFactory.hpp> 39 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 40 #include <comphelper/processfactory.hxx> 41 42 #include <com/sun/star/i18n/XBreakIterator.hpp> 43 #include <com/sun/star/i18n/XCharacterClassification.hpp> 44 #include <com/sun/star/i18n/XCollator.hpp> 45 #include <com/sun/star/awt/XExtendedToolkit.hpp> 46 #include <com/sun/star/accessibility/AccessibleEventObject.hpp> 47 #include <com/sun/star/accessibility/AccessibleStateType.hpp> 48 #include <com/sun/star/registry/XImplementationRegistration.hpp> 49 50 using namespace ::com::sun::star; 51 using namespace ::rtl; 52 53 struct VCLRegServiceInfo 54 { 55 const sal_Char* pLibName; 56 sal_Bool bHasSUPD; 57 }; 58 59 static VCLRegServiceInfo aVCLComponentsArray[] = 60 { 61 {"i18n", sal_True}, 62 {"i18npool", sal_True}, 63 #ifdef UNX 64 #ifdef MACOSX 65 {"dtransaqua", sal_True}, 66 #else 67 {"dtransX11", sal_True}, 68 #endif 69 #endif 70 #if defined(WNT) || defined(OS2) 71 {"sysdtrans", sal_False}, 72 #endif 73 {"dtrans", sal_False}, 74 {"mcnttype", sal_False}, 75 {"ftransl", sal_False}, 76 {"dnd", sal_False}, 77 {NULL, sal_False} 78 }; 79 80 uno::Reference< lang::XMultiServiceFactory > vcl::unohelper::GetMultiServiceFactory() 81 { 82 ImplSVData* pSVData = ImplGetSVData(); 83 if ( !pSVData->maAppData.mxMSF.is() ) 84 { 85 pSVData->maAppData.mxMSF = ::comphelper::getProcessServiceFactory(); 86 } 87 if ( !pSVData->maAppData.mxMSF.is() ) 88 { 89 TempFile aTempFile; 90 OUString aTempFileName; 91 osl::FileBase::getSystemPathFromFileURL( aTempFile.GetName(), aTempFileName ); 92 pSVData->maAppData.mpMSFTempFileName = new String(aTempFileName); 93 94 try 95 { 96 pSVData->maAppData.mxMSF = ::cppu::createRegistryServiceFactory( aTempFileName, rtl::OUString(), sal_False ); 97 uno::Reference < registry::XImplementationRegistration > xReg( 98 pSVData->maAppData.mxMSF->createInstance( OUString::createFromAscii( "com.sun.star.registry.ImplementationRegistration" )), uno::UNO_QUERY ); 99 100 if( xReg.is() ) 101 { 102 sal_Int32 nCompCount = 0; 103 while ( aVCLComponentsArray[ nCompCount ].pLibName ) 104 { 105 OUString aComponentPathString = CreateLibraryName( aVCLComponentsArray[ nCompCount ].pLibName, aVCLComponentsArray[ nCompCount ].bHasSUPD ); 106 if (aComponentPathString.getLength() ) 107 { 108 try 109 { 110 xReg->registerImplementation( 111 OUString::createFromAscii( "com.sun.star.loader.SharedLibrary" ),aComponentPathString, NULL ); 112 } 113 catch( ::com::sun::star::uno::Exception & ) 114 { 115 } 116 } 117 nCompCount++; 118 } 119 } 120 } 121 catch( ::com::sun::star::uno::Exception & ) 122 { 123 delete pSVData->maAppData.mpMSFTempFileName; 124 pSVData->maAppData.mpMSFTempFileName = NULL; 125 } 126 } 127 return pSVData->maAppData.mxMSF; 128 } 129 130 131 uno::Reference < i18n::XBreakIterator > vcl::unohelper::CreateBreakIterator() 132 { 133 uno::Reference < i18n::XBreakIterator > xB; 134 uno::Reference< lang::XMultiServiceFactory > xMSF = GetMultiServiceFactory(); 135 if ( xMSF.is() ) 136 { 137 uno::Reference < uno::XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) ); 138 if ( xI.is() ) 139 { 140 uno::Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XBreakIterator >*)0) ); 141 x >>= xB; 142 } 143 } 144 return xB; 145 } 146 147 uno::Reference < i18n::XCharacterClassification > vcl::unohelper::CreateCharacterClassification() 148 { 149 uno::Reference < i18n::XCharacterClassification > xB; 150 uno::Reference< lang::XMultiServiceFactory > xMSF = GetMultiServiceFactory(); 151 if ( xMSF.is() ) 152 { 153 uno::Reference < uno::XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.i18n.CharacterClassification" ) ); 154 if ( xI.is() ) 155 { 156 uno::Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XCharacterClassification >*)0) ); 157 x >>= xB; 158 } 159 } 160 return xB; 161 } 162 163 uno::Reference < i18n::XCollator > vcl::unohelper::CreateCollator() 164 { 165 uno::Reference < i18n::XCollator > xB; 166 uno::Reference< lang::XMultiServiceFactory > xMSF = GetMultiServiceFactory(); 167 if ( xMSF.is() ) 168 { 169 uno::Reference < uno::XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.i18n.Collator" ) ); 170 if ( xI.is() ) 171 { 172 uno::Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XCollator >*)0) ); 173 x >>= xB; 174 } 175 } 176 return xB; 177 } 178 179 ::rtl::OUString vcl::unohelper::CreateLibraryName( const sal_Char* pModName, sal_Bool bSUPD ) 180 { 181 // create variable library name suffixes 182 OUString aDLLSuffix; //= OUString::createFromAscii( STRING(DLLPOSTFIX) ); 183 184 OUString aLibName; 185 186 #if defined( WNT) || defined(OS2) 187 aLibName = OUString::createFromAscii( pModName ); 188 if ( bSUPD ) 189 { 190 aLibName += aDLLSuffix; 191 } 192 aLibName += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".dll" )); 193 #else 194 aLibName = OUString( RTL_CONSTASCII_USTRINGPARAM( "lib" )); 195 aLibName += OUString::createFromAscii( pModName ); 196 if ( bSUPD ) 197 { 198 aLibName += aDLLSuffix; 199 } 200 #ifdef MACOSX 201 aLibName += OUString( RTL_CONSTASCII_USTRINGPARAM( ".dylib" )); 202 #else 203 aLibName += OUString( RTL_CONSTASCII_USTRINGPARAM( ".so" )); 204 #endif 205 #endif 206 207 return aLibName; 208 } 209 210 void vcl::unohelper::NotifyAccessibleStateEventGlobally( const ::com::sun::star::accessibility::AccessibleEventObject& rEventObject ) 211 { 212 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XExtendedToolkit > xExtToolkit( Application::GetVCLToolkit(), uno::UNO_QUERY ); 213 if ( xExtToolkit.is() ) 214 { 215 // Only for focus events 216 sal_Int16 nType = ::com::sun::star::accessibility::AccessibleStateType::INVALID; 217 rEventObject.NewValue >>= nType; 218 if ( nType == ::com::sun::star::accessibility::AccessibleStateType::FOCUSED ) 219 xExtToolkit->fireFocusGained( rEventObject.Source ); 220 else 221 { 222 rEventObject.OldValue >>= nType; 223 if ( nType == ::com::sun::star::accessibility::AccessibleStateType::FOCUSED ) 224 xExtToolkit->fireFocusLost( rEventObject.Source ); 225 } 226 227 } 228 } 229