リスナー 
リスナーというのは,ある動作が行われるのを監視するものです。動作以外にも変化などを検出するリスナーもあります。リスナーを使うことでその動作や変化の検出に対して何かの処理を割り当てることができます。
リスナーは種類によって監視する動作が異なります。また,オブジェクトに対して使えるリスナーはサポートされているものだけで,使いたいものを勝手に使うといったことはできません。
リスナーの種類 
リスナーはインターフェースとして定義されています。そのため,X...Listener というインターフェース名を持っているのがリスナーです。
リスナーが呼び出されるとき,動作,変化に対応したそのリスナーインターフェースが備えているメソッドが呼ばれます。たとえば,XActionListener には actionPerformed というメソッドがありますが,このメソッドはこのリスナーを割り当てたボタンなどが動作したときに呼び出されます。
リスナーを使用する際には,リスナーを作成してそのリスナーインターフェースの持つメソッドのための動作を記述してやる必要があります。
リスナーの作成 
リスナーを作成する方法です。OOoBasic ではリスナーは CreateUnoListener ランタイム関数を使用して作成します。
CreateUnoListener の使い方は次のとおりです。(具体的な例については下で取り上げます。)
xListener CreateUnoListener( [in]string sName, [in]string sListenerName )
- xListener
- 作成されるリスナー (戻り値)
- string sName
- 作成されるリスナーのためのメソッドの接頭語 ("文字列" + "_" の形式で)
- sListenerName
- 作成するリスナーインターフェース名
この CreateUnoListener を使用すると Object 型 (実際はインターフェース) として xListener が戻されます。ここで,sName はリスナーを作成するときに作成するメソッドのための接頭語です。これについては詳しく後ほど説明します。sListenerName は作成したいリスナーインターフェース名です。
例を挙げてリスナーのための接頭語 sName などについて説明します。
リスナーの作成例 
例として XActionListener を取り上げます。この XActionListener は,ダイアログのコマンドボタンなどでサポートされているインターフェースで,ボタンの動作を検出して呼び出されます。
まず,このリスナーを CreateUnoListener ランタイム関数を使用して作成します。
Dim oActionListener As Object
oActionListener = CreateUnoListener("ActionListener_", "com.sun.star.awt.XActionListener")
ここで,CreateUnoListener の二つの引数について説明します。まず,一つ目の引数 "ActionListener_" は作成されるリスナーのメソッドが呼び出されるときに実行される Sub を定義する際に使用する接頭語を指定します。これについてはつづいて説明します。二つ目の引数 "com.sun.star.awt.XActionListener" は作成するリスナーのインターフェース名です。
この XActionListener は IDL Reference をみると actionPerformed というメソッドを持っていることが分かります。このメソッドは動作を検出したときに呼び出されるメソッドです。このメソッドが呼び出されたときに実行したい内容を次のようにして定義します。
Sub ActionListener_actionPerformed()
MsgBox "Action Performed!"
End Sub
ここで重要なことは,Sub の名前を「リスナーのメソッドのための接頭語」+「メソッド名」とすることです。接頭語は "文字列" + "_" という形式になっていました。この形式はここで必要になります。
また,全てのリスナーは共通のメソッド disposing を持っています。これはリスナーが処理されるときに呼び出されます。そのため,全てのリスナーにおいて定義しておく必要があります。ここでの例でも次のように定義しておきます。
Sub ActionListener_disposing()
End Sub
空です。何も動作させたくなければ空で定義しておきます。
また,ここで例として取り上げた ActionListener は一つのメソッドしか持っていませんでしたが,多くのリスナーは複数のメソッドを持っています。そのときには全てのメソッドについて一応定義を記述する (上記の disposing のように「空」でもよい) ことをお勧めします。未定義によるエラーを未然に防ぐことができます。
イベント 
リスナーを使用して,リスナーが呼び出されて定義したメソッドが呼び出されたときに,イベントを取得することができます。このイベントからはリスナーを呼び出す結果を生み出したそのオブジェクトを取得することもできます。
イベントを取得するには,リスナーのためのメソッドを定義する際に Sub の引数にイベントのための変数を一つ指定しておきます。たとえば,次のようにします。
Sub ActionListener_actionPerformed(oEvent)
...
oEvent. ...
...
End Sub
指定した変数を使って取得したイベントを使った動作が定義できます。このイベントからリスナーを呼び出したオブジェクトを取得するにはこのイベントオブジェクト (oEvent) の Source プロパティーを使用します。
Sub ActionListener_actionPerformed(oEvent)
MsgBox oEvent.Source.Dbg_Properties
End Sub
このようにするとリスナーを呼び出したオブジェクトの Dbg_Properties プロパティーを表示できます。
また,イベントは Source 以外のプロパティーを持っている場合もあります。
リスナーの追加と削除 
リスナーの作成で作成したリスナーは,適切なオブジェクトへ追加して使用します。また,使わなくなったリスナーは削除してやることが必要です。
リスナーの追加と削除を正しく行わなければさまざまな弊害を起こします。たとえば,追加が正しくなければうまく動作しません。リスナーの削除はもっと深刻な問題を起こします。削除し忘れたリスナーはいつまでも削除されるまで動作し続けます。同じリスナーを別に実行したマクロで再度追加すれば,追加された回数だけのリスナーが呼び出されます。削除できなくなったリスナーは OpenOffice.org のファイルを閉じることでしか削除できなくなります。リスナーは便利ですが,正しくリスナーの追加と削除を行ってください。
リスナーの追加 
リスナーの追加は対応するオブジェクトの持つ add..xxx..Listener メソッドで行います。このとき,..xxx.. の部分はリスナー名のインターフェースの X を省いた名前です。これらのメソッドの引数は上記の方法で作成されたリスナーオブジェクトです。また,このときリスナーオブジェクトを保持する変数は Global 変数として定義されていなければリスナーの追加と削除を正しく行えません。
リスナーの削除 
リスナーの削除は追加したオブジェクトに対して remove..xxx..Listener メソッドを呼び出してやります。引数として追加したリスナーオブジェクトが必要です。そのため,リスナーオブジェクトを作成するときには Global 変数として定義した変数に保存しておきます。
リスナーたち 
IDL Reference に記載されているリスナーを並べてみます。
com.sun.star.beans.
- XPropertiesChangeListener
com.sun.star.awt.
- XActionListener
- XActivateListener
- XAdjustmentListener
- XFocusListener
- XItemListener
- XKeyListener
- XMenuListener
- XMouseListener
- XMouseMotionListener
- XPaintListener
- XSpinListener
- XTextListener
- XTopWindowListener
- XWindowListener
.lang.XEventListener 
この com.sun.star.lang.XEventListener インターフェースはイベントリスナーのための基盤となるインターフェースであり,OOoBasic でリスナーとして使用する場合には役に立ちません。
.document.XEventListener 
com.sun.star.document.XEventListener リスナーを作成してあとでリスナーをオブジェクトに addEventListener メソッドで追加するときには注意が必要です。
com.sun.star.document.XEventListener インターフェースをサポートしているオブジェクトは com.sun.star.lang.XEventListener インターフェースもサポートしています。この二つのインターフェースを追加するメソッドは同じ名前を持っていて addEventListener です。リスナーを追加するメソッドとリスナーが対応していなければうまく動作しません。そのためメソッドを正確に呼び出す必要があります。
Global oEventListener As Object
Sub Main
Dim oDoc As Object
oDoc = ThisComponent
oEventListener = createUnoListener(_
"EventListener_","com.sun.star.document.XEventListener")
oDoc.com_sun_star_document_XEventListener_addEventListener(oEventListener)
End Sub
Sub EventListener_disposing()
End Sub
Sub EventListener_notifyEvent(oEvent)
MsgBox oEvent.EventName
End Sub
まとめ 
リスナーは使い慣れないと分かりにくいものなのでまとめておきます。
- リスナーは CreateUnoListener ランタイム関数を使用して作成する
- 一つ目の引数は,接頭語で "文字列" + "_" (アンダースコア) の形式
- 二つ目の引数は,インターフェース名
- リスナーのメソッドのための定義を行う
- 定義の Sub 名はリスナーを作成したときの "接頭語" + "メソッド名"
- 全てのメソッドについて定義を行う (一応,「空」でも)
- disposing メソッドについても定義する
- イベント
その他 
- com.sun.star.document.XEventBroadcaster
- com.sun.star.document.XEventListener
- com.sun.star.lang.XComponent
- com.sun.star.lang.XEventListener
- com.sun.star.accessibility.XAccessibleEventBroadcaster
- com.sun.star.accessibility.XAccessibleEventListener