1*2c696243SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*2c696243SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*2c696243SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*2c696243SAndrew Rist * distributed with this work for additional information 6*2c696243SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*2c696243SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*2c696243SAndrew Rist * "License"); you may not use this file except in compliance 9*2c696243SAndrew Rist * with the License. You may obtain a copy of the License at 10*2c696243SAndrew Rist * 11*2c696243SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*2c696243SAndrew Rist * 13*2c696243SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*2c696243SAndrew Rist * software distributed under the License is distributed on an 15*2c696243SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2c696243SAndrew Rist * KIND, either express or implied. See the License for the 17*2c696243SAndrew Rist * specific language governing permissions and limitations 18*2c696243SAndrew Rist * under the License. 19*2c696243SAndrew Rist * 20*2c696243SAndrew Rist *************************************************************/ 21*2c696243SAndrew Rist 22*2c696243SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_scripting.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "DialogModelProvider.hxx" 28cdf0e10cSrcweir #include "dlgprov.hxx" 29cdf0e10cSrcweir #include "dlgevtatt.hxx" 30cdf0e10cSrcweir #include <com/sun/star/awt/XControlContainer.hpp> 31cdf0e10cSrcweir #include <com/sun/star/awt/XWindowPeer.hpp> 32cdf0e10cSrcweir #include <com/sun/star/io/XInputStreamProvider.hpp> 33cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp> 34cdf0e10cSrcweir #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp> 35cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainer.hpp> 36cdf0e10cSrcweir #include <cppuhelper/implementationentry.hxx> 37cdf0e10cSrcweir #include <cppuhelper/exc_hlp.hxx> 38cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospection.hpp> 39cdf0e10cSrcweir #include <com/sun/star/resource/XStringResourceSupplier.hpp> 40cdf0e10cSrcweir #include <com/sun/star/resource/XStringResourceManager.hpp> 41cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 42cdf0e10cSrcweir #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 43cdf0e10cSrcweir #include <com/sun/star/resource/XStringResourceWithLocation.hpp> 44cdf0e10cSrcweir #include <com/sun/star/document/XEmbeddedScripts.hpp> 45cdf0e10cSrcweir #include <sfx2/app.hxx> 46cdf0e10cSrcweir #include <sfx2/objsh.hxx> 47cdf0e10cSrcweir #include <xmlscript/xmldlg_imexp.hxx> 48cdf0e10cSrcweir #include <tools/urlobj.hxx> 49cdf0e10cSrcweir #include <comphelper/namedvaluecollection.hxx> 50cdf0e10cSrcweir 51cdf0e10cSrcweir #include <com/sun/star/uri/XUriReference.hpp> 52cdf0e10cSrcweir #include <com/sun/star/uri/XUriReferenceFactory.hpp> 53cdf0e10cSrcweir #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp> 54cdf0e10cSrcweir #include <com/sun/star/uri/XVndSunStarExpandUrl.hpp> 55cdf0e10cSrcweir #include <com/sun/star/util/XMacroExpander.hpp> 56cdf0e10cSrcweir 57cdf0e10cSrcweir #include <util/MiscUtils.hxx> 58cdf0e10cSrcweir 59cdf0e10cSrcweir using namespace ::com::sun::star; 60cdf0e10cSrcweir using namespace awt; 61cdf0e10cSrcweir using namespace lang; 62cdf0e10cSrcweir using namespace uno; 63cdf0e10cSrcweir using namespace script; 64cdf0e10cSrcweir using namespace beans; 65cdf0e10cSrcweir using namespace document; 66cdf0e10cSrcweir using namespace ::sf_misc; 67cdf0e10cSrcweir 68cdf0e10cSrcweir // component helper namespace 69cdf0e10cSrcweir namespace comp_DialogModelProvider 70cdf0e10cSrcweir { 71cdf0e10cSrcweir _getImplementationName()72cdf0e10cSrcweir ::rtl::OUString SAL_CALL _getImplementationName() 73cdf0e10cSrcweir { 74cdf0e10cSrcweir return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.scripting.DialogModelProvider")); 75cdf0e10cSrcweir } 76cdf0e10cSrcweir _getSupportedServiceNames()77cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames() 78cdf0e10cSrcweir { 79cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > s(1); 80cdf0e10cSrcweir s[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.UnoControlDialogModelProvider")); 81cdf0e10cSrcweir return s; 82cdf0e10cSrcweir } 83cdf0e10cSrcweir _create(const uno::Reference<uno::XComponentContext> & context)84cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL _create(const uno::Reference< uno::XComponentContext > & context) SAL_THROW((uno::Exception)) 85cdf0e10cSrcweir { 86cdf0e10cSrcweir return static_cast< ::cppu::OWeakObject * >(new dlgprov::DialogModelProvider(context)); 87cdf0e10cSrcweir } 88cdf0e10cSrcweir } // closing component helper namespace 89cdf0e10cSrcweir //......................................................................... 90cdf0e10cSrcweir namespace dlgprov 91cdf0e10cSrcweir { 92cdf0e10cSrcweir //......................................................................... 93cdf0e10cSrcweir 94cdf0e10cSrcweir static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAscii( "ResourceResolver" ); 95cdf0e10cSrcweir lcl_getStringResourceManager(const Reference<XComponentContext> & i_xContext,const::rtl::OUString & i_sURL)96cdf0e10cSrcweir Reference< resource::XStringResourceManager > lcl_getStringResourceManager(const Reference< XComponentContext >& i_xContext,const ::rtl::OUString& i_sURL) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir INetURLObject aInetObj( i_sURL ); 99cdf0e10cSrcweir ::rtl::OUString aDlgName = aInetObj.GetBase(); 100cdf0e10cSrcweir aInetObj.removeSegment(); 101cdf0e10cSrcweir ::rtl::OUString aDlgLocation = aInetObj.GetMainURL( INetURLObject::NO_DECODE ); 102cdf0e10cSrcweir bool bReadOnly = true; 103cdf0e10cSrcweir ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); 104cdf0e10cSrcweir ::rtl::OUString aComment; 105cdf0e10cSrcweir 106cdf0e10cSrcweir Sequence<Any> aArgs( 6 ); 107cdf0e10cSrcweir aArgs[0] <<= aDlgLocation; 108cdf0e10cSrcweir aArgs[1] <<= bReadOnly; 109cdf0e10cSrcweir aArgs[2] <<= aLocale; 110cdf0e10cSrcweir aArgs[3] <<= aDlgName; 111cdf0e10cSrcweir aArgs[4] <<= aComment; 112cdf0e10cSrcweir 113cdf0e10cSrcweir Reference< task::XInteractionHandler > xDummyHandler; 114cdf0e10cSrcweir aArgs[5] <<= xDummyHandler; 115cdf0e10cSrcweir Reference< XMultiComponentFactory > xSMgr_( i_xContext->getServiceManager(), UNO_QUERY_THROW ); 116cdf0e10cSrcweir // TODO: Ctor 117cdf0e10cSrcweir Reference< resource::XStringResourceManager > xStringResourceManager( xSMgr_->createInstanceWithContext 118cdf0e10cSrcweir ( ::rtl::OUString::createFromAscii( "com.sun.star.resource.StringResourceWithLocation" ), 119cdf0e10cSrcweir i_xContext ), UNO_QUERY ); 120cdf0e10cSrcweir if( xStringResourceManager.is() ) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir Reference< XInitialization > xInit( xStringResourceManager, UNO_QUERY ); 123cdf0e10cSrcweir if( xInit.is() ) 124cdf0e10cSrcweir xInit->initialize( aArgs ); 125cdf0e10cSrcweir } 126cdf0e10cSrcweir return xStringResourceManager; 127cdf0e10cSrcweir } lcl_createControlModel(const Reference<XComponentContext> & i_xContext)128cdf0e10cSrcweir Reference< container::XNameContainer > lcl_createControlModel(const Reference< XComponentContext >& i_xContext) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir Reference< XMultiComponentFactory > xSMgr_( i_xContext->getServiceManager(), UNO_QUERY_THROW ); 131cdf0e10cSrcweir Reference< container::XNameContainer > xControlModel( xSMgr_->createInstanceWithContext( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ), i_xContext ), UNO_QUERY_THROW ); 132cdf0e10cSrcweir return xControlModel; 133cdf0e10cSrcweir } lcl_createDialogModel(const Reference<XComponentContext> & i_xContext,const Reference<io::XInputStream> & xInput,const Reference<resource::XStringResourceManager> & xStringResourceManager,const Any & aDialogSourceURL)134cdf0e10cSrcweir Reference< container::XNameContainer > lcl_createDialogModel( const Reference< XComponentContext >& i_xContext, 135cdf0e10cSrcweir const Reference< io::XInputStream >& xInput, 136cdf0e10cSrcweir const Reference< resource::XStringResourceManager >& xStringResourceManager, 137cdf0e10cSrcweir const Any &aDialogSourceURL) throw ( Exception ) 138cdf0e10cSrcweir { 139cdf0e10cSrcweir Reference< container::XNameContainer > xDialogModel( lcl_createControlModel(i_xContext) ); 140cdf0e10cSrcweir 141cdf0e10cSrcweir ::rtl::OUString aDlgSrcUrlPropName( RTL_CONSTASCII_USTRINGPARAM( "DialogSourceURL" ) ); 142cdf0e10cSrcweir Reference< beans::XPropertySet > xDlgPropSet( xDialogModel, UNO_QUERY ); 143cdf0e10cSrcweir xDlgPropSet->setPropertyValue( aDlgSrcUrlPropName, aDialogSourceURL ); 144cdf0e10cSrcweir 145cdf0e10cSrcweir ::xmlscript::importDialogModel( xInput, xDialogModel, i_xContext ); 146cdf0e10cSrcweir // Set resource property 147cdf0e10cSrcweir if( xStringResourceManager.is() ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir Reference< beans::XPropertySet > xDlgPSet( xDialogModel, UNO_QUERY ); 150cdf0e10cSrcweir Any aStringResourceManagerAny; 151cdf0e10cSrcweir aStringResourceManagerAny <<= xStringResourceManager; 152cdf0e10cSrcweir xDlgPSet->setPropertyValue( aResourceResolverPropName, aStringResourceManagerAny ); 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir return xDialogModel; 156cdf0e10cSrcweir } 157cdf0e10cSrcweir // ============================================================================= 158cdf0e10cSrcweir // component operations 159cdf0e10cSrcweir // ============================================================================= 160cdf0e10cSrcweir getImplementationName_DialogProviderImpl()161cdf0e10cSrcweir static ::rtl::OUString getImplementationName_DialogProviderImpl() 162cdf0e10cSrcweir { 163cdf0e10cSrcweir static ::rtl::OUString* pImplName = 0; 164cdf0e10cSrcweir if ( !pImplName ) 165cdf0e10cSrcweir { 166cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 167cdf0e10cSrcweir if ( !pImplName ) 168cdf0e10cSrcweir { 169cdf0e10cSrcweir static ::rtl::OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.DialogProvider" ) ); 170cdf0e10cSrcweir pImplName = &aImplName; 171cdf0e10cSrcweir } 172cdf0e10cSrcweir } 173cdf0e10cSrcweir return *pImplName; 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir // ----------------------------------------------------------------------------- 177cdf0e10cSrcweir getSupportedServiceNames_DialogProviderImpl()178cdf0e10cSrcweir static Sequence< ::rtl::OUString > getSupportedServiceNames_DialogProviderImpl() 179cdf0e10cSrcweir { 180cdf0e10cSrcweir static Sequence< ::rtl::OUString >* pNames = 0; 181cdf0e10cSrcweir if ( !pNames ) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 184cdf0e10cSrcweir if ( !pNames ) 185cdf0e10cSrcweir { 186cdf0e10cSrcweir static Sequence< ::rtl::OUString > aNames(3); 187cdf0e10cSrcweir aNames.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.DialogProvider" ) ); 188cdf0e10cSrcweir aNames.getArray()[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.DialogProvider2" ) ); 189cdf0e10cSrcweir aNames.getArray()[2] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.ContainerWindowProvider" ) ); 190cdf0e10cSrcweir pNames = &aNames; 191cdf0e10cSrcweir } 192cdf0e10cSrcweir } 193cdf0e10cSrcweir return *pNames; 194cdf0e10cSrcweir } 195cdf0e10cSrcweir 196cdf0e10cSrcweir 197cdf0e10cSrcweir // ============================================================================= 198cdf0e10cSrcweir // mutex 199cdf0e10cSrcweir // ============================================================================= 200cdf0e10cSrcweir getMutex()201cdf0e10cSrcweir ::osl::Mutex& getMutex() 202cdf0e10cSrcweir { 203cdf0e10cSrcweir static ::osl::Mutex* s_pMutex = 0; 204cdf0e10cSrcweir if ( !s_pMutex ) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 207cdf0e10cSrcweir if ( !s_pMutex ) 208cdf0e10cSrcweir { 209cdf0e10cSrcweir static ::osl::Mutex s_aMutex; 210cdf0e10cSrcweir s_pMutex = &s_aMutex; 211cdf0e10cSrcweir } 212cdf0e10cSrcweir } 213cdf0e10cSrcweir return *s_pMutex; 214cdf0e10cSrcweir } 215cdf0e10cSrcweir 216cdf0e10cSrcweir 217cdf0e10cSrcweir // ============================================================================= 218cdf0e10cSrcweir // DialogProviderImpl 219cdf0e10cSrcweir // ============================================================================= 220cdf0e10cSrcweir DialogProviderImpl(const Reference<XComponentContext> & rxContext)221cdf0e10cSrcweir DialogProviderImpl::DialogProviderImpl( const Reference< XComponentContext >& rxContext ) 222cdf0e10cSrcweir :m_xContext( rxContext ) 223cdf0e10cSrcweir ,m_xModel( 0 ) 224cdf0e10cSrcweir { 225cdf0e10cSrcweir } 226cdf0e10cSrcweir 227cdf0e10cSrcweir // ----------------------------------------------------------------------------- 228cdf0e10cSrcweir ~DialogProviderImpl()229cdf0e10cSrcweir DialogProviderImpl::~DialogProviderImpl() 230cdf0e10cSrcweir { 231cdf0e10cSrcweir } 232cdf0e10cSrcweir 233cdf0e10cSrcweir // ----------------------------------------------------------------------------- 234cdf0e10cSrcweir getStringResourceFromDialogLibrary(Reference<container::XNameContainer> xDialogLib)235cdf0e10cSrcweir Reference< resource::XStringResourceManager > getStringResourceFromDialogLibrary 236cdf0e10cSrcweir ( Reference< container::XNameContainer > xDialogLib ) 237cdf0e10cSrcweir { 238cdf0e10cSrcweir Reference< resource::XStringResourceManager > xStringResourceManager; 239cdf0e10cSrcweir if( xDialogLib.is() ) 240cdf0e10cSrcweir { 241cdf0e10cSrcweir Reference< resource::XStringResourceSupplier > xStringResourceSupplier( xDialogLib, UNO_QUERY ); 242cdf0e10cSrcweir if( xStringResourceSupplier.is() ) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir Reference< resource::XStringResourceResolver > 245cdf0e10cSrcweir xStringResourceResolver = xStringResourceSupplier->getStringResource(); 246cdf0e10cSrcweir 247cdf0e10cSrcweir xStringResourceManager = 248cdf0e10cSrcweir Reference< resource::XStringResourceManager >( xStringResourceResolver, UNO_QUERY ); 249cdf0e10cSrcweir } 250cdf0e10cSrcweir } 251cdf0e10cSrcweir return xStringResourceManager; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir createControlModel()254cdf0e10cSrcweir Reference< container::XNameContainer > DialogProviderImpl::createControlModel() throw ( Exception ) 255cdf0e10cSrcweir { 256cdf0e10cSrcweir return lcl_createControlModel(m_xContext); 257cdf0e10cSrcweir } 258cdf0e10cSrcweir createDialogModel(const Reference<io::XInputStream> & xInput,const Reference<resource::XStringResourceManager> & xStringResourceManager,const Any & aDialogSourceURL)259cdf0e10cSrcweir Reference< container::XNameContainer > DialogProviderImpl::createDialogModel( 260cdf0e10cSrcweir const Reference< io::XInputStream >& xInput, 261cdf0e10cSrcweir const Reference< resource::XStringResourceManager >& xStringResourceManager, 262cdf0e10cSrcweir const Any &aDialogSourceURL) throw ( Exception ) 263cdf0e10cSrcweir { 264cdf0e10cSrcweir 265cdf0e10cSrcweir 266cdf0e10cSrcweir return lcl_createDialogModel(m_xContext,xInput,xStringResourceManager,aDialogSourceURL); 267cdf0e10cSrcweir } 268cdf0e10cSrcweir createDialogModelForBasic()269cdf0e10cSrcweir Reference< XControlModel > DialogProviderImpl::createDialogModelForBasic() throw ( Exception ) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir if ( !m_BasicInfo.get() ) 272cdf0e10cSrcweir // shouln't get here 273cdf0e10cSrcweir throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("No information to create dialog" ) ), Reference< XInterface >() ); 274cdf0e10cSrcweir Reference< resource::XStringResourceManager > xStringResourceManager = getStringResourceFromDialogLibrary( m_BasicInfo->mxDlgLib ); 275cdf0e10cSrcweir 276cdf0e10cSrcweir rtl::OUString aURL(RTL_CONSTASCII_USTRINGPARAM("" )); 277cdf0e10cSrcweir Any aDialogSourceURL; 278cdf0e10cSrcweir aDialogSourceURL <<= aURL; 279cdf0e10cSrcweir Reference< XControlModel > xCtrlModel( createDialogModel( m_BasicInfo->mxInput, xStringResourceManager, aDialogSourceURL ), UNO_QUERY_THROW ); 280cdf0e10cSrcweir return xCtrlModel; 281cdf0e10cSrcweir } 282cdf0e10cSrcweir createDialogModel(const::rtl::OUString & sURL)283cdf0e10cSrcweir Reference< XControlModel > DialogProviderImpl::createDialogModel( const ::rtl::OUString& sURL ) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir 286cdf0e10cSrcweir ::rtl::OUString aURL( sURL ); 287cdf0e10cSrcweir 288cdf0e10cSrcweir // parse URL 289cdf0e10cSrcweir // TODO: use URL parsing class 290cdf0e10cSrcweir // TODO: decoding of location 291cdf0e10cSrcweir Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY ); 292cdf0e10cSrcweir 293cdf0e10cSrcweir if ( !xSMgr.is() ) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir throw RuntimeException( 296cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::getDialogModel: Couldn't instantiate MultiComponent factory" ) ), 297cdf0e10cSrcweir Reference< XInterface >() ); 298cdf0e10cSrcweir } 299cdf0e10cSrcweir 300cdf0e10cSrcweir Reference< uri::XUriReferenceFactory > xFac ( 301cdf0e10cSrcweir xSMgr->createInstanceWithContext( rtl::OUString::createFromAscii( 302cdf0e10cSrcweir "com.sun.star.uri.UriReferenceFactory"), m_xContext ) , UNO_QUERY ); 303cdf0e10cSrcweir 304cdf0e10cSrcweir if ( !xFac.is() ) 305cdf0e10cSrcweir { 306cdf0e10cSrcweir throw RuntimeException( 307cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "DialogProviderImpl::getDialogModel(), could not instatiate UriReferenceFactory." ), 308cdf0e10cSrcweir Reference< XInterface >() ); 309cdf0e10cSrcweir } 310cdf0e10cSrcweir 311cdf0e10cSrcweir // i75778: Support non-script URLs 312cdf0e10cSrcweir Reference< io::XInputStream > xInput; 313cdf0e10cSrcweir Reference< container::XNameContainer > xDialogLib; 314cdf0e10cSrcweir 315cdf0e10cSrcweir // Accept file URL to single dialog 316cdf0e10cSrcweir bool bSingleDialog = false; 317cdf0e10cSrcweir 318cdf0e10cSrcweir Reference< util::XMacroExpander > xMacroExpander( 319cdf0e10cSrcweir m_xContext->getValueByName( 320cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "/singletons/com.sun.star.util.theMacroExpander" ) ), 321cdf0e10cSrcweir UNO_QUERY_THROW ); 322cdf0e10cSrcweir 323cdf0e10cSrcweir Reference< uri::XUriReference > uriRef; 324cdf0e10cSrcweir for (;;) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir uriRef = Reference< uri::XUriReference >( xFac->parse( aURL ), UNO_QUERY ); 327cdf0e10cSrcweir if ( !uriRef.is() ) 328cdf0e10cSrcweir { 329cdf0e10cSrcweir ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "DialogProviderImpl::getDialogModel: failed to parse URI: " ); 330cdf0e10cSrcweir errorMsg += aURL; 331cdf0e10cSrcweir throw IllegalArgumentException( errorMsg, 332cdf0e10cSrcweir Reference< XInterface >(), 1 ); 333cdf0e10cSrcweir } 334cdf0e10cSrcweir Reference < uri::XVndSunStarExpandUrl > sxUri( uriRef, UNO_QUERY ); 335cdf0e10cSrcweir if( !sxUri.is() ) 336cdf0e10cSrcweir break; 337cdf0e10cSrcweir 338cdf0e10cSrcweir aURL = sxUri->expand( xMacroExpander ); 339cdf0e10cSrcweir } 340cdf0e10cSrcweir 341cdf0e10cSrcweir Reference < uri::XVndSunStarScriptUrl > sfUri( uriRef, UNO_QUERY ); 342cdf0e10cSrcweir if( !sfUri.is() ) 343cdf0e10cSrcweir { 344cdf0e10cSrcweir bSingleDialog = true; 345cdf0e10cSrcweir 346cdf0e10cSrcweir // Try any other URL with SimpleFileAccess 347cdf0e10cSrcweir Reference< ucb::XSimpleFileAccess > xSFI = 348cdf0e10cSrcweir Reference< ucb::XSimpleFileAccess >( xSMgr->createInstanceWithContext 349cdf0e10cSrcweir ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ), UNO_QUERY ); 350cdf0e10cSrcweir 351cdf0e10cSrcweir try 352cdf0e10cSrcweir { 353cdf0e10cSrcweir xInput = xSFI->openFileRead( aURL ); 354cdf0e10cSrcweir } 355cdf0e10cSrcweir catch( Exception& ) 356cdf0e10cSrcweir {} 357cdf0e10cSrcweir } 358cdf0e10cSrcweir else 359cdf0e10cSrcweir { 360cdf0e10cSrcweir ::rtl::OUString sDescription = sfUri->getName(); 361cdf0e10cSrcweir 362cdf0e10cSrcweir sal_Int32 nIndex = 0; 363cdf0e10cSrcweir 364cdf0e10cSrcweir ::rtl::OUString sLibName = sDescription.getToken( 0, (sal_Unicode)'.', nIndex ); 365cdf0e10cSrcweir ::rtl::OUString sDlgName; 366cdf0e10cSrcweir if ( nIndex != -1 ) 367cdf0e10cSrcweir sDlgName = sDescription.getToken( 0, (sal_Unicode)'.', nIndex ); 368cdf0e10cSrcweir 369cdf0e10cSrcweir ::rtl::OUString sLocation = sfUri->getParameter( 370cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "location" ) ); 371cdf0e10cSrcweir 372cdf0e10cSrcweir 373cdf0e10cSrcweir // get dialog library container 374cdf0e10cSrcweir // TODO: dialogs in packages 375cdf0e10cSrcweir Reference< XLibraryContainer > xLibContainer; 376cdf0e10cSrcweir 377cdf0e10cSrcweir if ( sLocation == ::rtl::OUString::createFromAscii( "application" ) ) 378cdf0e10cSrcweir { 379cdf0e10cSrcweir xLibContainer = Reference< XLibraryContainer >( SFX_APP()->GetDialogContainer(), UNO_QUERY ); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir else if ( sLocation == ::rtl::OUString::createFromAscii( "document" ) ) 382cdf0e10cSrcweir { 383cdf0e10cSrcweir Reference< XEmbeddedScripts > xDocumentScripts( m_xModel, UNO_QUERY ); 384cdf0e10cSrcweir if ( xDocumentScripts.is() ) 385cdf0e10cSrcweir { 386cdf0e10cSrcweir xLibContainer.set( xDocumentScripts->getDialogLibraries(), UNO_QUERY ); 387cdf0e10cSrcweir OSL_ENSURE( xLibContainer.is(), 388cdf0e10cSrcweir "DialogProviderImpl::createDialogModel: invalid dialog container!" ); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir } 391cdf0e10cSrcweir else 392cdf0e10cSrcweir { 393cdf0e10cSrcweir Sequence< ::rtl::OUString > aOpenDocsTdocURLs( MiscUtils::allOpenTDocUrls( m_xContext ) ); 394cdf0e10cSrcweir const ::rtl::OUString* pTdocURL = aOpenDocsTdocURLs.getConstArray(); 395cdf0e10cSrcweir const ::rtl::OUString* pTdocURLEnd = aOpenDocsTdocURLs.getConstArray() + aOpenDocsTdocURLs.getLength(); 396cdf0e10cSrcweir for ( ; pTdocURL != pTdocURLEnd; ++pTdocURL ) 397cdf0e10cSrcweir { 398cdf0e10cSrcweir Reference< frame::XModel > xModel( MiscUtils::tDocUrlToModel( *pTdocURL ) ); 399cdf0e10cSrcweir OSL_ENSURE( xModel.is(), "DialogProviderImpl::createDialogModel: invalid document model!" ); 400cdf0e10cSrcweir if ( !xModel.is() ) 401cdf0e10cSrcweir continue; 402cdf0e10cSrcweir 403cdf0e10cSrcweir ::rtl::OUString sDocURL = xModel->getURL(); 404cdf0e10cSrcweir if ( sDocURL.getLength() == 0 ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir ::comphelper::NamedValueCollection aModelArgs( xModel->getArgs() ); 407cdf0e10cSrcweir sDocURL = aModelArgs.getOrDefault( "Title", sDocURL ); 408cdf0e10cSrcweir } 409cdf0e10cSrcweir 410cdf0e10cSrcweir if ( sLocation != sDocURL ) 411cdf0e10cSrcweir continue; 412cdf0e10cSrcweir 413cdf0e10cSrcweir Reference< XEmbeddedScripts > xDocumentScripts( m_xModel, UNO_QUERY ); 414cdf0e10cSrcweir if ( !xDocumentScripts.is() ) 415cdf0e10cSrcweir continue; 416cdf0e10cSrcweir 417cdf0e10cSrcweir xLibContainer.set( xDocumentScripts->getDialogLibraries(), UNO_QUERY ); 418cdf0e10cSrcweir OSL_ENSURE( xLibContainer.is(), 419cdf0e10cSrcweir "DialogProviderImpl::createDialogModel: invalid dialog container!" ); 420cdf0e10cSrcweir } 421cdf0e10cSrcweir } 422cdf0e10cSrcweir 423cdf0e10cSrcweir // get input stream provider 424cdf0e10cSrcweir Reference< io::XInputStreamProvider > xISP; 425cdf0e10cSrcweir if ( xLibContainer.is() ) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir // load dialog library 428cdf0e10cSrcweir if ( !xLibContainer->isLibraryLoaded( sLibName ) ) 429cdf0e10cSrcweir xLibContainer->loadLibrary( sLibName ); 430cdf0e10cSrcweir 431cdf0e10cSrcweir // get dialog library 432cdf0e10cSrcweir if ( xLibContainer->hasByName( sLibName ) ) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir Any aElement = xLibContainer->getByName( sLibName ); 435cdf0e10cSrcweir aElement >>= xDialogLib; 436cdf0e10cSrcweir } 437cdf0e10cSrcweir 438cdf0e10cSrcweir if ( xDialogLib.is() ) 439cdf0e10cSrcweir { 440cdf0e10cSrcweir // get input stream provider 441cdf0e10cSrcweir if ( xDialogLib->hasByName( sDlgName ) ) 442cdf0e10cSrcweir { 443cdf0e10cSrcweir Any aElement = xDialogLib->getByName( sDlgName ); 444cdf0e10cSrcweir aElement >>= xISP; 445cdf0e10cSrcweir } 446cdf0e10cSrcweir 447cdf0e10cSrcweir if ( !xISP.is() ) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir throw IllegalArgumentException( 450cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::getDialogModel: dialog not found!" ) ), 451cdf0e10cSrcweir Reference< XInterface >(), 1 ); 452cdf0e10cSrcweir } 453cdf0e10cSrcweir } 454cdf0e10cSrcweir else 455cdf0e10cSrcweir { 456cdf0e10cSrcweir throw IllegalArgumentException( 457cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::getDialogModel: library not found!" ) ), 458cdf0e10cSrcweir Reference< XInterface >(), 1 ); 459cdf0e10cSrcweir } 460cdf0e10cSrcweir } 461cdf0e10cSrcweir else 462cdf0e10cSrcweir { 463cdf0e10cSrcweir throw IllegalArgumentException( 464cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::getDialog: library container not found!" ) ), 465cdf0e10cSrcweir Reference< XInterface >(), 1 ); 466cdf0e10cSrcweir } 467cdf0e10cSrcweir 468cdf0e10cSrcweir if ( xISP.is() ) 469cdf0e10cSrcweir xInput = xISP->createInputStream(); 470cdf0e10cSrcweir } 471cdf0e10cSrcweir 472cdf0e10cSrcweir // import dialog model 473cdf0e10cSrcweir Reference< XControlModel > xCtrlModel; 474cdf0e10cSrcweir if ( xInput.is() && m_xContext.is() ) 475cdf0e10cSrcweir { 476cdf0e10cSrcweir Reference< resource::XStringResourceManager > xStringResourceManager; 477cdf0e10cSrcweir if( bSingleDialog ) 478cdf0e10cSrcweir { 479cdf0e10cSrcweir xStringResourceManager = lcl_getStringResourceManager(m_xContext,aURL); 480cdf0e10cSrcweir } 481cdf0e10cSrcweir else if( xDialogLib.is() ) 482cdf0e10cSrcweir { 483cdf0e10cSrcweir xStringResourceManager = getStringResourceFromDialogLibrary( xDialogLib ); 484cdf0e10cSrcweir } 485cdf0e10cSrcweir 486cdf0e10cSrcweir Any aDialogSourceURLAny; 487cdf0e10cSrcweir aDialogSourceURLAny <<= aURL; 488cdf0e10cSrcweir 489cdf0e10cSrcweir Reference< container::XNameContainer > xDialogModel( createDialogModel( xInput , xStringResourceManager, aDialogSourceURLAny ), UNO_QUERY_THROW); 490cdf0e10cSrcweir 491cdf0e10cSrcweir xCtrlModel = Reference< XControlModel >( xDialogModel, UNO_QUERY ); 492cdf0e10cSrcweir } 493cdf0e10cSrcweir return xCtrlModel; 494cdf0e10cSrcweir } 495cdf0e10cSrcweir 496cdf0e10cSrcweir // ----------------------------------------------------------------------------- 497cdf0e10cSrcweir createDialogControl(const Reference<XControlModel> & rxDialogModel,const Reference<XWindowPeer> & xParent)498cdf0e10cSrcweir Reference< XControl > DialogProviderImpl::createDialogControl 499cdf0e10cSrcweir ( const Reference< XControlModel >& rxDialogModel, const Reference< XWindowPeer >& xParent ) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir OSL_ENSURE( rxDialogModel.is(), "DialogProviderImpl::getDialogControl: no dialog model" ); 502cdf0e10cSrcweir 503cdf0e10cSrcweir Reference< XControl > xDialogControl; 504cdf0e10cSrcweir 505cdf0e10cSrcweir if ( m_xContext.is() ) 506cdf0e10cSrcweir { 507cdf0e10cSrcweir Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager() ); 508cdf0e10cSrcweir 509cdf0e10cSrcweir if ( xSMgr.is() ) 510cdf0e10cSrcweir { 511cdf0e10cSrcweir xDialogControl = Reference< XControl >( xSMgr->createInstanceWithContext( 512cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialog" ) ), m_xContext ), UNO_QUERY ); 513cdf0e10cSrcweir 514cdf0e10cSrcweir if ( xDialogControl.is() ) 515cdf0e10cSrcweir { 516cdf0e10cSrcweir // set the model 517cdf0e10cSrcweir if ( rxDialogModel.is() ) 518cdf0e10cSrcweir xDialogControl->setModel( rxDialogModel ); 519cdf0e10cSrcweir 520cdf0e10cSrcweir // set visible 521cdf0e10cSrcweir Reference< XWindow > xW( xDialogControl, UNO_QUERY ); 522cdf0e10cSrcweir if ( xW.is() ) 523cdf0e10cSrcweir xW->setVisible( sal_False ); 524cdf0e10cSrcweir 525cdf0e10cSrcweir // get the parent of the dialog control 526cdf0e10cSrcweir Reference< XWindowPeer > xPeer; 527cdf0e10cSrcweir if( xParent.is() ) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir xPeer = xParent; 530cdf0e10cSrcweir } 531cdf0e10cSrcweir else if ( m_xModel.is() ) 532cdf0e10cSrcweir { 533cdf0e10cSrcweir Reference< frame::XController > xController( m_xModel->getCurrentController(), UNO_QUERY ); 534cdf0e10cSrcweir if ( xController.is() ) 535cdf0e10cSrcweir { 536cdf0e10cSrcweir Reference< frame::XFrame > xFrame( xController->getFrame(), UNO_QUERY ); 537cdf0e10cSrcweir if ( xFrame.is() ) 538cdf0e10cSrcweir xPeer = Reference< XWindowPeer>( xFrame->getContainerWindow(), UNO_QUERY ); 539cdf0e10cSrcweir } 540cdf0e10cSrcweir } 541cdf0e10cSrcweir 542cdf0e10cSrcweir // create a peer 543cdf0e10cSrcweir Reference< XToolkit> xToolkit( xSMgr->createInstanceWithContext( 544cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.Toolkit" ) ), m_xContext ), UNO_QUERY ); 545cdf0e10cSrcweir if ( xToolkit.is() ) 546cdf0e10cSrcweir xDialogControl->createPeer( xToolkit, xPeer ); 547cdf0e10cSrcweir } 548cdf0e10cSrcweir } 549cdf0e10cSrcweir } 550cdf0e10cSrcweir 551cdf0e10cSrcweir return xDialogControl; 552cdf0e10cSrcweir } 553cdf0e10cSrcweir 554cdf0e10cSrcweir // ----------------------------------------------------------------------------- 555cdf0e10cSrcweir attachControlEvents(const Reference<XControl> & rxControl,const Reference<XInterface> & rxHandler,const Reference<XIntrospectionAccess> & rxIntrospectionAccess,bool bDialogProviderMode)556cdf0e10cSrcweir void DialogProviderImpl::attachControlEvents( 557cdf0e10cSrcweir const Reference< XControl >& rxControl, 558cdf0e10cSrcweir const Reference< XInterface >& rxHandler, 559cdf0e10cSrcweir const Reference< XIntrospectionAccess >& rxIntrospectionAccess, 560cdf0e10cSrcweir bool bDialogProviderMode ) 561cdf0e10cSrcweir { 562cdf0e10cSrcweir if ( rxControl.is() ) 563cdf0e10cSrcweir { 564cdf0e10cSrcweir Reference< XControlContainer > xControlContainer( rxControl, UNO_QUERY ); 565cdf0e10cSrcweir 566cdf0e10cSrcweir if ( xControlContainer.is() ) 567cdf0e10cSrcweir { 568cdf0e10cSrcweir Sequence< Reference< XControl > > aControls = xControlContainer->getControls(); 569cdf0e10cSrcweir const Reference< XControl >* pControls = aControls.getConstArray(); 570cdf0e10cSrcweir sal_Int32 nControlCount = aControls.getLength(); 571cdf0e10cSrcweir 572cdf0e10cSrcweir Sequence< Reference< XInterface > > aObjects( nControlCount + 1 ); 573cdf0e10cSrcweir Reference< XInterface >* pObjects = aObjects.getArray(); 574cdf0e10cSrcweir for ( sal_Int32 i = 0; i < nControlCount; ++i ) 575cdf0e10cSrcweir { 576cdf0e10cSrcweir pObjects[i] = Reference< XInterface >( pControls[i], UNO_QUERY ); 577cdf0e10cSrcweir } 578cdf0e10cSrcweir 579cdf0e10cSrcweir // also add the dialog control itself to the sequence 580cdf0e10cSrcweir pObjects[nControlCount] = Reference< XInterface >( rxControl, UNO_QUERY ); 581cdf0e10cSrcweir 582cdf0e10cSrcweir Reference< XScriptEventsAttacher > xScriptEventsAttacher = new DialogEventsAttacherImpl 583cdf0e10cSrcweir ( m_xContext, m_xModel, rxControl, rxHandler, rxIntrospectionAccess, 584cdf0e10cSrcweir bDialogProviderMode, ( m_BasicInfo.get() ? m_BasicInfo->mxBasicRTLListener : NULL ) ); 585cdf0e10cSrcweir 586cdf0e10cSrcweir Any aHelper; 587cdf0e10cSrcweir xScriptEventsAttacher->attachEvents( aObjects, Reference< XScriptListener >(), aHelper ); 588cdf0e10cSrcweir } 589cdf0e10cSrcweir } 590cdf0e10cSrcweir } 591cdf0e10cSrcweir inspectHandler(const Reference<XInterface> & rxHandler)592cdf0e10cSrcweir Reference< XIntrospectionAccess > DialogProviderImpl::inspectHandler( const Reference< XInterface >& rxHandler ) 593cdf0e10cSrcweir { 594cdf0e10cSrcweir Reference< XIntrospectionAccess > xIntrospectionAccess; 595cdf0e10cSrcweir static Reference< XIntrospection > xIntrospection; 596cdf0e10cSrcweir 597cdf0e10cSrcweir if( !rxHandler.is() ) 598cdf0e10cSrcweir return xIntrospectionAccess; 599cdf0e10cSrcweir 600cdf0e10cSrcweir if( !xIntrospection.is() ) 601cdf0e10cSrcweir { 602cdf0e10cSrcweir Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY ); 603cdf0e10cSrcweir if ( !xSMgr.is() ) 604cdf0e10cSrcweir { 605cdf0e10cSrcweir throw RuntimeException( 606cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::getIntrospectionAccess: Couldn't instantiate MultiComponent factory" ) ), 607cdf0e10cSrcweir Reference< XInterface >() ); 608cdf0e10cSrcweir } 609cdf0e10cSrcweir 610cdf0e10cSrcweir // Get introspection service 611cdf0e10cSrcweir Reference< XInterface > xI = xSMgr->createInstanceWithContext 612cdf0e10cSrcweir ( rtl::OUString::createFromAscii("com.sun.star.beans.Introspection"), m_xContext ); 613cdf0e10cSrcweir if (xI.is()) 614cdf0e10cSrcweir xIntrospection = Reference< XIntrospection >::query( xI ); 615cdf0e10cSrcweir } 616cdf0e10cSrcweir 617cdf0e10cSrcweir if( xIntrospection.is() ) 618cdf0e10cSrcweir { 619cdf0e10cSrcweir // Do introspection 620cdf0e10cSrcweir try 621cdf0e10cSrcweir { 622cdf0e10cSrcweir Any aHandlerAny; 623cdf0e10cSrcweir aHandlerAny <<= rxHandler; 624cdf0e10cSrcweir xIntrospectionAccess = xIntrospection->inspect( aHandlerAny ); 625cdf0e10cSrcweir } 626cdf0e10cSrcweir catch( RuntimeException& ) 627cdf0e10cSrcweir { 628cdf0e10cSrcweir xIntrospectionAccess.clear(); 629cdf0e10cSrcweir } 630cdf0e10cSrcweir } 631cdf0e10cSrcweir return xIntrospectionAccess; 632cdf0e10cSrcweir } 633cdf0e10cSrcweir 634cdf0e10cSrcweir 635cdf0e10cSrcweir // ----------------------------------------------------------------------------- 636cdf0e10cSrcweir // XServiceInfo 637cdf0e10cSrcweir // ----------------------------------------------------------------------------- 638cdf0e10cSrcweir getImplementationName()639cdf0e10cSrcweir ::rtl::OUString DialogProviderImpl::getImplementationName( ) throw (RuntimeException) 640cdf0e10cSrcweir { 641cdf0e10cSrcweir return getImplementationName_DialogProviderImpl(); 642cdf0e10cSrcweir } 643cdf0e10cSrcweir 644cdf0e10cSrcweir // ----------------------------------------------------------------------------- 645cdf0e10cSrcweir supportsService(const::rtl::OUString & rServiceName)646cdf0e10cSrcweir sal_Bool DialogProviderImpl::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException) 647cdf0e10cSrcweir { 648cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() ); 649cdf0e10cSrcweir const ::rtl::OUString* pNames = aNames.getConstArray(); 650cdf0e10cSrcweir const ::rtl::OUString* pEnd = pNames + aNames.getLength(); 651cdf0e10cSrcweir for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames ) 652cdf0e10cSrcweir ; 653cdf0e10cSrcweir 654cdf0e10cSrcweir return pNames != pEnd; 655cdf0e10cSrcweir } 656cdf0e10cSrcweir 657cdf0e10cSrcweir // ----------------------------------------------------------------------------- 658cdf0e10cSrcweir getSupportedServiceNames()659cdf0e10cSrcweir Sequence< ::rtl::OUString > DialogProviderImpl::getSupportedServiceNames( ) throw (RuntimeException) 660cdf0e10cSrcweir { 661cdf0e10cSrcweir return getSupportedServiceNames_DialogProviderImpl(); 662cdf0e10cSrcweir } 663cdf0e10cSrcweir 664cdf0e10cSrcweir // ----------------------------------------------------------------------------- 665cdf0e10cSrcweir // XInitialization 666cdf0e10cSrcweir // ----------------------------------------------------------------------------- 667cdf0e10cSrcweir initialize(const Sequence<Any> & aArguments)668cdf0e10cSrcweir void DialogProviderImpl::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException) 669cdf0e10cSrcweir { 670cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 671cdf0e10cSrcweir 672cdf0e10cSrcweir if ( aArguments.getLength() == 1 ) 673cdf0e10cSrcweir { 674cdf0e10cSrcweir aArguments[0] >>= m_xModel; 675cdf0e10cSrcweir 676cdf0e10cSrcweir if ( !m_xModel.is() ) 677cdf0e10cSrcweir { 678cdf0e10cSrcweir throw RuntimeException( 679cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::initialize: invalid argument format!" ) ), 680cdf0e10cSrcweir Reference< XInterface >() ); 681cdf0e10cSrcweir } 682cdf0e10cSrcweir } 683cdf0e10cSrcweir else if ( aArguments.getLength() == 4 ) 684cdf0e10cSrcweir { 685cdf0e10cSrcweir // call from RTL_Impl_CreateUnoDialog 686cdf0e10cSrcweir aArguments[0] >>= m_xModel; 687cdf0e10cSrcweir m_BasicInfo.reset( new BasicRTLParams() ); 688cdf0e10cSrcweir m_BasicInfo->mxInput.set( aArguments[ 1 ], UNO_QUERY_THROW ); 689cdf0e10cSrcweir m_BasicInfo->mxDlgLib.set( aArguments[ 2 ], UNO_QUERY_THROW ); 690cdf0e10cSrcweir // leave the possibility to optionally allow the old dialog creation 691cdf0e10cSrcweir // to use the new XScriptListener ( which converts the old style macro 692cdf0e10cSrcweir // to a SF url ) 693cdf0e10cSrcweir m_BasicInfo->mxBasicRTLListener.set( aArguments[ 3 ], UNO_QUERY); 694cdf0e10cSrcweir } 695cdf0e10cSrcweir else if ( aArguments.getLength() > 4 ) 696cdf0e10cSrcweir { 697cdf0e10cSrcweir throw RuntimeException( 698cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::initialize: invalid number of arguments!" ) ), 699cdf0e10cSrcweir Reference< XInterface >() ); 700cdf0e10cSrcweir } 701cdf0e10cSrcweir } 702cdf0e10cSrcweir 703cdf0e10cSrcweir // ----------------------------------------------------------------------------- 704cdf0e10cSrcweir // XDialogProvider 705cdf0e10cSrcweir // ----------------------------------------------------------------------------- 706cdf0e10cSrcweir 707cdf0e10cSrcweir static ::rtl::OUString aDecorationPropName = 708cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "Decoration" ); 709cdf0e10cSrcweir static ::rtl::OUString aTitlePropName = 710cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "Title" ); 711cdf0e10cSrcweir createDialogImpl(const::rtl::OUString & URL,const Reference<XInterface> & xHandler,const Reference<XWindowPeer> & xParent,bool bDialogProviderMode)712cdf0e10cSrcweir Reference < XControl > DialogProviderImpl::createDialogImpl( 713cdf0e10cSrcweir const ::rtl::OUString& URL, const Reference< XInterface >& xHandler, 714cdf0e10cSrcweir const Reference< XWindowPeer >& xParent, bool bDialogProviderMode ) 715cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 716cdf0e10cSrcweir { 717cdf0e10cSrcweir // if the dialog is located in a document, the document must already be open! 718cdf0e10cSrcweir 719cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 720cdf0e10cSrcweir 721cdf0e10cSrcweir 722cdf0e10cSrcweir // m_xHandler = xHandler; 723cdf0e10cSrcweir 724cdf0e10cSrcweir //Reference< XDialog > xDialog; 725cdf0e10cSrcweir Reference< XControl > xCtrl; 726cdf0e10cSrcweir Reference< XControlModel > xCtrlMod; 727cdf0e10cSrcweir try 728cdf0e10cSrcweir { 729cdf0e10cSrcweir // add support for basic RTL_FUNCTION 730cdf0e10cSrcweir if ( m_BasicInfo.get() ) 731cdf0e10cSrcweir xCtrlMod = createDialogModelForBasic(); 732cdf0e10cSrcweir else 733cdf0e10cSrcweir { 734cdf0e10cSrcweir OSL_ENSURE( URL.getLength(), "DialogProviderImpl::getDialog: no URL!" ); 735cdf0e10cSrcweir xCtrlMod = createDialogModel( URL ); 736cdf0e10cSrcweir } 737cdf0e10cSrcweir } 738cdf0e10cSrcweir catch ( const RuntimeException& ) { throw; } 739cdf0e10cSrcweir catch ( const Exception& ) 740cdf0e10cSrcweir { 741cdf0e10cSrcweir const Any aError( ::cppu::getCaughtException() ); 742cdf0e10cSrcweir throw WrappedTargetRuntimeException( ::rtl::OUString(), *this, aError ); 743cdf0e10cSrcweir } 744cdf0e10cSrcweir if ( xCtrlMod.is() ) 745cdf0e10cSrcweir { 746cdf0e10cSrcweir // i83963 Force decoration 747cdf0e10cSrcweir if( bDialogProviderMode ) 748cdf0e10cSrcweir { 749cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xDlgModPropSet( xCtrlMod, uno::UNO_QUERY ); 750cdf0e10cSrcweir if( xDlgModPropSet.is() ) 751cdf0e10cSrcweir { 752cdf0e10cSrcweir bool bDecoration = true; 753cdf0e10cSrcweir try 754cdf0e10cSrcweir { 755cdf0e10cSrcweir Any aDecorationAny = xDlgModPropSet->getPropertyValue( aDecorationPropName ); 756cdf0e10cSrcweir aDecorationAny >>= bDecoration; 757cdf0e10cSrcweir if( !bDecoration ) 758cdf0e10cSrcweir { 759cdf0e10cSrcweir xDlgModPropSet->setPropertyValue( aDecorationPropName, makeAny( true ) ); 760cdf0e10cSrcweir xDlgModPropSet->setPropertyValue( aTitlePropName, makeAny( ::rtl::OUString() ) ); 761cdf0e10cSrcweir } 762cdf0e10cSrcweir } 763cdf0e10cSrcweir catch( UnknownPropertyException& ) 764cdf0e10cSrcweir {} 765cdf0e10cSrcweir } 766cdf0e10cSrcweir } 767cdf0e10cSrcweir 768cdf0e10cSrcweir xCtrl = Reference< XControl >( createDialogControl( xCtrlMod, xParent ) ); 769cdf0e10cSrcweir if ( xCtrl.is() ) 770cdf0e10cSrcweir { 771cdf0e10cSrcweir //xDialog = Reference< XDialog >( xCtrl, UNO_QUERY ); 772cdf0e10cSrcweir Reference< XIntrospectionAccess > xIntrospectionAccess = inspectHandler( xHandler ); 773cdf0e10cSrcweir attachControlEvents( xCtrl, xHandler, xIntrospectionAccess, bDialogProviderMode ); 774cdf0e10cSrcweir } 775cdf0e10cSrcweir } 776cdf0e10cSrcweir 777cdf0e10cSrcweir return xCtrl; 778cdf0e10cSrcweir } 779cdf0e10cSrcweir createDialog(const::rtl::OUString & URL)780cdf0e10cSrcweir Reference < XDialog > DialogProviderImpl::createDialog( const ::rtl::OUString& URL ) 781cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 782cdf0e10cSrcweir { 783cdf0e10cSrcweir Reference< XInterface > xDummyHandler; 784cdf0e10cSrcweir Reference< XWindowPeer > xDummyPeer; 785cdf0e10cSrcweir Reference < XControl > xControl = DialogProviderImpl::createDialogImpl( URL, xDummyHandler, xDummyPeer, true ); 786cdf0e10cSrcweir Reference< XDialog > xDialog( xControl, UNO_QUERY ); 787cdf0e10cSrcweir return xDialog; 788cdf0e10cSrcweir } 789cdf0e10cSrcweir createDialogWithHandler(const::rtl::OUString & URL,const Reference<XInterface> & xHandler)790cdf0e10cSrcweir Reference < XDialog > DialogProviderImpl::createDialogWithHandler( 791cdf0e10cSrcweir const ::rtl::OUString& URL, const Reference< XInterface >& xHandler ) 792cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 793cdf0e10cSrcweir { 794cdf0e10cSrcweir if( !xHandler.is() ) 795cdf0e10cSrcweir { 796cdf0e10cSrcweir throw IllegalArgumentException( 797cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::createDialogWithHandler: Invalid xHandler!" ) ), 798cdf0e10cSrcweir Reference< XInterface >(), 1 ); 799cdf0e10cSrcweir } 800cdf0e10cSrcweir Reference< XWindowPeer > xDummyPeer; 801cdf0e10cSrcweir Reference < XControl > xControl = DialogProviderImpl::createDialogImpl( URL, xHandler, xDummyPeer, true ); 802cdf0e10cSrcweir Reference< XDialog > xDialog( xControl, UNO_QUERY ); 803cdf0e10cSrcweir return xDialog; 804cdf0e10cSrcweir } 805cdf0e10cSrcweir createDialogWithArguments(const::rtl::OUString & URL,const Sequence<NamedValue> & Arguments)806cdf0e10cSrcweir Reference < XDialog > DialogProviderImpl::createDialogWithArguments( 807cdf0e10cSrcweir const ::rtl::OUString& URL, const Sequence< NamedValue >& Arguments ) 808cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 809cdf0e10cSrcweir { 810cdf0e10cSrcweir ::comphelper::NamedValueCollection aArguments( Arguments ); 811cdf0e10cSrcweir 812cdf0e10cSrcweir Reference< XWindowPeer > xParentPeer; 813cdf0e10cSrcweir if ( aArguments.has( "ParentWindow" ) ) 814cdf0e10cSrcweir { 815cdf0e10cSrcweir const Any aParentWindow( aArguments.get( "ParentWindow" ) ); 816cdf0e10cSrcweir if ( !( aParentWindow >>= xParentPeer ) ) 817cdf0e10cSrcweir { 818cdf0e10cSrcweir const Reference< XControl > xParentControl( aParentWindow, UNO_QUERY ); 819cdf0e10cSrcweir if ( xParentControl.is() ) 820cdf0e10cSrcweir xParentPeer = xParentControl->getPeer(); 821cdf0e10cSrcweir } 822cdf0e10cSrcweir } 823cdf0e10cSrcweir 824cdf0e10cSrcweir const Reference< XInterface > xHandler( aArguments.get( "EventHandler" ), UNO_QUERY ); 825cdf0e10cSrcweir 826cdf0e10cSrcweir Reference < XControl > xControl = DialogProviderImpl::createDialogImpl( URL, xHandler, xParentPeer, true ); 827cdf0e10cSrcweir Reference< XDialog > xDialog( xControl, UNO_QUERY ); 828cdf0e10cSrcweir return xDialog; 829cdf0e10cSrcweir } 830cdf0e10cSrcweir createContainerWindow(const::rtl::OUString & URL,const::rtl::OUString & WindowType,const Reference<XWindowPeer> & xParent,const Reference<XInterface> & xHandler)831cdf0e10cSrcweir Reference< XWindow > DialogProviderImpl::createContainerWindow( 832cdf0e10cSrcweir const ::rtl::OUString& URL, const ::rtl::OUString& WindowType, 833cdf0e10cSrcweir const Reference< XWindowPeer >& xParent, const Reference< XInterface >& xHandler ) 834cdf0e10cSrcweir throw (lang::IllegalArgumentException, RuntimeException) 835cdf0e10cSrcweir { 836cdf0e10cSrcweir (void)WindowType; // for future use 837cdf0e10cSrcweir if( !xParent.is() ) 838cdf0e10cSrcweir { 839cdf0e10cSrcweir throw IllegalArgumentException( 840cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogProviderImpl::createContainerWindow: Invalid xParent!" ) ), 841cdf0e10cSrcweir Reference< XInterface >(), 1 ); 842cdf0e10cSrcweir } 843cdf0e10cSrcweir Reference < XControl > xControl = DialogProviderImpl::createDialogImpl( URL, xHandler, xParent, false ); 844cdf0e10cSrcweir Reference< XWindow> xWindow( xControl, UNO_QUERY ); 845cdf0e10cSrcweir return xWindow; 846cdf0e10cSrcweir } 847cdf0e10cSrcweir 848cdf0e10cSrcweir 849cdf0e10cSrcweir // ============================================================================= 850cdf0e10cSrcweir // component operations 851cdf0e10cSrcweir // ============================================================================= 852cdf0e10cSrcweir create_DialogProviderImpl(Reference<XComponentContext> const & xContext)853cdf0e10cSrcweir static Reference< XInterface > SAL_CALL create_DialogProviderImpl( 854cdf0e10cSrcweir Reference< XComponentContext > const & xContext ) 855cdf0e10cSrcweir SAL_THROW( () ) 856cdf0e10cSrcweir { 857cdf0e10cSrcweir return static_cast< lang::XTypeProvider * >( new DialogProviderImpl( xContext ) ); 858cdf0e10cSrcweir } 859cdf0e10cSrcweir 860cdf0e10cSrcweir // ----------------------------------------------------------------------------- 861cdf0e10cSrcweir 862cdf0e10cSrcweir static struct ::cppu::ImplementationEntry s_component_entries [] = 863cdf0e10cSrcweir { 864cdf0e10cSrcweir {create_DialogProviderImpl, getImplementationName_DialogProviderImpl,getSupportedServiceNames_DialogProviderImpl, ::cppu::createSingleComponentFactory,0, 0}, 865cdf0e10cSrcweir { &comp_DialogModelProvider::_create,&comp_DialogModelProvider::_getImplementationName,&comp_DialogModelProvider::_getSupportedServiceNames,&::cppu::createSingleComponentFactory, 0, 0 }, 866cdf0e10cSrcweir { 0, 0, 0, 0, 0, 0 } 867cdf0e10cSrcweir }; 868cdf0e10cSrcweir 869cdf0e10cSrcweir // ----------------------------------------------------------------------------- 870cdf0e10cSrcweir 871cdf0e10cSrcweir //......................................................................... 872cdf0e10cSrcweir } // namespace dlgprov 873cdf0e10cSrcweir //......................................................................... 874cdf0e10cSrcweir 875cdf0e10cSrcweir 876cdf0e10cSrcweir // ============================================================================= 877cdf0e10cSrcweir // component exports 878cdf0e10cSrcweir // ============================================================================= 879cdf0e10cSrcweir 880cdf0e10cSrcweir extern "C" 881cdf0e10cSrcweir { component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment ** ppEnv)882cdf0e10cSrcweir void SAL_CALL component_getImplementationEnvironment( 883cdf0e10cSrcweir const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv ) 884cdf0e10cSrcweir { 885cdf0e10cSrcweir (void)ppEnv; 886cdf0e10cSrcweir 887cdf0e10cSrcweir *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 888cdf0e10cSrcweir } 889cdf0e10cSrcweir component_getFactory(const sal_Char * pImplName,lang::XMultiServiceFactory * pServiceManager,registry::XRegistryKey * pRegistryKey)890cdf0e10cSrcweir void * SAL_CALL component_getFactory( 891cdf0e10cSrcweir const sal_Char * pImplName, lang::XMultiServiceFactory * pServiceManager, 892cdf0e10cSrcweir registry::XRegistryKey * pRegistryKey ) 893cdf0e10cSrcweir { 894cdf0e10cSrcweir return ::cppu::component_getFactoryHelper( 895cdf0e10cSrcweir pImplName, pServiceManager, pRegistryKey, ::dlgprov::s_component_entries ); 896cdf0e10cSrcweir } 897cdf0e10cSrcweir } 898