Δημιουργία ακροατών συμβάντος

Συμβάντα που εμφανίζονται από διαλόγους, έγγραφα, φόρμες ή γραφικά στοιχεία ελέγχου μπορούν να συνδεθούν με μακροεντολές, που αναφέρεται ως προγραμματισμός βάσει συμβάντων. Η πιο συνηθισμένη μέθοδος συσχέτισης συμβάντων με μακροεντολές είναι στην καρτέλα Συμβάντα στο μενού Εργαλεία – Προσαρμογήκαι στο Επεξεργαστής διαλόγου από το μενού του παραθύρου ιδιοτήτων στοιχείων ελέγχου Εργαλεία – Μακροεντολές – Οργάνωση διαλόγων....

Τα γραφικά παράσιτα, οι είσοδοι πληκτρολογίου, οι μετακινήσεις ποντικιού και άλλες αλληλεπιδράσεις ανθρώπου/μηχανής μπορούν να ελεγχθούν χρησιμοποιώντας ακροατές 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 listens..'
         _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 στον {installation}/program/ κατάλογο έχει κάποια παραδείγματα ακροατών πλήκτρου.

Με LibreOffice Basic


         Option Explicit
             
         Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
         Const MY_LABEL = "Basic listens.."
         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
      

Ακροατές άλλου συμβάντος

Οι ακροατές σας κωδικοποιούνται συνήθως μαζί με το άνοιγμα διαλόγου. Πολλές προσεγγίσεις ακροατών είναι εφικτές όπως χειρισμός συμβάντων για διαλόγους, ή παρακολουθήσεις συμβάντων για έγγραφα ή φόρμες.