Creazione di listener di eventi

Gli eventi generati da finestre di dialogo, documenti, formulari o controlli grafici si possono collegare a macro, a cui ci si può riferire come programmazione controllata da eventi. Il metodo più comune per collegare eventi alle macro è utilizzare la scheda Eventi nel menu Strumenti – Personalizza e il pannello delle proprietà dei controlli dell'Editor delle finestre di dialogo dal menu Strumenti - Macro – Organizza finestre di dialogo....

Gli artefatti grafici, gli input di tastiera, i movimenti del mouse e altre interazioni uomo/macchina possono essere controllati mediante listener UNO che "ascoltano" il comportamento dell'utente. I listener sono alternative di codice di programmazione dinamica alle assegnazioni macro. Si possono creare tanti listener UNO quanti sono gli eventi da ascoltare. Un listener singolo può anche gestire più controlli di interfaccia utente.

Creazione di un listener di eventi

Listener vengono allegati ai controlli contenuti negli eventi contenuti nelle finestre di dialogo, nel documento o nei formulari. I listener vengono utilizzati anche quando si creano finestre di dialogo al tempo di esecuzione o quando si aggiungono al volo controlli a una finestra di dialogo.

Questo esempio crea un listener per il controllo Button1 della finestra di dialogo Dialog1 nella libreria Standard.

Con 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 è in ascolto..'
         _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'utente ha dato l'ok alla finestra di dialogo.")
             elif rc == CANCEL:
                 MsgBox("L'utente ha annullato la finestra di dialogo.")
             ui.dispose()  # ui.endExecute
             ctl.removeActionListener(act)
             
         def createUnoDialog(libr_dlg: str, embedded=False):
             """ Creare una finestra di dialogo dalla sua posizione """
             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):
             """ Ascoltare e conteggiare i clic dei pulsanti """
             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):  # routine obbligatoria
                 pass
             
         def MsgBox(txt: str):
             mb = util.MsgBox(uno.getComponentContext())
             mb.addButton("Ok")
             mb.show(txt, 0, "Python")
             
         g_exportedScripts = (Main,)
      

il file msgbox.py nella cartella {installation}/program/ contiene alcuni esempi di listener dei pulsanti.

Con LibreOffice Basic


         Option Explicit
             
         Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
         Const MY_LABEL = "Basic è in ascolto.."
         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 "L'utente ha dato l'ok alla finestra di dialogo.",, "Basic"
                 Case rc.CANCEL : MsgBox "L'utente ha annullato la finestra di dialogo.",, "Basic"
             End Select
             ui.dispose ' ui.endExecute()
             ctl.removeActionListener(act)
         End Sub
             
         Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
             ''' Ascoltare e conteggiare i clic dei pulsanti '''
             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
             ' il vostro codice va qui
         End Sub ' awt_disposing
      

Altri listener di eventi

I listener sono in genere codificati insieme con l'apertura della finestra di dialogo. Sono possibili numerosi approcci di listener, come i gestori degli eventi per le finestre di dialogo o il monitor degli eventi per i documenti o i formulari.

Sostienici!