Vytvoření dialogového okna s handlerem

Kromě přiřazování maker událostem a vytváření posluchačů událostí je možné použít dialogová okna s handlery, v nichž jsou definována klíčová slova UNO nebo metody, které jsou namapovány na sledované události. Handler události je zodpovědný za spouštění metod pomocí protokolu vnd.sun.star.UNO:<název_metody>. Na rozdíl od posluchačů, u nichž je nutné definovat všechny podporované metody (i nepoužité), handlery dialogových oken vyžadují kromě skriptů pro událost, ke které se vztahují, pouze dvě metody.

Výhody tohoto přístupu:

Tato technika je zde znázorněna pro jazyky Basic a Python, příklady využívají importovanou kopii dialogového okna dlgTrace z knihovny Access2Base. Pro přehlednost je vynecháno zpracování výjimek a lokalizace.

Přiřazení metod dialogového okna

Exportujte dialogové okno dlgTrace z knihovny Access2Base a importujte jej do knihovny MyLib.

V editoru dialogových oken přejděte na panelu vlastností pro ovládací prvek na kartu Události, nahraďte tam přiřazená makra komponentami a zadejte názvy požadovaných metod:

V událostech přiřazených těmto akcím by měl být zmíněn protokol vnd.sun.star.UNO:.

Vytvoření handleru

K nastavení dialogového okna a jeho handleru je použita metoda createDialogWithHandler služby com.sun.star.awt.DialogProvider2. Handler je zodpovědný za implementaci rozhraní com.sun.star.awt.XDialogEventHandler.

warning

Při použití handleru dialogového okna je nutné deklarovat všechny názvy metod komponent.


Pomocí Pythonu

V tomto příkladu je dialogové okno uloženo na počítači.

# -*- 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):
    """ Handler konzole Access2Base """
    ''' upraveno z příkladu "Créer un dialogue avec gestionnaire d'événements" od JM Zambona
    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):
        """ Vytvoří dialogové okno z daného umístění """
        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=''):
    ''' Ošklivý MsgBox '''
    import msgbox
    mb = msgbox.MsgBox(uno.getComponentContext())
    mb.addButton('Howdy')
    mb.show(prompt,0,title)

def ConsoleHandler():
    Console().show()

g_exportedScripts = (ConsoleHandler,)
note

Podle očekávání vyvolá chybějící metoda onOkHasFocus výjimku.


tip

Popis funkce getBasicScript a podrobnosti o spouštění skriptů v různých jazycích naleznete na stránce Volání maker Basicu z Pythonu.


Pomocí jazyka Collabora Office Basic

V tomto příkladu může být dialogové okno vloženo do dokumentu i uloženo na počítači.

' <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)) ' je-li dialogové okno vloženo v dokumentu
    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) jde-li o dialogové okno na počítači
        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

' upraveno z příkladu "Créer un dialogue avec gestionnaire d'événements" od JM Zambona
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
note

Podle očekávání vyvolá chybějící metoda onOkHasFocus výjimku.


Podpořte nás!