Създаване на слушатели за събития

Събитията, изпращани от диалози, документи, формуляри или графични контроли, могат да бъдат свързвани с макроси – това се нарича програмиране, базирано на събития. Най-разпространеният метод за обвързване на събитие с макрос са разделът Събития в менюто Инструменти - Персонализиране и панелът „Свойства на контрола“ в редактора на диалогови прозорци от менюто Инструменти - Макроси - Организиране на диалози....

Графичните елементи, входът от клавиатурата, движенията на мишката и други взаимодействия човек – машина могат да се управляват чрез слушатели на UNO, които наблюдават действията на потребителя. Слушателите представляват алтернатива с динамичен програмен код на присвояването на макроси. Можете да създадете толкова слушатели на UNO, колкото събития са достъпни за наблюдение. Един слушател може да обработва няколко контроли от потребителския интерфейс.

Създаване на слушател на събития

Слушателите се прикрепват към контролите в диалогови прозорци, както и към събития от документи или формуляри. Слушатели се използват и при създаване на диалози или добавяне на контроли към диалогов прозорец по време на изпълнение.

Този пример създава слушател за контролата Button1 в диалога Dialog1 от библиотеката Standard.

С Python


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
             
         import uno, unohelper
         from com.sun.star.awt import XActionListener
         from com.sun.star.awt import ActionEvent
         from com.sun.star.lang import EventObject
         from com.sun.star.ui.dialogs.ExecutableDialogResults \
             import OK, CANCEL
         import msgbox as util
             
         _MY_BUTTON =  "Button1"
         _MY_LABEL = 'Python слуша...'
         _DLG_PROVIDER = "com.sun.star.awt.DialogProvider"
             
         def Main(*args):
             ui = createUnoDialog("Standard.Dialog1", embedded=True)
             ui.Title = "Python X[any]Listener"
             ctl = ui.getControl(_MY_BUTTON)
             ctl.Model.Label = _MY_LABEL
             act = ActionListener()
             ctl.addActionListener(act)
             rc = ui.execute()
             if rc == OK:
                 MsgBox("Потребителят потвърди диалога.")
             elif rc == CANCEL:
                 MsgBox("Потребителят отказа диалога.")
             ui.dispose()  # ui.endExecute
             ctl.removeActionListener(act)
             
         def createUnoDialog(libr_dlg: str, embedded=False):
             """ Създаване на диалог от местоположението му """
             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.createDialog("vnd.sun.star.script:"+libr_dlg+location)
             return dlg
             
         class ActionListener(unohelper.Base, XActionListener):
             """ Наблюдаване и броене щракванията на бутони """
             def __init__(self):
                 self.count = 0
             
             def actionPerformed(self, evt: ActionEvent):
                 self.count = self.count + 1
                 #mri(evt)
                 if evt.Source.Model.Name == _MY_BUTTON:
                     evt.Source.Model.Label = _MY_LABEL+ str( self.count )
             return
             
             def disposing(self, evt: EventObject):  # задължителна подпрограма
                 pass
             
         def MsgBox(txt: str):
             mb = util.MsgBox(uno.getComponentContext())
             mb.addButton("Ok")
             mb.show(txt, 0, "Python")
             
         g_exportedScripts = (Main,)
      

msgbox.py в директорията {инсталация}/program/ съдържа примери за слушатели на бутони.

С LibreOffice Basic


         Option Explicit
             
         Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
         Const MY_LABEL = "Basic слуша..."
         Dim count As Integer
             
         Sub Main
             Dim libr As Object ' com.sun.star.script.XLibraryContainer
             Dim dlg As Object
             Dim ui As Object  ' stardiv.Toolkit.UnoDialogControl
             Dim ctl As Object ' stardiv.Toolkit.UnoButtonControl
             Dim act As Object ' com.sun.star.awt.XActionListener
             Dim rc As Object : rc = com.sun.star.ui.dialogs.ExecutableDialogResults
             
             BasicLibraries.LoadLibrary(MY_LIBRARY)
             libr = DialogLibraries.GetByName(MY_LIBRARY)
             dlg = libr.GetByName(MY_DIALOG)
             ui = CreateUnoDialog(dlg)
             ui.Title = "Basic X[any]Listener example"
             count = 0
             ctl = ui.GetControl(MY_BUTTON)
             ctl.Model.Label = MY_LABEL
             act = CreateUnoListener("awt_", "com.sun.star.awt.XActionListener")
             ctl.addActionListener(act)
             Select Case ui.Execute
                 Case rc.OK : MsgBox "Потребителят потвърди диалога.",, "Basic"
                 Case rc.CANCEL : MsgBox "Потребителят отказа диалога.",, "Basic"
             End Select
             ui.dispose ' ui.endExecute()
             ctl.removeActionListener(act)
         End Sub
             
         Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
             ''' Наблюдаване и броене щракванията на бутони '''
             With evt.Source.Model
                 If .Name = MY_BUTTON Then
                     count = count + 1
                     .Label = MY_LABEL+Cstr(count)
                 End If
             End With
         End Sub ' awt_actionPerformed
             
         Private Sub awt_disposing(evt As com.sun.star.lang.EventObject) ' mandatory Sub
             ' място за вашия код
         End Sub ' awt_disposing
      

Други слушатели на събития

Слушателите обикновено се програмират заедно с отварянето на диалога. Възможни са множество подходи, например обработчици на събития за диалози или наблюдатели на събития за документи или формуляри.

Моля, подкрепете ни!