Ajuda del LibreOffice 24.8
Al costat de assigna macros a esdeveniments o crea oients d'esdeveniments, es poden utilitzar gestors de diàlegs, el principi dels quals és definir paraules clau UNO, o mètodes, que s'assignen als esdeveniments a seguir. El gestor d'esdeveniments és responsable d'executar els mètodes mitjançant el protocol vnd.sun.star.UNO:<method_name> protocol. A diferència dels oients que necessiten definir tots els mètodes que suporta, fins i tot si no s’utilitzen, els gestors de diàlegs només requereixen dos mètodes a més dels scripts dels punts d'inserció esperats.
Els avantatges d'aquest enfocament són:
Empaqueta el codi que gestiona les macros orientades a esdeveniments,
aquest desvincula els esdeveniments dels noms de les macros, que facilita el manteniment o les actualitzacions, en particular quan es mouen macros o mòduls.
Aquest mecanisme s'il·lustra amb els llenguatges Basic i Python mitjançant una còpia importada del diàleg Access2Base dlgTrace. La gestió i la localització d’excepcions s’ometen per més claredat.
Exporta el diàleg dlgTrace de l'Access2Base i l'importa en la biblioteca MyLib de l'aplicació.
Dins de la subfinestra de propietats de control de l'editor de diàlegs, utilitzeu la pestanya Esdeveniments per a substituir les assignacions de les macros per assignacions per components i, tot seguit, escriviu els noms dels mètodes previstos:
Establiu el nom del mètode del component de botó del quadre de diàleg Buidar al fitxer_dump2File
Opcionalment, definiu txtTracelog els noms dels mètodes de l'esdeveniment del component de la la tecla premuda i del botó del ratolí com _openHelp
Opcionalment, podeu definir el nom del mètode de l'esdeveniment focus del component botó D'acord com a onOkHasfocus
Les accions assignades als esdeveniments han de referir-se al protocol vnd.sun.star.UNO:
createDialogWithHandler mètode del servei com.sun.star.awt.DialogProvider2 s'utilitza per configurar el diàleg i el seu controlador. El controlador és responsable de la implementació de la interfície com.sun.star.awt.XDialogEventHandler.
Tots els noms de mètodes del components s’han de declarar explícitament quan s’utilitza un controlador de diàleg.
En aquest exemple, el quadre de diàleg es troba a l'ordinador.
# -*- 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):
""" Gestor de consola de l'Access2Base """
''' adaptació de «Créer un dialogue avec gestionnaire d'événements» de J.-M. 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):
""" Creeu un diàleg des de la seua ubicació """
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 Lleig '''
import msgbox
mb = msgbox.MsgBox(uno.getComponentContext())
mb.addButton('Howdy')
mb.show(prompt,0,title)
def ConsoleHandler():
Console().show()
g_exportedScripts = (ConsoleHandler,)
Com s'esperava, la falta del mètode onOkHasFocus genera una excepció.
Consulteu la pàgina Crides de Python a Basic en LibreOffice per a la descripció de la rutina getBasicScript i més detalls sobre l'execució de scripts en llenguatge creuat.
En aquest exemple el diàleg s'incrusta a un document, i es pot localitzar a l'ordinador.
' <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 es tracta d'un diàleg incrustat al 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, _
metode 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) si el diàleg està basat en el computador
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
' adaptat des de « Crea un diàleg amb el gestor d'esdeveniments » per JM Zambon
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
Com s'esperava, la falta del mètode onOkHasFocus llença una excepció.