Aide Collabora Office 24.04
Outre l'attribution de macros aux événements ou la création d'auditeurs d'événements, on peut utiliser des gestionnaires de boîte de dialogue, dont le principe est de définir des mots-clés UNO, ou des méthodes, qui sont affectés à des événements à surveiller. Le gestionnaire d'événements est responsable de l'exécution des méthodes à l'aide du protocole vnd.sun.star.UNO:<nom_de_methode> . Contrairement aux auditeurs qui nécessitent de définir toutes les méthodes prises en charge, même s'ils ne sont pas utilisés, les gestionnaires de boîtes de dialogue ne nécessitent que deux méthodes en plus des scripts de branchement de contrôle prévus.
Les avantages de cette approche sont :
Il contient le code qui gère les macros événementielles,
il décorrèle les événements des noms de macros ce qui facilite la maintenance ou les mises à jour, notamment lors du déplacement de macros ou de modules.
Ce mécanisme est illustré ci-dessous pour les langages BASIC et Python, en utilisant une copie importée de la boîte de dialogue Access2Base dlgTrace.La gestion des exceptions et la localisation sont omises pour plus de clarté.
Exporter la boîte de dialogue Access2Base dlgTrace et l'importer dans la bibliothèque MyLib .
Dans le panneau d'édition des propriétés des contrôles de l'Éditeur de boîtes de dialogue, utilisez l'onglet Événements pour remplacer l'affectation de macro par l'affectation de composant, et saisissez les noms de méthode prévus :
Affecter à l'événement "Exécuter l'action" du bouton Dump to file la méthode du composant _dump2File.
Définissez éventuellement, pour les événements "Touche enfoncée" et "Bouton de la souris enfoncé" du contrôle texte txtTracelog la méthode _openHelp du composant.
Éventuellement affecter à l'événement "A la réception du focus" du bouton Ok l'événement onOkHasfocus du composant.
Les actions assignées aux événements doivent mentionner le protocole vnd.sun.star.UNO:.
La méthode createDialogWithHandler du service com.sun.star.awt.DialogProvider2 est utilisée pour créer la boîte de dialogue et son gestionnaire. Le gestionnaire est responsable de la mise en œuvre de l'interface com.sun.star.awt.XDialogEventHandler.
Tous les noms de méthode de composant doivent être déclarés explicitement lors de l'utilisation d'un gestionnaire de boîte de dialogue.
Dans cet exemple, la boîte de dialogue se trouve sur l'ordinateur.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, unohelper
from com.sun.star.awt import XDialogEventHandler
_DLG_PROVIDER = "com.sun.star.awt.DialogProvider2"
class Console(unohelper.Base, XDialogEventHandler):
"""Gestionnaire de console Access2Base """
''' adapté de « Créer un dialogue avec gestionnaire d'événements » par JM Zambon
https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler '''
def show(self):
dialog = self.getDialog("MyLib.dlgTrace", embedded=True)
dialog.Title = "Konsole"
dialog.execute()
def callHandlerMethod(self, dialog, event, method):
if method == '_dump2File':
event.Source.setLabel("dump requested")
scr = getBasicScript(script="_DumpToFile", module="Trace",
library='Access2Base')
scr.invoke((event,), (), ())
elif method == '_openHelp':
_msgbox('Not yet implemented')
dialog.endDialog(1)
else:
return False
def getSupportedMethodNames(self):
return ('_dump2File', '_openHelp')
def getDialog(self, libr_dlg: str, embedded=False):
""" Créer une boîte de dialogue à partir de son emplacement """
smgr = XSCRIPTCONTEXT.getComponentContext().ServiceManager
if embedded:
model = XSCRIPTCONTEXT.getDocument()
dp = smgr.createInstanceWithArguments(_DLG_PROVIDER, (model,))
location = "?location=document"
else:
dp = smgr.createInstanceWithContext(_DLG_PROVIDER, ctx)
location = "?location=application"
dlg = dp.createDialogWithHandler("vnd.sun.star.script:"+libr_dlg+location, self)
return dlg
# def getBasicScript() # see note
def _msgbox(prompt='', title=''):
''' MsgBox laide'''
import msgbox
mb = msgbox.MsgBox(uno.getComponentContext())
mb.addButton('Howdy')
mb.show(prompt,0,title)
def ConsoleHandler():
Console().show()
g_exportedScripts = (ConsoleHandler,)
Comme prévu, la méthode manquante onOkHasFocus lève une exception.
Reportez-vous à la page Appels Python vers Collabora Office Basic pour la description de la routine getBasicScript et pour plus de détails sur l'exécution des scripts entre langages.
Dans cet exemple, la boîte de dialogue est intégrée dans un document et peut également se trouver sur l'ordinateur.
' <MyLib>.<Handler> module
Public Sub Console_Show()
Dim dp as Object ' com.sun.star.awt.DialogProvider2
Dim dialog As Object ' com.sun.star.awt.XDialog, com.sun.star.awt.XDialogEventHandler
Dim eventHandler As Object ' com.sun.star.awt.XDialogEventHandler
dp = CreateUnoService("com.sun.star.awt.DialogProvider2")
dp.Initialize(Array(ThisComponent)) ' si intégrée au document
eventHandler = CreateUnoListener("Console_", "com.sun.star.awt.XDialogEventHandler")
dialog = dp.createDialogWithHandler("vnd.sun.star.script:MyLib.dlgTrace?location=document", eventHandler)
dialog.Title = "Konsole"
dialog.execute()
End Sub ' <Handler>.Console_Show()
Private Function Console_callHandlerMethod(dialog as Object, _
event As com.sun.star.document.DocumentEvent, _
method As String) As Boolean
''' Intercept dialog events using .UNO protocol '''
Console_callHandlerMethod = True
Select Case method
Case "_dump2File"
event.Source.setLabel("dump requested")
With GlobalScope.BasicLibraries
If Not .IsLibraryLoaded("Access2Base") Then .LoadLibrary("Access2Base")
End With
Access2Base.Trace._DumpToFile
Case "_openHelp"
MsgBox "Not yet implemented",0 , "Howdy"
'dialog.endDialog(1) if computer-based dialog
Case Else : Console_callHandlerMethod = False
End Select
End Function ' <Handler>.Console_callHandlerMethod
Private Function Console_getSupportedMethodNames()
Console_getSupportedMethodNames = Array("_dump2File", "_openHelp")
End Function ' <Handler>.Console _getSupportedMethodNames
' adapté de« Créer un dialogue avec gestionnaire d'événements » parJM Zambon
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
Comme prévu, la méthode manquante onOkHasFocus lève une exception.