d

Crea un controlador de diàleg

Al costat d'assignar macros a esdeveniments o crear 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>. 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:

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.

Assignació de mètodes al diàleg

Exporta el diàleg dlgTrace de l'Access2Base i l'importa en la llibreria 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:

Les accions assignades als esdeveniments han de referir-se al protocol vnd.sun.star.UNO:

Creació del gestor

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.

warning

Tots els noms de mètodes del components s’han de declarar explícitament quan s’utilitza un controlador de diàleg.


Amb Python

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 seva 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,)
note

Com s'esperava, la falta del mètode onOkHasFocus genera una excepció.


tip

Consulteu la pàgina Crides de Python a Basic en Collabora Office per a la descripció de la rutina getBasicScript i més detalls sobre l'execució de scripts en llenguatge creuat.


Amb el Collabora Office Basic

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
note

Com s'esperava, la falta del mètode onOkHasFocus llença una excepció.


Ens cal la vostra ajuda!