Oprette en dialoghåndtering

Udover at tildele makroer til begivenheder eller oprette begivenhedslyttere, kan man bruge dialoghåndteringer, hvis princip er at definere UNO-nøgleord eller metoder, som mappes til begivenheder, der skal overvåges. Begivenhedshåndteringen er ansvarlig for at udføre metoder med vnd.sun.star.UNO:<method_name>-protokollen. I modsætning til lyttere, som kræver alle understøttede metoder defineret, selv ikke-anvendte, kræver dialoghåndteringer kun to metoder oveni de påtænkte kontrol-kroge scripts.

Fordelene ved denne tilgang er:

Denne mekanisme illustreres hermed for sprogene Basic og Python med en importeret kopi af dialogen Access2Base dlgTrace. Håndtering af undtagelser og lokalisering udelades for klarhedens skyld.

Anvisning af dialogmetoder

Eksportér dialogen Access2Base dlgTrace og importér den til programbiblioteket MyLib.

I ruden Egenskabsredigering under Dialogredigering bruger du fanebladet Hændelser til at erstatte makro-anvisninger med komponent-anvisninger og indtaster de påtænkte metodenavne:

Begivenheder, der er tildelt handlinger, bør nævne protokollen vnd.sun.star.UNO:.

Oprettelse af håndtering

Metoden createDialogWithHandler i tjenesten com.sun.star.awt.DialogProvider2 bruges til at indstille dialogen og den håndtering. Håndteringen er ansvarlig for at implementere grænsefladen com.sun.star.awt.XDialogEventHandler.

warning

Alle komponent-metodenavne skal erklæres udtrykkeligt, når dialoghåndteringen bruges.


Med Python

I dette eksempel er dialogen placeret på computeren.

# -*- 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 Konsolhåndtering """
    ''' tilpasset fra « Créer un dialogue avec gestionnaire d'événements » af 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):
        """ Opret en dialog fra placeringen """
        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=''):
    ''' Grim MsgBox '''
    import msgbox
    mb = msgbox.MsgBox(uno.getComponentContext())
    mb.addButton('Howdy')
    mb.show(prompt,0,title)

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

g_exportedScripts = (ConsoleHandler,)
note

Som ventet onOkHasFocus udløser manglende metode en undtagelse.


tip

På siden Python-kald til Collabora Office Basic finder du en beskrivelse af rutiner i getBasicScript og detaljer om udførelse af sccrpting på tværs af sprog.


Med Collabora Office Basic

I dette eksempel er dialogen indlejret i et dokument og kan ligeledes være placeret på computeren.

' <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)) ' hvis dialogen er indlejret i dokumentet
    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) hvis dialogen er computer-baseret
        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

' tilpasset efter « Créer un dialogue avec gestionnaire d'événements » af JM Zambon
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
note

Som ventet udløser den manglende onOkHasFocus-metode en undtagelse.


Støt os venligst!