Ajuda do LibreOfficeDev 26.8
Para além de atribuir macros a eventos ou criar ouvintes de eventos, é possível utilizar manipuladores de diálogos, cujo princípio consiste em definir palavras-chave UNO, ou métodos, que são mapeados para os eventos a monitorizar. O manipulador de eventos é responsável por executar métodos utilizando o protocolo vnd.sun.star.UNO:<method_name>. Ao contrário dos ouvintes, que exigem a definição de todos os métodos suportados, mesmo que não sejam utilizados, os manipuladores de diálogo requerem apenas dois métodos, para além dos scripts de ligação de controlo pretendidos.
As vantagens desta abordagem são:
Empacota o código que manipula macros acionadas por eventos,
cancela a relação entre eventos e os nomes de macro, facilitando a manutenção ou atualização, em particular ao mover macros ou módulos.
Este mecanismo é aqui ilustrado para as linguagens Basic e Python, utilizando uma cópia importada da caixa de diálogo Access2Base dlgTrace. O tratamento de exceções e a localização foram omitidos por uma questão de clareza.
Exporte a caixa de diálogo Access2Base dlgTrace e importe-a para a biblioteca de aplicações MyLib.
No painel de propriedades do controlo do Dialog Editor, utilize o separador «Eventos» para substituir as atribuições de macros por atribuições de componentes e introduza os nomes dos métodos pretendidos:
Defina o nome do método do componente do botão da caixa de diálogo Gravar em ficheiro como _dump2File
Opcionalmente, defina os nomes dos métodos dos componentes para os eventos de teclas pressionadas txtTracelog e botões do rato pressionados como _openHelp
Opcionalmente, defina o nome do método do componente que recebe o evento de foco do botão Ok como onOkHasfocus
As ações atribuídas aos eventos devem mencionar o protocolo vnd.sun.star.UNO:.
O método createDialogWithHandler do serviço com.sun.star.awt.DialogProvider2 é utilizado para definir a caixa de diálogo e o seu manipulador. O manipulador é responsável por implementar a interface com.sun.star.awt.XDialogEventHandler.
Todos os nomes dos métodos dos componentes devem ser declarados explicitamente ao utilizar um manipulador de caixas de diálogo.
Neste exemplo, a caixa de diálogo encontra-se no computador.
# -*- 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 da Consola Access2Base """
''' adaptado de « Créer un dialogue avec gestionnaire d'événements » by 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):
""" Criar uma caixa de diálogo a partir da sua localização """
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 Feia '''
import msgbox
mb = msgbox.MsgBox(uno.getComponentContext())
mb.addButton('Howdy')
mb.show(prompt,0,title)
def ConsoleHandler():
Console().show()
g_exportedScripts = (ConsoleHandler,)
Como era de esperar, o método onOkHasFocus que não existe lança uma exceção.
Consulte a página Python calls to LibreOfficeDev Basic para obter a descrição da rotina getBasicScript e para obter detalhes sobre a execução de scripts entre linguagens.
Neste exemplo, a caixa de diálogo está incorporada num documento e pode igualmente estar localizada no computador.
' <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)) ' se for uma caixa de diálogo incorporada no documento
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, _
método 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) se for uma caixa de diálogo no 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
' adaptado de « Créer un dialogue avec gestionnaire d'événements » by JM Zambon
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
Como era de esperar, o método onOkHasFocus que não existe lança uma exceção.