Een dialog-handler aanmaken

Behalve het koppelen van macro's aan gebeurtenissen en afvangen van gebeurtenissen, kan men ook een dialoog-handler gebruiken, dan definieert men UNO-sleutelwoorden of methoden, die gekoppeld worden aan bepaalde te volgen gebeurtenissen. De handler zorgt voor het uitvoeren van de methode met gebruik van het protocol vnd.sun.star.UNO:<method_name>. Anders dan bij het afvangen waar alle ondersteunde methoden gedefinieerd moeten worden, ook de ongebruikte, hoeft bij een dialoog-handler dat maar twee methoden boven de bedoelde control hook scripts.

De voordelen van deze benadering zijn:

Dit mechanisme wordt hier toegelicht met de talen Basic en Python met een geïmporteerde kopie van de dialoog Access2Base dlgTrace. Omdat het een voorbeeld is zijn de foutafhandeling en de vertaling weggelaten.

Toekenning Dialoog-methodes

Exporteer de Access2Base dialoog dlgTrace en importeer die in de applicatie-bibliotheek MyLib.

Binnen het paneel van de eigenschappen van de dialoogeditor, gebruik het tabblad Gebeurtenissen om een koppeling van een macro te vervangen door een koppeling met een component, voer de bedoelde methodenamen in:

Acties gekoppeld aan gebeurtenissen moeten het protocol vnd.sun.star.UNO: vermelden.

De handler aanmaken

De methode createDialogWithHandler van de com.sun.star.awt.DialogProvider2 service wordt gebruikt om de dialoog en de handler in te stellen. De handler zorgt voor de implementatie van de com.sun.star.awt.XDialogEventHandler interface.

warning

Bij gebruik van een dialoog-handler moeten alle methode-namen expliciet worden gedeclareerd.


Met Python

In dit voorbeeld staat de dialoog op de computer.

# -*- 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 console-handler """
    ''' originele versie is « Créer un dialogue avec gestionnaire d'événements » van 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):
        """ Een dialoog aanmaken vanaf de locatie """
        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=''):
    ''' Lelijke MsgBox '''
    import msgbox
    mb = msgbox.MsgBox(uno.getComponentContext())
    mb.addButton('Howdy')
    mb.show(prompt,0,title)

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

g_exportedScripts = (ConsoleHandler,)
note

Zoals verwacht, de ontbrekende methode bij onOkHasFocus zorgt voor een exception.


tip

Bekijk de pagina Python aanroepen van Collabora Office Basic voor een beschrijving van de routine getBasicScript en voor details over de uitvoering van scripts tussen verschillende programmeertalen.


Met Collabora Office BASIC

In dit voorbeeld is de dialoog ingesloten in een document en kan ook worden gevonden op de computer.

' <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)) ' indien dialoog ingesloten zit in 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) indien dialoog via computer
        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

' bewerkte versie van « Créer un dialogue avec gestionnaire d'événements » door JM Zambon
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
note

Zoals verwacht, de ontbrekende methode bij onOkHasFocus zorgt voor een exception.


Help ons, alstublieft!