アダプタ
ブリッジは Ruby から UNO コンポーネントのメソッドなどを呼び出す肩代わりをしてくれる。一方でアダプタは Ruby のメソッドを UNO から呼び出す仲介をしてくれる。
例えば、ダイアログのボタンにリスナーを設定するときには Ruby でインターフェースを実装したクラスを用意する。ボタンを押したアクションでは com.sun.star.awt.XActionListener.actionPerformed が呼ばれる。
require 'uno.rb' office_path = '/home/asuka/opt/ooo-dev3/program/soffice -norestore' connection_type = 'pipe' args = {'host'=>'localhost', 'port'=>'2083', 'interval'=>3.0} ctx = Runo::Connector.bootstrap(office_path, connection_type, args) smgr = ctx.getServiceManager XActionListener = Runo.uno_require('com.sun.star.awt.XActionListener') class BtnListener include Runo::Base include XActionListener def disposing(ev) end def actionPerformed(ev) p 'pushed' end end dp = smgr.createInstanceWithContext('com.sun.star.awt.DialogProvider', ctx) def show_dialog(dp) dlg = dp.createDialog('vnd.sun.star.script:Standard.Dialog4?location=application') btn = dlg.getControl('CommandButton1') btn.addActionListener(BtnListener.new) dlg.execute dlg.dispose # adapter is also diaposed. end show_dialog(dp)
よく知らなくても使うのは簡単。ここでは BtnListener クラスのインスタンスをリスナーとして addActionListener メソッドに渡すだけ。
ダイアログを dispose しないと正しくアダプタのデストラクタが呼ばれない。