Top > OOoBasic > Generic > dispatch2

Dispatch Edit

コマンドによる作業 dispatch の補足。

コマンド情報 Edit

あるフレームまたはコントローラで実行できる dispatch コマンドはコントローラの com.sun.star.frame.XDispatchInformationProvider インターフェースから取得できます。

コマンドグループ Edit

コマンドはグループ分けされています。コマンドの種類は /org.openoffice.Office.UI.GenericCategories

そのフレームで実行できるコマンドの種類を XDispatchInformationProvider インターフェースから取得できます。

groups = controller.getSupportedCommandGroups()

コマンド Edit

実行できるコマンドはコマンドグループを指定して取得できます。

commands = controller.getConfigurableDispatchInformation(group)

返り値は []com.sun.star.frame.DispatchInformation struct です。各項目は Command および GroupId 要素を持ちます。

XNotifyingDispatch Edit

dispatch は非同期で実行されますが、終了を特定したい時には com.sun.star.frame.XNotifyingDispatch インターフェースを利用して dispatch を dispatchWithNotification メソッドで行うことで終了時に通知を受けることが出来ます。

しかし、Dispatch オブジェクトがこのインターフェースをサポートしている必要があります。

[oneway] void dispatchWithNotification(
    [in] URL url, 
    [in] []MediaDescriptor args, 
    [in] XDispatchResultListener listener )

このメソッドを利用するには com.sun.star.frame.XDispatchResultListener インターフェースを備えたリスナーが必要です。

XDispatchResultListener インターフェースのメソッドは次のものです。

dispatchFinished( [in] DispatchResultEvent ev )

ev は com.sun.star.frame.DispatchResultEvent struct で、要素は State および Result です。

  • State: com.sun.star.frame.DispatchResultState 定数
  • Result: any 結果

State は次のものです。

DispatchResultState説明
FAILURE0失敗
SUCCESS1成功
DONTKNOW2不明

Py-UNO で利用 Edit

XDispatchResultListener インターフェースはそのインターフェースを継承したクラスを作成してリスナーとします。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
import unohelper
 
from com.sun.star.util import URL
from com.sun.star.frame import XDispatchResultListener
from com.sun.star.frame.DispatchResultState import FAILURE as DRS_FAILURE, \
    SUCCESS as DRS_SUCCESS, DONTKNOW as DRS_DONTKNOW
 
 
class notify_listener(unohelper.Base,XDispatchResultListener):
    def __init__(self):
        pass
    def dispose(self,ev):
        pass
    def dispatchFinished(self,r):
        s = r.State
        if s == DRS_FAILURE:
            print "faild"
        elif s == DRS_SUCCESS:
            print "success"
        elif s == DRS_DONTKNOW:
            print "dontknow"

OOo Basic で利用 Edit

OOo Basic で利用する場合には少し問題があります。dispatchWithNotification メソッドは oneway のため、非同期で実行されます。そのため、メソッドを呼び出すと結果が出る前にコードのコントロールが OOo Basic 側に戻ることになり、コードが先に進んでしまいます (終了してしまう可能性もあります)。

メインのコードとリスナー部分が関係なければ問題ありません。が、わざわざ結果を知りたい場合にはメイン部分と関与すると思います。

Wait で一定時間ずつ待ち、終了を確認する。


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes