24#include <com/sun/star/awt/XControlContainer.hpp>
25#include <com/sun/star/awt/XControl.hpp>
26#include <com/sun/star/awt/DialogProvider.hpp>
27#include <com/sun/star/beans/XPropertySet.hpp>
28#include <com/sun/star/container/XEnumerationAccess.hpp>
29#include <com/sun/star/container/XNameContainer.hpp>
30#include <com/sun/star/frame/XModel.hpp>
31#include <com/sun/star/frame/Desktop.hpp>
32#include <com/sun/star/script/XLibraryContainer.hpp>
33#include <com/sun/star/script/provider/theMasterScriptProviderFactory.hpp>
34#include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
35#include <com/sun/star/script/provider/XScriptProvider.hpp>
36#include <com/sun/star/io/XInputStreamProvider.hpp>
64using namespace ::
cppu;
68void SFURL_firing_impl(
const ScriptEvent& aScriptEvent, Any* pRet,
const Reference< frame::XModel >& xModel )
70 SAL_INFO(
"basic",
"Processing script url " << aScriptEvent.ScriptCode);
73 Reference< provider::XScriptProvider > xScriptProvider;
76 Reference< provider::XScriptProviderSupplier > xSupplier( xModel, UNO_QUERY );
77 OSL_ENSURE( xSupplier.is(),
"SFURL_firing_impl: failed to get script provider supplier" );
79 xScriptProvider.set( xSupplier->getScriptProvider() );
83 Reference< XComponentContext > xContext(
85 Reference< provider::XScriptProviderFactory >
xFactory =
86 provider::theMasterScriptProviderFactory::get( xContext );
89 aCtx <<= OUString(
"user");
90 xScriptProvider =
xFactory->createScriptProvider( aCtx );
93 if ( !xScriptProvider.is() )
95 SAL_INFO(
"basic",
"Failed to create msp");
98 Sequence< Any > inArgs( 0 );
99 Sequence< Any > outArgs( 0 );
100 Sequence< sal_Int16 > outIndex;
103 inArgs = aScriptEvent.Arguments;
105 Reference< provider::XScript > xScript = xScriptProvider->getScript( aScriptEvent.ScriptCode );
109 SAL_INFO(
"basic",
"Failed to Failed to obtain XScript");
113 Any result = xScript->invoke( inArgs, outIndex, outArgs );
123 catch (
const Exception& )
131class BasicScriptListener_Impl :
public WeakImplHelper< XScriptListener >
134 Reference< frame::XModel >
m_xModel;
136 void firing_impl(
const ScriptEvent& aScriptEvent, Any* pRet);
139 BasicScriptListener_Impl(
StarBASIC* pBasic,
const Reference< frame::XModel >& xModel )
143 virtual void SAL_CALL firing(
const ScriptEvent& aScriptEvent)
override;
144 virtual Any SAL_CALL approveFiring(
const ScriptEvent& aScriptEvent)
override;
147 virtual void SAL_CALL disposing(
const EventObject& Source)
override;
151void BasicScriptListener_Impl::firing(
const ScriptEvent& aScriptEvent )
155 firing_impl( aScriptEvent,
nullptr );
158Any BasicScriptListener_Impl::approveFiring(
const ScriptEvent& aScriptEvent )
163 firing_impl( aScriptEvent, &aRetAny );
168void BasicScriptListener_Impl::disposing(
const EventObject& )
176void BasicScriptListener_Impl::firing_impl(
const ScriptEvent& aScriptEvent, Any* pRet )
178 if( aScriptEvent.ScriptType ==
"StarBasic" )
181 OUString aMacro( aScriptEvent.ScriptCode );
187 std::u16string_view aFullLibName =
o3tl::getToken(aMacro, 0,
'.', nLast );
189 size_t nIndex = aFullLibName.find(
':' );
190 if (nIndex != std::u16string_view::npos)
192 aLocation = aFullLibName.substr( 0, nIndex );
193 aLibName = aFullLibName.substr( nIndex + 1 );
196 aMacro = aMacro.copy( nLast );
208 xAppStandardBasic =
static_cast<StarBASIC*
>(pParentParent);
209 xDocStandardBasic =
static_cast<StarBASIC*
>(pParent);
213 OUString
aName =
p->GetName();
214 if( aName ==
"Standard" )
217 xDocStandardBasic =
static_cast<StarBASIC*
>(
p);
219 xAppStandardBasic =
static_cast<StarBASIC*
>(pParent);
223 xAppStandardBasic =
static_cast<StarBASIC*
>(
p);
226 bool bSearchLib =
true;
228 if( aLocation ==
"application" )
230 xLibSearchBasic = xAppStandardBasic;
232 else if( aLocation ==
"document" )
234 xLibSearchBasic = xDocStandardBasic;
242 if( bSearchLib && xLibSearchBasic.
is() )
244 sal_Int32
nCount = xLibSearchBasic->GetObjects()->Count();
245 for( sal_Int32 nObj = -1; nObj <
nCount ; nObj++ )
250 pBasic = xLibSearchBasic.
get();
254 SbxVariable* pVar = xLibSearchBasic->GetObjects()->Get(nObj);
255 pBasic =
dynamic_cast<StarBASIC*
>( pVar );
260 if( aName == aLibName )
274 if( (!pMethVar ||
dynamic_cast<const SbMethod*
>( pMethVar) ==
nullptr) && maBasicRef.is() )
285 sal_Int32 nCnt = aScriptEvent.Arguments.getLength();
289 const Any *pArgs = aScriptEvent.Arguments.getConstArray();
290 for( sal_Int32 i = 0;
i < nCnt;
i++ )
294 xArray->Put(xVar.
get(), sal::static_int_cast<sal_uInt32>(i + 1));
314 SFURL_firing_impl( aScriptEvent, pRet, m_xModel );
318css::uno::Reference< css::container::XNameContainer > implFindDialogLibForDialog(
const Any& rDlgAny,
SbxObject* pBasic )
320 css::uno::Reference< css::container::XNameContainer > aRetDlgLib;
323 if(
auto pDlgLibContUnoObj =
dynamic_cast<SbUnoObject*
>( pDlgLibContVar) )
325 Any aDlgLibContAny = pDlgLibContUnoObj->getUnoAny();
327 Reference< XLibraryContainer > xDlgLibContNameAccess( aDlgLibContAny, UNO_QUERY );
328 OSL_ENSURE( xDlgLibContNameAccess.is(),
"implFindDialogLibForDialog: no lib container for the given dialog!" );
329 if( xDlgLibContNameAccess.is() )
331 Sequence< OUString > aLibNames = xDlgLibContNameAccess->getElementNames();
332 const OUString* pLibNames = aLibNames.getConstArray();
333 sal_Int32 nLibNameCount = aLibNames.getLength();
335 for( sal_Int32 iLib = 0 ; iLib < nLibNameCount ; iLib++ )
337 if ( !xDlgLibContNameAccess->isLibraryLoaded( pLibNames[ iLib ] ) )
341 Any aDlgLibAny = xDlgLibContNameAccess->getByName( pLibNames[ iLib ] );
343 Reference< XNameContainer > xDlgLibNameCont( aDlgLibAny, UNO_QUERY );
344 OSL_ENSURE( xDlgLibNameCont.is(),
"implFindDialogLibForDialog: invalid dialog lib!" );
345 if( xDlgLibNameCont.is() )
347 Sequence< OUString > aDlgNames = xDlgLibNameCont->getElementNames();
348 const OUString* pDlgNames = aDlgNames.getConstArray();
349 sal_Int32 nDlgNameCount = aDlgNames.getLength();
351 for( sal_Int32 iDlg = 0 ; iDlg < nDlgNameCount ; iDlg++ )
353 Any aDlgAny = xDlgLibNameCont->getByName( pDlgNames[ iDlg ] );
354 if( aDlgAny == rDlgAny )
356 aRetDlgLib = xDlgLibNameCont;
368css::uno::Reference< css::container::XNameContainer > implFindDialogLibForDialogBasic(
const Any& aAnyISP,
SbxObject* pBasic,
StarBASIC*& pFoundBasic )
370 css::uno::Reference< css::container::XNameContainer > aDlgLib;
378 if( pParentParentBasic )
380 pSearchBasic1 = pParentBasic;
381 pSearchBasic2 = pParentParentBasic;
385 pSearchBasic1 = pStartedBasic;
386 pSearchBasic2 = pParentBasic;
390 aDlgLib = implFindDialogLibForDialog( aAnyISP, pSearchBasic1 );
393 pFoundBasic =
static_cast<StarBASIC*
>(pSearchBasic1);
395 else if( pSearchBasic2 )
397 aDlgLib = implFindDialogLibForDialog( aAnyISP, pSearchBasic2 );
399 pFoundBasic =
static_cast<StarBASIC*
>(pSearchBasic2);
412 if (rPar.
Count() < 2)
427 TypeClass
eType = aAnyISP.getValueType().getTypeClass();
429 if(
eType != TypeClass_INTERFACE )
436 Reference< XNameContainer > xDialogModel( xContext->getServiceManager()->createInstanceWithContext(
437 "com.sun.star.awt.UnoControlDialogModel", xContext), UNO_QUERY );
438 if( !xDialogModel.is() )
442 Reference< XInputStreamProvider > xISP;
450 Reference< XInputStream > xInput( xISP->createInputStream() );
453 uno::Reference< beans::XPropertySet > xDlgModPropSet( xDialogModel, uno::UNO_QUERY );
454 if( xDlgModPropSet.is() )
458 bool bDecoration =
true;
461 aDecorationAny >>= bDecoration;
465 xDlgModPropSet->setPropertyValue(
"Title",
Any( OUString() ) );
468 catch(
const UnknownPropertyException& )
472 css::uno::Reference< css::container::XNameContainer > aDlgLib;
473 bool bDocDialog =
false;
475 SAL_INFO(
"basic",
"About to try get a hold of ThisComponent");
477 aDlgLib = implFindDialogLibForDialogBasic( aAnyISP,
GetSbData()->pInst->GetBasic(), pFoundBasic );
481 Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create( xContext );
482 Reference< container::XEnumeration > xModels;
483 Reference< container::XEnumerationAccess > xComponents = xDesktop->getComponents();
484 if ( xComponents.is() )
486 xModels = xComponents->createEnumeration();
490 while ( xModels->hasMoreElements() )
492 Reference< frame::XModel > xNextModel( xModels->nextElement(), UNO_QUERY );
493 if ( xNextModel.is() )
498 aDlgLib = implFindDialogLibForDialogBasic( aAnyISP, pMgr->
GetLib(0), pFoundBasic );
514 Reference< XScriptListener > xScriptListener =
new BasicScriptListener_Impl(
GetSbData()->pInst->GetBasic(),
xModel );
517 Reference< XControl > xCntrl;
520 Reference< XDialogProvider > xDlgProv;
522 xDlgProv = css::awt::DialogProvider::createWithModelAndScripting( xContext,
xModel, xInput, aDlgLib, xScriptListener );
524 xDlgProv = css::awt::DialogProvider::createWithModelAndScripting( xContext, uno::Reference< frame::XModel >(), xInput, aDlgLib, xScriptListener );
526 xCntrl.set( xDlgProv->createDialog(OUString() ), UNO_QUERY_THROW );
528 Reference< XComponent > xDlgComponent( xCntrl->getModel(), UNO_QUERY );
536 catch(
const uno::Exception& )
StarBASIC * GetLib(sal_uInt16 nLib) const
ErrCode Call(SbxValue *pRet, SbxVariable *pCaller=nullptr)
css::uno::Any getUnoAny()
ComponentVector_t & getComponentVector()
SbxVariable * Get(sal_uInt32)
void SetFlags(SbxFlagBits n)
SbxFlagBits GetFlags() const
void ResetFlag(SbxFlagBits n)
virtual SbxVariable * Find(const OUString &, SbxClassType)
SbxBase * GetObject() const
const SbxObject * GetParent() const
void SetParameters(SbxArray *p)
const OUString & GetName(SbxNameType=SbxNameType::NONE) const
virtual SbxVariable * Find(const OUString &, SbxClassType) override
static css::uno::Reference< css::frame::XModel > GetModelFromBasic(SbxObject *pBasic)
static void Error(ErrCode, const OUString &rMsg={})
static BasicManager * getDocumentBasicManager(const css::uno::Reference< css::frame::XModel > &_rxDocumentModel)
returns the BasicManager belonging to the given document
#define TOOLS_INFO_EXCEPTION(area, stream)
Reference< frame::XModel > m_xModel
void RTL_Impl_CreateUnoDialog(SbxArray &rPar)
Reference< XSingleServiceFactory > xFactory
#define SAL_INFO(area, stream)
constexpr OUStringLiteral aDecorationPropName
sal_Int32 getTokenCount(std::string_view rIn, char cTok)
Reference< XComponentContext > getProcessComponentContext()
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
#define ERRCODE_BASIC_BAD_ARGUMENT
void unoToSbxValue(SbxVariable *pVar, const Any &aValue)
Any sbxToUnoValue(const SbxValue *pVar)
Reference< XModel > xModel