offapi/com/sun/star/script/vba/VBAEventId.idl | 5 +++++ sw/source/ui/vba/vbaeventshelper.cxx | 21 ++++++++++++++------- sw/source/uibase/app/docsh2.cxx | 9 ++++++--- 3 files changed, 25 insertions(+), 10 deletions(-)
New commits: commit 3d77fe0af515830001448fde0d394ef20a89002b Author: Justin Luth <justin.l...@collabora.com> AuthorDate: Thu Oct 6 19:35:21 2022 -0400 Commit: Justin Luth <jl...@mail.com> CommitDate: Sat Oct 8 16:14:05 2022 +0200 tdf#148806 doc vba: highest priority is ThisDocument AutoOpen Word has three ways of running events at doc open, although the two AutoOpen methods are exclusive. One is the special ThisDocument Document_open subroutine. Another is the AutoOpen subroutine, which is what this patch is about. It can exist in any module - first come first served (alphabetically) in doc - except that ThisDocument is checked first. [This is very different from Calc - which IGNORES these functions in ThisWorksheet.] //TODO: The subroutine must be public And finally, there can be an AutoOpen module with a Main subroutine. It is ignored if there is any AutoOpen subroutine. //TODO: fix the third way. I tried to create a unit test, but LO's Selection.TypeText always starts at position 0 for each call, unlike Word which also starts at position 0 for the first call, but then remembers where it left off. Change-Id: I4caf29eefd432c320b5acaf6210222f50a111e89 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141037 Tested-by: Justin Luth <jl...@mail.com> Reviewed-by: Justin Luth <jl...@mail.com> diff --git a/offapi/com/sun/star/script/vba/VBAEventId.idl b/offapi/com/sun/star/script/vba/VBAEventId.idl index 00989fccd053..00a524a1ef3b 100644 --- a/offapi/com/sun/star/script/vba/VBAEventId.idl +++ b/offapi/com/sun/star/script/vba/VBAEventId.idl @@ -58,6 +58,11 @@ constants VBAEventId const long DOCUMENT_OPEN = 1002; /** Document about to be closed. No arguments. */ const long DOCUMENT_CLOSE = 1003; + // auto* subroutines in ThisDocument have highest priority + const long DOCUMENT_AUTO_NEW = 1004; + const long DOCUMENT_AUTO_OPEN = 1005; + const long DOCUMENT_AUTO_CLOSE = 1006; + // MS Excel (identifiers from 2001 to 2999) diff --git a/sw/source/ui/vba/vbaeventshelper.cxx b/sw/source/ui/vba/vbaeventshelper.cxx index ccdb10548ca2..d083940106b5 100644 --- a/sw/source/ui/vba/vbaeventshelper.cxx +++ b/sw/source/ui/vba/vbaeventshelper.cxx @@ -32,10 +32,13 @@ SwVbaEventsHelper::SwVbaEventsHelper( uno::Sequence< css::uno::Any > const& aArg { using namespace ::com::sun::star::script::ModuleType; registerEventHandler( DOCUMENT_NEW, DOCUMENT, "Document_New" ); + registerEventHandler(DOCUMENT_AUTO_NEW, DOCUMENT, "AutoNew"); registerEventHandler( AUTO_NEW, NORMAL, "AutoNew" ); registerEventHandler( DOCUMENT_OPEN, DOCUMENT, "Document_Open" ); + registerEventHandler(DOCUMENT_AUTO_OPEN, DOCUMENT, "AutoOpen"); registerEventHandler( AUTO_OPEN, NORMAL, "AutoOpen" ); registerEventHandler( DOCUMENT_CLOSE, DOCUMENT, "Document_Close" ); + registerEventHandler(DOCUMENT_AUTO_CLOSE, DOCUMENT, "AutoClose"); registerEventHandler( AUTO_CLOSE, NORMAL, "AutoClose" ); } @@ -44,18 +47,22 @@ SwVbaEventsHelper::~SwVbaEventsHelper() } bool SwVbaEventsHelper::implPrepareEvent( EventQueue& rEventQueue, - const EventHandlerInfo& rInfo, const uno::Sequence< uno::Any >& /*rArgs*/ ) + const EventHandlerInfo& rInfo, const uno::Sequence< uno::Any >& rArgs) { switch( rInfo.mnEventId ) { - case AUTO_NEW: - rEventQueue.emplace_back(DOCUMENT_NEW); + case DOCUMENT_AUTO_NEW: + // Only one "AutoNew" subroutine can run. ThisDocument is highest priority. + if (!hasVbaEventHandler(rInfo.mnEventId, rArgs)) + rEventQueue.emplace_back(AUTO_NEW); break; - case AUTO_OPEN: - rEventQueue.emplace_back(DOCUMENT_OPEN); + case DOCUMENT_AUTO_OPEN: + if (!hasVbaEventHandler(rInfo.mnEventId, rArgs)) + rEventQueue.emplace_back(AUTO_OPEN); break; - case AUTO_CLOSE: - rEventQueue.emplace_back(DOCUMENT_CLOSE); + case DOCUMENT_AUTO_CLOSE: + if (!hasVbaEventHandler(rInfo.mnEventId, rArgs)) + rEventQueue.emplace_back(AUTO_CLOSE); break; } return true; diff --git a/sw/source/uibase/app/docsh2.cxx b/sw/source/uibase/app/docsh2.cxx index d9e1486e0e3a..51082a682c2d 100644 --- a/sw/source/uibase/app/docsh2.cxx +++ b/sw/source/uibase/app/docsh2.cxx @@ -221,10 +221,12 @@ static void lcl_processCompatibleSfxHint( const uno::Reference< script::vba::XVB switch( pSfxEventHint->GetEventId() ) { case SfxEventHintId::CreateDoc: - xVbaEvents->processVbaEvent(AUTO_NEW, aArgs); + xVbaEvents->processVbaEvent(DOCUMENT_AUTO_NEW, aArgs); + xVbaEvents->processVbaEvent(DOCUMENT_NEW, aArgs); break; case SfxEventHintId::OpenDoc: - xVbaEvents->processVbaEvent(AUTO_OPEN, aArgs); + xVbaEvents->processVbaEvent(DOCUMENT_AUTO_OPEN, aArgs); + xVbaEvents->processVbaEvent(DOCUMENT_OPEN, aArgs); break; default: break; } @@ -385,7 +387,8 @@ bool SwDocShell::PrepareClose( bool bUI ) { using namespace com::sun::star::script::vba::VBAEventId; uno::Sequence< uno::Any > aNoArgs; - xVbaEvents->processVbaEvent(AUTO_CLOSE, aNoArgs); + xVbaEvents->processVbaEvent(DOCUMENT_AUTO_CLOSE, aNoArgs); + xVbaEvents->processVbaEvent(DOCUMENT_CLOSE, aNoArgs); } } return bRet;