コマンドの捕捉
frame からの dispatch によるコマンドの実行を捕捉します。あるコマンドの実行を捕捉して別の処理を行ったり、補足処理を行ったり、コマンドを破棄したりといったことができます。 これはフレーム単位で行います。そのため、ドキュメントごとにフレームからのコマンドを無効化したりといったことができます。 フレームの com.sun.star.frame.XDispatchProviderInterception インターフェースのメソッドを利用してインターセプタを登録、削除します。インターセプタは複数登録できます。 そして、インターセプタは順番が回ってきたら com.sun.star.frame.XDispatchProviderInterceptor および com.sun.star.frame.XDispatchProvider インターフェースのメソッドを利用して何かを行います。 動作の詳細が必要であれば以下のドキュメントを参照してください。
新しくインターセプタを作成してフレームに登録します。また、二つ目のプロシージャは削除用です。 Global oDispatchInterceptor As Object Global oSlaveDispatchProvider As Object Global oMasterDispatchProvider As Object Global oInterceptor As Object ' register interceptor Sub registerInterceptor() ' create interceptor oInterceptor = CreateUnoListener( _ "DispatchPRoviderInterceptor_", _ "com.sun.star.frame.XDispatchProviderInterceptor") oDoc = ThisComponent oController = oDoc.getCurrentController() oFrame = oController.getFrame() ' register to the frame oFrame.registerDispatchProviderInterceptor(oInterceptor) End Sub ' release interceptor Sub releaseInterceptor() oDoc = ThisComponent oController = oDoc.getCurrentController() oFrame = oController.getFrame() ' release from the frame oFrame.releaseDispatchProviderInterceptor(oInterceptor) End Sub インターセプタは XDispatchProvider インターフェースのメソッドが呼ばれることでコマンドを捕捉、受け取ります。ここで処理が必要であれば捕捉します。処理が終わったり、処理が不要であれば次のインターセプタに処理をまわします。コマンドを無効化するのであれば Null が戻るようにします。 ' intercept commands, judge and pass or disable it Function DispatchPRoviderInterceptor_queryDispatch( aURL, sName, nFlag ) On Error GoTo Handler: If aURL.Protocol = ".uno:" Then If aURL.Path = "Copy" OR aURL.Path = "Paste" OR aURL.Path = "Cut" Then 'DispatchPRoviderInterceptor_queryDispatch = Null Exit Function End If End If 'If NOT IsNull(oSlaveDispatchProvider) Then DispatchPRoviderInterceptor_queryDispatch = oSlaveDispatchProvider.queryDispatch( aURL, sName, nFlag ) 'End If Exit Function Handler: End Function Function DispatchPRoviderInterceptor_queryDispatches() End Function 前後のインターセプタと協調するために以下のプロシージャや関数が必要です。 Function DispatchPRoviderInterceptor_getSlaveDispatchProvider() DispatchPRoviderInterceptor_getSlaveDispatchProvider() = oSlaveDispatchProvider End Function Sub DispatchPRoviderInterceptor_setSlaveDispatchProvider( oNewDispatchProvider ) oSlaveDispatchProvider = oNewDispatchProvider End Sub Function DispatchPRoviderInterceptor_getMasterDispatchProvider() DispatchPRoviderInterceptor_getMasterDispatchProvider() = oMasterDispatchProvider End Function Sub DispatchPRoviderInterceptor_setMasterDispatchProvider( oNewSupplier ) oMasterDispatchProvider = oNewSupplier End Sub Dispatch インターセプションでコマンドを無効化すれば XDispatch インターフェースが戻らないのでメニューなどの該当項目もグレーになり利用不可になります (当該フレームのみ)。 |