Dispatch 
コマンドによる作業 dispatch の補足。
コマンド情報 
あるフレームまたはコントローラで実行できる dispatch コマンドはコントローラの com.sun.star.frame.XDispatchInformationProvider インターフェースから取得できます。
コマンドグループ 
コマンドはグループ分けされています。コマンドの種類は /org.openoffice.Office.UI.GenericCategories
そのフレームで実行できるコマンドの種類を XDispatchInformationProvider インターフェースから取得できます。
groups = controller.getSupportedCommandGroups()
コマンド 
実行できるコマンドはコマンドグループを指定して取得できます。
commands = controller.getConfigurableDispatchInformation(group)
返り値は []com.sun.star.frame.DispatchInformation struct です。各項目は Command および GroupId 要素を持ちます。
XNotifyingDispatch 
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 | 値 | 説明 |
FAILURE | 0 | 失敗 |
SUCCESS | 1 | 成功 |
DONTKNOW | 2 | 不明 |
Py-UNO で利用 
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 で利用 
OOo Basic で利用する場合には少し問題があります。dispatchWithNotification メソッドは oneway のため、非同期で実行されます。そのため、メソッドを呼び出すと結果が出る前にコードのコントロールが OOo Basic 側に戻ることになり、コードが先に進んでしまいます (終了してしまう可能性もあります)。
メインのコードとリスナー部分が関係なければ問題ありません。が、わざわざ結果を知りたい場合にはメイン部分と関与すると思います。
Wait で一定時間ずつ待ち、終了を確認する。