アダプタ

ブリッジは 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 しないと正しくアダプタのデストラクタが呼ばれない。