Справка LibreOffice 26.2
После назначения макросов событиям или создания слушателей событий можно перейти к использованию обработчиков диалогового окна, основная задача которых заключается в определении ключевых слов UNO или методов, сопоставленных с отслеживаемыми событиями. Обработчик событий отвечает за исполнение методов с помощью протокола vnd.sun.star.UNO:<method_name>. В отличие от слушателей, которые должны включать определение всех поддерживаемых методов (даже неиспользуемых), обработчики диалоговых окон должны определять только два метода — помимо сценариев, привязанных к элементам управления.
Преимущества данного подхода:
Объединяет код, отвечающий за выполнение макросов, запускаемых в ответ на события,
Устраняет зависимость событий от имён макросов, что упрощает обслуживание и обновление, особенно при перемещении макросов или модулей.
Данный механизм представлен здесь на примере языков Basic и Python при помощи импортированной копии диалогового окна Access2Base dlgTrace. Обработка исключений и локализация опущены для наглядности.
Выполните экспорт диалогового окна Access2Base dlgTrace и импортируйте его в библиотеку приложения MyLib.
В панели свойств элемента управления Редактора диалоговых окон на вкладке «События» прямое назначение макросов замените назначением через компонент и введите имена вызываемых методов:
Для компонента кнопки диалогового окна Экспорт в файл укажите метод _dump2File
Для событий нажатия клавиши и кнопки мыши в элементе txtTracelog можно задать имя метода компонента _openHelp
Для события получения фокуса кнопкой ОК можно задать имя метода компонента onOkHasfocus
В назначенных событиям действиях необходимо указать протокол vnd.sun.star.UNO:.
Метод createDialogWithHandler службы com.sun.star.awt.DialogProvider2 используется для создания диалогового окна и назначения ему обработчика. Обработчик отвечает за реализацию интерфейса com.sun.star.awt.XDialogEventHandler.
При использовании обработчика диалогового окна все имена методов компонента должны объявляться явно.
В примере ниже диалоговое окно размещается на компьютере.
# -*- 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):
""" Обработчик консоли Access2Base """
''' основано на « Créer un dialogue avec gestionnaire d'événements » (Создание диалогового окна с обработчиком событий) от 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):
""" Создание диалогового окна по его расположению """
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 '''
import msgbox
mb = msgbox.MsgBox(uno.getComponentContext())
mb.addButton('Howdy')
mb.show(prompt,0,title)
def ConsoleHandler():
Console().show()
g_exportedScripts = (ConsoleHandler,)
Как и ожидалось, отсутствие метода onOkHasFocus вызывает исключение.
См. страницу Вызовы Python кLibreOffice Basic для изучения описания процедуры getBasicScript и получения подробной информации о выполнении межъязыковых сценариев.
В этом примере диалоговое окно встроено в документ, а также может размещаться на компьютере.
' <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)) ' если диалоговое окно встроено в документ
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), если диалоговое окно размещается на компьютере
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
' основано на « Créer un dialogue avec gestionnaire d'événements » (Создание диалогового окна с обработчиком событий) от JM Zambon
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
Как и ожидалось, отсутствие метода onOkHasFocus вызывает исключение.