Crea oients d'esdeveniments

Els esdeveniments emesos pels diàlegs, documents, formularis o controls, es poden enllaçar a macros, el que es coneix com a programació orientada a esdeveniments. El mètode més comú per a relacionar esdeveniments amb macros és la pestanya EsdevenimentsEines - Personalitza el menú i el panell de control de propietats de l'Editor de diàlegs des del menú Eines - Macros - Organitza els diàlegs... .

Artefactes gràfics, entrades de teclat, moviments del ratolí i altres interaccions home/màquina es poden controlar utilitzant oients UNO que vigilen el comportament de l'usuari. Els oients són alternatives de codi de programa dinàmic a les assignacions de macros. Un pot crear tants oients UNO com esdeveniments a vigilar hi haja. Un sol oient també pot gestionar múltiples controls de la interfície d'usuari.

Crea un oient d'esdeveniments

Els oients s'adjunten als controls mantinguts en diàlegs, així com als esdeveniments de documentar o formularis. Els oients també s'utilitzen quan es creen diàlegs en temps d'execució o quan s'afigen controls a un diàleg al vol.

Aquest exemple crea un oient per al control Botó1 del diàleg Diàleg1 a la biblioteca Standard.

Amb el 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"
         _MYLABEL = 'Oient 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("L'usuari ha reconegut el diàleg.")
             elif rc == CANCEL:
                 MsgBox("L'usuari ha cancel·lat el diàleg.")
             ui.dispose()  # ui.endExecute
             ctl.removeActionListener(act)
             
         def createUnoDialog(libr_dlg: str, embedded=False):
             """ Crea un diàleg des de la seua ubicació """
             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):
             """ Listen to & count button clicks """
             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): # rutina obligatòria
                 pass
             
         def MsgBox(txt: str):
             mb = util.MsgBox(uno.getComponentContext())
             mb.addButton("Ok")
             mb.show(txt, 0, "Python")
             
         g_exportedScripts = (Main,)
      

msgbox.py al directori {instal·lació}/programa/ hi ha alguns exemples d'oients de botons.

Amb el LibreOffice Basic


         Option Explicit
             
         Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
         Const MY_LABEL = "Oients bàsics."
         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
                 Cas rc.OK: MsgBox "L'usuari ha reconegut el diàleg.",, "Basic"
                 Cas rc.CANCEL MsgBox "L'usuari ha cancel·lat el diàleg.",, "Basic"
             End Select
             ui.dispose ' ui.endExecute()
             ctl.removeActionListener(act)
         End Sub
             
         Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
             ''' Listen to & count button clicks '''
             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
             ' el vostre codi va ací
         End Sub ' awt_disposing
      

Altres oients d'esdeveniments

Listeners are usually coded along with dialog opening. Numerous listener approaches are possible such as event handlers for dialogs or event monitors for documents or forms.

Ens cal la vostra ajuda!