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