Ustvarjanje krmilnikov pogovornih oken

Poleg dodeljevanja makrov dogodkom ali ustvarjanja poslušalcev dogodkov lahko uporabljamo tudi krmilnike pogovornih oken, ki določajo ključne besede UNO ali metode in jih preslikajo na dogodke, ki jih poslušajo. Krmilnik dogodka je odgovoren za izvajanje metod s protokolom vnd.sun.star.UNO:<ime_metode>. Medtem ko poslušalci dogodkov zahtevajo določitev vseh podprtih metod, tudi če niso uporabljene, zahtevajo krmilniki dogodkov le dve metodi poleg predvidenih skriptov nadzornih kljuk.

Prednosti takšnega pristopa so:

V tem primeru je mehanizem za jezika Basic in Python predstavljen z uporabo uvožene kopije pogovornega okna Access2Base dlgTrace. Obravnava izjem in lokalizacija sta zavoljo jasnosti izpuščena.

Dodeljevanje metod pogovornemu oknu

Izvozi pogovorno okno Access2Base dlgTrace in ga uvozi v knjižnico programa MyLib.

Na zavihku Dogodki v podoknu lastnosti kontrolnika v Urejevalniku pogovornega okna zamenjajte dodelitve makrov z dodelitvami komponent in vnesite imena predvidenih metod:

Dogodkom dodeljena dejanja morajo omenjati protokol vnd.sun.star.UNO:.

Ustvarjanje krmilnika

Metoda createDialogWithHandler storitve com.sun.star.awt.DialogProvider2 se uporablja za določitev pogovornega okna in njegovega krmilnika. Krmilnik je odgovoren za implementacijo vmesnika com.sun.star.awt.XDialogEventHandler.

warning

Ko uporabljate krmilnik pogovornih oken, morajo biti imena vseh metod komponent eksplicitno deklarirana.


S Pythonom

V tem primeru se pogovorno okno nahaja na računalniku.

# -*- 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):
    """ Krmilnik konzole Access2Base """
    ''' prirejeno po »Créer un dialogue avec gestionnaire d’événements« avtorja 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):
        """ Ustvari pogovorno okno iz njegovega mesta """
        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=''):
    ''' Grdi MsgBox '''
    import msgbox
    mb = msgbox.MsgBox(uno.getComponentContext())
    mb.addButton('Howdy')
    mb.show(prompt,0,title)

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

g_exportedScripts = (ConsoleHandler,)
note

Manjkajoča metoda onOkHasFocus pričakovano vrže izjemo.


tip

Oglejte si klice Pythona v Collabora Office Basic za opis rutine Getbasicscript in podrobnosti o skriptnem izvajanju v več jezikih.


Z Collabora Office Basicom

V tem primeru je pogovorno okno vdelano v dokument in ga je mogoče enakovredno poiskati v računalniku.

' <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)) ' če je pogovorno okno vdelano v dokument
    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) če je pogovorno okno na računalniku
        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

' prirejeno po »Créer un dialogue avec gestionnaire d’événements« avtorja JM Zambona
' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
note

Manjkajoča metoda onOkHasFocus pričakovano vrže izjemo.


Podprite nas!