wizards/source/scriptforge/SF_PythonHelper.xba | 12 ++++++++++++ wizards/source/scriptforge/python/scriptforge.py | 9 +++++---- 2 files changed, 17 insertions(+), 4 deletions(-)
New commits: commit 356bb47cb404eb54d1aea4ae7ab72c13e5f904ea Author: Jean-Pierre Ledure <j...@ledure.be> AuthorDate: Wed Aug 10 16:07:07 2022 +0200 Commit: Rafael Lima <rafael.palma.l...@gmail.com> CommitDate: Fri Aug 12 17:30:35 2022 +0200 ScriptForge - tdf#149983 dialog.EndExecute() failure In SF_PythonHelper._PythonDispatcher(): Force a hardcoded call of the methods in the Dialog service which may potentially be invoked while the dialog is displayed, bypassing the generic CallByName() Basic builtin function: Activate Controls EndExecute Execute (Controls is already hardcoded because returning an array) Patch on master: https://gerrit.libreoffice.org/c/core/+/137084 Patch on libreoffice-7-4: https://gerrit.libreoffice.org/c/core/+/137113 Change-Id: I1d2ef4d6e5d5e2863ac39ce646084cbd9265fe84 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138093 Tested-by: Jenkins Tested-by: Jean-Pierre Ledure <j...@ledure.be> Reviewed-by: Jean-Pierre Ledure <j...@ledure.be> Reviewed-by: Rafael Lima <rafael.palma.l...@gmail.com> diff --git a/wizards/source/scriptforge/SF_PythonHelper.xba b/wizards/source/scriptforge/SF_PythonHelper.xba index 5b919ba5abe1..d257df3cab27 100644 --- a/wizards/source/scriptforge/SF_PythonHelper.xba +++ b/wizards/source/scriptforge/SF_PythonHelper.xba @@ -614,6 +614,7 @@ Const cstArgArray = 512 ' Any argument can be a 2D array Const cstRetArray = 1024 ' Return value can be an array Const cstUno = 256 ' Return value can be a UNO object Const cstObject = 2048 ' 1st argument is a Basic object when numeric +Const cstHardCode = 4096 ' Method must not be executed with CallByName() ' Object nature in returned array Const objMODULE = 1, objCLASS = 2, objUNO = 3 @@ -792,6 +793,17 @@ Try: If Script = "Controls" Then vReturn = vBasicObject.Controls(vArgs(0)) End Select + ' Methods in class modules may better not be executed with CallByName() + ElseIf bBasicClass And ((CallType And vbMethod) + (CallType And cstHardCode)) = vbMethod + cstHardCode Then + Select Case sServiceName + Case "SFDialogs.Dialog" + Select Case Script + Case "Activate" : vReturn = vBasicObject.Activate() + Case "EndExecute" : vReturn = vBasicObject.EndExecute(vArgs(0)) + Case "Execute" : vReturn = vBasicObject.Execute(vArgs(0)) + End Select + End Select + ' Methods in class modules are invoked with CallByName ElseIf bBasicClass And ((CallType And vbMethod) = vbMethod) Then Select Case UBound(vArgs) diff --git a/wizards/source/scriptforge/python/scriptforge.py b/wizards/source/scriptforge/python/scriptforge.py index 9dc95d21f715..894ead016574 100644 --- a/wizards/source/scriptforge/python/scriptforge.py +++ b/wizards/source/scriptforge/python/scriptforge.py @@ -445,6 +445,7 @@ class SFServices(object): flgArrayRet = 1024 # Invoked service method can return a 2D array (standard modules) or any array (class modules) flgUno = 256 # Invoked service method/property can return a UNO object flgObject = 2048 # 1st argument may be a Basic object + flgHardCode = 4096 # Force hardcoded call to method, avoid CallByName() # Basic class type moduleClass, moduleStandard = 2, 1 # @@ -1652,16 +1653,16 @@ class SFDialogs: return container, library, dialogname, ScriptForge.componentcontext def Activate(self): - return self.ExecMethod(self.vbMethod, 'Activate') + return self.ExecMethod(self.vbMethod + self.flgHardCode, 'Activate') def Controls(self, controlname = ''): - return self.ExecMethod(self.vbMethod + self.flgArrayRet, 'Controls', controlname) + return self.ExecMethod(self.vbMethod + self.flgArrayRet + self.flgHardCode, 'Controls', controlname) def EndExecute(self, returnvalue): - return self.ExecMethod(self.vbMethod, 'EndExecute', returnvalue) + return self.ExecMethod(self.vbMethod + self.flgHardCode, 'EndExecute', returnvalue) def Execute(self, modal = True): - return self.ExecMethod(self.vbMethod, 'Execute', modal) + return self.ExecMethod(self.vbMethod + self.flgHardCode, 'Execute', modal) def GetTextsFromL10N(self, l10n): l10nobj = l10n.objectreference if isinstance(l10n, SFScriptForge.SF_L10N) else l10n