Pomoč LibreOffice 24.8
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:
vsebuje kodo, ki obravnava z dogodki gnane makre,
odveže dogodke in imena makrov, kar poenostavlja vzdrževanje ali posodobitve, še posebej pri premikanju makrov ali modulov.
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.
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:
Ime metode komponente gumba pogovornega okna Dump to file nastavite na _dump2File
Po potrebi lahko določite imena metod za komponente dogodkov pritisnjene tipke in pritisnjene tipke miške txtTracelog kot _openHelp
Po potrebi določite gumb V redu, ki prejme ime komponente metode dogodka prejema pozornosti kot onOkHasfocus
Dogodkom dodeljena dejanja morajo omenjati protokol vnd.sun.star.UNO:.
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.
Ko uporabljate krmilnik pogovornih oken, morajo biti imena vseh metod komponent eksplicitno deklarirana.
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,)
Manjkajoča metoda onOkHasFocus pričakovano vrže izjemo.
Oglejte si klice Pythona v LibreOffice Basic za opis rutine Getbasicscript in podrobnosti o skriptnem izvajanju v več jezikih.
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
Manjkajoča metoda onOkHasFocus pričakovano vrže izjemo.