Δημιουργία ακροατών συμβάντος
Συμβάντα που εμφανίζονται από διαλόγους, έγγραφα, φόρμες ή γραφικά στοιχεία ελέγχου μπορούν να συνδεθούν με μακροεντολές, που αναφέρεται ως προγραμματισμός βάσει συμβάντων. Η πιο συνηθισμένη μέθοδος συσχέτισης συμβάντων με μακροεντολές είναι στην καρτέλα Συμβάντα στο μενού και στο Επεξεργαστής διαλόγου από το μενού του παραθύρου ιδιοτήτων στοιχείων ελέγχου .
Τα γραφικά παράσιτα, οι είσοδοι πληκτρολογίου, οι μετακινήσεις ποντικιού και άλλες αλληλεπιδράσεις ανθρώπου/μηχανής μπορούν να ελεγχθούν χρησιμοποιώντας ακροατές 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
Ακροατές άλλου συμβάντος
Οι ακροατές σας κωδικοποιούνται συνήθως μαζί με το άνοιγμα διαλόγου. Πολλές προσεγγίσεις ακροατών είναι εφικτές όπως χειρισμός συμβάντων για διαλόγους, ή παρακολουθήσεις συμβάντων για έγγραφα ή φόρμες.