filter/source/msfilter/msvbahelper.cxx             |   13 ++++++----
 include/filter/msfilter/msvbahelper.hxx            |    3 +-
 vbahelper/source/vbahelper/vbaeventshelperbase.cxx |   25 +++++++++++++++++++--
 3 files changed, 33 insertions(+), 8 deletions(-)

New commits:
commit ffc15725b58d0988b4e2ed836c5751223ad00984
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Sat Oct 8 12:15:35 2022 -0400
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Tue Oct 11 20:39:04 2022 +0200

    tdf#148806 tdf#151393 xls vba: no Auto_Open from ThisWorksheet
    
    Unlike Word, ThisWorksheet cannot hold auto-running
    subroutines for Open/Close/New.
    
    This fixes a LO 7.4 regression caused by
    commit beb6c62e990599d91ac5d9183164c94d269027d3.
    
    Change-Id: Idb8f72775d9392b306cb924ee776821272b12f3b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141127
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>

diff --git a/filter/source/msfilter/msvbahelper.cxx 
b/filter/source/msfilter/msvbahelper.cxx
index 59d34ca5cec1..c7e84138f8dd 100644
--- a/filter/source/msfilter/msvbahelper.cxx
+++ b/filter/source/msfilter/msvbahelper.cxx
@@ -172,7 +172,7 @@ static SfxObjectShell* findShellForUrl( const OUString& 
sMacroURLOrPath )
 // if sMod is empty and a macro is found then sMod is updated
 // if sMod is empty, only standard modules will be searched (no class, 
document, form modules)
 static bool hasMacro(SfxObjectShell const* pShell, const OUString& sLibrary, 
OUString& sMod,
-                     const OUString& sMacro, bool bOnlyPublic)
+                     const OUString& sMacro, bool bOnlyPublic, const OUString& 
sSkipModule)
 {
 #if !HAVE_FEATURE_SCRIPTING
     (void) pShell;
@@ -180,6 +180,7 @@ static bool hasMacro(SfxObjectShell const* pShell, const 
OUString& sLibrary, OUS
     (void) sMod;
     (void) sMacro;
     (void) bOnlyPublic;
+    (void) sSkipModule;
 #else
     if (sLibrary.isEmpty() || sMacro.isEmpty())
         return false;
@@ -212,7 +213,8 @@ static bool hasMacro(SfxObjectShell const* pShell, const 
OUString& sLibrary, OUS
         SbMethod* pMeth = rModuleRef->FindMethod(sMacro, SbxClassType::Method);
         if (pMeth)
         {
-            if (bOnlyPublic && pMeth->IsSet(SbxFlagBits::Private))
+            if ((bOnlyPublic && pMeth->IsSet(SbxFlagBits::Private))
+                || rModuleRef->GetName() == sSkipModule)
                 continue;
             sMod = rModuleRef->GetName();
             return true;
@@ -263,7 +265,7 @@ static void parseMacro( const OUString& sMacro, OUString& 
sContainer, OUString&
 
 OUString resolveVBAMacro(SfxObjectShell const* pShell, const OUString& 
rLibName,
                          const OUString& rModuleName, const OUString& 
rMacroName,
-                         bool bOnlyPublic)
+                         bool bOnlyPublic, const OUString& sSkipModule)
 {
 #if !HAVE_FEATURE_SCRIPTING
     (void) pShell;
@@ -271,12 +273,13 @@ OUString resolveVBAMacro(SfxObjectShell const* pShell, 
const OUString& rLibName,
     (void) rModuleName;
     (void) rMacroName;
     (void) bOnlyPublic;
+    (void) sSkipModule;
 #else
     if( pShell )
     {
         OUString aLibName = rLibName.isEmpty() ?  getDefaultProjectName( 
pShell ) : rLibName ;
         OUString aModuleName = rModuleName;
-        if (hasMacro( pShell, aLibName, aModuleName, rMacroName, bOnlyPublic))
+        if (hasMacro(pShell, aLibName, aModuleName, rMacroName, bOnlyPublic, 
sSkipModule))
             return aLibName + "." + aModuleName + "." + rMacroName;
     }
 #endif
@@ -447,7 +450,7 @@ MacroResolvedInfo resolveVBAMacro( SfxObjectShell* pShell, 
const OUString& Macro
 
     for (auto const& search : sSearchList)
     {
-        aRes.mbFound = hasMacro(pShell, search, sModule, sProcedure, 
/*bOnlyPublic=*/false);
+        aRes.mbFound = hasMacro(pShell, search, sModule, sProcedure, 
/*bOnlyPublic=*/false, "");
         if ( aRes.mbFound )
         {
             sContainer = search;
diff --git a/include/filter/msfilter/msvbahelper.hxx 
b/include/filter/msfilter/msvbahelper.hxx
index c1ad7fdae3a2..90f1f8a2b90f 100644
--- a/include/filter/msfilter/msvbahelper.hxx
+++ b/include/filter/msfilter/msvbahelper.hxx
@@ -60,7 +60,8 @@ MSFILTER_DLLPUBLIC OUString extractMacroName( 
std::u16string_view rMacroUrl );
 MSFILTER_DLLPUBLIC OUString getDefaultProjectName( SfxObjectShell const * 
pShell );
 MSFILTER_DLLPUBLIC OUString resolveVBAMacro(SfxObjectShell const* pShell, 
const OUString& rLibName,
                                             const OUString& rModuleName,
-                                            const OUString& rMacroName, bool 
bOnlyPublic);
+                                            const OUString& rMacroName, bool 
bOnlyPublic,
+                                            const OUString& sSkipModule);
 MSFILTER_DLLPUBLIC MacroResolvedInfo resolveVBAMacro( SfxObjectShell* pShell, 
const OUString& rMacroName, bool bSearchGlobalTemplates = false );
 MSFILTER_DLLPUBLIC bool executeMacro( SfxObjectShell* pShell, const OUString& 
sMacroName, css::uno::Sequence< css::uno::Any >& aArgs, css::uno::Any& aRet, 
const css::uno::Any& aCaller );
 /// @throws css::uno::RuntimeException
diff --git a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx 
b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
index e9bd0f476f40..7d6e1bbb6ea9 100644
--- a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
+++ b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
@@ -364,11 +364,32 @@ VbaEventsHelperBase::ModulePathMap& 
VbaEventsHelperBase::updateModulePathMap( co
     sal_Int32 nModuleType = getModuleType( rModuleName );
     // search for all event handlers
     ModulePathMap& rPathMap = maEventPaths[ rModuleName ];
+
+    // Use WORKBOOK_OPEN as a way to get the codename for ThisWorkbook
+    OUString sThisWorkbook;
+    if (getImplementationName() == "ScVbaEventsHelper")
+    {
+        EventHandlerInfo& rThisWorksheetInfo
+            = maEventInfos[css::script::vba::VBAEventId::WORKBOOK_OPEN];
+        css::uno::Sequence<css::uno::Any> aNoArgs;
+        sThisWorkbook = implGetDocumentModuleName(rThisWorksheetInfo, aNoArgs);
+    }
+
     for( const auto& rEventInfo : maEventInfos )
     {
         const EventHandlerInfo& rInfo = rEventInfo.second;
         if( rInfo.mnModuleType == nModuleType )
         {
+            OUString sSkipModule;
+            // Only in Calc, ignore Auto_* in ThisWorkbook
+            if (getImplementationName() == "ScVbaEventsHelper"
+                && (rInfo.mnEventId == css::script::vba::VBAEventId::AUTO_NEW
+                    || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_OPEN
+                    || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_CLOSE))
+            {
+                sSkipModule = sThisWorkbook;
+            }
+
             // Only in Word, Auto* only runs if defined as Public, not Private.
             const bool bOnlyPublic
                 = getImplementationName() == "SwVbaEventsHelper"
@@ -380,7 +401,7 @@ VbaEventsHelperBase::ModulePathMap& 
VbaEventsHelperBase::updateModulePathMap( co
                       || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_CLOSE);
 
             OUString sName = resolveVBAMacro(mpShell, maLibraryName, 
rModuleName,
-                                             rInfo.maMacroName, bOnlyPublic);
+                                             rInfo.maMacroName, bOnlyPublic, 
sSkipModule);
             // Only in Word (with lowest priority), an Auto* module can 
execute a "Public Sub Main"
             if (sName.isEmpty() && rModuleName.isEmpty()
                 && getImplementationName() == "SwVbaEventsHelper")
@@ -390,7 +411,7 @@ VbaEventsHelperBase::ModulePathMap& 
VbaEventsHelperBase::updateModulePathMap( co
                     || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_CLOSE)
                 {
                     sName = resolveVBAMacro(mpShell, maLibraryName, 
rInfo.maMacroName, "Main",
-                                            bOnlyPublic);
+                                            bOnlyPublic, sSkipModule);
                 }
             }
             rPathMap[rInfo.mnEventId] = sName;

Reply via email to