Création d'un gestionnaire de boîtes de dialogue

Outre l'attribution de macros aux événements ou la création d'auditeurs d'événements, on peut utiliser des gestionnaires de boîte de dialogue, dont le principe est de définir des mots-clés UNO, ou des méthodes, qui sont affectés à des événements à surveiller. Le gestionnaire d'événements est responsable de l'exécution des méthodes à l'aide du protocole vnd.sun.star.UNO:<nom_de_methode> . Contrairement aux auditeurs qui nécessitent de définir toutes les méthodes prises en charge, même s'ils ne sont pas utilisés, les gestionnaires de boîtes de dialogue ne nécessitent que deux méthodes en plus des scripts de branchement de contrôle prévus.

Les avantages de cette approche sont :

Ce mécanisme est illustré ci-dessous pour les langages BASIC et Python, en utilisant une copie importée de la boîte de dialogue Access2Base dlgTrace.La gestion des exceptions et la localisation sont omises pour plus de clarté.

Affectation de méthodes de dialogue

Exporter la boîte de dialogue Access2Base dlgTrace et l'importer dans la bibliothèque MyLib .

Dans le panneau d'édition des propriétés des contrôles de l'Éditeur de boîtes de dialogue, utilisez l'onglet Événements pour remplacer l'affectation de macro par l'affectation de composant, et saisissez les noms de méthode prévus :

Les actions assignées aux événements doivent mentionner le protocole vnd.sun.star.UNO:.

Création du gestionnaire

La méthode createDialogWithHandler du service com.sun.star.awt.DialogProvider2 est utilisée pour créer la boîte de dialogue et son gestionnaire. Le gestionnaire est responsable de la mise en œuvre de l'interface com.sun.star.awt.XDialogEventHandler.

warning

Tous les noms de méthode de composant doivent être déclarés explicitement lors de l'utilisation d'un gestionnaire de boîte de dialogue.


En Python

Dans cet exemple, la boîte de dialogue se trouve sur l'ordinateur.

# -*- 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):
    """Gestionnaire de console Access2Base """
    ''' adapté de « Créer un dialogue avec gestionnaire d'événements » par 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):
        """ Créer une boîte de dialogue à partir de son emplacement """
        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 laide'''
    import msgbox
    mb = msgbox.MsgBox(uno.getComponentContext())
    mb.addButton('Howdy')
    mb.show(prompt,0,title)

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

g_exportedScripts = (ConsoleHandler,)
note

Comme prévu, la méthode manquante onOkHasFocus lève une exception.


tip

Reportez-vous à la page Appels Python vers Collabora Office Basic pour la description de la routine getBasicScript et pour plus de détails sur l'exécution des scripts entre langages.


En Collabora Office Basic

Dans cet exemple, la boîte de dialogue est intégrée dans un document et peut également se trouver sur l'ordinateur.

' <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 intégrée au 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) if computer-based dialog
        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

' adapté de« Créer un dialogue avec gestionnaire d'événements » parJM Zambon
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
note

Comme prévu, la méthode manquante onOkHasFocus lève une exception.


Aidez-nous !