23#include <com/sun/star/beans/XPropertySet.hpp>
24#include <com/sun/star/container/XIndexAccess.hpp>
25#include <com/sun/star/lang/XMultiComponentFactory.hpp>
26#include <com/sun/star/frame/XLayoutManager.hpp>
27#include <com/sun/star/awt/XWindow2.hpp>
31#include <tools/datetime.hxx>
46#include <unordered_map>
53typedef ::std::pair< OUString, ::std::pair< double, double > >
VbaTimerInfo;
64 VbaTimer() : m_aTimer(
"VbaTimer")
72 VbaTimer(
const VbaTimer&) =
delete;
73 VbaTimer& operator=(
const VbaTimer&) =
delete;
75 static double GetNow()
78 Date aRefDate(1899'12'30);
82 return static_cast<double>(nDiffDays) +
static_cast<double>(nDiffSeconds)/double(24*3600);
85 static sal_Int32 GetTimerMilliseconds(
double nFrom,
double nTo )
87 double nResult = nTo - nFrom;
89 nResult *= 24*3600*1000;
93 return static_cast<sal_Int32
>(nResult);
96 void Start( const ::rtl::Reference< VbaApplicationBase >& xBase,
const OUString& aFunction,
double nFrom,
double nTo )
98 if ( !xBase.is() || aFunction.isEmpty() )
99 throw uno::RuntimeException(
"Unexpected arguments!" );
102 m_aTimerInfo =
VbaTimerInfo( aFunction, ::std::pair< double, double >( nFrom, nTo ) );
104 m_aTimer.
SetTimeout( GetTimerMilliseconds( GetNow(), nFrom ) );
115 if ( m_aTimerInfo.second.second == 0 || GetNow() < m_aTimerInfo.second.second )
120 m_xBase->Run( m_aTimerInfo.first, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg );
122 catch( uno::Exception& )
129 m_xBase->OnTime(
uno::Any( m_aTimerInfo.second.first ), m_aTimerInfo.first,
uno::Any( m_aTimerInfo.second.second ),
uno::Any(
false ) );
130 }
catch( uno::Exception& )
136struct VbaTimerInfoHash
138 size_t operator()(
const VbaTimerInfo& rTimerInfo )
const
140 std::size_t seed = 0;
150typedef std::unordered_map< VbaTimerInfo, std::unique_ptr<VbaTimer>, VbaTimerInfoHash >
VbaTimerHashMap;
177 return !
xModel->hasControllersLocked();
185 ::basic::vba::lockControllersOfAllDocuments(
xModel, !bUpdate );
192 uno::Reference< frame::XFrame >
xFrame(
xModel->getCurrentController()->getFrame(), uno::UNO_SET_THROW );
193 uno::Reference< beans::XPropertySet > xProps(
xFrame, uno::UNO_QUERY_THROW );
195 uno::Reference< frame::XLayoutManager > xLayoutManager( xProps->getPropertyValue(
"LayoutManager"), uno::UNO_QUERY_THROW );
196 if( xLayoutManager->isElementVisible(
"private:resource/statusbar/statusbar" ) ){
206 uno::Reference< frame::XFrame >
xFrame(
xModel->getCurrentController()->getFrame(), uno::UNO_SET_THROW );
207 uno::Reference< beans::XPropertySet > xProps(
xFrame, uno::UNO_QUERY_THROW );
209 uno::Reference< frame::XLayoutManager > xLayoutManager( xProps->getPropertyValue(
"LayoutManager" ), uno::UNO_QUERY_THROW );
210 OUString url(
"private:resource/statusbar/statusbar" );
211 if( bDisplayStatusBar && !xLayoutManager->isElementVisible( url ) ){
212 if( !xLayoutManager->showElement( url ) )
213 xLayoutManager->createElement( url );
216 else if( !bDisplayStatusBar && xLayoutManager->isElementVisible( url ) ){
217 xLayoutManager->hideElement( url );
228 uno::Reference< frame::XController >
xController(
xModel->getCurrentController() );
236 uno::Reference< awt::XWindow2 > xWindow(
xFrame->getContainerWindow(), uno::UNO_QUERY );
240 return xWindow->isEnabled();
247 ::basic::vba::enableContainerWindowsOfAllDocuments(
xModel, bInteractive );
274 uno::Reference< frame::XFrame >
xFrame(
xModel->getCurrentController()->getFrame(), uno::UNO_SET_THROW );
290 uno::Reference< frame::XFrame >
xFrame(
xModel->getCurrentController()->getFrame(), uno::UNO_SET_THROW );
291 xFrame->setName( sCaption );
301 uno::Reference< frame::XModel >
xModel;
331uno::Any SAL_CALL
VbaApplicationBase::Run(
const OUString&
MacroName,
const uno::Any& varg1,
const uno::Any& varg2,
const uno::Any& varg3,
const uno::Any& varg4,
const uno::Any& varg5,
const uno::Any& varg6,
const uno::Any& varg7,
const uno::Any& varg8,
const uno::Any& varg9,
const uno::Any& varg10,
const uno::Any& varg11,
const uno::Any& varg12,
const uno::Any& varg13,
const uno::Any& varg14,
const uno::Any& varg15,
const uno::Any& varg16,
const uno::Any& varg17,
const uno::Any& varg18,
const uno::Any& varg19,
const uno::Any& varg20,
const uno::Any& varg21,
const uno::Any& varg22,
const uno::Any& varg23,
const uno::Any& varg24,
const uno::Any& varg25,
const uno::Any& varg26,
const uno::Any& varg27,
const uno::Any& varg28,
const uno::Any& varg29,
const uno::Any& varg30 )
334 if( aMacroName.startsWith(
"!") )
335 aMacroName =
o3tl::trim(aMacroName.subView(1));
337 uno::Reference< frame::XModel >
xModel;
350 if( !aMacroInfo.mbFound )
352 throw uno::RuntimeException(
"The macro doesn't exist" );
356 const uno::Any* aArgsPtrArray[] = { &varg1, &varg2, &varg3, &varg4, &varg5, &varg6, &varg7, &varg8, &varg9, &varg10, &varg11, &varg12, &varg13, &varg14, &varg15, &varg16, &varg17, &varg18, &varg19, &varg20, &varg21, &varg22, &varg23, &varg24, &varg25, &varg26, &varg27, &varg28, &varg29, &varg30 };
359 uno::Sequence< uno::Any > aArgs( nArg );
360 auto pArgs = aArgs.getArray();
362 const uno::Any** pArg = aArgsPtrArray;
363 const uno::Any** pArgEnd = aArgsPtrArray + nArg;
365 sal_Int32 nArgProcessed = 0;
367 for ( ; pArg != pArgEnd; ++pArg, ++nArgProcessed )
368 pArgs[ nArgProcessed ] = **pArg;
371 aArgs.realloc( nArgProcessed + 1 );
375 executeMacro( aMacroInfo.mpDocContext, aMacroInfo.msResolvedMacro, aArgs, aRet, aDummyCaller );
382 if ( aFunction.isEmpty() )
383 throw uno::RuntimeException(
"Unexpected function name!" );
385 double nEarliestTime = 0;
386 double nLatestTime = 0;
387 if ( !( aEarliestTime >>= nEarliestTime )
388 || ( aLatestTime.
hasValue() && !( aLatestTime >>= nLatestTime ) ) )
389 throw uno::RuntimeException(
"Only double is supported as time for now!" );
391 bool bSetTimer =
true;
392 aSchedule >>= bSetTimer;
394 VbaTimerInfo aTimerIndex( aFunction, ::std::pair< double, double >( nEarliestTime, nLatestTime ) );
396 VbaTimerHashMap::iterator aIter =
m_pImpl->m_aTimerHash.find( aTimerIndex );
397 if ( aIter !=
m_pImpl->m_aTimerHash.end() )
399 m_pImpl->m_aTimerHash.erase( aIter );
404 VbaTimer* pTimer =
new VbaTimer;
405 m_pImpl->m_aTimerHash[ aTimerIndex ].reset(pTimer);
406 pTimer->Start(
this, aFunction, nEarliestTime, nLatestTime );
416 uno::Reference< lang::XMultiComponentFactory > xServiceManager(
mxContext->getServiceManager(), uno::UNO_SET_THROW );
417 uno::Reference< uno::XInterface > xVBE = xServiceManager->createInstanceWithArgumentsAndContext(
418 "ooo.vba.vbide.VBE" , aArgs,
mxContext );
421 catch(
const uno::Exception& )
430 return "VbaApplicationBase";
433uno::Sequence<OUString>
438 "ooo.vba.VbaApplicationBase"
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
static AsyncQuitHandler & instance()
css::uno::Reference< css::uno::XComponentContext > mxContext
const SbxObject * GetParent() const
static css::uno::Reference< css::frame::XModel > GetModelFromBasic(SbxObject *pBasic)
static SbMethod * GetActiveMethod(sal_uInt16 nLevel=0)
void QuitAndExitApplication()
void SetTimeout(sal_uInt64 nTimeoutMs)
void SetInvokeHandler(const Link< Timer *, void > &rLink)
virtual void Start(bool bStartTimer=true) override
virtual css::uno::Any SAL_CALL CommandBars(const css::uno::Any &aIndex) override
virtual sal_Bool SAL_CALL getVisible() override
virtual void SAL_CALL setDisplayStatusBar(sal_Bool bDisplayStatusBar) override
virtual void SAL_CALL setInteractive(sal_Bool bInteractive) override
virtual css::uno::Any SAL_CALL getVBE() override
virtual void SAL_CALL setScreenUpdating(sal_Bool bUpdate) override
virtual sal_Bool SAL_CALL getDisplayStatusBar() override
virtual ~VbaApplicationBase() override
virtual void SAL_CALL OnKey(const OUString &Key, const css::uno::Any &Procedure) override
virtual OUString SAL_CALL getCaption() override
virtual css::uno::Reference< css::frame::XModel > getCurrentDocument()=0
virtual void SAL_CALL OnTime(const css::uno::Any &aEarliestTime, const OUString &aFunction, const css::uno::Any &aLatestTime, const css::uno::Any &aSchedule) override
virtual sal_Bool SAL_CALL getScreenUpdating() override
virtual sal_Bool SAL_CALL getInteractive() override
virtual void SAL_CALL Quit() override
virtual OUString getServiceImplName() override
std::unique_ptr< VbaApplicationBase_Impl > m_pImpl
virtual void SAL_CALL setCaption(const OUString &sCaption) override
VbaApplicationBase(const css::uno::Reference< css::uno::XComponentContext > &xContext)
virtual css::uno::Any SAL_CALL Run(const OUString &MacroName, const css::uno::Any &varg1, const css::uno::Any &varg2, const css::uno::Any &varg3, const css::uno::Any &varg4, const css::uno::Any &varg5, const css::uno::Any &varg6, const css::uno::Any &varg7, const css::uno::Any &varg8, const css::uno::Any &varg9, const css::uno::Any &varg10, const css::uno::Any &varg11, const css::uno::Any &varg12, const css::uno::Any &varg13, const css::uno::Any &varg14, const css::uno::Any &varg15, const css::uno::Any &varg16, const css::uno::Any &varg17, const css::uno::Any &varg18, const css::uno::Any &varg19, const css::uno::Any &varg20, const css::uno::Any &varg21, const css::uno::Any &varg22, const css::uno::Any &varg23, const css::uno::Any &varg24, const css::uno::Any &varg25, const css::uno::Any &varg26, const css::uno::Any &varg27, const css::uno::Any &varg28, const css::uno::Any &varg29, const css::uno::Any &varg30) override
virtual void SAL_CALL setVisible(sal_Bool bVisible) override
virtual OUString SAL_CALL getVersion() override
virtual void SAL_CALL Undo() override
virtual css::uno::Sequence< OUString > getServiceNames() override
DECL_LINK(CheckNameHdl, SvxNameDialog &, bool)
std::deque< AttacherIndex_Impl > aIndex
Sequence< OUString > aServiceNames
#define LINK(Instance, Class, Member)
#define SAL_N_ELEMENTS(arr)
std::enable_if_t<(sizeof(N)==4)> hash_combine(N &nSeed, T const *pValue, size_t nCount)
std::basic_string_view< charT, traits > trim(std::basic_string_view< charT, traits > str)
awt::KeyEvent parseKeyEvent(std::u16string_view Key)
bool executeMacro(SfxObjectShell *pShell, const OUString &sMacroName, uno::Sequence< uno::Any > &aArgs, uno::Any &aRet, const uno::Any &)
SfxObjectShell * getSfxObjShell(const uno::Reference< frame::XModel > &xModel)
void dispatchRequests(const uno::Reference< frame::XModel > &xModel, const OUString &aUrl, const uno::Sequence< beans::PropertyValue > &sProps)
OUString resolveVBAMacro(SfxObjectShell const *pShell, const OUString &rLibName, const OUString &rModuleName, const OUString &rMacroName, bool bOnlyPublic, const OUString &sSkipModule)
void applyShortCutKeyBinding(const uno::Reference< frame::XModel > &rxModel, const awt::KeyEvent &rKeyEvent, const OUString &rMacroName)
VbaApplicationBase_Impl()
VbaTimerHashMap m_aTimerHash
Reference< XController > xController
Reference< XFrame > xFrame
Reference< XModel > xModel
IMPL_LINK_NOARG(VbaTimer, MacroCallHdl, Timer *, void)
std::unordered_map< VbaTimerInfo, std::unique_ptr< VbaTimer >, VbaTimerInfoHash > VbaTimerHashMap
constexpr OUStringLiteral OFFICEVERSION
::std::pair< OUString, ::std::pair< double, double > > VbaTimerInfo